2

我编写了一个程序来在运行时读取数组元素,然后它会根据一些配置更改列。

我从 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");
    }
}
4

1 回答 1

1

导致错误的行如下:

(*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])。所以类型是冲突的:INPUTvs. 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你应该真正声明ptrconst INPUT *ptr;.

于 2012-04-30T22:49:42.897 回答