C言語の設計ミスった危険な関数トップ10決めようぜ (215レス)
上下前次1-新
55: 2019/12/14(土)13:26 ID:TlZt0bii(1) AAS
関数そのものじゃないが
breakにラベル指定出来なかったのは設計ミスやろ
56: 2019/12/14(土)13:54 ID:JwYnIOEa(1/2) AAS
その為のgoto
57(8): 2019/12/14(土)22:43 ID:8CJijD11(1) AAS
AA省
58(1): 2019/12/14(土)22:45 ID:JwYnIOEa(2/2) AAS
単純に
breakする数を指定出来るだけで良い
59: 2019/12/15(日)06:50 ID:6aWNd1w0(1/2) AAS
>>58
ネストの数を数えるとか最低だと思う
60(1): 2019/12/15(日)07:00 ID:a0yEED8b(1) AAS
1000行のコードでbreak 7;とかされても、
どこに抜けるかわからんよな!
61(1): 2019/12/15(日)09:51 ID:5sPbacoo(1/8) AAS
ネストの数がわからないような巨大な構造は
それだけで最低だ
そんなんだと名前付きループにした所で
@outerなんて名前が使い回されて
同じ名前のループがネストされて
それこそ難読コードになる
それならユニークなラベルによるgotoの方が良い
省4
62: 2019/12/15(日)09:57 ID:5sPbacoo(2/8) AAS
とは書いたけど
どっちも有るならどっちも欲しい
どっちかだけげならbreak 2;の方が欲しい
って感じ
63: 2019/12/15(日)10:52 ID:6aWNd1w0(2/2) AAS
>>61
> そんなんだと名前付きループにした所で
> @outerなんて名前が使い回されて
> 同じ名前のループがネストされて
> それこそ難読コードになる
無能の妄想w
64(1): 2019/12/15(日)11:05 ID:5sPbacoo(3/8) AAS
ループの先頭、ループの終わり、break部分
3箇所見ないとダメってだけでダメな仕様
65: 2019/12/15(日)12:32 ID:bDjAMWVj(1/2) AAS
>>64
なぜか自分の前提は
> >>57くらいのループなら
なのにラベルにした途端にループの頭とbreakとループの終わりが一瞥でわからないとかアホすぎ
66: 2019/12/15(日)12:36 ID:5sPbacoo(4/8) AAS
大きければgoto
小さければbreak n
67(1): 2019/12/15(日)12:38 ID:5sPbacoo(5/8) AAS
名前を付ける手間を許容するならgotoという解決法が既にある
68: 2019/12/15(日)13:48 ID:o9m7qUoD(1) AAS
>>60
ネスト変わるような変更あるたびにbreakの引数勝手に書き換えてくれるエディタとかマクロが流行る
69: 2019/12/15(日)16:33 ID:bDjAMWVj(2/2) AAS
>>67
ifとgotoあるからforもwhileもdoも要らんという主張か
本物のプログラマーだなw
70: 2019/12/15(日)16:52 ID:u46gpj2V(1) AAS
歪んだ教育のせいで
gotoに拒絶反応を示す人が多いんだよな
2重ループを抜けるなら素直にgotoを使えって
71: 2019/12/15(日)16:53 ID:pTp+dpJs(1) AAS
アセンブラの
jmp 1f
とかを C でやりたいという話なのか?
やってみりゃいいじゃん。プリプロセッサの出力を処理すればいい。
1 パスで出来ると思うよ。
ひょっとしてもう誰かがやってるかも。
72(1): 2019/12/15(日)18:05 ID:5sPbacoo(6/8) AAS
AA省
73(1): 2019/12/15(日)18:58 ID:5sPbacoo(7/8) AAS
AA省
74: 2019/12/15(日)19:01 ID:5sPbacoo(8/8) AAS
わざわざ言語拡張しなくても
>>57以上の事が実現出来る
75: 2019/12/16(月)09:05 ID:AI1GDY0I(1) AAS
ラベルのスコープを狭くしたいという話のようだから
マクロの中で使ってこそ真価を発揮するんじゃないかな。
フル仕様のパースが必要というわけではなく、かなり手抜きできそうではある。
あれば便利というのは否定しないが、C でそこまで必要かというと…
76: 2019/12/16(月)12:33 ID:0jmxiGrg(1) AAS
{
goto hoge;
hoge:;
}
{
goto hoge;
hoge:;
省2
77: 2019/12/16(月)13:21 ID:ZZ8St2Js(1/3) AAS
マクロで二重以上のループってのもなかなか考えづらいなあ
一応、ラベル名をパラメータとする手もある
使う側のコストを考えるとgotoの為にパラメータを増やさないよな
gotoを使わない主義者がよくやってるように
余分な変数を使って実装するんだろうね
78: 2019/12/16(月)13:23 ID:ZZ8St2Js(2/3) AAS
アセンブラだとマクロローカルラベルってのがあったりする
ラベルを頻繁に使うので
あと
@@/@b/@fのように、
直近のラベルを指定する仕組みもある
79: 2019/12/16(月)13:28 ID:ZZ8St2Js(3/3) AAS
>>72 >>73 みたいなのって
gotoの使いどころだと思うんだけだ
gotoを使わない人はどう書いてるの?
特に >>57 の答えを聞いてみたい
80: 2019/12/16(月)15:17 ID:arH1mwfY(1/13) AAS
AA省
81: 2019/12/16(月)16:34 ID:/0yHEQmX(1) AAS
outer より後に処理が続く場合は?
82(2): 2019/12/16(月)16:51 ID:arH1mwfY(2/13) AAS
AA省
83: 2019/12/16(月)16:55 ID:arH1mwfY(3/13) AAS
"短い処理"をいちいち関数にしなくて済むから、break 2とかはあってもいいが、
長い処理は関数にしてないとろくにテストできないんだからgotoなんていらない
84: 2019/12/16(月)19:03 ID:4DgO9d+i(1) AAS
じゃあ>>57もいらないね
85: 2019/12/16(月)19:09 ID:lsrBHsJG(1) AAS
gotoの基本的な使い方くらい知っておいた方が良いかと
ループを抜ける為だけに関数を分けないといけなくなるし
挙げ句の果てに言語の欠陥とか言い出す
86: 2019/12/16(月)20:06 ID:3ha1TSe5(1) AAS
今のC言語ではネストしたループから抜けるのはフラグを使うかgotoしかないからたいていgoto使ってるけどgotoなんて野蛮なものはできたら使いたくないから他の言語で実装されてるラベル付きbreakなりレベル付きbreakが欲しいって話だろ
今更gotoの基本的な使い方ガーとか言ってる奴はどんだけ低レベルなんだよw
87(1): 2019/12/16(月)20:09 ID:xr9KOlE0(1/17) AAS
あれ?
returnで抜ける為に関数に分けるんじゃなかったの?
88: 2019/12/16(月)20:21 ID:xr9KOlE0(2/17) AAS
gotoは野蛮とかいう歪んだ教育のせいで
わざわざ変数を定義したりわざわざ関数を分けたりして
わざわざ見にくいコードにしちゃう
生でポインタを扱う野蛮なC言語なんか使わないで
上品な言語を使った方が良いよ
89: 2019/12/16(月)20:28 ID:jL52ryYk(1/2) AAS
gotoじゃなくてgodowntoなら誰も文句言わなかった
90: 2019/12/16(月)20:47 ID:LjjtFzBx(1/4) AAS
自分は小規模な字句解析みたいなのでもgoto使うことがある。
ラベルで状態を表してgotoで遷移する。
goto使わなかったら状態を変数に入れて、
ループの中でswitchで場合分けするようなコードになって辛い。
91: 2019/12/16(月)20:52 ID:DbnQVwfE(1) AAS
ループの中のswitchでループを抜けるのに
gotoを使うんじゃ?
92: 2019/12/16(月)21:41 ID:wRV+mRkt(1) AAS
次の状態を返す関数ポインタでループすればいんじゃないの?
93: 2019/12/16(月)21:45 ID:jhycq5nX(1) AAS
そんな野蛮なことはしません
94: 2019/12/16(月)22:12 ID:arH1mwfY(4/13) AAS
>>87
returnで抜けるためというか、
1. gotoで抜けたい
2. 関数にするか
3. あ、そもそもコードが複雑なんだな
4. 関数にして正解だった
こんな感じかな。
省1
95: 2019/12/16(月)22:22 ID:xr9KOlE0(3/17) AAS
で>>82みたいな意味不明な関数の分け方をすると
>>57は、より複雑な記述をしたいっていう主張だし
gotoに親を殺された人の言うことは支離滅裂
理由が後付けだからそうなる
96: 2019/12/16(月)22:27 ID:arH1mwfY(5/13) AAS
> で>>82みたいな意味不明な関数の分け方をすると
なんで意味不明?
そもそもその処理に意味をもたせてから言おうよw
処理に意味をもたせると、関数にしたほうが良いと思うからさ
97: 2019/12/16(月)22:32 ID:arH1mwfY(6/13) AAS
> 理由が後付けだからそうなる
質問の方が先なのに、理由を先に言えるわけがないw
Q. 多重ループから抜けるのに、gotoは必要ですか?
A. 必要ありません。多重ループが必要になるぐらい複雑なら関数にしますから
これが普通だから、後付にはならないよね。
98: 2019/12/16(月)22:37 ID:xr9KOlE0(4/17) AAS
じゃ>>57も当然不要ですね
99: 2019/12/16(月)22:38 ID:arH1mwfY(7/13) AAS
そんなにくり返し言わなくても、最初から不要だしw
100: 2019/12/16(月)22:39 ID:xr9KOlE0(5/17) AAS
じゃあ>>57はどういうつもりで書いたんでしょうかね?
101: 2019/12/16(月)22:40 ID:LjjtFzBx(2/4) AAS
gogoサイコーっす
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){
ロック
処理
省5
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配列のチェックサムを計算
省3
122: 2019/12/16(月)23:55 ID:xr9KOlE0(17/17) AAS
sizeof(a) とか書くレベルの相手してたのか
アホらしい
123: 2019/12/17(火)00:04 ID:JvBVW/sd(1/4) AAS
>>119
じゃあ普通のbreakもいらないね
まさか使ってないよね
124: 2019/12/17(火)06:41 ID:YMIUnRyv(1) AAS
まあgotoあればbreakは要らんわなw
そんな言語は使いたくないけど
125: 2019/12/17(火)07:00 ID:JvBVW/sd(2/4) AAS
gotoもbreakもいらないって
126: 2019/12/17(火)07:10 ID:JvBVW/sd(3/4) AAS
gotoもbreakも無い
ループを抜けるときはreturn
switchを抜ける時もreturm
関数は単一の処理しか出来ない
こんな言語はイヤだね
127: 2019/12/17(火)07:23 ID:JvBVW/sd(4/4) AAS
後に退けなくなったアホの作る言語
128: 2019/12/17(火)07:39 ID:odSFZTU+(1) AAS
gotoの使い方
外部リンク[html]:www7b.biglobe.ne.jp
外部リンク[html]:www9.plala.or.jp
外部リンク:tomeapp.jp
外部リンク[html]:opencv.jp
129: 2019/12/17(火)08:49 ID:QeraReD1(1/2) AAS
たとえ相手がアホであっても、しつこく絡むのもまたアホだと思うんだが…
130: 2019/12/17(火)12:33 ID:vDeQfs2U(1) AAS
自分より下の人間を叩くしか能がないんだろ
ID:arH1mwfYなんてスルーでいいと思うんだがそれしか叩けないからいつまでたっても終わらないw
131: 2019/12/17(火)13:15 ID:GBggCGQK(1) AAS
雑談スレだしネタも無いから良いんじゃね?
132(2): 2019/12/17(火)18:32 ID:x9hYOthl(1) AAS
String型が無いって死ぬほど不便なんだが
133: 2019/12/17(火)19:06 ID:p6v4J1KY(1) AAS
他の言語を使ってください
134: 2019/12/17(火)19:18 ID:6LhBKKEf(1) AAS
>>132
自分で似たようなものを作ればいいだろ。汎用的なものがあっても使い勝手や性能で何かしら不満が出るのだから、自分の要求に合致するものを自分で作りな。
135: 2019/12/17(火)20:52 ID:QeraReD1(2/2) AAS
特定の用途においてローカルラベルが役に立つことも無くはないかもしれないな。
自分でそれをやるかどうかは別にして。
いずれにせよ、gcc では式の中で変数を宣言できるのだから
ローカルラベルが可能になっても驚かないよ。
上下前次1-新書関写板覧索設栞歴
あと 80 レスあります
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル
ぬこの手 ぬこTOP 0.014s