我是一个相当新的程序员,但我认为我的google-fu很有能力,我花了几个小时search。
我有一个简单的SDL应用程序,它从二进制文件中读取(2个字节作为幻数,然后每个“tile”有5个字节),然后在缓冲区中显示每个tile,字节决定x,y,id,passability等等。 所以这只是水平加载。
它可以在任何Windows电脑(经过testing的Windows Server 2008,7 / 64和7/32)上运行良好,但是当我在linux上编译它时,它随机显示随机位置。 我试图说它是从RAM中的错误部分读取的,但是我给了这个幻数,所以如果前两个字节出来,它会返回一个错误。
我很想自己弄清楚这一点,但现在让我感到困惑,除非我可以在移动中编程(我的笔记本电脑运行linux),否则我无法进一步进步。 我在linux上使用G ++,在windows上使用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]的元素。
在你的内循环中,你从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]]); } }