Linuxでは、異なるファイルの読み込み? C ++
質問
私はかなり新しいプログラマんだけど、私は私の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ベースのアレイ処理と不要なコピーが私の頭が痛くを行います。
ただ、これらの線に沿って何かをしないのはなぜ?
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]]);
}
}