题
我是一个相当新的程序员,但我认为我的谷歌福相当称职,我已经花了几个小时搜索。
我有一个简单的SDL的应用程序,从二进制文件读(2个字节作为一个幻数,然后每“瓦片” 5个字节) 它然后显示每个瓦片在缓冲器中,该字节决定在x,y,ID,通过性和这样。 所以它只是水平荷载真的。
它运行任何窗口的计算机上细(测试Windows Server 2008的7/64和7/32) 但是当我编译它在Linux上,它显示在随机位置随机地砖。 我会忍不住说这是从在RAM中的错误部分阅读,但我implimented一个神奇的数字,因此会返回一个错误,如果前2个字节出炉。
我喜欢这出自己,但它现在缠着我到地狱,我不能进步更远吧,除非我可以在移动中(我的笔记本电脑运行的是Linux)计划。 我使用G ++在Linux,mingw32g ++上的窗户。
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。
您已经定义“tile_buffer”是一个数组大小“BYTES_PER_TILE”。结果 如果BYTES_PER_TILE为5,您的阵列将具有tile_buffer [0]的元素tile_buffer [4]。
在您的内部的for循环您环路1至5个这样会发生缓存器溢出。
我不知道这是你的问题的原因,但它肯定不会帮助的事项。
其他提示
这可能不是一个答案,但基于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]]);
}
}
不隶属于 StackOverflow