Вопрос:
Как сделать передачу двумерного массива через параметр функции?
Ответ:
Либо создаёшь массив динамически:
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;
|