帕斯卡变体记录的使用
Usage of pascal variant record
我需要非常了解 Pascal 的人的帮助。
我需要(教师要求)使用变体记录。这些变体记录定义如下:
Temperature = record
case scale : TemperatureScale of
celsius : (celsius_value : ScaleCelsius);
kelvin : (kelvin_value : ScaleKelvin);
end;
根据我在研究该主题期间找到的主要资源,我找不到如何使用变体记录,只能找到如何声明它。
我的主要来源:google 搜索(一无所获),Case-Freepascal and Record-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;
考虑来自 Delphi Help 的示例记录。我用标签修改了它。
标签的使用是可选的,通常不使用,也不提供有用的信息。
请注意,第一行输出的半径与高度的值相同——它们共享相同的内存。
然后我明确设置标签(但字段保持不变)
还要注意无标记记录和标记记录的大小差异。
再次注意 - 在大多数情况下,程序员不会定义或使用标记值。依赖标签可能是不安全的(除非您在分配标签时遵循严格的规则)。我没有设置 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
我需要非常了解 Pascal 的人的帮助。
我需要(教师要求)使用变体记录。这些变体记录定义如下:
Temperature = record
case scale : TemperatureScale of
celsius : (celsius_value : ScaleCelsius);
kelvin : (kelvin_value : ScaleKelvin);
end;
根据我在研究该主题期间找到的主要资源,我找不到如何使用变体记录,只能找到如何声明它。
我的主要来源:google 搜索(一无所获),Case-Freepascal and Record-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;
考虑来自 Delphi Help 的示例记录。我用标签修改了它。
标签的使用是可选的,通常不使用,也不提供有用的信息。
请注意,第一行输出的半径与高度的值相同——它们共享相同的内存。
然后我明确设置标签(但字段保持不变)
还要注意无标记记录和标记记录的大小差异。
再次注意 - 在大多数情况下,程序员不会定义或使用标记值。依赖标签可能是不安全的(除非您在分配标签时遵循严格的规则)。我没有设置 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