0

構造体のベクトルをファイルに書き込もうとすると問題が発生します。

void Obj::Write(wchar_t const* filename)
{
    FILE* file;
    errno_t err = _wfopen_s(&file, filename, L"wb");
    assert (file && !err);

    assert (sizeof(VertexData_VNT) == 32);
    assert (vertexArray.size() == 1654);

    //unsigned int const vertexCount = vertexArray.size();
    //if (fwrite(&vertexCount, sizeof(unsigned int), 1, file) != 1) {
    //    perror ("fwrite(&vertexCount, ...) error:");
    //}

    if (fwrite(&vertexArray, sizeof(VertexData_VNT), vertexArray.size(), file) != vertexArray.size()) {
        perror ("fwrite(&vertexArray, ...) error:");
    }

    fclose(file);
}

ここで、頂点配列は次のように定義されます。

std::vector<VertexData_VNT> vertexArray;

VertexData_VNT は、float のみを含む 32 バイトの構造体です。

ほとんどの場合、fwrite は「無効な引数」エラーで失敗し、何も書き込みません。うまくいくこともありますが...それは私には意味がありません。

上記の行のコメントを外すと、代わりに同じ fwrite ステートメントで「アクセス違反読み取り場所」例外が発生します。fwrite.c の 139 行目の memcpy に問題があるようです。

誰にもアイデアはありますか?

4

2 に答える 2

2

そのはず:

&vertexArray[0]

if (fwrite(&vertexArray[0], sizeof(VertexData_VNT), vertexArray.size(), file) != vertexArray.size()) {
    perror ("fwrite(&vertexArray, ...) error:");
}

ベクターオブジェクトのアドレスを取得しています。要素のアドレスではありません。

vector の要素は連続した空間にあることが保証されているため、最初の要素のアドレスを取得することは、C 配列の先頭のアドレスに似ています。

于 2013-01-20T19:26:51.663 に答える
2

&vertexArray[0]代わりに試してください&vertexArray

std::vectorスペースを動的に割り当てます。データはオブジェクトがある場所ではなくstd::vector、ヒープのどこかにあり、ベクトルは通常、いくつかのポインターしか保持しません。

于 2013-01-20T19:26:59.997 に答える