c++ - matlab c shared library: capturing matlab function output with mxArray*/mxArray** -


i trying call matlab function c code, trying follow whatever can on web. using matlab version r2014a running on ubuntu 14.04. lets function testfun.m looks below --

function c = testfun(a, b)     disp('doing testfun()');     c = + b ;     disp('done testfun()'); end 

now invoked mcc make c-wrapper --

user@pc:/tmp/test$ mcc -b csharedlib:libtestfun testfun.m -v 

then have libtestfun.c, libtestfun.h , libtestfun.so files , create c file calls testfun() --

#include <stdio.h> #include "libtestfun.h"  int main() {     libtestfuninitialize();      mxarray *a, *b, **c;     double *x ;      = 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 ; } 

and building executable --

user@pc:/tmp/test$ mbuild test.c libtestfun.c -l.libtestfun.so -v 

the fact signature function reads

lib_libtestfun_c_api bool mw_call_conv mlftestfun(int nargout, mxarray** c, mxarray* a, mxarray* b); 

if notice, can see output c declared mxarray**, therefore using mxarray **c in test.c file.

but when run executable, see 0.0 value of c, supposed 9.0 --

user@pc:/tmp/test$ ./test  = 4.0 b = 5.0 c = 0.0 

what going on?

why output declared mxarray** in function signature? why can't see outputs produced disp() function in testfun.m ?

any appreciated.

you have declared c incorrectly. should mxarray*. double pointer in signature because output. when write *c de-referencing uninitialized pointer.

you need following code:

#include <stdio.h> #include "libtestfun.h"  int main() {     libtestfuninitialize();      mxarray *a;     mxarray *b;     mxarray *c = null; // output arg must initialized null     double *x ;      = mxcreatedoublescalar(4); x = mxgetpr(a);     printf("a = %.1f\n", x[0]);     b = mxcreatedoublescalar(5); x = mxgetpr(b);     printf("b = %.1f\n", x[0]);      if (mlftestfun(1, &c, a, b))     {             x = mxgetpr(c);         printf("c = %.1f\n", x[0]);     }      libtestfunterminate();     return 1 ; } 

Comments

Popular posts from this blog

c - Bitwise operation with (signed) enum value -

xslt - Unnest parent nodes by child node -

YouTubePlayerFragment cannot be cast to android.support.v4.app.Fragment -