简体   繁体   中英

Casting Issue in MATLAB C/MEX

I'm passing an array of complex doubles from matlab into a cmex file in order to perform a sequential operation on them. When I cast the number retrieved from the mxArray to a double, it seems to be misinterpreting the code.

double *Xr, *Xi;
Xr = mxGetPr(IN_0);
Xi = mxGetPi(IN_0);
for(i = 1; i < 20; i++){
    printf("%d: %d+i%d\n",i,*Xr,*Xi);
    Xr++;Xi++;
}

This yields very high values such as the one that follows

15: -803610318+i-1940584014
16: 1832649449+i300289408
17: -1676226884+i1653608050
18: -88066604+i-2135293182

I noticed if I replace the %d with a %f so that printf reads it as a floating point number, the output matches my matlab variable that is being passed in

   printf("%d: %f+i%f\n",i,*Xr,*Xi);

Yields

15: -0.000538+i0.000221
16: -0.000602+i0.000596
17: 0.000550+i-0.000179
18: -0.000371+i-0.001420

This is correct.

However, if I try to change the type of my pointer to float I get the incorrect answer again.

float *Xr, *Xi;
Xr = mxGetPr(IN_0);
Xi = mxGetPi(IN_0);
for(i = 1; i < 20; i++){
    printf("%d: %f+i%f\n",i,*Xr,*Xi);
    Xr++;Xi++;
}

Yields

15: 4596027085627908600000000000000.000000+i-0.000000
16: -0.392485+i0.362957
17: -82893360.000000+i0.000000
18: 0.412054+i-0.383178

To me it looks as if the data is coming through encoded in a floating point representation, but is seen by the compiler as a double, causing it to be casted to float when assigned to a float type. Other than that I do not know how to solve this problem and help would be appreciated.

Using a %d specifier with anything other than an int argument (or something that promotes to int ) is undefined behavior.

For your third example, casting pointers does not convert the underlying data. You are assigning a pointer to double to a pointer to float , and dereferencing that is undefined behavior.

The data coming from Matlab is an array of double s and must be treated that way. If you need to, you can convert the elements one at a time to another type.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM