Динамическое изменение двумерного вектора
|
|
Alkosha | Дата: Вторник, 21 Апреля 2015, 23:40 | Сообщение # 1 |
участник
Сейчас нет на сайте
| Матрица двумерного массива объявлена так: Код size_t row = mapsizeX; size_t col = mapsizeY; vector<vector<int> > matrixfloor(row);
при первой инициализации заполняю так (например рандомом) Код for(size_t i = 0; i < row; i++) { matrixfloor[i].resize(col); for(size_t j = 0; j < col; ++j) matrixfloor[i][j] = rand() % 4; }
Теперь чтобы изменить размер матрицы по высоте (клавишами 2 и 8) Код if(keys[SDL_SCANCODE_KP_8]) {
mapsizeY--;
for(size_t i = 0; i < mapsizeX; i++) { matrixfloor[i].resize(mapsizeY);
}
SDL_Delay(100); } if(keys[SDL_SCANCODE_KP_2]) { mapsizeY++; for(size_t i = 0; i < mapsizeX; i++) { matrixfloor[i].resize(mapsizeY);
} SDL_Delay(100); }
А вот по ширине когда пытаюсь изменить размер - fatal error Код if(keys[SDL_SCANCODE_KP_6]){mapsizeX++;
for(size_t i = 0; i < mapsizeX; i++) { matrixfloor[i].resize(mapsizeY);
} SDL_Delay(100);} if(keys[SDL_SCANCODE_KP_4]){mapsizeX--; for(size_t i = 0; i < mapsizeX; i++) { matrixfloor[i].resize(mapsizeY);
}
SDL_Delay(100);}
|
|
| |
CaptainHunt | Дата: Среда, 22 Апреля 2015, 13:49 | Сообщение # 2 |
был не раз
Сейчас нет на сайте
| может быть здесь проблема:
не for(size_t j = 0; j < col; ++j)
а for(size_t j = 0; j < col; j++)
между ними есть небольшая разница: size_t j = 0; j < col; ++j // сначала увеличивается j на 1, потом size_t = j size_t j = 0; j < col; j++ // сначала присваивается size_t = j, потом j увеличивается на 1
хотя может быть и по другой причине вылетает.
WorldSim3D: сделай 3D игру на С++/FreeBasic/D для PC Windows/Linux. Программируй в удовольствие, а не "в тягость"! Make your project with pleasure, not with strain! Ознакомиться
|
|
| |
OpenGOO | Дата: Среда, 22 Апреля 2015, 16:04 | Сообщение # 3 |
почти ветеран
Сейчас нет на сайте
| Цитата Tyr_Anassazi ( ) не for(size_t j = 0; j < col; ++j)
а for(size_t j = 0; j < col; j++) Здесь нет проблемы. Единственное отличие, что в первом варианте инкрементация может чуть быстрее работать.
Заглянул что мой оптимизирующий компилятор выдает, код оказался идентичным
Не оптимизированный мог бы выглядить так Код movl 12(%esp), %eax leal 1(%eax), %edx movl %edx, 12(%esp) Добавлено (22 апреля 2015, 16:04) --------------------------------------------- Alkosha, в чем собственно суть вопроса?
Мои проекты: - Свободный и открытый клон World Of Goo - TrueEngine2D (2D игровой фреймворк основанный на FreeBASIC)
[GameMaker: Studio v1.4.9999]
Сообщение отредактировал OpenGOO - Среда, 22 Апреля 2015, 15:55 |
|
| |
Alkosha | Дата: Среда, 22 Апреля 2015, 20:48 | Сообщение # 4 |
участник
Сейчас нет на сайте
| Цитата OpenGOO ( ) в чем собственно суть вопроса?
Не получается динамически менять 2д-матрицу массива по ширине. Только по высоте работает.
|
|
| |
falcoware | Дата: Среда, 22 Апреля 2015, 20:53 | Сообщение # 5 |
старожил
Сейчас нет на сайте
| Alkosha, предалагаю матрицу выложить и одномерный массив и ресайзить как хочется... А обращаться так: Х + У*СайзХ
|
|
| |
Alkosha | Дата: Среда, 22 Апреля 2015, 21:00 | Сообщение # 6 |
участник
Сейчас нет на сайте
| А.. наверное при изменении по ширине лучше использовать push_back pop_back Добавлено (22 апреля 2015, 21:00) ---------------------------------------------
Цитата falcoware ( ) предалагаю матрицу выложить и одномерный массив и ресайзить как хочется... А обращаться так: Х + У*СайзХ
Тоже поначалу думал про одномерный массив, но показалось, что будет неудобно работать с таким в дальнейшем.
|
|
| |
falcoware | Дата: Среда, 22 Апреля 2015, 21:02 | Сообщение # 7 |
старожил
Сейчас нет на сайте
| Alkosha, template <class T> class Matr{ public: int numberx; int numbery;
Array<T> matr; // ------------------------------------------------------------------------- Matr(void){
numberx = numbery = 0; } // ------------------------------------------------------------------------- Matr(int numx, int numy){
matr.Set((numberx = numx) * (numbery = numy)); } // ------------------------------------------------------------------------- T& e(int numx, int numy){ if(((numx < numberx) && (numx >= 0)) && ((numy < numbery) && (numy >= 0))){ return matr.e(numberx * numy + numx); } else{ return matr.tmp; } }
|
|
| |
Alkosha | Дата: Среда, 22 Апреля 2015, 21:49 | Сообщение # 8 |
участник
Сейчас нет на сайте
| Сделал так, вроде работает. Цитата if(keys[SDL_SCANCODE_KP_6]){mapsizeX++; vector<int> tmp; matrixfloor.push_back(tmp); for(size_t i = 0; i < mapsizeX; i++) { matrixfloor[i].resize(mapsizeY);
} SDL_Delay(100);} if(keys[SDL_SCANCODE_KP_4]){mapsizeX--; matrixfloor.pop_back(); for(size_t i = 0; i < mapsizeX; i++) { matrixfloor[i].resize(mapsizeY);
}
|
|
| |
OpenGOO | Дата: Четверг, 23 Апреля 2015, 00:59 | Сообщение # 9 |
почти ветеран
Сейчас нет на сайте
| У тебя в этом месте происходит выход за границы массива Цитата Alkosha ( ) mapsizeX++;
for(size_t i = 0; i < mapsizeX; i++) { matrixfloor[i].resize(mapsizeY);
}
Мои проекты: - Свободный и открытый клон World Of Goo - TrueEngine2D (2D игровой фреймворк основанный на FreeBASIC)
[GameMaker: Studio v1.4.9999]
|
|
| |
Saitei | Дата: Четверг, 23 Апреля 2015, 20:51 | Сообщение # 10 |
старожил
Сейчас нет на сайте
| Цитата OpenGOO ( ) У тебя в этом месте происходит выход за границы массива +1. Попробуй поставить условие i < mapsizeX - 1
|
|
| |