2011-11-14 18 views
1

構造体の配列があります。関数のパラメータとしての配列

static field fields[xsize][ysize]; 

は私が機能

void MoveLeft(pacman *Pacman, field **fields,int **play) 

でそれを変更したい。しかし、私はこの

 MoveLeft(&Pacman,fields,play); 

のようにそれを送信するとき、私は、エラーを持っています。

フィールド - 構造

 typedef struct 
    { 
    blossom blossoms; 
    wall walls; 
    }field; 

花&壁 - 別の構造

+6

エラーが発生しました...クール:)何のエラー? –

+0

正確には、どのようなエラー? PS。私は確かではない、私は本当にプログラマーではないが、あなたはポインタを期待している間にパックマン参照を送る... –

+0

あなたの関数のプロトタイプで '** fields'がすでに 'field'型なので、ダブルポインタです。 – gkiar

答えて

2

配列とポインタがCに多少互換性がありますが、それらはまったく同じではないです。特に、配列の配列とポインタの配列は、メモリ内で異なって配置されます。

は、ここで配列の既存の配列と同じデータを参照するポインタの配列を作るための方法です:

field* field_rows[xsize]; 
for (unsigned int i=0; i<xsize; i++) { 
    field_rows[i] = fields[i]; 
} 

その後、そのfield_rows配列へのポインタがMoveLeftに渡すことができます。

MoveLeft(&Pacman,field_rows,play); 

別の解決策は、配列の配列へのポインタを取るために、代わりMoveLeftの宣言を変更するかもしれない:

void MoveLeft(pacman *Pacman, field fields[xsize][ysize], int **play); 

MoveLeft(&Pacman,fields,play); 
+0

これでエラーが発生しました 'pacma.exeの0x001f100eで未処理の例外:0xC0000005:アクセス違反が0x00000044にあります。 最後の方法のエラーです –

+0

これは別の問題のようです。あなたはプログラムをデバッグする必要があります。 – aschepler

+0

私はこの問題を解決しました。私の配列は、levelinfo.hでplay [11] [31]します。だから私は単純にmoveprocs.hにlevelinfo.hを含める(fucntion moveleftがどこにあるのか) –

-1

私はWindowsを使用していないよ一方では、私はあなたのエラーを推測していることはこれに似たものである:

error: cannot convert ‘field (*)[xx]’ to ‘field**’ for argument ‘2’ to ‘void MoveLeft(pacman*, field**,int**)’ 
は、

これに対処するには、fieldsパラメータを関数が望むタイプにキャストするだけです。

MoveLeft(&Pacman, (field **) fields, play); 
+0

エラーですが、このメソッドは機能しません。 –

+2

正しいエラーですが、ひどい答えです。決して "問題を投げ捨てる"ことはありません - あなたがここでやっているのは、エラーを無視して、コンパイラに関係なく進めるように指示することだけです。 [] []として定義されたフィールドは連続した2D配列ですが、フィールド**はポインタの(暗黙の配列)へのポインタです。 2つは非常に異なるメモリレイアウトを持っています。あなたはただ一方を他方として扱うことはできません。そうした場合、配列の実際のフィールドを実際のポインタと同じように扱うことになります。運が良ければ、早期にクラッシュし、何か間違っていることに気づくでしょう。 – BrendanMcK

2

私は、エラーがあると思い、次の2次元配列fields[xsize][ysize]で固定サイズの配列(XSIZE/YSIZEは定義またはconstsている)、それは、フィールドへのポインタへのポインタです原因これは一方で、field**のように見えていないとメモリにfields[xsize][ysize]内部的には1次元の固定サイズの配列で、コンパイラはあなたのために二重インデックスを処理します。

あなたが必要とするのは、フィールドをfield**として定義し、それを動的に割り当てることです。より詳細な説明のための

参照画像: enter image description here

+0

これは間違っています。 'field ** 'は' field'へのポインタへのポインタを意味します。 "' field'へのポインタの配列へのポインタは 'field *(* fields)[]'になります。 'field **'は配列を表現するのに適した型です。これは、ヨアヒム・ピレボリが指摘しているように型変換を明示的に行わなければならないことです。 –

+0

ここでは、用語と混同しないように、ポインタへのポインタだとしましょう。内部的には、それらはすべていくつかの型のバッファへのポインタです... –

+0

@undur_gongor IMHOあなたは間違っています。 'field [] [N]'と '*(field [N])'は同じメモリレイアウトを持ちます。 'field **'と '(* field)[]'もありますが、最初のものとは異なります。 – glglgl

関連する問題