C言語の設計ミスった危険な関数トップ10決めようぜ (215レス)
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 では式の中で変数を宣言できるのだから
ローカルラベルが可能になっても驚かないよ。
136: 132 2019/12/18(水)23:56 ID:9RDvo6To(1) AAS
typedefを使用
外部リンク:pastebin.com
137: 2019/12/19(木)00:12 ID:vqVcyk4J(1) AAS
PHPはbreakにネスト数指定できるよな
138
(1): 2019/12/19(木)09:03 ID:vjQjJ4nK(1) AAS
C言語の開発者によるgoto文の使い方を対象とした実証研究の結果、「goto文は無害だと考えられる」
外部リンク:developers.srad.jp
139
(1): 2019/12/19(木)16:51 ID:86m15ms9(1) AAS
longjmp についても調査してほしいな。
特に例は挙げないが、誰もが使っているようなプログラムでも結構使われてる。
140: 2019/12/19(木)16:57 ID:+cpLTGtZ(1) AAS
static
141: 2019/12/25(水)01:15 ID:k3ZI/Zl3(1) AAS
>>139
それは代わりがない。
142: 2020/07/09(木)10:18 ID:tNMImStE(1) AAS
>>7
大発明なんbだけどな、
リスクも大きい
143
(1): 2020/07/09(木)10:22 ID:vrNDocOm(1) AAS
発明って言うか当時はそれが普通だったろ
144: 2020/07/09(木)10:51 ID:I92CxMlL(1) AAS
longjmpは「設計上のミス」ではないんでは。
むしろそういう動作をする目的で設計・導入されたように思えるけど
(longjmpに関するRationaleを読んでないので当てずっぽうw)
145: 2020/07/09(木)16:31 ID:KHuqFwsC(1) AAS
>>5
エスティーアールトゥーケー
146
(2): 2020/07/09(木)21:58 ID:Zo8nB2NL(1) AAS
例外は setjump、longjumpて実装されてるんじゃないのかな?
違うのかな?
147
(1): 2020/07/10(金)22:03 ID:AfLodKTd(1) AAS
>>143
普通じゃない
当時はPascalの文字数+文字列が普通
148
(1): 2020/07/10(金)22:26 ID:U1HXCT7S(1) AAS
returnが1変数しか対応していないこと。

ポインター祭りになって可読性がウンコになる
149: 2020/07/10(金)23:11 ID:7RoGj1wV(1) AAS
>>148
可読性がうんこなのはお前の能力が足りないから
150: 2020/07/11(土)00:22 ID:UdJEarb2(1) AAS
いろんな言語たらい回しにされるって不幸だよね。

こういうノーガキ垂れる奴がウチの職場にいなくて良かった〜ヽ(´▽`)/
151
(1): 2020/07/11(土)10:50 ID:J0INoyBc(1) AAS
>>147
OSのAPIは文字数じゃなくて
文字列byte列+デリミタ'$'
みたいなのが多かったぞ
152: 2020/07/11(土)12:01 ID:2M7rjl8q(1) AAS
>>151
それはCP/Mの文字列出力がそうなっていただけ
入力はC言語のfgets()なんかみたいにデリミタの '$' を付加したりしないよ
1-
あと 63 レスあります
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル

ぬこの手 ぬこTOP 0.021s