我试图从c代码调用matlab函数,试图遵循我可以通过网络得到的任何东西。我正在使用在Ubuntu 14.04上运行的matlab版本R2014a。让我们说函数testfun.m
如下所示 -
function c = testfun(a, b)
disp('doing testfun()');
c = a + b ;
disp('done testfun()');
end
现在我调用了mcc
来制作c-wrapper -
user@pc:/tmp/test$ mcc -B csharedlib:libtestfun testfun.m -v
然后我有libtestfun.c
,libtestfun.h
和libtestfun.so
个文件,我创建了一个调用testfun()
的c文件 -
#include <stdio.h>
#include "libtestfun.h"
int main()
{
libtestfunInitialize();
mxArray *a, *b, **c;
double *x ;
a = mxCreateDoubleScalar(4); x = mxGetPr(a);
printf("a = %.1f\n", x[0]);
b = mxCreateDoubleScalar(5); x = mxGetPr(b);
printf("b = %.1f\n", x[0]);
*c = mxCreateDoubleMatrix(1, 1, mxREAL);
mlfTestfun(1, c, a, b);
x = mxGetPr(c[0]);
printf("c = %.1f\n", x[0]);
libtestfunTerminate();
return 1 ;
}
我正在使用 -
构建可执行文件user@pc:/tmp/test$ mbuild test.c libtestfun.c -L.libtestfun.so -v
事实是该函数的签名为
LIB_libtestfun_C_API bool MW_CALL_CONV mlfTestfun(int nargout, mxArray** c, mxArray* a, mxArray* b);
如果您注意到,您可以看到输出c
被声明为mxArray**
,因此我在mxArray **c
文件中使用test.c
。
但是当我运行可执行文件时,我只看到0.0
作为c
的值,但它应该是9.0
-
user@pc:/tmp/test$ ./test
a = 4.0
b = 5.0
c = 0.0
发生了什么事?
为什么输出总是在函数签名中声明为mxArray**
?
为什么我无法在disp()
中看到testfun.m
函数产生的输出?
任何帮助将不胜感激。
答案 0 :(得分:1)
您已正确声明state.getCities()
。它也应该是c
。签名中的双指针是因为它是输出。当您编写mxArray*
时,您将取消引用未初始化的指针。
您需要以下代码:
*c