5

我正在尝试从 C# 调用 Delphi DLL 中的过程。该过程期望调用者预先分配并输入一个array of array of TSomeRecord,然后它将操作其中的TSomeRecord元素作为返回结果的一种方式。所以,我需要手工制作 X 数组的 Delphi 动态数组。
现在,我在这里发现动态array of X由指向动态数组的第一个元素的指针组成,并且该第一个元素具有引用计数和长度(元素的数量)数组的前置(都是 32 位整数),并且元素是内联和连续存储的,所以整个事情在内存中看起来像这样:

rrrrllll000...000111...12...
        ^

rrrr 是引用计数,llll 是长度,0123 是元素,而 ^ 是指针指向的位置。这证明了;我已经对其进行了测试,并且可以正常工作。
对于多维动态数组,我假设我可以替换array of Yin Xarray of X换句话说,外部维度只是动态数组(指向)的动态数组,如下所示:

rrrrllll000011112222...
        ^

其中元素 0000、1111 等现在是指向独立分配的动态数组的 32 位指针。但是,这样做会因为我的麻烦而导致访问冲突。这显然不是 Delphi 期望我做的。谁能向我解释我应该怎么做?

4

2 回答 2

8

动态数组是指向打包元素块的指针。

因此,TSomeRecord 的数组数组是指向指针数组的指针,每个指针都指向具有 length(array[firstlevel]) 元素的块内存,如果没有元素,则为 nil。

换句话说,您假设的内容大致正确,另外零元素的数组为零。请注意,除非您真的知道自己在做什么,否则您不应该自己更改引用计数和长度。

如果没有示例代码,很难确定导致崩溃的原因。请记住,对于所有自动 Delphi 类型(除了宽字符串),所有动态内存都必须由 delphi 内存管理器分配。

尝试使用您正在连接的任何语言的内存管理器是不可能的。

于 2009-10-05T09:44:53.780 回答
0

语言指南(曾经作为非常有用的印刷手册提供,现在很难在在线帮助中找到此信息)指出:

“存储多维数组,最右边的维度首先增加。”

因此AFAIK你没有一个指针数组 - 只是每个维度数据一个接一个,从最右边开始,我想它更快,因为没有更多的间接。

于 2009-10-05T22:29:32.543 回答