使用pascal变体记录

时间:2017-12-07 09:19:57

标签: pascal freepascal

我需要那些非常了解帕斯卡的人的帮助。

我需要(教师要求)使用变体记录。那些变体记录定义如下:

Temperature = record
   case scale :   TemperatureScale of
   celsius : (celsius_value : ScaleCelsius);
   kelvin : (kelvin_value : ScaleKelvin);
end;

根据我在研究这个主题时发现的主要来源,我找不到如何使用变体记录,只知道如何声明它。

我的主要来源:谷歌搜索(未找到任何内容),Case-FreepascalRecord-Freepascal

编辑那些想知道我必须在实施中使用的人,这是显而易见的:

 type
  UkPolozka = ^Polozka;
  UkHodnota = ^Hodnota;
  TypUdaj=(typretez, typcele, typrealne, typlogik, typpole, typobjekt);

  VarZaznam = record
  case Udaj: TypUdaj of        
    typretez:  (retez: string);
    typcele:   (cele: word);
    typrealne: (realne: single);
    typlogik:  (logik: boolean);
    typpole:   (pole: UkHodnota);
    typobjekt: (objekt: UkPolozka);
 end;

 Polozka = record
    Nazev: string;
    Hodn:  VarZaznam;
    Dalsi: UkPolozka
 end;
 Hodnota = record
    Hodn:  VarZaznam;
    Dalsi: UkHodnota     
 end;

1 个答案:

答案 0 :(得分:0)

考虑来自Delphi Help的示例记录。我用标签修改了它。

标签使用是可选的,通常不使用,也不提供有用的信息 请注意,第一行输出的半径与height的值相同 - 它们共享相同的内存。

然后我明确设置标签(但字段保持不变)

还要注意无标记记录和标记记录的大小差异。

再次注意 - 在大多数情况下,程序员不会定义或使用标记值。依赖标记可能不安全(直到您在分配标记时遵循严格的规则)。我没有设置rectangle标记,但程序将零标记视为第一个变体。

只需按名称分配所需的字段即可。只需按名称阅读所需字段即可。对于您的示例varVarZaznam.retez:= 'test';

type
   TShapeList = (Rectangle, Triangle, Circle, Ellipse, Other);
   TFigure = record
     case shape: TShapeList of
       Rectangle: (Height, Width: Real);
       Triangle: (Side1, Side2, Angle: Real);
       Circle: (Radius: Real);
       Ellipse, Other: ();
   end;

   TFigureNoTag = record
     case TShapeList of
       Rectangle: (Height, Width: Real);
       Triangle: (Side1, Side2, Angle: Real);
       Circle: (Radius: Real);
       Ellipse, Other: ();
   end;

var
   Fig: TFigure;
begin
  Fig.Height := 5;
  Fig.Width := 3;
  //default tag is zero = Rectangle
  if Fig.shape = Rectangle then
    Writeln('Rect ', Fig.Height:3:0, Fig.Width:3:0, Fig.Radius:3:0)
  else
    Writeln('not Rect');

  Fig.shape := Circle;
  if Fig.shape <> Rectangle then
    Writeln('not Rect');

  Writeln('Fig size ', SizeOf(TFigure), ' noTag size ', SizeOf(TFigureNoTag));
  Readln;
在Delphi中输出

Rect   5  3  5
not Rect
Fig size 32 noTag size 24