【问题标题】:Passing a matrix in a function (C)在函数中传递矩阵 (C)
【发布时间】:2012-07-10 19:51:30
【问题描述】:

我在将矩阵传递给 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");
    }
}

【问题讨论】:

标签: c matrix


【解决方案1】:

您需要传递一个指针,其间接级别 (*) 与矩阵的维数一样多。

例如,如果您的矩阵是二维的(例如 10 x 100),那么:

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

如果你有一个固定的维度(例如 100),你也可以这样做:

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

【讨论】:

  • 谢谢。如果我有一个固定尺寸(查看我的编辑)定义的 SIZE,我需要如何更改代码?
  • 不可能通过“具有与矩阵维数一样多的间接级别 (*) 的指针”传递 OP 示例中的二维数组。这部分答案是完全错误的。
【解决方案2】:

如果您有现代 C 编译器,您可以对任意大小的二维矩阵执行以下操作

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

重要的是尺寸在矩阵之前,这样它们就在那里是已知的。

在您的函数中,您可以使用matrix[i][j] 轻松访问元素,编译器会为您进行所有索引计算。

【讨论】:

    【解决方案3】:

    也可以将第一个维度留空,与 (*matrix) 相同:

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

    【讨论】:

      【解决方案4】:

      使用 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;
      }
      

      【讨论】:

        【解决方案5】:

        你也可以试试这个:

        void inputmat(int r,int c,int arr[r * sizeof(int)][c * sizeof(int)])
        

        【讨论】:

          猜你喜欢
          • 2015-06-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-11-20
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多