同上

解决方案 »

  1.   

    记录中的变体部分
     记录类型中可以含有变体部分,有点象case语句。变体部分必需在记录中其他字段的声明之后。声明含有变体部分的记录类型,语法如下:type recordTypeName = record  fieldList1: type1;  ...  fieldListn: typen;case tag: ordinalType of  constantList1: (variant1);  ...  constantListn: (variantn);end;在保留字case之前的声明部分与标准记录类型中的声明相同。剩余从case到end之前最后一个可选的分号(;)之间叫做变体部分。在变体部分中:·  tag是可选的,并且可以是任意有效的标识符。如果忽略tag,那么也要同时忽略紧随其后的冒号(:)。·  ordinalType表示一个序数类型。·  每个constantList都是一个表示ordinalType类型的常量,或者逗号隔开的此类常量列表。在当前变体部分声明中,对于所有的constantLists,同一个值最多只能出现一次。·  每个variant都是一个逗号隔开的声明列表,这与记录类型主要部分中的fieldList: type结构相似。也就是说,variant具有如下形式fieldList1: type1; ...fieldListn: typen;这里,每个fieldList是一个有效标识符或者逗号隔开的标识符列表,每个type代表一个类型,最后的分号是可选的。所有的类型(types)都不能是长串、动态数组、变体(即Variant类型)或接口,也不能是包含长串、动态数组、变体(即Variant类型)或接口的结构类型;但可以是指向这些类型的指针。含有变体部分的记录在语句构成上比较复杂,但在语义上比较简单,具有欺骗性。记录中的变体部分包含几个变体,在内存中它们共享相同的空间。可以在任何时候对记录中任何变体的任何字段读或写;但如果在一个变体中写一个字段并且在另一个变体中写另一个字段,那么后面的写操作可能覆盖前面写入的数据。对于Tag,如果存在,那么将作为记录中的非变体部分,被视为额外的字段(其类型是ordinalType)。 变体部分有两种用途。首先,假设要创建一个记录类型,它有不同数据种类的字段,但不需要在单个记录实例中使用全部数据。例如,type  TEmployee = record  FirstName, LastName: string[40];  BirthDate: TDate;  case Salaried: Boolean of    True: (AnnualSalary: Currency);    False: (HourlyWage: Currency);end;这里的意思是,每个雇员都有年薪或计时工资,但不能都有。因此,在创建TEmployee时,没有理由为两个字段都分配足够的内存。这种情况下,变体之间只有名字不同,而要想让字段的类型不同也是很容易的。考虑相对复杂的例子:type  TPerson = record  FirstName, LastName: string[40];  BirthDate: TDate;  case Citizen: Boolean of    True: (Birthplace: string[40]);    False: (Country: string[20];            EntryPort: string[20];            EntryDate, ExitDate: TDate);  end;type  TShapeList = (Rectangle, Triangle, Circle, Ellipse, Other);  TFigure = record    case TShapeList of      Rectangle: (Height, Width: Real);      Triangle: (Side1, Side2, Angle: Real);      Circle: (Radius: Real);      Ellipse, Other: ();  end;对上面的每个记录实例,编译器分配足够的内存以在最大的变体中能够保存所有的字段。可选的Tag和常量列表constantLists(如上面最后一个例子中Rectangle、Triangle等)在编译器管理字段的途径中不扮演任何角色,它们仅为程序员提供方便。 变体部分的第二个用途是,可以将相同的数据视为不同的类型,尤其在编译器不允许类型转换的情况。例如,如果有一个64位的实数Real类型作为变体的第一个字段,一个32位的整数Integer类型作为另一个变体的第一个字段,那么可以向实数Real字段赋值然后以整数Integer字段读出其前32位(简单地说,作用就是请求整数参量)。 
      

  2.   

    自有用处,就像C语言中的Union一样的
      

  3.   

    TVar = record
        case integer of
         0 :(
               buff :array [0..63] of byte;
             );
         1 :(
           case integer of
             0 : ( x : byte;);
             1 : ( y : smallint;);
             2 : ( z : integer;)
            );
      end;
      

  4.   

    共用体(Union)时C语言里的,Pascal里没有现成的共用体