ページ 11

ポインタによる二次配列参照について

Posted: 2011年6月22日(水) 19:41
by 小人
他ファイルで定義されている二次配列をコピーもしくは参照するにはどのようにポインタを扱えば良いのか分からず、質問致しました。

ソースコードは以下の通りです。
(見易いよう変えてあります)

Graph.cpp

コード:

void Draw_board(){
	int copy_board[11][11];
             int (*copy)[11] = copy_board;
	int x,y;

	Board_copy(copy);

	for( y = 1 ; y < 11 -1 ; y++ ){
		for( x = 1 ; x < 11-1 ; x++ ){
			switch(copy_board[ y ][ x ] ){
				case 0 : 
					DrawGraph();
					break;

				case 1 :
					DrawGraph();
					break;

				case 2 :
					DrawGraph();
					break;
			}
		}
	}
}
Board.cpp

コード:

static int BanData[ 11 ][ 11 ] =
{
	{ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,-1 } ,
	{ -1, 2, 1, 2, 0, 0, 1, 1, 0, 0, -1 } ,
	{ -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1 } ,
	{ -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1 } ,
	{ -1, 0, 1, 0, 0, 0, 0, 0, 0, 0, -1 } ,
	{ -1, 0, 0, 0, 2, 2, 2, 0, 0, 0, -1 } ,
	{ -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1 } ,
	{ -1, 0, 2, 1, 0, 1, 0, 0, 0, 0, -1 } ,
	{ -1, 0, 0, 0, 0, 0, 0, 0, 2, 0, -1 } ,
	{ -1, 1, 1, 2, 2, 1, 0, 1, 1, 2, -1 } ,
	{ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,-1 }
} ;

void Board_copy(int (*board_copy)[11]){
	int y;

	for( y=0 ; y<12 ; y++ ){                //ボードの情報をコピーする
            board_copy[y] = BanData[y];
        }
}

プロトタイプ宣言はそれぞれのヘッダファイルで行っております。
Board.cppからDraw.cppへ配列の情報を持っていくにはどのようにすれば宜しいでしょうか?

Re: ポインタによる二次配列参照について

Posted: 2011年6月22日(水) 20:51
by box
今はうまく持っていくことができてないってことですよね。
どんな風にうまくいってないのか、エラーメッセージなどの情報を示してください。

Re: ポインタによる二次配列参照について

Posted: 2011年6月22日(水) 21:29
by 小人
エラーメッセージはこちらです

board.cpp(20) : error C2106: '=' : 左のオペランドが、左辺値になっていません。

Graph.cpp(6) : error C2664: 'Board_copy' : 1 番目の引数を 'int (*)[11]' から 'int *[]' に変換できません。(新しい機能 ; ヘルプを参照)

Re: ポインタによる二次配列参照について

Posted: 2011年6月22日(水) 22:35
by box
小人 さんが書きました: board.cpp(20) : error C2106: '=' : 左のオペランドが、左辺値になっていません。
board_copyは、int型の配列(要素数11)へのポインターであって配列ではないため、
そのメッセージが出ているのではないでしょうか。
小人 さんが書きました: Graph.cpp(6) : error C2664: 'Board_copy' : 1 番目の引数を 'int (*)[11]' から 'int *[]' に変換できません。(新しい機能 ; ヘルプを参照)
Board_copy()のプロトタイプ宣言も関係しているような気がします。

Re: ポインタによる二次配列参照について

Posted: 2011年6月22日(水) 22:46
by a5ua
Board_copyは以下のようになるのではないでしょうか

コード:

//ボードの情報をコピーする
void Board_copy(int (*board_copy)[11])
{
	int y, x;

	for (y = 0; y < 11; y++) {
		for (x = 0; x < 11; x++) {
			board_copy[y][x] = BanData[y][x];
		}
	}
}

Re: ポインタによる二次配列参照について

Posted: 2011年6月22日(水) 22:57
by 小人
プロトタイプ宣言はこちらです
void Board_copy(int*[11]);

これが原因な気もしてきました。
どう書き直したら良いものでしょうか・・・?

>>a5uaさん
その様に書き直した所、
board.cpp(20) : error C2106: '=' : 左のオペランドが、左辺値になっていません。
のエラーは無くなりました。有難う御座います。

y座標1づつに入っている配列(x座標の始まりから終わりまで)の先頭をポインタで対応していくものだと考えていたのですが、そういう訳ではないのですねorz

よく1次元の配列ならば添字なしに配列名だけで先頭のアドレスを渡せていたので、二次元配列も同様に出来るものと勘違いしておりました。

Re: ポインタによる二次配列参照について

Posted: 2011年6月22日(水) 23:32
by box
小人 さんが書きました:プロトタイプ宣言はこちらです
void Board_copy(int*[11]);

これが原因な気もしてきました。
どう書き直したら良いものでしょうか・・・?
プロトタイプ宣言には変数名を含めてよいことはご存じですか?
というわけで、その関数定義の先頭ではどう書いてあるかということをよく見ると、
プロトタイプ宣言をどう書けばいいかは自ずとわかるはずです。

ちなみに、今のプロトタイプ宣言では、
int型のポインターの配列(要素数11)
となっていて、
int型の配列(要素数11)へのポインター
になっていません。

Re: ポインタによる二次配列参照について

Posted: 2011年6月22日(水) 23:43
by 小人
あぁ!
void Board_copy(int(*)[11]);
にすれば解決しそうですね。

長い間付き合って下さって有難う御座いましたm(_ _)m

Re: ポインタによる二次配列参照について

Posted: 2011年6月23日(木) 01:33
by ISLe
void Board_copy(int[11][11]);
void Board_copy(int board_copy[11][11])
{
}
と書いても同じ結果になることはご存知ですか?