我编写了一个程序来在运行时读取数组元素,然后它根据某些配置更改列。
我从GCC cygwin编译器收到以下警告消息:
pointer.c:73: error: incompatible types in assignment
考虑下面的代码,如何删除此警告?
提前感谢您的帮助
typedef struct INPUT_ST
{
float a;
float b;
float c;
}INPUT;
const INPUT lookup[3][3];
main()
{
INPUT *ptr;
/*typedef INPUT (st[3][3]);*/
INPUT (*ptr1)[3][3];
int i, j;
ptr = (INPUT *)&lookup;
(*ptr1)[3][3] = &lookup[0][0];
for(i=0; i<3; i++)
{
for(j=0; j<3; j++)
{
printf("Row %d and column %d:n", i, j);
printf("%fn", (*ptr1)[i][j].a);
printf("%fn", (*ptr1)[i][j].b);
printf("%fnn", (*ptr1)[i][j].c);
}
printf("n");
}
}
导致错误的行如下:
(*ptr1)[3][3] = &lookup[0][0];
原因是作业的左侧和右侧具有不兼容的类型。
左侧ptr1
的类型为 INPUT (*)[3][3]
(指向 3x3 INPUT
数组的指针(。 (*ptr1)[3][3]
的类型为 INPUT
(取消引用(未初始化的(指针,然后访问(越界(元素[3][3]
(。 右侧的lookup
类型为 const INPUT [3][3]
(3x3 const INPUT
数组(。这使得&lookup[0][0]
属于类型 const INPUT *
(元素的地址 [0][0]
(。所以类型是冲突的:INPUT
vs. const INPUT *
.
您真正要做的是使ptr1
指针指向数组lookup
。因此,您需要将const
添加到指针声明中,然后按如下方式对其进行初始化:
const INPUT (*ptr1)[3][3];
// ...
ptr1 = &lookup;
您对 ptr
的部分解决方案不起作用,因为它是一个常规指针(单维(,因此您无法访问 ptr[i][j]
,这意味着取消引用不是指针INPUT
(但您可以访问ptr[i*3+j]
而不是ptr[i][j]
(。顺便说一句,与其像ptr
那样抛弃const
,不如真正宣布ptr
const INPUT *ptr;
.