例外

2011-12-21 14 views
1

EDIT取得、フロートへのポインタへのポインタを使用して、[3]のsscanfで:私は、コードはsscanf関数部に当たったら例外

typedef float vector[3] 

int mainLoaderFunc() { 

    char* memory = NULL; 
    size_t size = loadFile(fileName, &memory); // load model file into memory, this works, tested and true 

    // create vector arrays 
    vector *vertexArray = NULL;   
    vector *normalArray = NULL;   
    vector *textureArray = NULL;   

    loadArrays(size, memory, &vertexArray, &normalArray, &textureArray); 

    // do other stuff with arrays 

} 

void loadArrays(size_t size, char *memory, vector **vertexArray, vector **normalArray, vector **textureArray) { 

    int numVerts = 0; 
    int numNormals = 0; 
    int numTextures = 0; 

    char* p = memory;   // pointer to start of memory 
    char* e = memory + size; // pointer to end of memory 

    // count verts, normals, textures for memory allocation 
    while (p != e) { 
     if (memcmp(p, "vn", 2) == 0) { 
      numNormals++; 
     } else if (memcmp(p, "vt", 2) == 0) { 
      numTextures++; 
     } else if (memcmp(p, "v", 1) == 0) { 
      numVerts++; 
     } 
     while (*p++ != (char) 0x0A); 
    } 

    // allocate memory for vector arrays 
    *vertexArray  = new vector[numVerts]; 
    *normalArray  = new vector[numNormals]; 
    *textureArray  = new vector[numTextures]; 


    int vertexIndex = 0; 
    int normalIndex = 0; 
    int textureIndex = 0; //*** IF BREAK POINT HERE: NO EXCEPTION 

    // load data from memory into arrays 
    while (p != e) { 

     if (memcmp(p, "vn", 2) == 0) { 
      sscanf(p, "vn %f %f %f", normalArray[normalIndex][0], normalArray[normalIndex][1], normalArray[normalIndex][2]); 
      normalIndex++; 
     } else if (memcmp(p, "vt", 2) == 0) { 
      sscanf(p, "vt %f %f", textureArray[textureIndex][0], textureArray[textureIndex][1]); 
      textureIndex++; 
     } else if (memcmp(p, "v", 1) == 0) { 
      sscanf(p, "v %f %f %f", vertexArray[vertexIndex][0], vertexArray[vertexIndex][1], vertexArray[vertexIndex][2]); 
      vertexIndex++; 
     } 
     while (*p++ != (char) 0x0A); 
    } 

} 

:私はそれ以前の相続人SSCCEあまりにあいまいであったので大丈夫例外を取得、私は入れてみた&、と*配列のinfrontしかし、私はいずれかの例外を取得します。

+1

コードの実際のスニペット([SSCCE](http://sscce.org/))を投稿できますか? – AusCBloke

+3

これはC++の多くのポインタです。 'vector'クラスを作成し、参照や(例えば)' boost :: smart_ptr'を使ってコードをクリアすることを検討しましたか?また、 'new []'を使って 'myFunction'でメモリを割り当てるのは混乱しているようですが、なぜそこに' new'を使わないのですか? – Eric

+3

なぜ地球上で..?! –

答えて

0

sscanffloat *を期待しています。 vertexArrayfloat ***であり、vertexArray[i]float **であり、vertexArray[i][j]float*である。しかし、これはvertexArrayvertexの配列へのポインタですので、あなたが望むものではないので、あなたの代わりにこれをしたい:sscanfに渡すあなたに正しいfloat *を取得します

&(*vertexArray)[i][j] 

+0

@eharvest、それは 'sscanf'の仕組みではありません。これが 'printf'の仕組みです。 'sscanf'はポインタを取らなければなりません。さもなければ、' float'を書き出すことができません! – MSN

+0

申し訳ありませんがミス...集中力の欠如 –

3

私はあなたがsscanfにアドレスを渡す必要が推測:%fを使用した場合

sscanf(myMemChunk, "%f %f %f", &myVector[i][0], &myVector[i][1], &myVector[i][2]); 
+0

私はこれを行うとまだ例外が発生します...多分問題は私がそれが何ではないかと思います。 SSCCEが追加されました。 – kbirk

+0

これは正しくありません。 'float ** 'ではなく' sscanf'に 'float **'を渡します。 – MSN