C ++ 2D динамический массив сбой - PullRequest
0 голосов
/ 30 ноября 2009

Привет У меня возникла проблема с динамическим массивом 2D.

int main()
{
   double **M;
   int M_dimension;
   int i;

   M_dimension = 10;

   M = new double *[M_dimension];
   for (i=0;i<M_dimension;i++)
   {
      M[i] = new double[M_dimension];
   }

   M[0][0] = 1.0;

...
}

Программа работает, но я бы хотел инициализировать 2D-массив с помощью такой функции:

void initialize2D(double **M,int M_dimension)
{
   int i;
   M = new double *[M_dimension];
   for (i=0;i<M_dimension;i++)
   {
      M[i] = new double[M_dimension];
   }
}

Наконец программа выглядит так:

int main()
{
   double **M;
   int M_dimension;
   int i;

   M_dimension = 10;

   initialize2D(M,M_dimension);        

   M[0][0] = 1.0; //crash

...
}

К сожалению, он падает на M[0][0] = 1.0;

Спасибо за любую помощь или предложения.

Ответы [ 4 ]

8 голосов
/ 30 ноября 2009

Вы передаете M по значению, а не по ссылке. initialize2D необходимо изменить значение указателя на указатель M так, чтобы оно указывало на выделенную память

Попробуйте вместо этого изменить сигнатуру функции:

void initialize2D(double **&M,int M_dimension)

Или

void initialize2D(double ***M,int M_dimension) {
    ...
    *M = new double *[M_dimension];
    ...
}
1 голос
/ 30 ноября 2009

Вам нужно передать ссылку на double** вместо double** для работы, в противном случае модификация, выполненная для указателя после присвоения M результата new, теряется при выходе из функции.

0 голосов
/ 06 февраля 2010

Почему бы вам не использовать std::vector или Boost.MultiArray

Было бы довольно легко определить двумерный массив как общий вектор векторов в C ++

0 голосов
/ 06 февраля 2010

проблема может быть в том, что вы объявляете целочисленный параметр, такой как int M_dimension void initialize2D (double ** M, int M_dimension)

и затем вы инициализируете динамический массив как: M [i] = новый двойной [M_dimension];

где это противоречит, потому что вы объявили переменную M_dimension как целое число, а затем использовали ее как двойное

попробуйте это так: либо измените тип данных массива или M_dimension, чтобы оба они имели одинаковый тип данных.

надеюсь, это поможет вам

...