在函数中通过指针给多维数组分配指针。

3
void print_first_n_row(double **matrix, int n, int row_size) {
 double (*abc)[row_size];
 abc=matrix;}

我遇到了"从不兼容的指针类型转换导致的赋值问题 [-Wincompatible-pointer-types]"的错误,怎样解决?


void print_first_n_row(double **matrix, int n, int row_size) 修改为 void print_first_n_row(int n, int row_size, double (*matrix)[row_size]),并相应地修改调用者?(这取决于函数和 abc 的使用方式) - MikeCAT
1
我不明白为什么有人会投票关闭这个问题。对于任何新的C程序员来说,这是一个包含常见遇到的谜团的问题,因此对其他新程序员也很有兴趣。 - ryyker
1
你需要展示调用 print_first_n_row 函数的代码,并展示对应 matrix 参数是如何声明的。 - John Bode
4个回答

4

矩阵是一种抽象数据类型。如何实现它是一个实现细节。

在这个答案中,我详细介绍了如何在C语言中实现这样的类型。

C语言中并不存在真正的多维数组。 C只有数组的数组、指针的数组或其他类型的数组,包括标量的数组。通过阅读n1570(C11标准)进行检查。

我遇到了不兼容指针类型的赋值错误[-Wincompatible-pointer-types] abc=matrix error。我该怎么解决?

要么以抽象数据类型为思考方式,要么阅读更多关于C 动态内存分配(考虑使用灵活的数组成员)和C编程语言的信息。

githubgitlab以及其他地方,您可以找到许多与矩阵相关的源代码示例。


3
注意:本答案仅涉及错误信息,不涉及传递指针给矩阵背后的逻辑。

"我遇到了'assignment from incompatible pointer type [-Wincompatible-pointer-types] abc=matrix'错误。如何解决?"

double (*abc)[row_size]; - abc 是一个指向 double 数组的指针。

double **matrix - matrix 是一个指向指向 double 的指针。

存在类型不匹配问题。 * vs. **

不能将 指向指向 double 的指针 的值 赋给 指向 double 数组的指针。

double (*abc)[row_size]; 改为 double **abcdouble (**abc)[row_size]; ,或者如果 abc 不需要,则直接使用 matrix


2

好的,答案是matrixabc必须以相同的方式声明。你需要改变原型为:

void print_first_n_row(int n, int row_size, double (*matrix)[row_size]) // row_size needs to be defined first
{
  double (*abc)[row_size] = matrix;
  ...
}

或者您需要更改abc的定义为

double **abc;

这取决于你如何定义参数matrix,以及如何调用print_first_n_row函数。

假设你的代码类似于:

int main( void )
{
  int rows = ...;  // assumes rows and cols are set at runtime
  int cols = ...;
  ...
  double matrix[rows][cols];
  ...
  print_first_n_rows( matrix, n, cols )
  ...
}

如果第一个解决方案是正确的,那么您需要更改调用方式。
  print_first_n_rows( n, cols, matrix );

1
在其他答案中已经详细解释了试图使用不兼容类型进行赋值是错误的。即使编译器没有警告,这些赋值往往会导致未定义的行为。但在C语言中,多维数组存储在单个连续的内存块中,例如:
in array[4][2] = {{1,2,3,4},{5,6,7,8}};

存储在内存中作为单个连续的位置块:

|1|2|3|4|5|6|7|8|

不像你想象的那样,是多个块:
|1|2|3|4|
|5|6|7|8|

因此,可以创建一个单一的指针变量,它可以被设置为指向C数组中的任何位置(相同基本类型),并且可以用于为该数组分配值,例如使用可变长度数组中所示的以下适应:
int main(void)
{
    print_first_n_row(4,2);// params to create 4X2 array

    return 0;
}

void print_first_n_row(int r, int c) 
{
    double matrix[r][c];        //create array using Variable Length Array
    double *abc = &matrix[0][0];//create pointer of same base type
                                //and set address to pointer to point to 
                                //first location of matrix
    printf("%s", "array contents:");
    for(int i=0; i<r*c; i++)
    {
        *(abc + i) = i*i;
        printf("%0.2f,", *(abc + i));

    }
}  

或者,与您传递数组作为参数的示例保持一致,只要类型相同,使用指针索引遍历数组位置的能力也是成立的: 传递数组参数:
void print_first_n_row(double matrix[4][2]);

int main(void)
{
    double array1[4][2] = {1,2,3,4,5,6,7,8};
    print_first_n_row(array1);

    return 0;
}

void print_first_n_row(double matrix[4][2]) 
{
    double *abc = &matrix[0][0];//create pointer of same base type
                                //and set address to pointer to point to 
                                //first location of matrix
    ...(same as first example)

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