这就是我想要实现的目标:
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->road
是std::map<std::string, double>
,而this->roadFields
是std::vector<std::string>
,其中包含.mat文件中ROAD结构的所有字段名称。
我在mxGetPr
调用中遇到访问冲突,我想这是因为返回的数组有不同的长度?我想我需要以某种方式重新分配内存,但我无法弄清楚如何。
答案 0 :(得分:2)
mxGetFieldByNumber()
返回NULL。由于你的段错误发生在mxGetPr()
上,它表明你传递的东西是非法的,非法的东西可能是NULL。
此函数的documentation表示导致NULL返回的常见错误是:
检查mxGetFieldByNumber()
的返回值,如果确实为NULL,请查看上面的列表并检查输入条件。
答案 1 :(得分:0)
我解决了。部分问题是一个愚蠢的错误,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);
感谢所有帮助。