Пятница, 17 Августа 2018, 07:56

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Форум игроделов » Программирование » C/C++ » Динамическое изменение двумерного вектора
Динамическое изменение двумерного вектора
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);}
Tyr_AnassaziДата: Среда, 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 + Irrlicht + FreeBasic. Программируй в удовольствие, а не "в тягость"! 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++)

Здесь нет проблемы. Единственное отличие, что в первом варианте инкрементация может чуть быстрее работать.

Заглянул что мой оптимизирующий компилятор выдает, код оказался идентичным
Код
addl    $1, 12(%esp)


Не оптимизированный мог бы выглядить так
Код
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.1772]


Сообщение отредактировал 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.1772]
SaiteiДата: Четверг, 23 Апреля 2015, 20:51 | Сообщение # 10
старожил
Сейчас нет на сайте
Цитата OpenGOO ()
У тебя в этом месте происходит выход за границы массива

+1. Попробуй поставить условие i < mapsizeX - 1 smile
Форум игроделов » Программирование » C/C++ » Динамическое изменение двумерного вектора
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2018 Рейтинг