我编写了一个程序来在运行时读取数组元素,然后根据某些配置更改列。
我从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("%f\n", (*ptr1)[i][j].a);
printf("%f\n", (*ptr1)[i][j].b);
printf("%f\n\n", (*ptr1)[i][j].c);
}
printf("\n");
}
}
答案 0 :(得分:1)
导致错误的行如下:
(*ptr1)[3][3] = &lookup[0][0];
原因是作业的左侧和右侧有不兼容的类型。
左侧的 ptr1
类型为INPUT (*)[3][3]
(指向INPUT
的3x3数组的指针)。 (*ptr1)[3][3]
的类型为INPUT
(取消引用(未初始化的)指针,然后访问(越界)元素[3][3]
)。右侧lookup
的类型为const INPUT [3][3]
(const INPUT
的3x3数组)。这使得&lookup[0][0]
属于const INPUT *
类型(元素[0][0]
的地址)。因此类型存在冲突:INPUT
与const INPUT *
。
您真正想要做的是使ptr1
指针指向数组lookup
。因此,您需要将const
添加到指针声明中,然后按如下所示进行初始化:
const INPUT (*ptr1)[3][3];
// ...
ptr1 = &lookup;
您使用ptr
的部分解决方案不起作用,因为它是常规指针(单维),因此您无法访问ptr[i][j]
,这意味着取消引用INPUT
不是指针(但可以访问ptr[i*3+j]
而不是ptr[i][j]
)。顺便说一句,您不应像const
那样丢弃ptr
,而应该将ptr
声明为const INPUT *ptr;
。