Передача матрицы в функции (C)
у меня проблема с передачей матрицы функции в C. Есть функция, которую я хочу создать:
void ins (int *matrix, int row, int column);
но я заметил, что в отличие от векторов, матрица дает ошибку. Как я могу передать свою матрицу функции so?
EDIT --> есть код:
// Matrix
#include <stdio.h>
#define SIZE 100
void ins (int *matrix, int row, int column);
void print (int *matrix, int row, int column);
int main ()
{
int mat[SIZE][SIZE];
int row, col;
printf("Input rows: ");
scanf ("%d", &row);
printf("Input columns: ");
scanf ("%d", &col);
printf ("Input data: n");
ins(mat, row, col);
printf ("You entered: ");
print(mat, row, col);
return 0;
}
void ins (int *matrix, int row, int column);
{
int i, j;
for (i = 0; i < row; i++)
{
for (j = 0; j < column; j++)
{
printf ("Row %d column %d: ", i+1, j+1);
scanf ("%d", &matrix[i][j]);
}
}
}
void print (int *matrix, int row, int column)
{
int i;
int j;
for(i=0; i<row; i++)
{
for(j=0; j<column; j++)
{
printf("%d ", matrix[i][j]);
}
printf("n");
}
}
5 ответов
вы должны передать количество измерений в качестве указателей,
т. е. если ваша матрица 2D (10 на 100), то:
void ins (int **matrix, int row, int column);
но предыдущий неверен, так как любой статический 2D-массив требует, чтобы второй уровень указателей был const
указатель на статический массив. Предыдущий заголовок будет правильным, если матрица является динамическим массивом. Итак, правильно:
void ins (int (*matrix)[100], int row, int column);
или в вашем случае:
void ins (int (*matrix)[SIZE], int row, int column);
или просто:
void ins (int matrix[10][100], int row, int column);
или в вашем дело:
void ins (int matrix[SIZE][SIZE], int row, int column);
Если у вас есть современный компилятор C, вы можете сделать следующее для 2D матрицы любых размеров
void ins (size_t rows, size_t columns, int matrix[rows][columns]);
важно то, что размеры приходят перед матрицей, так что они известны, там.
внутри вашей функции, то вы можете легко получить доступ к элементам как matrix[i][j]
и компилятор выполняет все вычисления индекса для вас.
также можно было бы оставить первое измерение пустым, таким же, как (*matrix):
void ins (int matrix[][100], int row, int column);
выше вы найдете программу, которую я сделал с функциями, выделяющими и манипулирующими матрицами любым возможным способом для C (gcc C11/C99).
гораздо лучший способ использовать функцию malloc и создавать динамически выделенный массив и делать все, что вы хотите сделать, используя 2D массива:
#include <stdio.h>
#include <stdlib.h>
#include <stdio.h>
void fun(int **arr,int m,int n)
{
int i, j;
for (i = 0; i < m; i++)
{
for (j = 0; j < n; j++)
{
scanf("%d", &arr[i][j]);
}
}
}
int main()
{
int i,j,m,n;
printf("enter order of matrix(m*n)");
scanf("%d*%d",&m,&n);
int **a=(int **)malloc(m*sizeof(int));
for(i=0;i<n;i++)
a[i]=(int *)malloc(n*sizeof(int));
fun(a,m,n);
for (i = 0; i < m; i++)
{
for (j = 0; j < n; j++)
{
printf("%d ", a[i][j]);
}
printf("\n");
}
return 0;
}
output:
#include <stdio.h>
#include <stdlib.h>
#include <stdio.h>
void fun(int **arr,int m,int n)
{
int i, j;
for (i = 0; i < m; i++)
{
for (j = 0; j < n; j++)
{
scanf("%d", &arr[i][j]);
}
}
}
int main()
{
int i,j,m,n;
printf("enter order of matrix(m*n)");
scanf("%d*%d",&m,&n);
int **a=(int **)malloc(m*sizeof(int));
for(i=0;i<n;i++)
a[i]=(int *)malloc(n*sizeof(int));
fun(a,m,n);
for (i = 0; i < m; i++)
{
for (j = 0; j < n; j++)
{
printf("%d ", a[i][j]);
}
printf("\n");
}
return 0;
}