这是我要实现的目标:

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->roadFieldsstd::vector<std::string>,其中包含.mat文件中ROAD结构的所有字段名称。

我在mxGetPr调用中遇到访问冲突,我想这是由于返回的数组具有不同的长度?我想我需要以某种方式重新分配内存,但是我还无法弄清楚该怎么做。

最佳答案

对于某些错误,mxGetFieldByNumber()返回NULL。由于您的段错误发生在mxGetPr()上,因此表明您正在向其传递非法内容,并且非法内容可能为NULL。

此函数的documentation表示导致返回NULL的常见错误是:

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

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

    10-08 20:05