2016-11-18 14 views
-2

私はこの2つの機能を持っており、配列を渡して内容を変更する必要があります。多次元配列をポインタとして渡すには?

void play_game(int mines, int c, int r) { 
    char (*table)[c][r]; 
    build_field(*table, c, r); 
} 

void build_field(char *table ,int tamanhox, int tamanhoy) { 
    int i, x; 
    for(i=1;i<tamanhoy+1;i++){   
     table[tamanhoy][tamanhox] = '-';   
     for(x=0;x<tamanhox-1;x++){ 
      table[tamanhoy][tamanhox] = '-'; 
    } 
} 

このコードでは、エラーはtable[tamanhoy][tamanhox]です。

+1

を書く必要がありますので、いずれにしても、さらにこの表現

table[tamanhoy][tamanhox] ^^^^^^^^ ^^^^^^^^^ 

は意味がありません。 char ** 'それ以外の場合は、フラット 'char *'メモリ空間上に独自の行列表現を作成し、それを使用する必要があります。多くの良いC行列ライブラリがあります。 – David

+0

@David: 'char **'は多次元配列ではなく、1次元または2次元配列を表現することはできません!これはまったく異なるデータ構造です。 OP型は簡単に関数に渡すことができます。そしてその解決策は明らかです。 – Olaf

+0

@Olaf:はい、データ構造は異なります。しかし、特定のメモリレイアウトを前提とすると、char **を使用して多次元配列にインデックスを付けることができます。それは間違いなく悪い形ですが、時にはそれを回避することはできません。私はあなたが私がポストしようとしているリンクでこのテクニックに不平を抱いているのを見ているので、私はちょうど同意しないでしょう。 http://stackoverflow.com/questions/2565039/how-are-multi-dimensional-arrays-formatted-in-memory – David

答えて

1

引数tableを配列の配列へのポインタではなく、charへのポインタとして宣言しているため、エラーが発生します。あなたはでもとはしませんtable実際にどこかを指しています。あり

char table[c][r]; 
build_field(c, r, table); 

... 

void build_field(int tamanhox, int tamanhoy, char table[][tamanhoy]) 
{ 
    // Use table like a normal array of array (i.e. table[x][y] = z) 
} 

は、これらの両方の問題は、あなたがbuild_field関数に引数を渡す順序を変更することにより、ないは、配列の配列にtableポインタを作ることによって解決することができますあなたがおそらくtable[x][i]を意味するときに、build_field関数に常にtable[tamanhoy][tamanhox]を使用しているように、あなたが表示するコードの他のいくつかの問題もあります。

また、関数内の境界がループしていますが、インデックスは0から始まるため、最初の "次元"の有効なインデックスは0からtamanhox - 1(両端を含む)です。

+1

サイドローブとして: 'char table [tamanhox] [tamanhoy]のような両方のディメンションを使用すると同じ結果が得られますが、ドキュメントビューではより優れています。 2つの整数が余分なコメントなしの次元であることは明らかです。また、配列の次元の正しい型は 'int'ではなく' size_t'です。これはネガティブな価値を決して通過しないことも明らかにします。例えば、ほとんどの64ビットアーキテクチャでは、 'int'はすべてのインデックスを表すことができません。そのようなシステムでは、 'size_t'は通常64ビットです。 16ビット以上のアドレス空間を持ついくつかの16ビットアーキテクチャでも同様です。 – Olaf

1

この宣言

char (*table)[c][r]; 

は、配列を宣言しません。これは、タイプchar[c][r]のオブジェクトへのポインタを宣言します。ところで、どうしてですか?

char[r][c] 
    ^^^^^ 

このポインタを使用する前に、正しく初期化されます。

この関数宣言

void build_field(char *table ,int tamanhox, int tamanhoy); 

の最初のパラメータはchar *を入力しています。タイプchar (*)[c][r]とタイプchar *は異なる互換性のないタイプです。

あなたはポインタ間接参照に次のタイプ

void build_field(int tamanhox, int tamanhoy, char (*table)[tamanhox][tamanhoy]); 

しかし、あなたが持っている機能の内部に例えば関数宣言を書くことができます。たとえば、

(*tablw)[I][j] 

正確なパラメータの宣言は、ポインタの初期化方法と実行予定によって異なります。たぶん、あなたは次の宣言

char (*table)[r]; 

void build_field(int tamanhox, int tamanhoy, char (*table)[tamanhoy]); 

関数パラメータtableがchar型を持つため、コンパイラはエラーを発行*を意味します。したがって、table[I]はタイプcharのスカラーオブジェクトです。あなたはtable[I][x]のような添え字演算子をそれに適用することはできません。あなたは `としてあなたのテーブルを渡すことができるの下に特定のメモリレイアウトを想定して喜んでいる場合は、少なくともあなたが

table[i][x] 
    ^^^^^^