#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.