警告:从不兼容的指针类型 'double *' 赋值给 'double (*)[101]'

Warning: assignment to 'double (*)[101]' from incompatible pointer type 'double *'

这个警告让我痛苦了几个星期。我用 main.c、basic_math.c、basic_math.h 和 variables.h 编写了一个 C 程序。本程序将一个二维矩阵从main.c转移到function.c,计算function.c中矩阵每个元素的平方,并将returns结果放入main.c。我可以从这个程序中得到很好的结果。尽管如此,我想知道为什么我会收到此警告,并收到一条关于如何在外部程序(如 basic_math.c.

中将二维矩阵与函数一起使用的好建议

main.c

#include <stdio.h>
#include <math.h>

#include "basic_math.h"

int main()
{
  #include "variables.h"
  #include "open_read.h"
      
  //square
  sq_matrix = square(signal, sizeof(signal)/sizeof(signal[0]));
  
  //test
  for(int j=0; j <y; j++){
    for(int i=0; i <x; i++){
      printf("%lf \n", sq_matrix[j][i]);
    }
  }
#include "write.h"
#include "close.h"

  return 0;
}

basic_math.h

double * square(double signal[][101], int y);

basic_math.c


double * square (const double signal[][101], int y)
{
   static int x3 = sizeof(signal[0]/sizeof(double));
   int y3 = y;
   static double temp_sq[4096][101];

   for(int j=0; j <y3; j++){
   for(int i=0; i <x3; i++){
                           temp_sq[j][i] = signal[j][i] * signal[j][i];
                          }
                          }
   return temp_sq;
}

variables.h

int y=4096;
int x=101;

double signal[y][x];
double (*sq_matrix)[x];

编译

gcc -g main.c /path/basic_math.c -o test

编译后警告

main.c: In function ‘main’:
main.c:22:14: warning: assignment to ‘double (*)[101]’ from incompatible pointer type ‘double *’ [-Wincompatible-pointer-types]
   22 |    sq_matrix = square(signal, sizeof(signal)/sizeof(signal[0]));
      |              ^
/path/basic_math.c: In function ‘square’:
/path/basic_math.c:47:12: warning: returning ‘double (*)[101]’ from a function with incompatible return type ‘double *’ [-Wincompatible-pointer-types]
   47 |     return temp_sq;

为方便起见,我省略了打开、写入和关闭文件的部分。我是指针、二维矩阵、外部c程序的初学者。并且,参考 this,我在 basic_math.c 中使用了 'static',以便将矩阵从外部传输到主程序。

我在 variables.c 中固定了信号 [y][x] 的大小,并在 basic_math.c 中再次输入了 temp_sq 的大小。这对我来说很不方便。事实上,当我使用这个程序时,列数和行数是可变的。如果我能在main.c中控制矩阵的大小,这个程序会更有效。

main.c: In function ‘main’: main.c:22:14: warning: assignment to ‘double (*)[101]’ from incompatible pointer type ‘double *’ [-Wincompatible-pointer-types] 22 | sq_matrix = square(signal, sizeof(signal)/sizeof(signal[0])); | ^

这告诉您该函数正在 return 指向双 b (double *) 的指针,它被分配给指向行长度为 101 的多维数组的指针 (double (*)[101]).

/path/basic_math.c: In function ‘square’: /path/basic_math.c:47:12: warning: returning ‘double (*)[101]’ from a function with incompatible return type ‘double *’ [-Wincompatible-pointer-types] 47 |
return temp_sq;

这告诉你函数是 returning 一个指向 double b (double *) 的指针,使用 temp_sq 的值,它是一个指向多维数组的指针行长 101 (double (*)[101]).

这可以通过更改 return 类型以匹配 return 值的源和目标来更正。例如:

typedef double (*Double2DArr101)[101];

Double2DArr101 square (const double signal[][101], int y)