こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

2次元配列を引数とする関数について

2次元配列を引数とする関数について
私は今、2次元配列を引数とする関数の表を作るという課題に取り組んでいます。
条件として、int a[数字][数字]={{1,2,3...}}という配列の宣言と同時の初期化は使わず、
関数内で表の値を代入し、値を表示する関数を作り、事実上二つの関数を作るというものです。

私は以下のようなプログラムを作り、動かしましたが、[数字][数字]=********のような本来
あるべき実行結果とは異なる数字の羅列が出てきてしまいました。

#include <stdio.h>


void func(int a[][6]);
void fund(int b[4][6]);
void main(void)
{
int a[4][6];

fund(a);

func(a);
}
void func(int a[][6])
{
int i,j,b[4][6];

fund(b);

for(i=0;i<4;i++)
      {
for(j=0;j<6;j++)
{
printf("a[%d][%d]=%d\n",i,j,a[i][j]);

printf("\n");
}
}
}
void fund(int b[4][6])
{
int i,j;

for(i=0;i<4;i++)
{
for(j=0;j<6;j++)
         {
scanf("b[%d]*[%d]=%d\n",&i,j,b[i][j]);
}
}
}

本来の実行結果
1 2 3 4 5 6
2 4 6 8 10 12
3 6 9 12 15 18
4 8 12 16 20 24

紙にも書いて何回も見直しましたが、どこがおかしいのかわかりませんでした。
どうすれば良いのでしょうか?
何か良いアドバイスをよろしくお願いします。

投稿日時 - 2010-09-15 11:49:32

QNo.6183960

すぐに回答ほしいです

質問者が選んだベストアンサー

>本来の実行結果
>1 2 3 4 5 6
>2 4 6 8 10 12
>3 6 9 12 15 18
>4 8 12 16 20 24

 「本来の実行結果」って、この1つのみですか?。
 そうだとしたら、

>関数内で表の値を代入・・

 する必要はない、と思います。
 下のソースを参照願います。
++++++++++++++++++++++++++++++++++++++++++++++
あくまでも「関数内で表の値を代入」するならば、

 前の回答者が指摘した箇所の、
 「 [数字][数字]= 」と入力を「促す部分」は、printf() で行うよう《分ける》べきと思います。

 http://www.bohyoh.com/CandCPP/C/Library/scanf.html

★ただし、そこでは入力の都度、「本来の実行結果」に合うかチェックが必要で、そのための「配列」が必要となり、

>条件として、int a[数字][数字]={{1,2,3...}}という配列の宣言と同時の初期化は使わず、

 本末転倒となります。
 「課題」を読み直した方がよろしいかと・・。

#include <stdio.h>

void Dainyuu( int b[][ 6 ] )
{
 int i, j;

 for( i = 0; i < 4; i++ ){

  for( j = 0; j < 6; j++ ){

   b[ i ][ j ] = ( i + 1 ) * ( j + 1 );
  }
 }
}
void HyouPrint( int c[][ 6 ] )
{
 int i, j;

 for( i = 0; i < 4; i++ ){

  for( j = 0; j < 6; j++ ){

   printf( "%d ", c[ i ][ j ] );
  }
  printf( "\n" );
 }
}
void main( void )
{
 int a[ 4 ][ 6 ];

 Dainyuu( a );

 HyouPrint( a );
}
注:インデントに全角空白を用いています。コピペ後、タブに一括変換して下さい。

投稿日時 - 2010-09-15 17:07:21

このQ&Aは役に立ちましたか?

3人が「このQ&Aが役に立った」と投票しています

回答(4)

ANo.3

Wr5

訂正。
>それぞれ「全く別のもの」であること

func()の
int b[4][6]
はmain()の
int a[4][6]
と別ですが、他は「コール元のもの」…でした。
# こんな使い方普段やらないからなぁ…

原因に関しては…既に回答されているscanf()の書き方…でしょう。

投稿日時 - 2010-09-15 12:25:48

ANo.2

確実に
scanf("b[%d]*[%d]=%d\n",&i,j,b[i][j]);
はおかしい.

投稿日時 - 2010-09-15 12:07:24

ANo.1

Wr5

>関数内で表の値を代入し、値を表示する関数を作り

とりあえず…
main()の中の
int a[4][6]
とfunc()の
int a[][6]
int b[4][6]
とfund()の
int b[4][6]
がそれぞれ「全く別のもの」であることは理解されてます?

投稿日時 - 2010-09-15 12:06:52

あなたにオススメの質問