我有一系列传统记录。
当我知道记录的开始地址,字段的偏移量和字段的类型时,如何访问第N条记录的字段? 例如
type
Tstring = string[20];
TRecord = packed record
aInteger : integer;
aDouble : double;
aString : Tstring ;
bString : string;
end;
var
aArray : array[0..N] of Trecord;
p : pointer;
....
p := pointer(cardinal(aArray[5])+12); // 12 = offset of field "aString"
writeln(Tstring(p^);
依旧......
这不符合我的预期。哪里我错了,拜托?
答案 0 :(得分:3)
没有像我预期的那样工作
我意识到您发布的代码在尝试使其生效之间被复制了,但下次请在您解决语法错误后发布代码。另外,请说明无法正常工作,不要让我们为您调试。
我已经解决了类型错误,因此代码现在可以正常运行,但仍然非常毛茸茸的。
p := pointer(cardinal(@aArray[5])+12); // 12 = offset of field "aString"
writeln(Tstring(p^));
基本上,在将其转换为支持arithmetics的aArray
类型之前,您忘记使用Cardinal
的地址。
这就是为什么类型转换被认为是不安全的。类型错误很好地隐藏在另一个类型转换后面。