如何在Matlab中将两个参数及其大小传递给C函数?

时间:2012-11-22 07:52:06

标签: c matlab

我必须用Matlab调用以下C库函数:

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

并且参数iArraySize应该是数组通道和pdValueArray的大小。

参数channel和pdValueArray如下:

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

我的calllib命令是:

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

它不起作用。

我不知道如何正确传递参数通道的大小和步骤。有人有想法吗?谢谢!

编辑: 感谢所有答案,我会在下周二回来工作时尝试你的建议。

其他一些信息:

我需要PI_OAD功能通过硬件接口操作压电元件,通道最长时间为1,因为我只有一个轴,而step是我想在压电元件上设置的电压。

它不起作用意味着我从界面中得到一些错误。据我所知,我得到一个'命令是长的'然后是'未知命令'错误。

2 个答案:

答案 0 :(得分: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 

一切正常!

答案 1 :(得分:0)

你需要编写一个MATLAB MEX-Wrapper,它是一个C函数,它将采用MATLAB定义的类型(通常是mxArray)并将它们转换为正确的类型。

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文档中遵循许多示例。其中许多都接近你想要的。