Цикл For для чтения строк из файла в 3D-массив

#c #vector #3d #for-loop #sdl

#c #вектор #3D #цикл for #sdl

Вопрос:

У меня проблема с одной из моих функций, я работаю над простым редактором карты листов и пытаюсь реализовать 3D-массив для отслеживания листов (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 ", amp;tempTile.TileID, amp;tempTile.TilePassage);

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

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

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

Где первое число указывает tileID, а второе — проходимость плитки. Вышеуказанная функция работает. Мои 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 ", amp;tempTile.TileID, amp;tempTile.TilePassage);

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

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

 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, поскольку 3D-массив инициализируется и работает должным образом. Спасибо за вашу помощь!

Комментарии:

1. Таким же образом, как и в TileList, за исключением 3D: std::vector<std::vector<std::vector<Tile> > > TileList2;

2. Класс. Проблемы не было, как понял Роб.

Ответ №1:

 TileList2.clear();
  

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

Комментарии:

1. Это сработало? Я думал, что такие векторы индексирования автоматически изменяют размер… Прошло много времени с тех пор, как я работал с STL, хотя

2. Похоже, что это не так, поскольку удаление этого lime заставляет его работать должным образом. Я приму ваш ответ, как только закончится лимит тайлов.

3. @Dan, Нет, std::vector не изменяет размер автоматически ни в std::vector::operator[] , ни в std::vector::at . Если вы хотите добавить данные в вектор и изменить их размер, попробуйте std::vector::push_back .

4. Теперь, когда я могу проголосовать, 1 за то, что заставил меня чувствовать себя идиотом : D Это была просто старая привычка из других языков программирования, что массив должен сохранять свою форму в режиме clear.