我试图用C#调用Delphi DLL中的一个过程。该过程期望调用者预先分配并输入array of array of TSomeRecord
,然后它将操纵TSomeRecord
元素作为返回结果的方法。所以,我需要手工制作Delphi数组的Delphi动态数组
现在,I have found here动态array of X
由指向动态数组的第一个元素的指针组成,并且第一个元素具有引用计数和数组的长度(元素数)前置(两个32位整数),并且元素是内联和连续存储的,所以整个事情在内存中看起来像这样:
rrrrllll000...000111...12... ^
rrrr是引用计数,llll是长度,0123是元素,^是指针指向的位置。这证明了;我测试了它,它的工作原理
对于多维动态数组,我假设我可以用array of Y
代替X
中的array of X
,换句话说,外部维度只是动态数组的动态数组(指向),像这样:
rrrrllll000011112222... ^
其中元素0000,1111等现在是独立分配的动态数组的32位指针。但是,这样做会让我遇到麻烦的访问权限。这显然不是德尔福希望我这样做的方式。任何人都可以向我解释我我应该怎么做?
答案 0 :(得分:8)
动态数组是指向打包的元素块的指针。
因此TSomeRecord数组的数组是指向指针数组的指针,每个指针指向具有length(array [firstlevel])元素的块内存,如果没有则指向nil。
换句话说,你所假设的大致是正确的,并且添加了零元素的数组为零。请注意,除非您真的知道自己在做什么,否则不应自行更改引用次数和长度。
如果没有示例代码,确定导致崩溃的原因将很困难。请记住,对于 ALL 自动Delphi类型(widestring除外),所有动态内存必须由delphi内存管理器分配。
尝试使用您正在连接的任何语言的内存管理器是不可能的。
答案 1 :(得分:0)
语言指南(一旦作为非常有用的印刷手册提供,现在在在线帮助中找到此信息非常困难)声明:
“存储多维数组,最右边的维度首先增加。”
因此,AFAIK你没有一个指针数组 - 从最右边开始,每个维度数据都是一个接一个,我想它更快,因为没有更多的间接。