2016-05-29 68 views
1

我有一组传统记录。访问(传统)记录的字段

当我知道记录的开始地址,字段偏移量和字段类型时,如何访问第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^); 

等等...

这如我所料不工作。请问我哪里错了?

+3

请添加一个语言标签并解释一下您在此上下文中的传统记录的含义? – paisanco

+0

@paisanco看起来像一些pascal的味道,也许[对象pascal](http://docwiki.appmethod.com/appmethod/1.13/topics/en/Structured_Types#Records_.28traditional.29) –

+1

为什么你需要做这个?如果你知道'aArray [5]'是一个'TRecord',为什么不直接用'TRecord(aArray [5]).aString'类型化并直接访问? –

回答

3

如我所料

不工作,我知道你已经张贴在中间被复制的尝试,使其工作有什么代码,但下一次,后代码后”已经解决了语法错误。此外,请包括它如何不工作,不要只是要求我们为您调试。

足够的咆哮

我解决一个类型的错误,所以现在代码工作,但还是很毛茸茸

p := pointer(cardinal(@aArray[5])+12); // 12 = offset of field "aString" 
writeln(Tstring(p^)); 

基本上,你忘了浇铸成之前采取的aArray地址算术启用Cardinal类型。

这就是为什么类型转换被认为是不安全的原因。类型错误隐藏在其他类型转换后面。

+0

你是对的!非常感谢。 – JimPapas