Arquivos lendo de maneira diferente no Linux? C ++
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!
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]]);
}
}