MyTetra Share
Делитесь знаниями!
Как передать в функцию динамический двумерный массив
Время создания: 11.01.2011 14:14
Текстовые метки: c, c++, массив
Раздел: Компьютер - Программирование - Язык C (Си)
Запись: xintrea/mytetra_syncro/master/base/0000003383/text.html на raw.github.com

Вопрос:


Как сделать передачу двумерного массива через параметр функции?



Ответ:


Либо создаёшь массив динамически:


int ** arr;

arr = new int*[M]

for(i = 0; i<M; ++i)

arr = new int[N];


Тогда можно написать функцию:


int f(int **a)

{

...

a[j]

...

}


и использовать её прямо: f(arr);


Если же твой двумерный массив статический, то тебе обязательно нужно в объявлении функции указать одну (вторую) размерность:


f2(int a[][5]);


main()

{

int arr[3][5];

f2(arr);

}



Дальнейшее обсуждение


ZufuS:

Вот она, моя функция:


float det(float p[][], int n)

{

if(n==1) return p;

float det=0;

for(int i=0; i<n; i++) {

add[n-1][n-1];

for(int y=1; y<n-1; y++) {

for(int x=0; x<-1; x++) {

if(x==i) continue;

if(x<i) add[х][y-1] = p[y][х];

else add[х-1][y-1] = p[y][х];

}

}

if(p[i][0]%2) p[i][0] = -p[i][0];

det += p[i][0]*det(add, n-1))

}

return det;

}


Попытался перевести на указатели, получилось вот что:


float det(float **p, int n)

{

if(n==1) return **p;

float det=0;

for(int i=0; int m=n>i; i++) {

float **add = new float*[n-1];

for(int i=0; i<n-1; i++) add[i] = new float[n-1];

for(int y=1; y<n-1; y++) {

for(int x=0; x<-1; x++) {

if(x==i) continue;

if(x<i) add[х][y-1] = p[y][х];

else add[х-1][y-1] = p[y][х];

}

}

if(i%2) p[i][0] = -p[i][0];

static float det;

det += p[i][0]*det(add, n-1); // вот здесь ошибка, не хочет вызываться [C++ Error] Call of nonfunction

}

return det;

}


А ещё можно ли как-нибудь за счёт параметра n указать сразу в параметре массива его размерность типа (n, m[n][n]).



artursa:

Я делаю так:


void func(char mas[10][5]);

{

...

}


main()

{

char mas[10][5];

func(mas);

}



melkiy:

Ну, какие есть замечания:


1) Зачем тебе две переменных det - одна static, другая auto ??

2) Почему переменная det называется так же, как и функция? Или в латинском алфавите букв мало :? Тогда используй знак подчёркивания и цифры (цифры - не в начале). Компилятор, собственно, на это и ругается.


3) Если ты выделил память под переменную с помощью оператора new, то, когда она больше не нужна, освободи ресурс оператором delete. Пример


int* pa = new int;

...

cout << *pa;

delete pa;



Используй оператор delete[] для освобождения памяти для целого массива. Для двумерного массива это будет выглядеть так:


float **add = new float*[n-1];

for(int i=0; i<n-1; i++)

add[i] = new float[n-1];

...

...

for(i=0; i<n-1; i++)

delete[] add[i];

delete[] add;



Так же в этом разделе:
 
MyTetra Share v.0.59
Яндекс индекс цитирования