1

2D配列をファイルに書き込むために必要なプロシージャを記述します。コードは次のとおりです。

void Level::loadLevel(){
    int levelmap[15][9];
    FILE *fp = fopen("resources/lvls/loc1.map", "wb");  
    for (int i=0;i<=15;i++){
        for(int j=0;j<=9;j++){
            levelmap[i][j]=i+j;
            }
    }
    char asd[255];

    for (int i=0;i<=15;i++){
        for(int j=0;j<=9;j++){
            char *buffer=itoa(levelmap[i][j],asd,1);
            fwrite(buffer,2,sizeof(buffer),fp);
            };
        };
    fclose(fp);
 }

コンパイル中ですが、呼び出し時にこの関数アプリケーションがクラッシュします。私はそれmenu_selectorをcocs2d-xメニュー項目の属性と呼んでいます。なぜクラッシュするのですか?

更新:ファイルストリーム広告に変更され、優れた機能を発揮します

4

3 に答える 3

3

上記の間違いだけでなく...

  1. フォルダ「resources/lvls/」が存在することを確認してください。fopenはフォルダを作成しません!

  2. itoaの3番目のパラメーター-基数(値のベース。2〜36の範囲である必要があります。)

  3. 本当にバイナリ形式のintの文字列表現として書きたいですか?バイナリ出力用にファイルを開くということは、そこに生データを書き込むことを意味します。次のコードを使用して、int配列をファイルに保存およびファイルからロードできます。

'

void saveLevel()
{
    int levelmap[15][9];
    FILE *fp = fopen("loc1.map", "wb");  
    for (int i=0;i<15;i++){
        for(int j=0;j<9;j++){
            levelmap[i][j]=i+j;
        }
    }

    for (int i=0;i<15;i++){
        fwrite(levelmap[i], sizeof(int), _countof(levelmap[i]), fp);
    };

    fclose(fp);
}

void loadLevel()
{
    int levelmap[15][9];

    FILE *fp = fopen("loc1.map", "rb");  

    for (int i=0;i<15;i++){
        fread(levelmap[i], sizeof(int), _countof(levelmap[i]), fp);
    };
    fclose(fp);

}

'

于 2012-12-07T09:54:50.047 に答える
1

いくつかの場所でアレイの境界を超えているため、メモリが破損しています。例えば:

int levelmap[15][9];
//           ^^  ^

// ...

for (int i=0;i<=15;i++){
    //        ^^^^
    for(int j=0;j<=9;j++){
                 ^^^
        levelmap[i][j]=i+j;
    }
}

配列インデックスのループ条件での使用<=は危険信号です。forほとんどの場合、それは間違ったことなので、コードを見るときは常に注意深くチェックしてください。

また:

char *buffer= /* ... */;
// ...
fwrite(buffer,2,sizeof(buffer),fp);

sizeof(buffer)ポインタのサイズはバッファ内の文字数とは関係がないため、思ったとおりには機能しません。そして、なぜあなた2は要素のサイズとして渡すのfwrite()ですか?

于 2012-12-07T09:41:36.020 に答える
0
char *buffer=itoa(levelmap[i][j],asd,1);

itoaの最後のparamはbaseです。1ではなく10にする必要があります(http://www.cplusplus.com/reference/cstdlib/itoa/を参照)


void Level::loadLevel(){
    int levelmap[15][9];
    FILE *fp = fopen("resources/lvls/loc1.map", "wb");  
    for (int i=0;i<=15;i++){
        for(int j=0;j<=9;j++){
            levelmap[i][j]=i+j;
            }
    }

i==15およびj==9の場合、配列の境界を超えています(levelmap[15][9]はlevelmap[0..14][0..8]を意味します)

ループの条件をi<15およびj<9に変更します。

于 2012-12-07T09:25:40.417 に答える