課題のプログラムを作ったのですが、プログラムの①、②の箇所がおかしいみたいで全然うまく出来ませんでした。ですので教えていただけると嬉しいです。
まず問題文ですが、「仮引数を 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で質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
do-while文が禁止される理由
-
For文の終了値を関数にしても問...
-
入力した文字列から母音だけを...
-
for文while文の無限ループの違...
-
Cプログラムが終了しない
-
ループを途中で抜けたいのですが。
-
PIC のプログラムについて ど...
-
【C言語】後輩に教えるコツ!【...
-
プログラムで関数は使わない方...
-
入力した数値を倍々するプログラム
-
C言語 数字を削除する関数
-
c言語の配列を使ってサイコロを...
-
「指定されたキャストは有効で...
-
2÷3などの余りについて
-
複数桁10進数の*桁目だけを抽出...
-
DWORDの実際の型は何でしょうか
-
#define _CRT_SECURE_NO_WARNIN...
-
プログラムでの数字につく”f”の...
-
値差の%計算方法について
-
CTRL+Dでループを抜けるには
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ループを途中で抜けたいのですが。
-
do-while文が禁止される理由
-
break文でループを一気に抜ける...
-
For文の終了値を関数にしても問...
-
UWSCにてある一定の動作を無限...
-
エクセルVBAで Do While (1)って?
-
入力した文字列から母音だけを...
-
入力した数値を倍々するプログラム
-
PIC のプログラムについて ど...
-
C言語forループが完結した場合...
-
放電現象の2分法C言語プログラ...
-
Delphiで・・・
-
While文の終わりにセミコロンが...
-
他言語で言うcontinue文
-
n重のfor文にするには?
-
for文while文の無限ループの違...
-
フラッシュ暗算
-
ループの特定入力終了
-
Excel VBAで年度をまたぐ期間の...
-
PAD図の書き方
おすすめ情報