![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
課題のプログラムを作ったのですが、プログラムの①、②の箇所がおかしいみたいで全然うまく出来ませんでした。ですので教えていただけると嬉しいです。
まず問題文ですが、「仮引数を 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");
}
}
---------------------------------------------------------------------------------------------------
No.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により直線的(連続的)に」だと前者かと思われますが。
回答ありがとうございます。
大変わかりやすく教えていただいたとおりプログラムを
実行したらうまくできましたありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- C言語・C++・C# C言語 3 2022/10/04 15:07
- C言語・C++・C# c言語の問題です 課題1 (二分探索木とセット) 大きさ size の配列 array を考える。す 2 2023/01/10 21:08
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# C言語の課題が出たのですが自力でやっても分かりませんでした。 要素数がnであるint型の配列v2の並 3 2022/11/19 17:41
- C言語・C++・C# カードシャッフルのブログラムを使ってc言語でブラックジャックをしたい 2 2022/04/12 15:13
- Java javaでのプログラム(配列)について質問です. 2 2022/10/14 22:27
- C言語・C++・C# プログラミング c言語 4 2023/03/07 01:05
- C言語・C++・C# 至急教えてください! プログラミングの問題です! お願いします! 出力2と全く同じ出力をするように、 2 2022/06/22 23:10
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ループを途中で抜けたいのですが。
-
do-while文が禁止される理由
-
for文while文の無限ループの違...
-
break文でループを一気に抜ける...
-
入力した文字列から母音だけを...
-
UWSCにてある一定の動作を無限...
-
エクセルでC言語のfor文と同じ...
-
プログラムで関数は使わない方...
-
PIC のプログラムについて ど...
-
ループの特定入力終了
-
C言語、whileループを抜け出す...
-
While文の終わりにセミコロンが...
-
Excel VBAで年度をまたぐ期間の...
-
プログレスバーで
-
C言語 数字を削除する関数
-
基本情報技術平成21年春午後問8...
-
Cプログラムが終了しない
-
入力した数値を倍々するプログラム
-
if文を使わずに奇数・偶数を判断
-
H8/3048マイコンAD/DA変換について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
break文でループを一気に抜ける...
-
ループを途中で抜けたいのですが。
-
do-while文が禁止される理由
-
入力した数値を倍々するプログラム
-
For文の終了値を関数にしても問...
-
C言語forループが完結した場合...
-
エクセルVBAで Do While (1)って?
-
入力した文字列から母音だけを...
-
if文の中にfor文なのか、for文...
-
Excel VBAで年度をまたぐ期間の...
-
C言語、whileループを抜け出す...
-
for文while文の無限ループの違...
-
プログラムで関数は使わない方...
-
Cプログラムが終了しない
-
PIC のプログラムについて ど...
-
アルゴリズムです!四つの数字...
-
UWSCにてある一定の動作を無限...
-
繰り返し文の利点について
-
ループの特定入力終了
-
PAD図の書き方
おすすめ情報