我必须用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是我想在压电元件上设置的电压。
它不起作用意味着我从界面中得到一些错误。据我所知,我得到一个'命令是长的'然后是'未知命令'错误。
答案 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/apiref/mexfunction.html
您可以在MATLAB文档中遵循许多示例。其中许多都接近你想要的。