什么是X的动态数组的一个Delphi动态数组的内存布局?
-
19-09-2019 - |
题
我试图从C#调用一个Delphi DLL的过程。该过程需要的呼叫者预先分配并输入一个array of array of TSomeRecord
,其中它然后将操纵TSomeRecord
元素作为返回结果的手段。所以,我需要手工工艺X.点击阵列的德尔福动态数组
现在,我已经在这里找到一个动态array of X
由指针动态数组的第一个元素的,并且该第一元件具有预先考虑所述阵列的引用计数和长度(元素数)(32位整数),并将该元件被内联和连续存储的,使整个东西看起来像这样在存储器中:
rrrrllll000...000111...12... ^
与RRRR参考计数,LLLL长度,0123的元素,和^其中指针指向。这证实了;我测试了它和它的作品。结果
多维动态数组我假定我可以替代array of Y
在X
的array of X
,换句话说,所述外尺寸是简单地(指针)动态数组,像这样的动态数组:
rrrrllll000011112222... ^
,其中现在的元素0000,1111等都是独立地分配的动态数组32个指针。这样做,这样,不过,我挣的访问冲突为我的烦恼。这显然不是德尔福如何希望我做到这一点。任何人都可以向我解释我是如何的上午的应该这样做吗?
解决方案
一个动态阵列是一个指向元件的填充块。
因此TSomeRecord的阵列的阵列是一个指向指针数组,如果没有,则其中的每一个指向与长度块存储器(阵列[firstlevel])元件,或为零。
在换句话说,假设你是什么大致正确的,与加入与零个元素的数组是零。请注意,你不应该改变引用计数和长度自己,除非你真的知道自己在做什么。
确定是什么原因导致你的崩溃将是很难不示例代码。请注意的是,作为所有的的自动化的Delphi类型(除WideString的),所有动态存储器必须由Delphi的内存管理器来分配。
尝试,使用的任何你接口到语言是不可能的存储器管理器。
其他提示
在语言指南(一次可作为非常有用的印刷手册,现在发现的在线帮助这个信息是非常困难的)规定:
“多维数组存储有最右边的维度第一增大。”
由此AFAIK你没有指针数组 - 简单地接连每个维度数据的一个,从最右边的一种起始,我想这是更快,因为没有更多的间接寻址
。