提问人:Changwan Sun 提问时间:2/8/2022 最后编辑:Jonathon S.Changwan Sun 更新时间:4/9/2022 访问量:464
警告:从不兼容的指针类型“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 中矩阵中每个元素的平方,并将结果返回到 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;
}
变量.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 程序的初学者。而且,考虑到这一点,我在 basic_math.c 中使用了“static”,以便将矩阵从外部程序传输到主程序。
我在variables.c中固定了signal[y][x]的大小,并在basic_math.c中再次输入了temp_sq的大小。这对我来说很不方便。事实上,当我使用这个程序时,列数和行数可能是可变的。如果我能控制 main.c 中矩阵的大小,这个程序会更有效。
答:
main.c:在函数“main”中:main.c:22:14:警告:赋值给 “double (*)[101]”来自不兼容的指针类型“double *” [-Wincompatible-pointer-types] 22 |sq_matrix = 平方(信号, sizeof(signal)/sizeof(signal[0])); |^
这告诉您该函数正在返回指向双精度 b() 的指针,该指针被分配给指向行长度为 101 () 的多维数组的指针。double *
double (*)[101]
/path/basic_math.c:在函数“square”中:/path/basic_math.c:47:12: 警告:从不兼容的函数返回“double (*)[101]” 返回类型“double *”[-Wincompatible-pointer-types] 47 |
返回temp_sq;
这告诉您该函数使用 temp_sq 的值返回指向双精度 b() 的指针,该值是指向行长度为 101() 的多维数组的指针。double *
double (*)[101]
这可以通过更改返回类型以匹配返回值的源和目标来更正。例如:
typedef double (*Double2DArr101)[101];
Double2DArr101 square (const double signal[][101], int y)
上一个:指针比较警告
评论