I file di lettura in modo diverso in Linux? C ++
Domanda
Sono un abbastanza nuovo programmatore, ma considero il mio google-fu abbastanza competente e ho trascorso diverse ore a cercare.
Ho una semplice applicazione SDL che legge da un file binario (2 byte come un numero magico, poi 5 byte per "tile") esso quindi visualizza ogni tessera nel buffer, i byte decidere la x, y, id, passability e così via. Quindi è carico solo livello davvero.
Funziona bene su qualsiasi computer Windows (Windows Server 2008 testati, 7/64 e 7/32) ma quando compilo su Linux, visualizza piastrelle casuali in posizioni casuali. Sarei tentato di dire che è la lettura dalla parte sbagliata nella RAM, ma io implimented il numero magico in modo che sarebbe tornato un errore se i primi 2 byte erano fuori.
Mi piacerebbe capirlo me stesso, ma mi rode all'inferno ora e non riesco a progredire molto di più con esso a meno che non posso programmare in movimento (le mie corse laptop Linux). Sto usando G ++ su Linux, mingw32g ++ su Windows.
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;
}
Grazie in anticipo!
Soluzione
Il trattamento di matrice non è corretta.
Indicizzazione degli array in C / C ++ inizia da 0.
È stato definito 'tile_buffer' ad essere un array di dimensioni 'BYTES_PER_TILE'.
Se BYTES_PER_TILE era 5, l'array avrebbe elementi tile_buffer [0] a tile_buffer [4].
Nel suo interno si esegue un ciclo per ciclo-1-5 quindi si verifica un overflow del buffer.
Non so se questa è la causa del problema, ma di certo non aiuterà le cose.
Altri suggerimenti
Questo probabilmente non è una risposta, ma la manipolazione serie 1-based e la copia non necessari a rendere il mio mal di testa.
Perché non fare qualcosa in questo senso?
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]]);
}
}