【发布时间】:2010-10-28 19:20:37
【问题描述】:
我正在读取一个二进制数据文件,该文件是通过在 Matlab m-file 中调用以下行来编写的:
disp(sprintf('template = %d', fwrite(fid, template_1d, 'uint8')));
AFAIK,uint8 与 BYTE、unsigned char 和 unsigned short 类型的大小相同。因此,我在 Matlab 调用的 mexfunction 中实例化的 C++ 类中的文件读取方法中编写了以下代码:
template1D = (unsigned short*) malloc(Nimgs*sizeof(unsigned short)); printf("template1D = %d\n", fread(template1D, sizeof(unsigned short), Nimgs, dfile));以下是我如何在类析构函数的辅助函数中释放这个成员变量:
免费((无效*)模板1D);在主 mexfunction 中,当我没有通过调用 mexMakeMemoryPersistent() 函数在 mex 函数完成后将类对象实例化为持久存在内存中时,template1D 会被正确清除,而不会来自 Matlab 的分段错误消息。但是,如果我确实将类实例化为在内存中保持如下:
如果 (!dasani) { dasani = 新的 NeedleUSsim; mexMakeMemoryPersistent((void*) dasani); mexAtExit(ExitFcn); }ExitFcn 为:
无效退出Fcn() { 删除dasani; }然后当我在 free((void*) template1D); 行时,Matlab 给我一个关于分段错误的错误消息。我检查了内存大小,它们似乎是一致的。对于 malloc/calloc/free 函数,当我将 C++ 项目作为 Matlab mex 函数执行时,我使用的是 Matlab 的 mxMalloc/mxCalloc/mxFree 函数。
根据这个描述,你对我有什么进一步的建议来解决这个问题并确保将来不会发生这种情况(或者至少知道将来如何处理类似的问题)?
提前致谢。
--------------添加------ ------------------------------------
以下代码块基本上显示了我的 mex 文件的 jists。 mex 文件基本上是在 Matlab 中运行并从带有一些 Matlab 头文件的 C/C++ 代码编译的可执行文件。
无效退出Fcn() { 删除dasani; } void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) { needle_info 引脚; // 检查 i/o 的数量是否正确 如果 (nrhs != NUMIN) { mexErrMsgTxt("输入参数的数量无效"); } 否则如果 (nlhs != NUMOUT) { mexErrMsgTxt("无效的输出参数个数"); } // 检查输入是否不复杂 如果(mxIsComplex(针)) { mexErrMsgTxt("输入必须是非复数标量整数。"); } // 检查针信息的尺寸是否有效 int needlerows, needlecols; needlerows = mxGetM(NEEDLE); needlecols = mxGetN(NEEDLE);if (needlerows < 1 || needlecols < 6)
{
mexErrMsgTxt("针信息的尺寸无效");
}
浮动 *needlePoint, *yPoint ;
// 获取当前针信息
// 变量的顺序总是如下:
// r, theta, l, rho, alpha, beta
needlePoint = (float*) mxGetData(NEEDLE) ;
pin.r =针点[0];
pin.theta = needlePoint[1];
pin.l =针点[2];
pin.rho =针点[3];
pin.alpha =针点[4];
pin.beta = needlePoint[5];
//// 读取文件输入
**//如果(!dasani)
//{
// dasani = new NeedleUSsim;
// mexMakeMemoryPersistent((void*) dasani);
// mexAtExit(ExitFcn);
//}
dasani = 新的 NeedleUSsim;
删除dasani;**
// 现在发送一个无用的输出(如果在概念上不需要,请去掉它
plhs[0] = mxCreateNumericMatrix(1,1,mxSINGLE_CLASS,mxREAL) ;
yPoint = (float*) mxGetData(plhs[0]) ;
*yPoint = 1;
}
如果用户从命令行或 m 文件脚本的任何位置调用“mexfunction”,此代码将在构建/编译后运行。由“**”包围的 sn-p(当我试图将 sn-p 加粗时)是我正在研究的问题。从第二次看 sn-p,我可能正在为 dasani 指针分配与 Matlab 内存不同的内存(因为内存的范围仅限于 C++ mex 函数,而另一个内存空间的范围可见到 Matlab 程序)。否则,我不确定为什么 Matlab 会抱怨这个问题。
【问题讨论】:
-
(unsigned) short 通常是 2 个字节。
-
您能否提供更多代码以及如何使用它?如果您能详细解释一下 c++ 和 matlabs 如何协同工作,那就太好了。什么时候以及为什么会发生什么?只是一个简单的列表“1。类是在blabla中创建的”等
-
uint8 和 unsigned char 类型都是 1 字节(8 位),而 unsigned short 是 2 字节(16 位)。 FREAD 的文档包含您在读取和写入文件时可能使用的各种数据类型的列表:www.mathworks.com/access/helpdesk/help/techdoc/ref/fread.html。
-
我想对类型进行更正。我用 unsigned char 而不是 unsigned short 测试了程序。 unsigned short 只是最新的 hack 努力,但没有奏效,这与使用 unsigned char 相同。
-
好吧,我猜 dasani 是一些全局指针。 matlab 在哪里使用/使用该指针?我只是看到你的函数调用 new 来分配 NeedleUSsim 类的实例。另外,这个 mex 文件。是matlab编译的还是其他c++编译器编译的?