C++: возвращение двумерного массива из функции.

В Си я совсем нуб. Есть функция ввода элементов массива, где он инициализируется:

/** * GeSHi (C) 2004 - 2007 Nigel McNie, 2007 - 2008 Benny Baumann * (http://qbnz.com/highlighter/ and http://geshi.org/) */ .cpp.geshi_code {font-family:monospace;} .cpp.geshi_code .imp {font-weight: bold; color: red;} .cpp.geshi_code .kw1 {color: #0000ff;} .cpp.geshi_code .kw2 {color: #0000ff;} .cpp.geshi_code .kw3 {color: #0000dd;} .cpp.geshi_code .kw4 {color: #0000ff;} .cpp.geshi_code .co1 {color: #666666;} .cpp.geshi_code .co2 {color: #339900;} .cpp.geshi_code .coMULTI {color: #ff0000; font-style: italic;} .cpp.geshi_code .es0 {color: #000099; font-weight: bold;} .cpp.geshi_code .es1 {color: #000099; font-weight: bold;} .cpp.geshi_code .es2 {color: #660099; font-weight: bold;} .cpp.geshi_code .es3 {color: #660099; font-weight: bold;} .cpp.geshi_code .es4 {color: #660099; font-weight: bold;} .cpp.geshi_code .es5 {color: #006699; font-weight: bold;} .cpp.geshi_code .br0 {color: #008000;} .cpp.geshi_code .sy0 {color: #008000;} .cpp.geshi_code .sy1 {color: #000080;} .cpp.geshi_code .sy2 {color: #000040;} .cpp.geshi_code .sy3 {color: #000040;} .cpp.geshi_code .sy4 {color: #008080;} .cpp.geshi_code .st0 {color: #FF0000;} .cpp.geshi_code .nu0 {color: #0000dd;} .cpp.geshi_code .nu6 {color: #208080;} .cpp.geshi_code .nu8 {color: #208080;} .cpp.geshi_code .nu12 {color: #208080;} .cpp.geshi_code .nu16 {color:#800080;} .cpp.geshi_code .nu17 {color:#800080;} .cpp.geshi_code .nu18 {color:#800080;} .cpp.geshi_code .nu19 {color:#800080;} .cpp.geshi_code .me1 {color: #007788;} .cpp.geshi_code .me2 {color: #007788;} .cpp.geshi_code span.xtra { display:block; }

int input ()
{
     int size;
     cout << "Input matrix size:";    
     cin >> size ;
     int M[size][size];
     for (int i = 0; i < size; i++){
         for (int j = 0; j < size; j++){
             M[i][j] = 2;        
         }
     }
     return M;
}
 


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

DevC++ выдает ошибки:
18 D:dev_c251main.cpp invalid conversion from `int (*)[((unsigned int)((int)size))]' to `int'
12 D:dev_c251main.cpp [Warning] address of local variable `M' returned

1 ответов


Как то так.


#include <iostream>

using namespace std;

int **GetArray(void);
void deleteArray(int **arr);

int _tmain(int argc, _TCHAR* argv[])
{
  int **dArray = GetArray();

  deleteArray(dArray);

  return 0;
}

int **GetArray(void){
  int **dArray;
  int max;
  std::cout<<"Enter length of array :";
  std::cin>>max;
  dArray = new int*[max];
  for(int i=0; i<max; i++){
    dArray[i] = new int [max];
  }
 
  std::cout<<"Returning array\n";
  return dArray;
}

void deleteArray(int **arr){
  std::cout<<"Delete array\n";
  //После всех операций с массивом его надо удалить
  for(int i=0; i<sizeof(arr); i++){
    delete[] arr[i];
  }
  delete[] arr;
}
 

Если это все-таки не С, а С++, то функция прекрасно может возвращать std::vector< std::vector< int > >
Если же все равно нужен "сырой" массив, то тут два пункта:
1. Массив не должен быть локальным (int [][], объявленный в функции, при выходе из нее уничтожается)
2. Массив все равно будет одномерным, int*, а не int**, двумерность массивов в С и С++ - это обман программиста компилятором, на самом деле компилятор просто пересчитывает индексы сам.

Вариант @jackkum - это переусложненный костыль, которого лучше избегать. Он аналогичен вложенному вектору во всем, кроме легкости сопровождения.