关闭。这个问题需要details or clarity .它目前不接受答案。
想改进这个问题?通过 editing this post 添加详细信息并澄清问题.
5年前关闭。
Improve this question
我有一系列传统记录。
当我知道记录的开始地址、字段的偏移量和字段的类型时,如何访问第 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^);
等等...
这不像我预期的那样工作。请问我哪里错了?
最佳答案
doesn't work as I expected
我知道您发布的代码是在尝试使其正常工作的过程中被复制的,但下一次,请解决语法错误后发布代码。另外,请说明它是如何不起作用的,不要只要求我们为您调试。
足够的咆哮
我已经解决了一个类型错误,所以代码现在可以工作,但仍然很麻烦。
p := pointer(cardinal(@aArray[5])+12); // 12 = offset of field "aString"
writeln(Tstring(p^));
基本上,您忘记了 aArray
的地址在将其转换为启用算术的 Cardinal
之前类型。这就是为什么类型转换被认为是不安全的。类型错误很好地隐藏在其他类型转换之后。
关于arrays - 访问(传统)记录的字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37505653/