我是一个相当新的程序员,但我认为我的谷歌福相当称职,我已经花了几个小时搜索。

我有一个简单的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]]);
    }
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top