Calling a DLL generated by MatLab from VC
Afficher commentaires plus anciens
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?
Réponses (1)
Titus Edelhofer
le 26 Juil 2012
Modifié(e) : Titus Edelhofer
le 26 Juil 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 commentaires
iar
le 26 Juil 2012
Titus Edelhofer
le 26 Juil 2012
Hi Iar,
my fault: I've been programming too much in object oriented languages the last days ... I changed the call to mxGetPr to be correct C syntax now.
Thanks, Titus
iar
le 26 Juil 2012
Titus Edelhofer
le 26 Juil 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
le 29 Juil 2012
Catégories
En savoir plus sur Variables dans Centre d'aide et File Exchange
Produits
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!