Для цикла для чтения строк из файла в 3D-массив - PullRequest
1 голос
/ 05 мая 2011

У меня проблема с одной из моих функций, я работаю над простым редактором карты тайлов и пытаюсь реализовать трехмерный массив для отслеживания тайлов (x, y, layer). До этого у меня был одномерный массив, в котором все плитки были только что перечислены последовательно:

bool Map::OnLoad(char* File) {
    TileList.clear();
    FILE* FileHandle = fopen(File, "r");
    if(FileHandle == NULL) {
        return false;
    }

    for(int Y = 0;Y < MAP_HEIGHT;Y++) {
        for(int X = 0;X < MAP_WIDTH;X++) {
            Tile tempTile;

            fscanf(FileHandle, "%d:%d ", &tempTile.TileID, &tempTile.TilePassage);

            TileList.push_back(tempTile);
        }
        fscanf(FileHandle, "\n");
    }
    fclose(FileHandle);
    return true;
}

Это в основном читает строки из файла, который выглядел как:

2:1 1:0 3:2...

Где первое число указывает на плитку, а второе - на проходимость плитки. Вышеприведенная функция работает . Мои 3D-массивы также правильно построены, я протестировал их с помощью простых назначений и вызова значений из них. Функция, которая доставляет мне проблемы, следующая (обратите внимание, что добавлено число 2, т.е. OnLoad2 (), чтобы я мог сохранить старые переменные и функцию без изменений до тех пор, пока прототип не заработает):

bool Map::OnLoad2(char* File) {
    TileList2.clear();
    FILE* FileHandle2 = fopen(File, "r");
    if(FileHandle2 == NULL) {
        return false;
    }

    for(int Y = 0;Y < MAP_HEIGHT;Y++) {

        for(int X = 0;X < MAP_WIDTH;X++) {
            Tile tempTile;
            fscanf(FileHandle2, "%d:%d ", &tempTile.TileID, &tempTile.TilePassage);

            TileList2[X][Y][0] = tempTile;
        }
        fscanf(FileHandle2, "\n");
    }
    fclose(FileHandle2);
    return true;
}

Хотя эта функция не запускает компилятор для сообщения об ошибках, как только приложение запускается, оно зависает и вылетает. Для дополнительной информации MAP_WIDTH и MAP_HEIGHT установлены в 40 каждый , а трехмерный массив был построен следующим образом:

TileList2.resize(MAP_HEIGHT);
for (int i = 0; i < MAP_HEIGHT; ++i) {
    TileList2[i].resize(MAP_WIDTH);
    for (int j = 0; j < MAP_WIDTH; ++j)
        TileList2[i][j].resize(3);
}

Буду признателен, если вы укажете мне, что мне нужно исправить, насколько я знаю, что я испортил структуру цикла for, поскольку трехмерный массив инициализируется и работает правильно. Спасибо за вашу помощь!

1 Ответ

5 голосов
/ 05 мая 2011
TileList2.clear();

Эта строка повторно инициализирует TileList2, поэтому она возвращается к вектору нулевой длины.Удалите эту строку, и вы, вероятно, будете в порядке.

...