将一个二维数组作为参数传递给函数

5

If I dont know the size of both the dimensions of array and want to print a matrix using the following code

    
    void printAnyMatrix(int (*A)[], int size_A, int size_B)
    {
       for (int i = 0; i<=size_A; i++)
       {
           for (int j = 0; j<=size_B; j++)
               printf("%d ", A[i][j]);
           printf("\n");
       }
       printf("\n");
    }
    


Compiler gives

错误 无法将'to': 'void printAnyMatrix(int [])'的参数1从'int (*)[(((unsigned int)((int)size_B)) + 1)]'转换为'int ()[]'

3个回答

4

对于这样的问题,请使用template功能:

template<typename T, unsigned int size_A, unsigned int size_B>
void printAnyMatrix(T  (&Arr)[size_A][size_B])
{       // any type^^  ^^^ pass by reference        
}

现在你可以将任何2D数组传递给该函数,大小将自动以size_Asize_B的形式推断出来。
示例:
int ai[3][9];
printAnyMatrix(ai);
...
double ad[18][18];
printAnyMatrix(ad);

没有匹配的函数调用printAnyMatrix(int [(((unsigned int)((int)size_A)))][(((unsigned int)((int)size_B)))]) 注意:候选项是: 注意:模板<class T,unsigned int size_A,unsigned int size_B> void printAnyMatrix(T(&)[(size_A)][(size_B)]) - Anubhav Agarwal

2

简化签名:指针更易于人类阅读。

您的循环中也存在错误:应该是小于号,而不是小于等于号。

void printAnyMatrix(int *A, int size_A, int size_B)<br />
{
   for (int i = 0; i<size_A; i++)
   {
       for (int j = 0; j<size_B; j++)
           printf("%d ", A[i*size_B + j]);
       printf("\n");
   }
   printf("\n");
}

无法将‘int ()[(((unsigned int)((int)size_B)) + 1)]’转换为‘int’,作为参数‘1’传递给‘void printAnyMatrix(int*, int, int)’。 - Anubhav Agarwal
这意味着您正在使用错误的参数调用 prinAnyMatrix 来处理 int。看起来您正在使用实际上是 int 而不是 int 的参数进行调用(对于第一个位置)。 - Adrian
int matrix[size_A][size_B], size_A, size_B; 我正在调用printAnyMatrix(matrix, size_A, size_B); - Anubhav Agarwal
如果矩阵是int*,那么matrix[a]就是int类型,而matrix[a][b]会产生编译错误。 - Adrian

1
如果你想要打印任何矩阵,也许你需要打印静态和动态分配的矩阵。对于静态分配的矩阵,函数看起来应该像下面这样:
template <class T, int size_A, int size_B>
void printAnyMatrix(T (&A)[size_A][size_B])
{
   for (int i = 0; i < size_A; i++)
   {
       for (int j = 0; j < size_B; j++)
           std::cout<<A[i][j]<<' ';
       std::cout<<'\n';
   }
   std::cout<<std::endl;
}

动态分配矩阵的函数:
template <class T>
void printAnyMatrix(T **A, int size_A, int size_B)
{
   for (int i = 0; i < size_A; i++)
   {
       for (int j = 0; j < size_B; j++)
           cout<<A[i][j]<<' ';
       cout<<'\n';
   }
   std::cout<<std::endl;
}

你可以在同一个翻译单元中同时使用它们,编译器会选择适合你的矩阵的那个。(注意:对于静态分配的矩阵,你需要一个参数,而对于动态分配的矩阵,你需要三个参数)

如果你在 C++ 中工作,请考虑使用 cout 而不是 printf。它对所有基本类型进行了重载,而 printf 需要你显式地声明类型。

如果你仍然有编译器错误,请展示你的矩阵声明。


1
int[m][n] 无法转换为 int**。使用二维数组调用函数将导致编译器错误。 - fredoverflow

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接