关于变体记录一问(50分)

  • 主题发起人 主题发起人 maple_guo
  • 开始时间 开始时间
M

maple_guo

Unregistered / Unconfirmed
GUEST, unregistred user!
代码:
TRect = packed record
  case Integer of  //到底是判断Integer的什么[?]
    0: (Left, Top, Right, Bottom: Longint);
    1: (TopLeft, BottomRight: TPoint);
 end;
1、case Integer of 这一句到底是判断Integer的什么[?]
2、为什么要这样定义[?]
3、它是怎样保证不论Integer的取值如何都能访问到相同的数据的呢?[?][?][?]

谢谢![:D]
 
1、case integer of 这句没有意义: 你也可以写成case Boolean of, case char of....
这句的目的是告诉编译器从这里开始是变体结构。 只要你下面相关的分支判断类型是相应的Integer/boolean/char值即可
2、答案见1
3、同1, 这个Integer值没有意义,不需要赋值。 它只是告诉编译器你变体结构的分支判断是个Integer值。
至于访问,你可以直接访问你上面定义里的各个变量。 例如 Rect.Left, Rect.TopLeft
 
可不可以给我们演示一下有关变体记录的具体使用例程???
 
我的理解:所谓变体记录其实就是数字节玩。 将相同字节数的不同类型变量放在同一块内存里存储。
一个很简单的例子:
TMultiTypeRcd = record
case Integer of
0: (Int1, Int2: Integer);
1: (Flt: Double);
2: (Dt: TDateTime);
end;
这个结构可以存2个整型变量, 或者一个Double型变量, 或者一个TDateTime型的变量, 但不能同时保存三种不同类型的变量。
这就是变体记录的限制, 它用同一块内存(例子里是总长8字节)保存不同类型的数据。
其实这都是针对编译器玩的小把戏。 目的是让赋值语句:
MultiTypeRcd.Int1 := 1
MultiTypeRcd.Flt := 5.24
MultiTypeRcd.Dt := now

都能正确编译而不会产生类型不匹配的错误。
真正运行时存的都是字节。
 
To Another_eYes 大虾:
这样就是说
代码:
case Integer of
0:..
1:..
2:..
只是一种语法形式啰,对吗?如果需要的话就可以把它写成:
代码:
case Integer of
10:..
11:..
12:..
或者:
case Char of
'w':..
'x':..
'y':..
等形式,我的理解对吗?
 
完全正确, 你甚至可以写成:
case Integer of
50000: (....);
1: (....);
-125: (....);
...
 
接受答案了,谢谢Another_eYes!
 
后退
顶部