警告:从不兼容的指针类型 '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)
这个警告让我痛苦了几个星期。我用 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)