Cの関数に行列を渡す際に問題が発生します。作成したい関数があります。
void ins (int *matrix, int row, int column);
しかし、ベクトルとは対照的に、行列は私にエラーを与えることに気づきました。マトリックスを関数に渡すにはどうすればよいですか?
編集->コードがあります:
// 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");
}
}
ポインタとして次元数を渡す必要があります。
つまり、マトリックスが2D(10 x 100)の場合、次のようになります。
void ins (int **matrix, int row, int column);
しかし、前の例は間違っています。静的2D配列では、第2レベルのポインターが静的配列へのconst
pointerである必要があるためです。行列が動的配列の場合、前のヘッダーは正しいでしょう。だから正しいです:
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);
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;
}
上に、Cの可能な方法で行列を割り当てたり操作したりする関数(gcc C11/C99)で作成したプログラムがあります。