pascal编程语言中 声明 record 类型中的 case 用法,多谢

2024-11-20 14:42:03
推荐回答(3个)
回答1:

很简单,case关键字后面跟上某种类型,然后分支的序号与该类型保持一致就行,例如:
type
IntRec1 = packed record
ID: ShortString;
case Integer of
3: (
Param: Integer);
5: (
ParamLo: Word;
ParamHi: Byte);
end;

IntRec2 = packed record
ID: ShortString;
case Char of
'c': (
Param: Integer);
'e': (
ParamLo: Word;
ParamHi: Byte);
end;

IntRec3 = packed record
ID: ShortString;
case Boolean of
True: (
Param: Integer);
False: (
ParamLo: Word;
ParamHi: Byte);
end;
1、以上Param和ParamLo/ParamHi是变体结构的两个不同分支,可以用Param域直接访问该变体的整数部分(Integer),也可以用ParamLo域访问该整数部分的低16位(Word),用ParamH域i访问高8位(Byte)。
2、变体结构的大小,取决于占空间最大的分支,如本题中Integer(4字节)>Word(2字节)+Byte(1字节),因此本题三个变体结构大小均为256+4=260字节。
3、case后面的类型与分支标识的类型保持一致就行了,分支标识随便写什么都行(Integer与3、5,Char与'c'、'e',Boolean与True、False)。以上三种声明方法都声明的同一种类型。
4、为了能精确访问变体结构的域,一般要加packed关键字,防止编译器自动对齐。
5、变体结构在日常编程中用的不多,它大量使用在对Windows API的翻译中。

回答2:

type BirthOrAge=(BirthFlag, AgeFlag);
PersonType=record
id:
string[18];
name: string[50];
gender: (male, female);
case flag:
BirthOrAge of
BirthFlag: (birthday: longint);
AgeFlag: (age:
0..150);
end;

// birthday 和 Age 是重叠的,既可表示 生日,也可表示年龄。(二取一)

回答3:

type node=record
case a:char of
'b':(b:integer);
'c':(c:integer);
end;