web-dev-qa-db-ja.com

関数で行列を渡す(C)

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");
    }
}
8
Lc0rE

ポインタとして次元数を渡す必要があります。

つまり、マトリックスが2D(10 x 100)の場合、次のようになります。

void ins (int **matrix, int row, int column);

しかし、前の例は間違っています。静的2D配列では、第2レベルのポインターが静的配列へのconstpointerである必要があるためです。行列が動的配列の場合、前のヘッダーは正しいでしょう。だから正しいです:

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);
20
user586399

最新のCコンパイラを使用している場合は、任意のサイズの2D行列に対して以下を実行できます。

void ins (size_t rows, size_t columns, int matrix[rows][columns]);

重要なのは、サイズが行列の前に来ることです。

関数内では、matrix[i][j]として要素に簡単にアクセスでき、コンパイラはすべてのインデックス計算を実行します。

7
Jens Gustedt

(* matrix)と同じように、最初の次元を空のままにすることもできます。

void ins (int matrix[][100], int row, int column);
0
asam

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;
}
0
Prashant gaUtam

C-関数に行列を割り当てる

上に、Cの可能な方法で行列を割り当てたり操作したりする関数(gcc C11/C99)で作成したプログラムがあります。

0
42n4