Pergunta

Sou um programador bastante novo, mas considero meu Google-Fu bastante competente e passei várias horas pesquisando.

Eu tenho um aplicativo SDL simples que lê de um arquivo binário (2 bytes como um número mágico e, em seguida, 5 bytes por "ladrilho"), então exibe cada ladrilho no buffer, os bytes decidem o x, y, id, passabilidade e tal. Portanto, é apenas um nível de carga realmente.

Ele é bom em qualquer computador Windows (testado Windows Server 2008, 7/64 e 7/32), mas quando eu o compilo no Linux, exibe ladrilhos aleatórios em posições aleatórias. Eu ficaria tentado a dizer que está lendo a parte errada no RAM, mas impelei o número mágico para que ele retornasse um erro se os dois primeiros bytes estivessem fora.

Eu adoraria descobrir isso sozinho, mas isso está me incomodando agora e não posso progredir muito mais com ele, a menos que eu possa programar em movimento (meu laptop executa o Linux). Estou usando G ++ no Linux, Mingw32G ++ no 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;
}

Desde já, obrigado!

Foi útil?

Solução

Seu manuseio de matriz está incorreto.
A indexação da matriz em C/C ++ começa a partir de 0.

Você definiu 'tile_buffer' para ser uma matriz 'bytes_per_tile'.
Se BYTES_PER_TILE fosse 5, sua matriz teria elementos tile_buffer [0] para tile_buffer [4].

No seu loop interno, você loop de 1 a 5, para que ocorra um excesso de buffer.

Não sei se essa é a causa do seu problema, mas certamente não ajudará.

Outras dicas

Provavelmente isso não é uma resposta, mas o manuseio de matrizes com base em 1 e a cópia desnecessária fazem minha cabeça doer.

Por que não fazer algo nesse sentido?

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]]);
    }
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top