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])になります。したがって、タイプは競合しています:INPUTconst INPUT *

あなたが本当にやろうとしていることは、ptr1ポインタが配列を指すようにすることlookupです。constしたがって、ポインタ宣言に追加してから、次のように初期化する必要があります。

const INPUT (*ptr1)[3][3];
// ...
ptr1 = &lookup;

ptr通常のポインタ(単一次元)であるため、使用している部分的なソリューションは機能しません。したがってptr[i][j]、にアクセスできません。つまり、ポインタではない間接参照を意味しINPUTます(ただし、の代わりにアクセスできます)。ちなみに、あなたがするように捨てるのではなく、あなたは本当にとして宣言するべきです。ptr[i*3+j]ptr[i][j]constptrptrconst INPUT *ptr;

于 2012-04-30T22:49:42.897 に答える