2017-06-22 10 views
1
typedef struct piece Piece; 
struct piece{ 
char color; 
char symbol; 
}; 
int readPiece(Piece * p[]); 

//私のコードはかなり長いため、私はそれらのすべてをここに入れなかった。ポインタを使って構造体の2次元配列を渡す方法

int main(void){ 
    int row = 0; 
    int col = 0; 

    Piece input[LEN][LEN]; 
    readPiece(input); 
    return 0; 
} 

// 16 * 2の特定の文字を読み込みます。

int readPiece(Piece * p[]){ 
    int row = 0; 
    int col = 0; 


    while(row < LEN){ 
     col = 0; 
     while(col < LEN){ 
      scanf("%c%c",&(p[row][col] .color), &(p[row][col].symbol)); 
      if((p[row][col].color == 'R' || p[row][col].color == 'G' || p[row][col].color == 'B' || p[row][col].color == 'Y') && (p[row][col] . symbol == '*' || p[row][col].symbol == '^' || p[row][col].symbol == '#' || p[row][col].symbol == '$')){ 
      getchar(); 

      }else{ 
      return 0; 
      } 
      col ++;  
     } 
     row ++; 
    } 
    return 1; 

} 

//私はちょうどC言語の学習を始めます。私は2d構造体を関数のポインタに渡そうとしますが、コンパイルすると '互換性のないポインタ型が渡ります'というメッセージが表示されます。 2d構造体を関数に渡す正しい方法と、なぜ私が機能していないのかを尋ねたいと思います。ありがとう。

+2

あなたが提供した内容は、MCVE([MCVE])にかなり近いようです。 'LEN'を定義し、' 'を含める必要があるように見えますが、それはすべてです。より多くを提供することは良いことではないでしょう。それで、うまくやった。なぜ 'int readPiece(Piece p [LEN] [LEN]);'を使わないのですか?それは構造型の2D配列を渡す合理的な方法のようです。 (あなたは 'main'の' '行' '' col''を使用しません) –

+0

ええとint readPiece(Piece [LEN] [LEN])は動作しますが、今はポインタを学習しています。私は練習したいだけで、なぜこの方法がうまくいかないのか理解できません。または、代わりに** pを使用する必要がありますか?Thx –

+0

関数に2次元配列を渡すのと同じです。 https://stackoverflow.com/questions/16724368/how-to-pass-a-2d-array-by-pointer-in-c –

答えて

2

私も最近この問題に遭遇しました。 Piece *p[]ではなく、関数定義ヘッダー(および関数宣言)にPiece (*p)[LEN]を使用してください。

*p[]はポインタの配列になりますが、(*p)[]は配列のポインタになります。

は、同様にこれを読んで試してみてください:
C pointer to array/array of pointers disambiguation

+1

「宣言と定義の両方の関数プロトタイプで」というのは、ちょっとした言い方をすれば正確だろう。 –

+0

パラメータとして配列ポインタを使用しても問題ありませんが、構文は少し混乱します。同等ではあるがはるかに読みやすい 'pens p [LEN] [LEN]'を使う方が良いでしょう。 – Lundin

0

Piece * p[]は、ポインタの配列を意味しますので、間違ったタイプです。

この関数はint readPiece(Piece p[LEN][LEN);と宣言する必要があります。
またはご希望の場合は、int readPiece(size_t length, Piece p[length][length]);

関連する問題