Calling a DLL generated by MatLab from VC

2 views (last 30 days)
iar
iar on 26 Jul 2012
Matlab version is 2009b, and VC version is 2008,the program is calling a DLL generated by the Matlab function normrnd.m to obtain 100 random numbers.
mxArray *norm_out;
mxArray *norm_in[4];
double r[100];
int main()
{
if ( !mclInitializeApplication(NULL,0) )
{
fprintf(stderr, "Could not initialize the application.\n" );
printf("Hello\n");
exit(1);
}
if (!libpkgInitialize())
{
fprintf(stderr, "Could not initialize the library.\n" );
exit(1);
}
norm_in[0] = mxCreateScalarDouble(0.0);
norm_in[1] = mxCreateScalarDouble(1.0);
norm_in[2] = mxCreateScalarDouble(1);
norm_in[3] = mxCreateScalarDouble(100);
norm_out = mxCreateDoubleMatrix(1,100,mxREAL);
mlxNormrnd(1,norm_out,4,norm_in);
memcpy(r,norm_out,100*sizeof(double))
However, the outputs of array r are all zeros. What's the problem?

Answers (1)

Titus Edelhofer
Titus Edelhofer on 26 Jul 2012
Edited: Titus Edelhofer on 26 Jul 2012
Hi,
it's the last memcpy that's wrong: you should not use the datastructure norm_out, but the data of norm_out, i.e.,
memcpy(r,mxGetPr(norm_out),100*sizeof(double))
Alternative: at the top write
double *r = null;
and instead of a memcpy just do
r = mxGetPr(norm_out);
Titus
EDIT: changed mxGetPr call.
  5 Comments
Titus Edelhofer
Titus Edelhofer on 26 Jul 2012
Hi,
of course, the declaration of r as double* or double r[100] is the same.
Nnow I see another mistake: don't initialize norm_out, i.e., replace the line
norm_out = mxCreateDoubleMatrix(...);
by
norm_out = null;
Titus
iar
iar on 29 Jul 2012
The problem is solved when I modify the function: mlxNormrnd(1,norm_out,4,norm_in); into mlxNormrnd(1,&norm_out,4,norm_in);
Thanks for your attention.

Sign in to comment.

Categories

Find more on C Shared Library Integration in Help Center and File Exchange

Tags

Products

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!