我试图从C#调用一个Delphi DLL的过程。该过程需要的呼叫者预先分配并输入一个array of array of TSomeRecord,其中它然后将操纵TSomeRecord元素作为返回结果的手段。所以,我需要手工工艺X.点击阵列的德尔福动态数组 现在,我已经在这里找到一个动态array of X由指针动态数组的第一个元素的,并且该第一元件具有预先考虑所述阵列的引用计数和长度(元素数)(32位整数),并将该元件被内联和连续存储的,使整个东西看起来像这样在存储器中:

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

与RRRR参考计数,LLLL长度,0123的元素,和^其中指针指向。这证实了;我测试了它和它的作品。结果 多维动态数组我假定我可以替代array of YXarray of X,换句话说,所述外尺寸是简单地(指针)动态数组,像这样的动态数组:

rrrrllll000011112222...
        ^

,其中现在的元素0000,1111等都是独立地分配的动态数组32个指针。这样做,这样,不过,我挣的访问冲突为我的烦恼。这显然不是德尔福如何希望我做到这一点。任何人都可以向我解释我是如何的上午的应该这样做吗?

有帮助吗?

解决方案

一个动态阵列是一个指向元件的填充块。

因此TSomeRecord的阵列的阵列是一个指向指针数组,如果没有,则其中的每一个指向与长度块存储器(阵列[firstlevel])元件,或为零。

在换句话说,假设你是什么大致正确的,与加入与零个元素的数组是零。请注意,你不应该改变引用计数和长度自己,除非你真的知道自己在做什么。

确定是什么原因导致你的崩溃将是很难不示例代码。请注意的是,作为所有的的自动化的Delphi类型(除WideString的),所有动态存储器必须由Delphi的内存管理器来分配。

尝试,使用的任何你接口到语言是不可能的存储器管理器。

其他提示

在语言指南(一次可作为非常有用的印刷手册,现在发现的在线帮助这个信息是非常困难的)规定:

“多维数组存储有最右边的维度第一增大。”

由此AFAIK你没有指针数组 - 简单地接连每个维度数据的一个,从最右边的一种起始,我想这是更快,因为没有更多的间接寻址

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top