C言語の設計ミスった危険な関数トップ10決めようぜ (215レス)
1-

102: 2019/12/16(月)22:41 ID:LjjtFzBx(3/4) AAS
間違えたw goto
103: 2019/12/16(月)22:42 ID:xr9KOlE0(6/17) AAS
話を戻して

・ループを抜けた後に関数の後処理が必要な場合
・ループを抜けた後にローカル変数を使った処理をする場合
・他、意味的に関数内で処理したい場合

はどうするの?
104
(1): 2019/12/16(月)22:44 ID:arH1mwfY(8/13) AAS
> ・ループを抜けた後に関数の後処理が必要な場合
前処理を関数の中でするな

> ・ループを抜けた後に関数の後処理が必要な場合
戻り値を返せ

>・他、意味的に関数内で処理したい場合
自分で具体例が思いつかないなら出すな
105: 2019/12/16(月)22:45 ID:arH1mwfY(9/13) AAS
コピペミスったな

>・ループを抜けた後にローカル変数を使った処理をする場合
戻り値を返せ
106
(1): 2019/12/16(月)22:48 ID:xr9KOlE0(7/17) AAS
>>104
なぜ?
107: 2019/12/16(月)22:52 ID:arH1mwfY(10/13) AAS
>>106
なにが?

ってか、もう少し具体例を書けよ。
それみれば設計がおかしいという結論になる

例えて言うなら、パーサーの処理の中でネットワークにアクセスしたい時困るから
ネットワークモジュールはグローバルにアクセスできるようにしておくべき
みたいなことを言ってるようなもんだよ。それは設計がおかしい。
108
(1): 2019/12/16(月)22:54 ID:xr9KOlE0(8/17) AAS
int func(int n){
ロック
ループ
アンロック
return 結果;
}
109: 2019/12/16(月)22:55 ID:xr9KOlE0(9/17) AAS
int func(int n){
ループ
値を加工
return 値
}
110: 2019/12/16(月)22:58 ID:arH1mwfY(11/13) AAS
>>108
「ループ」という言い方がおかしい。
ループで「実装」しているのであって
やっているのはなにかの「処理」だろう?

int func(int n){
ロック
処理
アンロック
return 結果;
}

「処理」という名前をつけたくなるならば、
そこは独立した関数にするべきだろう
111: 2019/12/16(月)23:02 ID:xr9KOlE0(10/17) AAS
double sigma(const double *a){
ループで総和と2乗和と数を計算
標準偏差を計算
return 標準偏差
}
112
(2): 2019/12/16(月)23:04 ID:xr9KOlE0(11/17) AAS
int func(int n){
int a[10] = {0};
ループ
aから値を計算
return 値
}
113: 2019/12/16(月)23:06 ID:xr9KOlE0(12/17) AAS
いくらでも思い浮かぶ
114: 2019/12/16(月)23:07 ID:LjjtFzBx(4/4) AAS
全部関数に分けろって言われて終わりそう
115: 2019/12/16(月)23:09 ID:xr9KOlE0(13/17) AAS
分ける理由がない
116: 2019/12/16(月)23:10 ID:xr9KOlE0(14/17) AAS
>>112を分けてみて
117: 2019/12/16(月)23:17 ID:xr9KOlE0(15/17) AAS
関数分けってのは意味、機能、汎用性、...で分けるべきであって
単にループを抜けるのにreturnを使いたいから分けるとかを考えるべきじゃない
118
(1): 2019/12/16(月)23:23 ID:xr9KOlE0(16/17) AAS
素直にgotoの使い方を覚えた方が良いよ
意地はってないで
119
(1): 2019/12/16(月)23:42 ID:arH1mwfY(12/13) AAS
>>118
だから意味とか汎用性とかで分けると
自然にループに抜けるときにreturnを使えば良くなるんだよ
120: 2019/12/16(月)23:45 ID:jL52ryYk(2/2) AAS
gotoでもreturnでも読めれば良い
但し1関数50行以上は読めないんで宜しく
121: 2019/12/16(月)23:48 ID:arH1mwfY(13/13) AAS
>>112
だから「ループ」と書くなっちゅうねんw
関数を設計するならこんな感じやろ?

int func(int n){
int a[10] = {0};
memset_random(a, sizeof(a)); // a配列をランダムな値で埋める
int chksum = chksum(a, sizeof(a)); // a配列のチェックサムを計算
return 値
}

関数の中でループしてようが何して用が関係ないわ
1-
あと 94 レスあります
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル

ぬこの手 ぬこTOP 0.021s