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!

È stato utile?

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]]);
    }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top