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
/** * 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 - это переусложненный костыль, которого лучше избегать. Он аналогичен вложенному вектору во всем, кроме легкости сопровождения.