pointers — ошибка сегментации при создании экземпляра структуры

У меня проблема при попытке загрузить 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;
}

Я довольно долго пытался найти проблему, но вообще не получаю информации об ошибке. Я знаю, что способ назначения вершин и граней немного утомителен, любые предложения для более аккуратного кода приветствуются. Скажите, пожалуйста, нужна ли какая-либо дополнительная информация, заранее большое спасибо.

1

Решение

Сначала вы делаете

obj->numGroups = 0;

Тогда в некоторых случаях вы делаете

obj->groups[obj->numGroups-1]

без повышение obj->numGroupsЭто означает, что вы получаете доступ к массиву за пределами. Вы также не проверяете, была ли выделена запись массива или нет.


Другая проблема заключается в том, что str только один персонаж, а ваш fscanf сканирует на строку, которая поставит по крайней мере два символа в строке: фактический символ, который вы хотите а потом символ конца строки. Вы также получаете доступ str[1] позже в цикле, который выходит за пределы. Все это неопределенное поведение и может привести к сбоям.

1

Другие решения

На вашем месте я бы держался подальше от различных fscanf(), sscanf()и др. функции для обработки ввода. Они могут быть рискованными в использовании. Видеть это страница руководства fscanf как я думаю, вы принимаете полную строку из fscanf () и, возможно, вы ее не получаете.

Подход, который я выбрал бы, был бы следующим: (1) чтение полной строки из файла, используя fgets() и (2) использовать парсер рекурсивного спуска (см. также другое статья о разборе рекурсивного спуска), чтобы разобрать строку, строящую объект, как я иду.

0

По вопросам рекламы [email protected]