2009-10-05 54 views
5

我想從C#中調用Delphi DLL中的過程。該過程期望調用者預先分配並輸入array of array of TSomeRecord,然後它將操縱TSomeRecord元素作爲返回結果的手段。所以,我需要手工製作動態數組的動態數組X.
現在,I have found here一個動態的array of X由一個指向動態數組的第一個元素的指針組成,並且第一個元素有一個引用計數和長度預先考慮所述陣列的(32位整數),並且該元素被內聯和連續存儲的,使整個東西看起來像這樣在存儲器(元素的數量):什麼是動態數組X的Delphi動態數組的內存佈局?

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

與RRRR參考計數,llll長度,0123元素,以及^指針指向的地方。這顯示出來;我已經測試過它,它工作。
對於多維動態數組我假定我可以替代array of Yarray of XX,換句話說,所述外尺寸是簡單地(指針)動態數組,像這樣的動態數組:

 
rrrrllll000011112222... 
     ^

其中元素0000,1111等現在是指向獨立分配的動態數組的32位指針。然而,這樣做會使我的麻煩遭到侵犯。這顯然不是德爾福如何期望我做到的。任何人都可以向我解釋我如何上午應該這樣做?

回答

8

動態數組是指向一個打包的元素塊的指針。

因此,TSomeRecord數組的數組是指向指向數組的指針,每個指針指向一個長度爲(array [firstlevel])元素的塊存儲器,如果沒有則指向nil。

換句話說,你所假設的是大致正確的,此外,零元素的數組是零。請注意,除非你真的知道你在做什麼,否則你不應該改變引用次數和長度。

如果沒有示例代碼,確定導致崩潰的原因將很困難。請記住,至於全部自動化Delphi類型(除了寬字符串),所有動態內存必須由delphi內存管理器分配。

嘗試使用內存管理器的任何語言,你連接到是不可能的。

+0

感謝您的回答。我意識到這可能更容易診斷(示例)代碼,但我沒有;只有程序的簽名。該DLL是第三方黑匣子。 – 2009-10-05 11:14:14

+0

然後,我可以給你的唯一建議是堅持這樣一個原則,即誰分配也必須釋放,或在德爾福Delphi包裝DLL。exe(comserver)或dll首先從界面中刪除自動化類型 – 2009-10-05 11:48:13

0

語言指南(一次可作爲非常有用的印刷手冊,現在發現的聯機幫助是很難在這個信息)指出:

「多維數組存儲最右邊的維先增加。」

因此AFAIK你還沒有一個指針數組 - 從最右邊開始一個接一個地從每個維數據開始,我猜這個數據更快,因爲沒有更多的間接指針。

+0

LG片段是關於靜態數組,而問題是關於動態數組。 – 2009-10-06 10:02:11

+0

你說得對。我已經檢查了手冊,雖然動態數組的內存佈局沒有詳細說明,但它說dynarray可以是「非矩形」的,我猜想實現它的唯一方法是將anohter動態數組作爲「外層」陣列。儘管如此,訪問內部網頁相當緩慢。 – 2009-10-11 13:59:30