我是一个相当新的程序员,但我认为我的google-fu非常称职,我花了几个小时搜索.
我有一个简单的SDL应用程序从二进制文件读取(2个字节作为幻数,然后每个"tile"5个字节)然后它显示缓冲区中的每个tile,字节决定x,y,id,可通过性等等.所以它真的只是水平加载.
它可以在任何Windows计算机上运行(经过测试的Windows Server,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;
}
Run Code Online (Sandbox Code Playgroud)
提前致谢!
小智 5
您的阵列处理不正确.
C/C++中的数组索引从0开始.
您已将'tile_buffer'定义为大小为'BYTES_PER_TILE'的数组.
如果BYTES_PER_TILE是5,那么你的数组将把tile_buffer [0]元素添加到tile_buffer [4].
在你的内部for循环中,你从1循环到5,这样就会发生缓冲区溢出.
我不知道这是否是你问题的原因,但肯定无济于事.
| 归档时间: |
|
| 查看次数: |
172 次 |
| 最近记录: |