最近又在做一个CMOS相机和nm级位移台配合工作的问题
相机公司只提供了C++的SDK,所以我又要把它转成matlab的,因为之前做过一次的所以这次也是轻车熟路
相机的地址传入传出,一般来说相机地址都是自定义的类型,但绝大多数都是指针的,而mex的函数传的也是地址,也就是说传入传出也只有一次寻址,这个是比较简单的、
在之前的文章中有说明
接下来说说目前的问题
首先是结构体定义:
然后m_frame定义:
可以看得出来m_frame是一个结构体,而mex编译的时候是以地址方式传出的,所以,首先,我们传出的时候是这样传出的:
int *out1;
plhs[0] = mxCreateNumericMatrix(1, 1,mxINT32_CLASS , mxREAL);
out1 = (int *)mxGetPr(plhs[0]);
*out1 = int(&m_frame);
其实这么写是有风险的,但是目前的出错率比较低,我目前也没有找到合适的解决方法,以后找到了再开一篇文吧
可以看得出来,我们传入的指向m_frame地址的指针所在的地址、
当我们想要对结构体进行赋值的时候,需要二次寻址,先贴出代码:
unsigned int k;
k =mxGetScalar(prhs[3]);
m_frame = *(TUCAM_FRAME *)(int*)k;
解释一下:
mxGetScalar是直接取值,也就是K是m_frame所在的地址,所以我们直接对其寻址就可以达到我们的目的
加入我们使用*k进行寻址,会报错,说是非法间接寻址
百思不得其解之际,想到了这么一串代码
int data = *(int *) 0x11111;
试了一下果然不行,嗯,我习惯了,想了一下,应该是类型不匹配
用m_frame的类型把括号里的类型替换点,类型统一就好了