1

波面ファイルから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;
}

私はかなり長い間問題を見つけようとしましたが、エラーに関する情報がまったく得られません。頂点と面を割り当てる方法が少し面倒であることを私は知っています。きちんとしたコードの提案は大歓迎です。追加情報が必要な場合はお知らせください。よろしくお願いします。

4

2 に答える 2

1

まずあなたがする

obj->numGroups = 0;

その後、場合によっては

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

増加させずobj->numGroupsに、範囲外で配列にアクセスすることを意味します。また、配列エントリが割り当てられているかどうかもチェックしません。


もう 1 つの問題は、str1 文字だけであり、文字列に少なくともfscanf2 文字を入れる文字列をスキャンすることです: 必要な実際の文字文字列終了文字。範囲外のループの後半にもアクセスします。これらはすべて未定義の動作であり、クラッシュにつながる可能性があります。str[1]

于 2012-11-10T12:31:05.940 に答える
0

fscanf()私があなただったら、入力を処理するためのさまざまな、、sscanf()などの関数から離れます。それらは使用するのが難しい場合があります。fscanf() からの完全な文字列を想定していて、取得できない可能性があるため、このfscanf man ページを参照してください。

私がとるアプローチは、次の手順になります。(1) を使用してファイルから完全な文字列を読み取り、fgets()(2)再帰降下パーサーを使用して (再帰降下解析に関する別の記事も参照)、オブジェクトを次のように構築する文字列を解析します。囲碁。

于 2012-11-10T12:45:03.217 に答える