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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
小人
記事: 78
登録日時: 14年前

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

#1

投稿記事 by 小人 » 14年前

他ファイルで定義されている二次配列をコピーもしくは参照するにはどのようにポインタを扱えば良いのか分からず、質問致しました。

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

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へ配列の情報を持っていくにはどのようにすれば宜しいでしょうか?

box
記事: 2002
登録日時: 15年前

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

#2

投稿記事 by box » 14年前

今はうまく持っていくことができてないってことですよね。
どんな風にうまくいってないのか、エラーメッセージなどの情報を示してください。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

小人
記事: 78
登録日時: 14年前

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

#3

投稿記事 by 小人 » 14年前

エラーメッセージはこちらです

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

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

box
記事: 2002
登録日時: 15年前

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

#4

投稿記事 by box » 14年前

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

アバター
a5ua
記事: 199
登録日時: 15年前

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

#5

投稿記事 by a5ua » 14年前

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];
		}
	}
}

小人
記事: 78
登録日時: 14年前

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

#6

投稿記事 by 小人 » 14年前

プロトタイプ宣言はこちらです
void Board_copy(int*[11]);

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

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

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

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

box
記事: 2002
登録日時: 15年前

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

#7

投稿記事 by box » 14年前

小人 さんが書きました:プロトタイプ宣言はこちらです
void Board_copy(int*[11]);

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

ちなみに、今のプロトタイプ宣言では、
int型のポインターの配列(要素数11)
となっていて、
int型の配列(要素数11)へのポインター
になっていません。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

小人
記事: 78
登録日時: 14年前

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

#8

投稿記事 by 小人 » 14年前

あぁ!
void Board_copy(int(*)[11]);
にすれば解決しそうですね。

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

ISLe
記事: 2650
登録日時: 15年前
連絡を取る:

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

#9

投稿記事 by ISLe » 14年前

void Board_copy(int[11][11]);
void Board_copy(int board_copy[11][11])
{
}
と書いても同じ結果になることはご存知ですか?

閉鎖

“C言語何でも質問掲示板” へ戻る