このプログラミングの式ってなんか間違ってる?

1: 2019/06/27(木) 13:17:30.36 ID:+jJiSq56d
思うように動かない
void CalculateBMI(struct PhysicalData *p)
{
p->bmi = p->weight / (p->height * p->height);
p++;
}

5: 2019/06/27(木) 13:18:32.75 ID:SkD0/3HMp
言語は?

6: 2019/06/27(木) 13:18:46.05 ID:+jJiSq56d
>>5
c

8: 2019/06/27(木) 13:19:14.56 ID:iMJCh+kor
ポインタか?
昔知っけどろくに覚えてないわ

12: 2019/06/27(木) 13:19:35.27 ID:+jJiSq56d
>>8
ポインタ一個ズレてほしいのにずれない

13: 2019/06/27(木) 13:19:51.69 ID:WMyGKLL1r
>>12
やっぱりな

10: 2019/06/27(木) 13:19:20.86 ID:WMyGKLL1r
p++がおかしい

14: 2019/06/27(木) 13:19:52.98 ID:+jJiSq56d
>>10
そうなの?
じゃあどうすんの?

18: 2019/06/27(木) 13:20:55.19 ID:WMyGKLL1r
>>14
やりたいこと具体的におしえて
多分もっとスマートに解決できる

25: 2019/06/27(木) 13:21:48.55 ID:+jJiSq56d
>>18
bmiの計算を複数回やりたい

19: 2019/06/27(木) 13:21:08.89 ID:SBBCfqIUp
>>14
どうしようもない

11: 2019/06/27(木) 13:19:32.39 ID:YNZ66+fna
構造体にp++って出来なくないか

14: 2019/06/27(木) 13:19:52.98 ID:+jJiSq56d
>>11
そうなの?
じゃあどうすんの?

26: 2019/06/27(木) 13:21:58.93 ID:mOSTTk7b0
>>11
これは構造体のポインタだからできる

28: 2019/06/27(木) 13:22:27.18 ID:+jJiSq56d
>>26
そうなの?

17: 2019/06/27(木) 13:20:50.14 ID:YNZ66+fna
複数データを計算したいなら、構造体の配列を引数に取ればいいんでね

21: 2019/06/27(木) 13:21:25.83 ID:lVQYIw3S0
p=p+1

27: 2019/06/27(木) 13:22:16.22 ID:+jJiSq56d
>>21
それならいいの?

23: 2019/06/27(木) 13:21:41.98 ID:QroAS0NQd
関数内で++しても外では増えてないから意味がない

31: 2019/06/27(木) 13:22:35.74 ID:i4HLmuBjd
>>23
これやな

33: 2019/06/27(木) 13:23:16.77 ID:+jJiSq56d
ポインタってどこでも反映されるんじゃないの?

35: 2019/06/27(木) 13:23:51.04 ID:DSAmzBh2a
>>33
それはポインタの指してる構造体の話
ポインタ自体はただの変数だから値渡し

46: 2019/06/27(木) 13:28:11.43 ID:8iPZASSJ0
>>33
引数の時は値渡しされてるんじゃなかったっけ

36: 2019/06/27(木) 13:23:51.54 ID:+jJiSq56d
値を渡す?

38: 2019/06/27(木) 13:24:43.61 ID:ZIF1RCFf0
>>36
値渡しと参照渡しでググれ

37: 2019/06/27(木) 13:23:55.69 ID:zyDrHhWq6
呼び出すときに

CalculateBMI(p[i])

みたいにすると思うがそのインデックスを調整すればええやん

40: 2019/06/27(木) 13:25:06.50 ID:tjgZuOq50
頭いい人多いんやな

44: 2019/06/27(木) 13:27:35.97 ID:FN8THxLa0
void CalculateBMI(struct PhysicalData **pp
)
{
struct PhysicalData *p=*pp;
p->bmi = p->weight / (p->height * p->height);
*pp++;
}

51: 2019/06/27(木) 13:29:04.98 ID:FN8THxLa0
>>44
(*pp)++; だった

60: 2019/06/27(木) 13:31:31.42 ID:FN8THxLa0
>>44
でも読んでる側でp++でいいんじゃねえの。関数側でされるのが明確に見えないし

45: 2019/06/27(木) 13:27:38.24 ID:DYxRwO+l0
関数呼び出す側でずらせばええんちゃうん

47: 2019/06/27(木) 13:28:16.07 ID:EqMG/m9Ha
単純で分かりやすい記述にしとかないと後で自分でわかんなくなるんだよなあ

55: 2019/06/27(木) 13:30:04.28 ID:+jJiSq56d
いまいちわからん

56: 2019/06/27(木) 13:30:09.64 ID:xsP3gvq8a
その関数がそもそもうんち
戻り値でbmi返すようにしなよ

58: 2019/06/27(木) 13:30:35.31 ID:YXfqRxIG0
普通関数の外でインクリメントするよね?

59: 2019/06/27(木) 13:31:22.56 ID:ndv0plqX0
返り値を返す形にした方がいいんじゃないの

61: 2019/06/27(木) 13:31:34.07 ID:zUL+8ybPd
bmi計算の関数にインクリメントの仕事をさせるな

62: 2019/06/27(木) 13:31:37.67 ID:b+abxKTNa
戻り値bmiで関数外で関数含めた繰り返し

64: 2019/06/27(木) 13:31:51.21 ID:2zDkoRv7d
ポインタのインクリメントに突っ込んでるヤツ多すぎ
連想配列じゃないんだからそれ自体は問題ないだろう

78: 2019/06/27(木) 13:35:52.43 ID:2zDkoRv7d
>>64
自己レスやけど内部でループするのにインクリメントしてるんじゃないのか
恥ずかC

65: 2019/06/27(木) 13:32:05.49 ID:IMrTB9Aa0
p->ってなんや

68: 2019/06/27(木) 13:32:37.33 ID:+jJiSq56d
>>65
構造体のメンバ変数

66: 2019/06/27(木) 13:32:10.07 ID:+jJiSq56d
戻り値なし
ポインタ使用で

76: 2019/06/27(木) 13:35:24.75 ID:DSAmzBh2a
>>66
じゃあ再帰にしろ
呼び出し元の方で、予め配列の末尾を表すデータを入れて置く
たとえばp->weight == 0が終端を表すとすると

void CalculateBMI(struct PhysicalData *p)
{
if(!p->weight) return;
p->bmi = p->weight / (p->height * p->height);
CalculateBMI(++p);
}

99: 2019/06/27(木) 13:38:42.00 ID:2zDkoRv7d
>>76
だっさ普通こう書くよね

void CalculateBMI(struct PhysicalData *p)
{
 while(p){
p->bmi = p->weight /(p->height * p->height);
  p++;
}

}

105: 2019/06/27(木) 13:39:43.38 ID:DSAmzBh2a
>>99
はいバッファオーバーフロー

110: 2019/06/27(木) 13:40:40.03 ID:2zDkoRv7d
>>105
じぶんのもスタックオーバフローの可能性あるだろ

114: 2019/06/27(木) 13:42:41.57 ID:DSAmzBh2a
>>110
永遠にp==NULLにはならんから終わらんぞそれ
まあ再帰で書くよりwhile回せっていうのも一理あるけど

118: 2019/06/27(木) 13:43:44.71 ID:2zDkoRv7d
>>114
それは配列の最後にNULLパッド入れる前提なのくらい察して

67: 2019/06/27(木) 13:32:27.02 ID:DSAmzBh2a
そもそも副作用を増やすのはあんまり良くないぞ
素直に呼び出し元でfor文を回せ

69: 2019/06/27(木) 13:33:00.91 ID:+jJiSq56d
>>67
回してるよ

79: 2019/06/27(木) 13:35:57.54 ID:ndv0plqX0
>>69
forの部分貼ってもらってもいい?

88: 2019/06/27(木) 13:37:31.19 ID:+jJiSq56d
>>79
while (1)
{
printf("312番目の人の名前を入力してください(!で終了):", i + 1);
scanf_s("176", pd[i].name, 30);
if (pd[i].name[0] == '!')
break;
printf("身長を入力してください:");
scanf_s("", &pd[i].height);
printf("体重を入力してください:");
scanf_s("", &pd[i].weight);
i++;
CalculateBMI(pd);
}

108: 2019/06/27(木) 13:40:25.66 ID:SYrPtj5u0
>>88
&pd[i]渡せばええんちゃう

117: 2019/06/27(木) 13:43:17.51 ID:+jJiSq56d
>>108
ありがとう
うまくいきました

73: 2019/06/27(木) 13:34:49.11 ID:0g6VXraE0
何このスレwめちゃ頭よさそうに見えてかっこいいなw

74: 2019/06/27(木) 13:35:12.74 ID:0GRosi0yp
変数のスコープとか引数の勉強した方がいいと思う

83: 2019/06/27(木) 13:36:27.74 ID:HOY7xdeH0
pythonしか知らんがCってクッソわかりづらいな
今更こんな言語勉強しても将来性ないだろ

89: 2019/06/27(木) 13:37:33.57 ID:RNP3fScg0
>>83
お勉強用の言語って感じやな
実用性は無い