2012-04-30 21 views
2

実行時に配列要素を読み込むプログラムを作成しました。そこで配列をいくつかの設定に基づいて変更します。以下のコードを考慮ポインタ代入の警告メッセージ2次元配列ポインタ

pointer.c:73: error: incompatible types in assignment 

、どのように私はこの警告を削除することができます

私はGCCのcygwinのコンパイラから次の警告メッセージが表示されますか?

(*ptr1)[3][3] = &lookup[0][0]; 

理由は左手側と右手の側ということである。

は、エラーの原因となった行は次のようであるあなたの助けのために事前に

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"); 
    } 
} 
+3

私は、73行目の内容を伝えることから始めます。 – MByD

+0

提供されているサンプルコードの15行目です。 –

答えて

1

をありがとう代入の互換性のない型があります。

ptr1は、タイプINPUT (*)[3][3](3x3アレイへのポインタINPUT)です。 (*ptr1)[3][3]はタイプINPUTであり(初期化されていない)ポインタを逆参照してから、範囲外(out-of-bounds)の要素[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のようにconstをキャストするのではなく、ptrconst INPUT *ptr;と実際に宣言する必要があります。

関連する問題