Delphi:未定义的记录变量

时间:2011-12-12 18:43:25

标签: delphi record null

我已经使用以下结构定义了TCGTable记录类型:

type
  TCGTable = record
    x : array [1 .. MAX_POINTS] of Single;
    y : array [1 .. MAX_POINTS] of Single;
  end;

我已宣布TCGTable变量CGTable

如果该记录满足多个运行时条件,则为变量CGTable分配一个特定的常量TCGTable记录值。

如果没有常量TCGTable记录满足这些条件,则CGTable应该是未定义的。

是否有可以分配给CGTable的Delphi 2010内置值以表明它未定义?我尝试使用值nilnull,但这两个似乎只对指针或变体类型有效。源不会使用分配给CGTable的这些值进行编译。

我想检查变量CGTable以确定其有效性,而不是,例如,维护一些额外的布尔有效性标志。

我能确定的唯一解决方法是:

a)将CGTable的类型更改为TCGTable指针(CGTable : ^TCGTable;),这样我就可以将CGTablenil值进行比较

b)定义一些常量TCGTable记录以充当“无效”记录。然后我会将CGTable与此“无效”记录进行比较。

有关如何处理此问题的任何建议?感谢

3 个答案:

答案 0 :(得分:5)

您的记录中包含static array。此特定记录的大小等于ElementCount*SizeOf(Element)

根据您的数组大小为MAX_POINTS常量的事实判断,您看起来阵列中的点数可变。我想我会倾向于切换到这样的动态数组:

type
  TSinglePoint = record
    x: Single;
    y: Single;
  end;
  TSinglePointArray = array of TSinglePoint;

现在,如果您有一个变量a: TSinglePointArray,则值nil表示它为空或为零。您可以使用Length(a)查询数组的长度。您可以使用SetLength(a, NewLength)调整数组大小。

答案 1 :(得分:1)

不,你的记录包含其成员占用的字节数。[*]如果四个字节的任何组合是有效的单一,并且没有更多的字节可用于附加信息,则无法存储以下事实:记录在某处无效。

您可以决定将TCGTable标记为无效,将CGTable.x [1]设置为NaN。要检查它是否无效,您可以检查IsNaN(CGTable.x [1])。这仅适用于所有有效的TCGTable将x [1]设置为实际值的情况。或者你可以选择另一个永远不会对x [1]有效的值。如果没有这样的值,则必须为额外信息创建空间以便能够检查有效性,可能通过存储指向TCGTable的指针,可能通过向记录添加IsValid字段。

[*]对于所有记录都不是这样,但几乎肯定是在你的情况下。

答案 2 :(得分:0)

如果您将数组类型更改为动态数组,那么您可以检查它们的长度以查找无效记录(例如,长度为零)。由于您使用的是Delphi 2010,您还可以使用记录中定义的方法来分配值,验证范围并确定记录是否有效。