Файлы читают по-разному в Linux?C ++ - PullRequest
2 голосов
/ 29 сентября 2010

Я довольно новый программист, но я считаю, что мой google-fu достаточно компетентен, и я потратил несколько часов на поиск.

У меня есть простое приложение SDL, которое читает из двоичного файла (2 байта как магическое число, затем 5 байтов на «плитку»), затем он отображает каждую плитку в буфере, байты определяют x, y, id, проходимость и тому подобное.Так что на самом деле это просто уровень загрузки.

Он отлично работает на любом компьютере с Windows (протестировано на Windows Server 2008, 7/64 и 7/32), но когда я компилирую его на Linux, он отображает случайные листы в случайных позициях.Я хотел бы сказать, что он читает не ту часть в ОЗУ, но я запутал магическое число, поэтому оно вернуло бы ошибку, если бы первые 2 байта отсутствовали.

Я бы с удовольствием вычислилЭто само по себе, но теперь это меня пугает, и я не смогу продвинуться дальше, если не смогу программировать на ходу (мой ноутбук работает под управлением Linux).Я использую G ++ на Linux, Mingw32g ++ на 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;
}

Заранее спасибо!

Ответы [ 2 ]

5 голосов
/ 29 сентября 2010

Ваша обработка массива неверна.
Индексирование массива в C / C ++ начинается с 0.

Вы определили 'tile_buffer' как массив размером 'BYTES_PER_TILE'.
Если BYTES_PER_TILE было 5ваш массив будет иметь элементы от tile_buffer [0] до tile_buffer [4].

Во внутреннем цикле for вы выполняете цикл от 1 до 5, так что произойдет переполнение буфера.

Я не знаюЯ не знаю, является ли это причиной вашей проблемы, но это определенно не поможет.

0 голосов
/ 29 сентября 2010

Вероятно, это не ответ, но обработка массива на основе 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]]);
    }
}
...