我使用德爾福XE和Windows 7 Matlab的2012B編譯德爾福XE創建使用MCR用於在Matlab使用編譯好的DLL
我試着寫一些包裝函數與創建這樣的DLL文件結構數組Delphi 2012b編譯器可以更容易地從Delphi XE調用。我發現在使用MCR時我應該使用_proxy函數,這確實允許我成功地調用幾個函數。我也可以通過將字符串作爲PAnsiChar傳遞給Matlab而沒有任何問題。
我目前正在試圖建立一個StructArray一些字段名。 正如我已經成功地創建數字數組和矩陣,我敢肯定,前2個參數確定。我期望最後一個導致錯誤,但我不知道如何解決這個(還)。看看Matlab的幫助和示例文件,我正在做什麼應該做的。顯然我錯了...
我知道,用Matlab r13我們必須通過字段名爲array[0..n] of pAnsiChar
而不是array of pAnsiChar
。我在這裏嘗試了這一點也無濟於事。
有人能告訴我,如果我確實已經做出了正確的函數映射到mxCreateStructArray(_730_proxy),如果我傳遞的參數如預期?
type
mxArray = pointer;
// mxArray *mxCreateStructArray(mwSize ndim, const mwSize *dims, int nfields, const char **fieldnames);
function MCRdll_CreateStructArray(aDimCount: integer; aDims: pointer; aFieldCount: integer; aFields: PPAnsiChar): mxArray; cdecl; external 'mclmcrrt8_0.dll' name 'mxCreateStructArray_730_proxy';
function MCR_CreateStructArray(aFieldNames: TArray<string>): mxArray;
var
i: integer;
lstDims: array of integer;
lstNames: array of pAnsiChar;
begin
SetLength(lstNames, Length(aFieldNames));
for i := 0 to Length(aFieldNames) - 1 do
lstNames[i] := ToPAnsiChar(aFieldNames[i]); //Creates a new PAnsiChar with the content of aFieldNames[i]
SetLength(lstDims, 2);
lstDims[0] := 1;
lstDims[1] := Length(aFieldNames);
//This call raises an "External Exception" from Matlab.
Result := MCRdll_CreateStructArray(Length(lstDims), @lstDims, Length(lstNames), @lstNames);
end;
我複製了一個名爲ToPAnsiChar的現有函數來完成轉換。經過我的調查,我確實打算將包裝器更改爲函數ToPAnsiArray(字符串:TArray):TArray 'lstDims'的奇怪之處在於它確實適用於其他調用,例如'mxCreateNumericArray'。你知道這是爲什麼嗎? –
deColaman
正如問題'@ lstDims'映射到'int **'所寫的那樣。它從來沒有工作。也許你之前使用的是固定長度的數組。 –