Динамическая инициализация 2D массива - PullRequest
1 голос
/ 25 декабря 2011

Я хочу создать и инициализировать двумерный массив, но инициализация не удалась. Я сталкиваюсь с "Программа неожиданно закончилась". в Qt Creator.

Что не так?

в файле .h

private:
    int pop;
    int d;
    float **uye;

в файле .cpp

pop=50;
d=12;
uye = new float*[pop];
for(int i=0; i<d; i++) uye[i] = new float[d];

for(int n=0; n<pop; n++)
{
    for(int m=0; m<d; m++)
    {
        uye[n][m] = (float) n*m;
    }
}

Ответы [ 2 ]

3 голосов
/ 25 декабря 2011

Что не так?

Вы не используете std::vector (это одна из вещей, которые неправильно, @FredO покрывал другую вещь).

#include <vector>

int main(){
  typedef std::vector<float> inner_vec;
  typedef std::vector<inner_vec> outer_vec;

  int pop = 50, d = 12;
  // first parameter to vector is its size
  // second is what every element should be initialized to
  outer_vec uye(pop, inner_vec(d));
  for(unsigned n = 0; n < uye.size(); ++n){
    for(unsigned m = 0; m < uye[n].size(); ++m){
      uye[n][m] = (float)n*m;
    }
  }
}
3 голосов
/ 25 декабря 2011

Первый цикл for(int i=0; i<d; i++), вероятно, должен быть for(int i=0; i<pop; i++). В противном случае вы резервируете место только для 12 элементов, но позже попытаетесь получить доступ к 50.

Обратите внимание, что наличие необработанных членов-указателей считается очень плохой идеей в современном C ++, потому что вам нужно беспокоиться о копировании семантики. Лучше использовать плоскую std::vector<float> и выполнить 2D-1D-отображение вручную или использовать std::vector<std::vector<float> > с удобным синтаксисом доступа.

Я бы предпочел вторую версию. Не видя больше контекста:

pop = 50;
d = 12;
uye = std::vector<std::vector<float> >(pop, std::vector<float>(d));

Последовательность вложенных циклов работает точно так же, никаких изменений не требуется.

...