dポイントプレゼントキャンペーン実施中!

課題のプログラムを作ったのですが、プログラムの①、②の箇所がおかしいみたいで全然うまく出来ませんでした。ですので教えていただけると嬉しいです。

 まず問題文ですが、「仮引数を int b [][5]のように宣言した場合、関数 setwに5という固定した値が入り込み、関数としての汎用性がかけるので、先頭アドレス、行の数、列の数を引数として渡し、ポインタbにより直線的(連続的)に a[ ][ ] を参照するようにしなさい。 」とあり、自分では理解しきれなかったので問題文ごと載せましたすいません。プログラムも下に載せてます。情報が少ないとは思うのですが教えていただけると幸いです。

---------------------------------------------------------------------------------------------------

#include <stdio.h>

void setw (int *b, int m, int n, int dat) /* 初期化を行う関数 */
{

int k;
for (k=0;k<n;k++){  -----------------------  ①
*(b[m] + n) = dat;  -----------------------  ②
b++;
}

}

int main(void)
{

int a[5][8],j,k;

setw ((int *)a, 5, 8, 1);

for (j=0;j<5;j++){
for (k=0;k<8;k++)
printf ("%2d",a[j][k]);
printf ("\n");
}

}

---------------------------------------------------------------------------------------------------

A 回答 (1件)

int a[5][8]で下記のような感じで確保されます。


[0][0] [0][1] [0][2] [0][3] [0][4] [0][5] [0][6] [0][7]
[1][0] [1][1] [1][2] [1][3] [1][4] [1][5] [1][6] [1][7]
[2][0] [2][1] [2][2] [2][3] [2][4] [2][5] [2][6] [2][7]
[3][0] [3][1] [3][2] [3][3] [3][4] [3][5] [3][6] [3][7]
[4][0] [4][1] [4][2] [4][3] [4][4] [4][5] [4][6] [4][7]

>void setw (int *b, int m, int n, int dat) /* 初期化を行う関数 */
>{
> int k;
> for (k=0;k<n;k++){  -----------------------  ①
>  *(b[m] + n) = dat;  -----------------------  ②
>  b++;
> }
>}

ループ1回目のそれぞれの変数は……
bがa[0][0]を差しています。
>*(b[m] + n) = dat;
により、b[5]でa[0][5]でさらに+8した箇所(a[1][5])を差します。
> b++;
により、bはa[0][1]を差すようになります。

ループ2回目で
>*(b[m] + n) = dat;
により、b[5]でa[0][6]でさらに+8した箇所(a[1][6])を差します。
> b++;
により、bはa[0][2]を差すようになります。

ループ3回目で
>*(b[m] + n) = dat;
により、b[5]でa[0][7]でさらに+8した箇所(a[1][7])を差します。
> b++;
により、bはa[0][3]を差すようになります。

ループ4回目で
>*(b[m] + n) = dat;
により、b[5]でa[1][0]でさらに+8した箇所(a[2][0])を差します。
> b++;
により、bはa[0][4]を差すようになります。

ループ5回目で
>*(b[m] + n) = dat;
により、b[5]でa[1][1]でさらに+8した箇所(a[2][1])を差します。
> b++;
により、bはa[0][5]を差すようになります。

ループ6回目で
>*(b[m] + n) = dat;
により、b[5]でa[1][2]でさらに+8した箇所(a[2][2])を差します。
> b++;
により、bはa[0][6]を差すようになります。

ループ7回目で
>*(b[m] + n) = dat;
により、b[5]でa[1][3]でさらに+8した箇所(a[2][3])を差します。
> b++;
により、bはa[0][7]を差すようになります。

次のループでkがめでたく8になりますのでループ終了です。
a[1][5]からa[2][3]までは値が設定されますが、他の部分は未初期化ですので不定値となります。


 int k;
 for (k=0;k<(m * n);k++){
  *b = dat;
  b++;
 }
とか、
 int k,l;
 for (k=0;k<n;k++){
  for (l=0;l<m;l++){
   *(b + (k*m) + l) = dat;
  }
 }
とかにするべきなんじゃないですかね?
「ポインタbにより直線的(連続的)に」だと前者かと思われますが。
    • good
    • 1
この回答へのお礼

回答ありがとうございます。
大変わかりやすく教えていただいたとおりプログラムを
実行したらうまくできましたありがとうございました。

お礼日時:2015/09/09 20:57

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!