2012-11-22 60 views
3

我必須調用下面的C-庫函數出的matlab:如何在Matlab中將兩個參數及其大小傳遞給C函數?

bool PI_OAD (int ID, const int* channel, const double* pdValueArray, int iArraySize) 

和參數iArraySize應陣列通道和pdValueArray的大小。

參數通道和pdValueArray給出如下:

pChannel = uint8(channel); 
pStep = uint16(step); 

而且我calllib命令是:

calllib(Controller, 'PI_OAD', ID, pChannel, pStep, int32(24)); 

它不工作。

我不知道如何正確傳遞參數通道的大小和步驟。有人有想法嗎?謝謝!

編輯: 感謝所有的答案,我會在下週二我嘗試你的建議,當我回到工作。

一些附加信息:

我所需要的功能PI_OAD通過硬件接口來操作的壓電元件中,信道爲1的時間最多,因爲我只有一個軸線,和步驟是我想設置在電壓壓電元件。

它不起作用意味着我從界面中得到一些錯誤。據我記得,我得到一個'命令是很長',然後是'未知命令'錯誤。

+0

pChannel和pStep是指針,你不應該傳遞libpointer嗎?像pChannel = libpointer('uint8Ptr',channel); ? – Shai

+0

matlab手冊說,Matlab將轉換爲正確的pointertype。 –

+0

1.當你說「它不工作」究竟發生了什麼?分段故障?錯誤信息?錯誤的輸出? 2.根據函數頭信道預計爲int *,pdValueArray應該是double *。那麼,爲什麼要轉換'pChannel = uint8(channel)'和'pStep = uint16(step)'?不應該是'pChannel = int32(channel)'和'pStep = double(step)'? – Shai

回答

0

您需要編寫一個MATLAB MEX-Wrapper,它是一個C函數,它將採用MATLAB定義的類型(通常爲mxArray's)並將它們轉換爲正確的類型。

MEX功能並不難寫,看

http://www.mathworks.com/help/matlab/creating-c-c-and-fortran-programs-to-be-callable-from-matlab-mex-files.html;jsessionid=874554659556527535e9ea9a084c

和:

http://www.mathworks.com/help/matlab/apiref/mexfunction.html

有很多,你可以在MATLAB文檔中遵循的例子。他們中的許多人都接近你想要的東西。

+0

有趣的解決方案,但'calllib'的樂趣在哪裏? – Shai

+0

AH。我不知道calllib。現在我知道了。我的答案已過時... – Pete

1

你在你的代碼的一些錯誤:

  • channel被聲明爲int *,而你傳遞的uint8
  • pdValueArray數組被聲明爲double *,而你通過uint16

所以傳遞大小不是你的問題 - 傳遞其他變量是。

下面是一個簡單的dll我寫道:

int PI_OAD (int ID, const int* channel, const double* pdValueArray, int iArraySize){ 
    int i; 
    mexPrintf("ID %d, size %d\n", ID, iArraySize); 
    for(i=0; i<iArraySize; i++) 
    mexPrintf("%lf ", pdValueArray[i]); 
} 

這是我如何把它從MATLAB

lib = loadlibrary('libtestlib.so','testlib.h'); 

ID=int32(10); 
pChannel = int32([1:10]); 
pStep = double([1:10]); 
calllib('libtestlib', 'PI_OAD', ID, pChannel, pStep, int32(numel(pChannel))); 

unloadlibrary('libtestlib'); 

這裏是輸出

ID 10, size 10 
1.000000 2.000000 3.000000 4.000000 5.000000 6.000000 7.000000 8.000000 9.000000 10.000000 

一切工作正常!

+0

爲什麼要將iArraySize作爲'24'傳遞?不應該是'int32(numel(pChannel))'?在第10個元素之後,你會在輸出中獲得有趣的數字!這可能會導致訪問衝突和seg錯誤! – Shai

+1

@Shai哦,當然。你是對的。這是來自OP代碼的複製粘貼。改變了,謝謝! – angainor

相關問題