尝试从wavefront文件加载3d对象并将其保存到我预定义的结构中时遇到问题。我得到一个分段错误错误,我假设我的指针出错了。以下是结构:
struct vertex
{
float x,y,z;
};
// the idea is to split each object into groups in order to animate
// them seperately
struct group
{
float xpos, ypos, zpos;
float xrot, yrot, zrot;
int numVertices;
int numFaces;
//all verteces
vertex vertices[MAX_NUM];
//faces-- a face is made up of one vertex from each of these arrays
vertex vertexOne[MAX_NUM];
vertex vertexTwo[MAX_NUM];
vertex vertexThree[MAX_NUM];
};
struct object
{
float xpos, ypos, zpos;
float xrot, yrot, zrot;
int numGroups;
group * groups[MAX_NUM];
};
这是应该加载对象的函数:
object * loadObject(char * path)
{
object * obj;
obj = new object;
char str[1];
obj->numGroups = 0;
FILE * file = fopen(path, "r");
while(fscanf(file, "%s", str) != EOF)
{
if(str[0] == 'o')
{
obj->numGroups++;
obj->groups[obj->numGroups-1] = new group;
obj->groups[obj->numGroups-1]->numVertices = 0;
obj->groups[obj->numGroups-1]->numFaces = 0;
}
else if(str[0] == 'v' && str[1] == ' ')
{
obj->groups[obj->numGroups-1]->numVertices++;
sscanf(str, "v %f %f %f",
&(obj->groups[obj->numGroups-1]->vertices[obj->groups[obj->numGroups-1]->numVertices-1].x),
&(obj->groups[obj->numGroups-1]->vertices[obj->groups[obj->numGroups-1]->numVertices-1].y),
&(obj->groups[obj->numGroups-1]->vertices[obj->groups[obj->numGroups-1]->numVertices-1].z));
}
else if(str[0] == 'f')
{
int one, two, three;
obj->groups[obj->numGroups-1]->numFaces++;
sscanf(str, "f %i/%*i/%*i %i/%*i/%*i %i/%*i/%*i", &one, &two, &three);
obj->groups[obj->numGroups-1]->vertexOne[obj->groups[obj->numGroups-1]->numFaces-1] = obj->groups[obj->numGroups-1]->vertices[one-1];
obj->groups[obj->numGroups-1]->vertexTwo[obj->groups[obj->numGroups-1]->numFaces-1] = obj->groups[obj->numGroups-1]->vertices[two-1];
obj->groups[obj->numGroups-1]->vertexThree[obj->groups[obj->numGroups-1]->numFaces-1] = obj->groups[obj->numGroups-1]->vertices[three-1];
}
}
fclose(file);
return obj;
}
我已经尝试了很长一段时间来找到问题,但我根本没有得到关于错误的信息。我知道我分配顶点和面的方式有点单调乏味,对于整洁的代码的任何建议都非常受欢迎。如果需要任何其他信息,请告诉我,非常感谢您提前。
答案 0 :(得分:1)
首先你做
obj->numGroups = 0;
然后在某些情况下你做
obj->groups[obj->numGroups-1]
没有增加obj->numGroups
,这意味着你可以访问超出界限的数组。您也不会检查数组条目是否已分配。
另一个问题是str
只有一个字符,而你的fscanf
会扫描一个字符串,它会将至少两个字符放入字符串中:实际字符你想要然后字符串终止符。您也可以在循环中稍后访问str[1]
,这是超出范围的。所有这些都是未定义的行为,可能导致崩溃。
答案 1 :(得分:0)
如果我是你,我会远离各种fscanf()
,sscanf()
等功能来处理输入。他们可能很冒险使用。看到这个fscanf man page因为我认为你假设fscanf()中有一个完整的字符串,你可能没有得到它。
我将采取的方法是以下步骤:(1)使用fgets()
从文件中读取完整的字符串,然后使用recursive descent parser(另请参阅另一个article on recursive descent parsing })在我去的时候解析构建对象的字符串。