質問

私はかなり新しいプログラマんだけど、私は私のGoogle-FUは非常に有能考えると、私は検索数時間を費やしてきます。

私は、バイナリファイル(マジックナンバーとして2バイト、その後、5バイトあたりの「タイル」)から読み込み、単純なSDLアプリケーションを持っています それは、バッファ内の各タイルを表示し、バイトは、X、Y、ID、通過性などを決めます。 本当にただのレベルの負荷だそれはとてもます。

これは、任意のWindowsコンピュータ(テストのWindows Server 2008、7/64および7/32)に罰金を実行します 私はLinux上でそれをコンパイルするとき、それはランダムな位置にランダムタイルが表示されます。 私はそれがRAMで間違った部分から読んだと言うように誘惑されると思いますが、最初の2つのバイトが出た場合、それはエラーを返すと思いますので、私はマジックナンバーをimplimentedます。

私は自分自身から、これを理解してみたいが、(私のラップトップは、Linuxを実行している)それは今地獄に私を悩ませていますし、私は移動中にプログラムすることができない限り、私はそれにさらに多くを進行することはできません。 私は、Linux上でWindows上でmingw32gを++ G ++を使用しています。

bool loadlevel(int level_number)
{
    int length;
    std::string filename;
    filename = "Levels/level";
    filename += level_number+48;
    filename += ".lvl";
    std::ifstream level;
    level.open(filename.c_str(),std::ios::in|std::ios::binary);
    level.seekg(0,std::ios::end);
    length = level.tellg();
    level.seekg(0,std::ios::beg);
    char buffer[length];
    level.read(buffer,length);
    if (buffer[0] == 0x49 && buffer[1] == 0x14)
    {
        char tile_buffer[BYTES_PER_TILE];
        int buffer_place = 1;
        while(buffer_place < length)
        {
            for (int i = 1;i <= BYTES_PER_TILE;i++)
            {
                tile_buffer[i] = buffer[buffer_place+1];
                buffer_place++;
            }
            apply_surface(tile_buffer[1],tile_buffer[2],tiles,screen,&clip[tile_buffer[3]]);
        }
    }
    else
    {
        // File is invalid
        return false;
    }
    level.close();
    return true;
}

事前に感謝します!

役に立ちましたか?

解決

あなたの配列の処理が正しくありません。
C / C ++での配列のインデックスは0から始まります。

あなたは「BYTES_PER_TILE」をサイズの配列であることを「tile_buffer」を定義している。
BYTES_PER_TILEが5だった場合、あなたの配列は、[4] tile_bufferに[0] tile_bufferの要素を持つことになります。

バッファオーバーフローが発生しますので、1から5まであなたの内側のforループあなたがループでは、

私はこれがあなたの問題の原因であるかどうかを知りませんが、それ確かにしませんヘルプ事柄ます。

他のヒント

これはおそらく、答えはありませんが、1ベースのアレイ処理と不要なコピーが私の頭が痛くを行います。

ただ、これらの線に沿って何かをしないのはなぜ?

if ((length >= 2+BYTES_PER_TILE) && (buf[0] == CONST1) && (buf[1] == CONST2)) {
    for (char *tile = &buf[2]; tile < &buf[length-BYTES_PER_TILE]; tile+=BYTES_PER_TILE) {
        apply_surface(tile[0],tile[1],tiles,screen,&clip[tile[2]]);
    }
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top