使用 mxArray C++动态内存分配

C++ dynamic memory allocation with mxArray

本文关键字:内存 分配 动态 C++ mxArray 使用      更新时间:2023-10-16

这就是我想要实现的目标:

MATFile *file = matOpen(this->filename.c_str(),"r");
mxArray *roadstruct = matGetVariable(file, "ROAD");
mxArray *field;
int i;
for (i = 0; i < this->roadFields.size(); i++) {
field = mxGetFieldByNumber(roadstruct,0,i);
if(field != NULL) {
this->road[this->roadFields.at(i).c_str()] = *mxGetPr(field);
}
}

其中this->roadstd::map<std::string, double>this->roadFields是包含 .mat 文件中 ROAD 结构的所有字段名称的std::vector<std::string>

我在mxGetPr调用中收到访问冲突,我想这是因为返回的数组具有不同的长度?我想我需要以某种方式重新分配内存,但我一直无法弄清楚如何。

mxGetFieldByNumber()为某些错误返回NULL。 由于您的段错误发生在 mxGetPr() 上,这表明您正在传递非法的东西,并且非法的东西可能是 NULL。

此函数的文档指出,导致 NULL 返回的常见错误是:

  • 指定不指向结构 mxArray 的数组指针 pm。调用 mxIsStruct 以确定 pm 是否指向结构 mxArray。
  • 指定指向 mxArray 边界之外的元素的索引。例如,给定一个包含十个元素的结构 mxArray,不能在 C 中指定大于 9(在 Fortran 中指定大于 10 的索引)。
  • 指定不存在的字段编号。调用 mxGetFieldNumber 以确定与给定字段名称对应的字段编号。

检查 mxGetFieldByNumber() 的返回值,如果确实为 NULL,请浏览上面的列表并检查您的输入条件。

我解决了。问题的一部分是一个愚蠢的错误,即std::vector<std::string>中的几个字段名称与 ROAD 结构中的字段名称不完全匹配。但我也必须使用memcpy(现在看起来很明显)。

for 循环的内容现在看起来像这样,它可以工作!

size_t arraySize = mxGetNumberOfElements(field)*sizeof(double);
this->road[this->roadFields.at(i).c_str()] = (double*) malloc(arraySize);
memcpy(this->road[this->roadFields.at(i).c_str()],mxGetPr(field),arraySize);

感谢所有的帮助。