我已经使用以下结构定义了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内置值以表明它未定义?我尝试使用值nil
和null
,但这两个似乎只对指针或变体类型有效。源不会使用分配给CGTable
的这些值进行编译。
我想检查变量CGTable
以确定其有效性,而不是,例如,维护一些额外的布尔有效性标志。
我能确定的唯一解决方法是:
a)将CGTable
的类型更改为TCGTable
指针(CGTable : ^TCGTable;
),这样我就可以将CGTable
与nil
值进行比较
b)定义一些常量TCGTable
记录以充当“无效”记录。然后我会将CGTable
与此“无效”记录进行比较。
有关如何处理此问题的任何建议?感谢
答案 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,您还可以使用记录中定义的方法来分配值,验证范围并确定记录是否有效。