1 名前:デフォルトの名無しさん [2005/08/11(木) 11:18:15 ] 前スレ pc8.2ch.net/test/read.cgi/tech/1021364372/
85 名前:デフォルトの名無しさん mailto:sage [2006/08/08(火) 16:58:17 ] if(!A) { if(B) procY; else return; } procX; これで>>81 と等価かな。
86 名前:81 mailto:sage [2006/08/08(火) 18:22:30 ] >>85 できるもんなんですねぇ…。 勉強になりました。ありがとうございました。
87 名前:デフォルトの名無しさん mailto:sage [2006/08/08(火) 20:00:42 ] そういう思考ができない人はあまりプログラマに向いて無い希ガス
88 名前:デフォルトの名無しさん mailto:sage [2006/08/08(火) 20:15:33 ] >>81 俺ならこうやってネストしちゃうな。 (例として、条件がCまで、処理がprocZまでの三段階に増えたとする) if(!A) { if(!B) { if(!C) return; procZ; } procY; } procX;
89 名前:デフォルトの名無しさん mailto:sage [2006/08/08(火) 21:43:38 ] 誰もお前には聞いてないんだよカス
90 名前:デフォルトの名無しさん [2006/08/08(火) 22:43:54 ] GOTO使う事によってコードが短くなる件
91 名前:デフォルトの名無しさん mailto:sage [2006/08/08(火) 22:54:29 ] まあ、goto使うことで コードが短くも速くもならないなら 使うなとは言えるなw
92 名前:デフォルトの名無しさん mailto:sage [2006/08/08(火) 23:20:51 ] if (flag) goto N0021; return; N0021: 〜 こういうコードならつい最近見た。Fortran から C に単純変換したものらしい。 こういうのがいたるところに orz
93 名前:デフォルトの名無しさん mailto:sage [2006/08/08(火) 23:37:24 ] >>92 実行形式から逆コンパイルした結果も それと同様に goto だらけになったりするんだろうなぁ。
94 名前:デフォルトの名無しさん mailto:sage [2006/08/09(水) 19:48:06 ] >>89 では今度からきちんと指名 (無料) するように。
95 名前:デフォルトの名無しさん mailto:sage [2006/09/06(水) 08:55:10 ] コンパイル済みの汗ソース見ればくだらない議論と気付くはずw
96 名前:デフォルトの名無しさん mailto:sage [2006/09/06(水) 20:08:23 ] ちうか、わざわざ高級言語つって読み書きしやすい制御構文を用意しているのに、 それを破壊するような使い方をするなっていうのがgotoは悪派の主張なわけで、 機械語に落ちれば全部jmpだろってのはあんまり関係ないよな。 まあ、機械語レベルのjmp命令がif等の制御構文と同等のレベルで 読み書きできるような人間にゃgotoだろうがforだろうが関係ないのかもしれんが、 そうじゃない人もいるんでそういう人も思いやってくれよということで。
97 名前:デフォルトの名無しさん mailto:sage [2006/09/28(木) 07:51:36 ] 1.gotoはどんな事があっても絶対使うな! 2.gotoはなるべく使わない方がいい 初心者に教えるなら1の方が正しいと思う。
98 名前:デフォルトの名無しさん mailto:sage [2006/09/28(木) 08:24:30 ] ちなみに俺自身がどの程度使っているか調べてみたら、 92年ごろこんな事やってた。 // ポートからマウス移動量を取得 outp(0x7fdd,0x80);goto L1; L1: x1 =inp(0x7fd9)&0xf; outp(0x7fdd,0xa0);goto L2; L2: x1+=(inp(0x7fd9)&0xf)<<4; outp(0x7fdd,0xc0);goto L3; L3: y1 =inp(0x7fd9)&0xf; outp(0x7fdd,0xe0);goto L4; L4: y1+=(inp(0x7fd9)&0xf)<<4; outp(0x7fdd,0);goto L5; L5: wark =inp(0x7fd9); pc98のコードだが、今となってはよく分からん。 見ての通り組み込みに近い処理なので、こういうウェイトが 必要な場合もあったんだろうな、たぶん。
99 名前:デフォルトの名無しさん mailto:sage [2006/09/28(木) 19:48:42 ] ジャンプ系の命令を挟んで数clockをwaitするってこと…なのか? 要するにnop代わりにgotoを使ったと…結構アレげだな
100 名前:98 mailto:sage [2006/09/28(木) 20:20:07 ] >ジャンプ系の命令を挟んで数clockをwaitするってこと…なのか? たぶん、そういう事をやりたかったのだと思う。 gotoはCで書けるけど、nopはasmブロックで書かなくてはならないので gotoを選択したんじゃないかねー。「念のため」的なコードは書かない 主義なので、このgotoが無ければ動かない機種があったのだとは思う。 14〜15年前の若かりし日のコードなんで詳しい事は思い出せないなw
101 名前:デフォルトの名無しさん mailto:sage [2006/09/28(木) 23:28:51 ] >>100 約15年前のキミに言っておきたい。 そのコードにはコメントを入れておけとw
102 名前:デフォルトの名無しさん mailto:sage [2006/09/28(木) 23:29:29 ] おっと、もちろん、goto使用理由に関するコメントな。
103 名前:デフォルトの名無しさん mailto:sage [2006/09/29(金) 00:27:57 ] 最近のコンパイラだと、最適化で消される悪寒・・・
104 名前:98 mailto:sage [2006/09/29(金) 00:49:32 ] >そのコードにはコメントを入れておけとw まったくもってそうかも知れない。。。 ちなみに別な所はこんな感じ // マウス割り込みを許可する void pascal MOUSE::_enable() { asm pushf disable(); setvect(MOUSE_VECT,MOUSE::main); // ベクタの更新 outp(0x7fdf,0x93); // マウスモードセット int a = inp(0x0a) & 0xdf; // 8259A(スレーブ)読みだし outp(0x0a,a); // マウス割り込み許可(8259A) goto w1; w1: outp(0x7fdf,0x08); // マウス割り込み許可(8255A) goto w2; w2: asm popf } これだけマメにコメント入れているのに問題のgotoだけ何のコメントも 入ってないのは一体。。。。orz
105 名前:デフォルトの名無しさん mailto:sage [2006/09/29(金) 06:52:14 ] 自信の有無か、切羽詰ってたのか、或いは煮詰まっていたのか。
106 名前:デフォルトの名無しさん mailto:sage [2006/09/29(金) 23:52:01 ] >>104 マジックナンバー(0x7fdfとか)に対するコメントはgoodだが、 「ベクタの更新」はコメント要らない気がする。 ていうか、だからgotoにコメント入れろとw
107 名前:デフォルトの名無しさん mailto:sage [2006/09/30(土) 02:16:48 ] goto を入れるまでも無いくらい、自然で当然な行為だったんでわ。
108 名前:デフォルトの名無しさん mailto:sage [2006/09/30(土) 02:17:28 ] goto を、じゃなくてコメントを、だった。 酔ってるんで許してくれ。
109 名前:デフォルトの名無しさん mailto:sage [2006/09/30(土) 02:21:43 ] nopするだけのasmブロックをマクロで定義した方が良かったと思われる。
110 名前:デフォルトの名無しさん [2006/12/01(金) 12:12:09 ] gotoを恐れなく使うのなら、finallyやbreakなんてヌルい物じゃなく、 gotoより強力な継続をバリバリに活用する方法を語るべきだろ。
111 名前:デフォルトの名無しさん [2006/12/01(金) 12:34:53 ] ま、要するに使う側にとっては多少CPU時間が変わろうが仕様通り動けば良いわけだから 個人で開発するぶんには、完全に好みと言うか主観なわけで。
112 名前:デフォルトの名無しさん mailto:sage [2006/12/04(月) 10:41:09 ] それは議論の対象外だろ
113 名前:デフォルトの名無しさん mailto:sage [2006/12/23(土) 22:52:44 ] 個人的に、breakとか使わなくてもifとgotoで事足りるんだが。
114 名前:デフォルトの名無しさん mailto:sage [2006/12/24(日) 15:34:12 ] そりゃ、そうだろ…
115 名前:デフォルトの名無しさん mailto:sage [2006/12/24(日) 15:46:17 ] プリフェッチの関係でnopではなくjmp shortを使わないとウエイトにならないとかでしょ? 当時のPC98ではそれが普通だったっつーか俺が覚えてるくらいだから広まってはいたんじゃないか
116 名前:デフォルトの名無しさん mailto:sage [2006/12/25(月) 13:40:26 ] これまで何度も言われてきたことだけど 「個人で開発するぶんには・・・」とか「***で事足りるから***は不要」とか 無意味だとは思わんかね?
117 名前:デフォルトの名無しさん mailto:sage [2006/12/25(月) 14:15:25 ] andとnotとorとgotoで事足りるから制御構造は不要
118 名前:デフォルトの名無しさん mailto:sage [2006/12/27(水) 00:36:01 ] nand さえあれば、andもnotもorも不要なんじゃなかったっけ?
119 名前:デフォルトの名無しさん mailto:sage [2006/12/28(木) 15:51:00 ] 最終的にはチューリングマシン云々とかマシン語云々に行き着くんだろうな
120 名前:デフォルトの名無しさん mailto:sage [2006/12/29(金) 00:38:20 ] >>119 フルアセンブラで組むのはさすがにバカ→C言語を使う俺、最高→いやいやC++使いの俺、最高→(以下略
121 名前:デフォルトの名無しさん mailto:sage [2006/12/29(金) 01:11:44 ] プログラマを顎で使うクライアントの俺、最高
122 名前:デフォルトの名無しさん mailto:sage [2006/12/29(金) 06:34:33 ] 作業に見合うだけのお金を払ってくれるならな。
123 名前:デフォルトの名無しさん mailto:sage [2007/01/02(火) 20:09:15 ] >>81 と似たケースなんだけど if(A){ if(B){ procX; } else { procY; } } else { procY; } ってなってたら判断回数を増やさずにprocYを 一箇所だけにしたい場合、 if(A){ if(B){ procX; } else { goto _Y; } } else { _Y: procY; } って書く以外にある?
124 名前:デフォルトの名無しさん mailto:sage [2007/01/02(火) 20:28:59 ] if (A && B){ procX; } else { procY; } じゃいけないの?
125 名前:デフォルトの名無しさん mailto:sage [2007/01/02(火) 20:55:36 ] それじゃプログラムが変わってしまう。
126 名前:デフォルトの名無しさん mailto:sage [2007/01/02(火) 20:58:39 ] あれ、ぼけてたかも…
127 名前:デフォルトの名無しさん mailto:sage [2007/01/02(火) 21:07:49 ] >>123 すげー gotoは絶対禁止ってルール作った方がいいよw
128 名前:デフォルトの名無しさん mailto:sage [2007/01/02(火) 21:20:41 ] >>125 特に変わってないように見えるんだけど
129 名前:デフォルトの名無しさん mailto:sage [2007/01/02(火) 22:20:23 ] >>128 >>126
130 名前:デフォルトの名無しさん mailto:sage [2007/01/02(火) 22:22:59 ] だいたいgoto無くて困った事ないなw
131 名前:デフォルトの名無しさん mailto:sage [2007/01/03(水) 19:40:17 ] >>129 ああそうか、 >>125 =>>126 なのか。 >>124 =>126 だと思ってた
132 名前:デフォルトの名無しさん mailto:sage [2007/01/03(水) 20:01:01 ] (A && B && (procX || 1)) || procY; ネタ提供
133 名前:デフォルトの名無しさん mailto:sage [2007/01/04(木) 20:07:36 ] 自分はこんなくだらないことでgotoを使う/使わないなどと悩むことはしないよ。
134 名前:デフォルトの名無しさん mailto:sage [2007/01/04(木) 21:43:08 ] 悩むまでもなくgotoを使うということか
135 名前:デフォルトの名無しさん mailto:sage [2007/01/04(木) 21:49:00 ] goto眼中無しだろ普通
136 名前:133 mailto:sage [2007/01/04(木) 22:00:10 ] >>134 当然noだ。 故意に曲解していないか? >>135 yes
137 名前:デフォルトの名無しさん mailto:sage [2007/01/04(木) 22:17:01 ] 134 はギャグで言っただけだろう
138 名前:デフォルトの名無しさん mailto:sage [2007/01/04(木) 22:33:01 ] はいはいthrowthrow
139 名前:デフォルトの名無しさん mailto:sage [2007/01/04(木) 23:21:51 ] しかしcatch
140 名前:デフォルトの名無しさん mailto:sage [2007/01/04(木) 23:23:35 ] しかしgotoの嫌われっぷりも、相当なもんだよな 実際多少gotoつかったぐらいじゃ、可読性など落ちはしない 可読性を決める要因は、goto文の有無とは殆ど関係ないところにあるのにな C++でgoto使うと、gotoでコンストラクタすっ飛ばすんじゃねえ とか、コンパイラに怒られたりするな goto文はなかなか教育的だ
141 名前:デフォルトの名無しさん mailto:sage [2007/01/04(木) 23:35:33 ] 使うシーンが思い浮かばん 使わなきゃならない、もしくは使ったほうがいい場合が思い浮かばん もっともJava使ってんだけどJavaにはgotoって無いよね?
142 名前:デフォルトの名無しさん mailto:sage [2007/01/05(金) 01:10:07 ] 残念ながらJavaはgotoをサポートしていない。
143 名前:デフォルトの名無しさん mailto:sage [2007/01/05(金) 01:23:31 ] 特に残念でもないw
144 名前:デフォルトの名無しさん mailto:sage [2007/01/05(金) 01:25:25 ] まぁ、Java は goto なんか使わせたら速攻でスパゲッティなコードを書くようなプログラマを対象にした言語だからな。
145 名前:デフォルトの名無しさん mailto:sage [2007/01/05(金) 01:27:06 ] kwsk
146 名前:デフォルトの名無しさん mailto:sage [2007/01/05(金) 01:33:27 ] このコマンドをいれると自動で玉が出る goto ゴト行為はやめましょう
147 名前:デフォルトの名無しさん mailto:sage [2007/01/05(金) 01:36:05 ] >>145 詳しくもなにもそのまんまなだけ。Javaが現代COBOLだとか言われているのって聞いたことない? "普通のプログラマはまともに使いこせない"という理由で他にも元ネタの言語であるC++からtemplateなどを排除し、 メモリ管理ひとつまともにできないプログラマの為にGCを標準装備したりしている。
148 名前:デフォルトの名無しさん mailto:sage [2007/01/05(金) 01:37:48 ] >>147 そういえばそういうコードはよく見るなw
149 名前:デフォルトの名無しさん mailto:sage [2007/01/05(金) 11:29:43 ] >>144 実際には goto なくてもスパゲッティ作れる人が大量投入されてる。 (そうじゃない人も多数いるけど。まぁどの言語もなんだが。)
150 名前:デフォルトの名無しさん mailto:sage [2007/01/05(金) 11:50:03 ] Javaでmainに全コードベタ書きするスタイルを採用したらgotoが必要になると思うぞ。
151 名前:デフォルトの名無しさん mailto:sage [2007/01/05(金) 12:02:54 ] Dr.goto
152 名前:デフォルトの名無しさん mailto:sage [2007/01/05(金) 21:53:43 ] 手続き指向言語(?)にはgoto欲しいかもね
153 名前:デフォルトの名無しさん mailto:sage [2007/01/06(土) 17:24:39 ] >>83 それだと評価順が変わるのでいいのか? >>85 あとにコードが続いてたらreturnはまずい気が。
154 名前:デフォルトの名無しさん mailto:sage [2007/01/06(土) 17:51:23 ] >>147 詳しくのニュアンスに違和感を覚えるのは俺だけではないはずだ
155 名前:デフォルトの名無しさん [2007/01/06(土) 18:46:18 ] >>154 IT土方の現代コボラーさん、いらっしゃ〜い。 まぁ、IT土方なんて沢山いるから、違和感を覚えたのは君だけじゃないよ、きっと、うん。
156 名前:デフォルトの名無しさん mailto:sage [2007/01/06(土) 19:10:46 ] 違和感を覚えた部分はそこじゃないと思うよ多分。
157 名前:デフォルトの名無しさん mailto:sage [2007/01/06(土) 19:14:03 ] >>156 IT土方さん、いらっしゃい。
158 名前:デフォルトの名無しさん mailto:sage [2007/01/06(土) 20:13:02 ] コボラーにはJAVAすら使えない。
159 名前:デフォルトの名無しさん mailto:sage [2007/01/06(土) 20:34:18 ] こぼらーってJavaっていう言語があること知ってるの?
160 名前:デフォルトの名無しさん mailto:sage [2007/01/06(土) 22:01:30 ] >>158-159 コボラーにあやまれ! そこの現代コボラー!
161 名前:デフォルトの名無しさん mailto:sage [2007/01/06(土) 22:15:19 ] コボラーってアトランティス人みたいなもんでしょ
162 名前:デフォルトの名無しさん mailto:sage [2007/01/06(土) 22:38:27 ] コボラーってどんな言語?
163 名前:デフォルトの名無しさん mailto:sage [2007/01/06(土) 22:44:53 ] コボラーって伝承とか伝説でだけ出てくる空想上の生物じゃね?
164 名前:デフォルトの名無しさん mailto:sage [2007/01/07(日) 16:28:26 ] >>141 機能限定のラベル付きbreak、continueなら・・・
165 名前:デフォルトの名無しさん mailto:sage [2007/01/07(日) 17:57:19 ] 高速電脳の斜向かいにある美容院の名前はコボル
166 名前:デフォルトの名無しさん mailto:sage [2007/01/08(月) 01:37:16 ] コボルちゃん
167 名前:デフォルトの名無しさん mailto:sage [2007/01/08(月) 17:48:22 ] >>158-159 Javaも書けるCOBOLプログラマはそもそもコボラーとは呼ばれない
168 名前:デフォルトの名無しさん mailto:sage [2007/01/08(月) 18:02:11 ] >>167 そのJavaコードがコボルチックだったりするからコボラーと呼ばれる。 コボラーが書いたC言語のコード見たらすごかった。 全部グローバル変数にしてw
169 名前:デフォルトの名無しさん mailto:sage [2007/01/08(月) 18:38:23 ] >>167 そりゃそうだ、現代コボラーと呼ばれるだけだから。 >>168 あるあるw
170 名前:デフォルトの名無しさん mailto:sage [2007/01/08(月) 20:15:24 ] >>168 コボルにはローカル変数無いの? ちなみにおれ、コボル覚えられなかったんだよね…(´・ω・`) C系よりよほど難しいと思うんだが。
171 名前:デフォルトの名無しさん mailto:sage [2007/01/08(月) 20:23:11 ] >>170 10年以上前にやったCOBOL85あたりではローカル変数って言う考え方は無かった アドレスとかポインタとか意識する必要が無いからCOBOLのほうが圧倒的に簡単だと思うがの
172 名前:デフォルトの名無しさん mailto:sage [2007/01/08(月) 20:26:56 ] >170 >ちなみにおれ、コボル覚えられなかったんだよね…(´・ω・`) >C系よりよほど難しいと思うんだが。 ナカーマ( ・∀・)人(・∀・ ) 俺もC++ならtemplateもバッチリ使いこなせてメタプロもできるし、 アセンブラやスクリプト系の言語も問題なくこなせるんだが、 COBOLだけはダメっす。
173 名前:デフォルトの名無しさん mailto:sage [2007/01/08(月) 23:47:19 ] cobolはデータ依存プログラミングができるから、ある意味非常に強力。 逆に、それを使わないとグローバル変数しかない非常に貧弱な言語になってしまう。
174 名前:デフォルトの名無しさん mailto:sage [2007/01/15(月) 23:15:26 ] だから、商用システムなんかにはよく使われていた。 当時は、それが生産性が高かったんだよ。
175 名前:デフォルトの名無しさん mailto:sage [2007/03/03(土) 23:23:27 ] 漏れのトコはエラー処理へすっ飛ばす時にgoto使ってるんだが。 goto完全毛嫌い派ってそこんとこどうなん?
176 名前:デフォルトの名無しさん mailto:age [2007/03/04(日) 16:11:26 ] >>175 あいつら馬鹿だから、もちろんそれも否定するよ。
177 名前:デフォルトの名無しさん mailto:sage [2007/03/04(日) 16:29:08 ] たまに1関数1returnとか言い出す。
178 名前:デフォルトの名無しさん mailto:sage [2007/03/04(日) 16:53:23 ] if( is_error( hoge, hoge ) ) { 10行ぐらいのエラー処理 return ERROR; } if( is_error( next, hoge ) ) { 上のと同じ10行ぐらいのエラー処理 return ERROR; } if( is_error( next_next, hoge ) ) { やっぱり同じ10行ぐらいのエラー処理 return ERROR; } 以下続く こんな感じの無残なコードは、何度も見かけたもんだがw
179 名前:デフォルトの名無しさん mailto:sage [2007/03/29(木) 14:58:09 ] 例外キャッチしたら頭に戻ってやり直しってコードには躊躇なくgotoを使うな
180 名前:デフォルトの名無しさん mailto:sage [2007/03/29(木) 21:42:18 ] >>179 それって catch ブロックの中から try ブロックの中あるいはその前へ飛ぶの?
181 名前:デフォルトの名無しさん mailto:sage [2007/04/02(月) 23:02:59 ] for(;;) try{ // 例外が起きそうな処理 break; } catch(e){ }
182 名前:デフォルトの名無しさん mailto:sage [2007/04/02(月) 23:46:11 ] ダサッ
183 名前:デフォルトの名無しさん mailto:sage [2007/04/03(火) 01:25:49 ] 摩訶不思議
184 名前:デフォルトの名無しさん mailto:sage [2007/04/29(日) 03:54:13 ] 1関数1returnというのは「出口はひとつ」を誤解してるんだろうな。 returnが複数でも出口は一つだし。returnはある意味"goto 最後の}"だと 思えばいい。 本当の「出口が一つじゃない」というのはBASICの 100 GOSUB 200 110 PRINT "1" 120 PRINT "2" 130 END 200 INPUT A 210 IF A=1 THEN RETURN 110 220 RETURN 120 の210行と220行みたいな話を言っているはず。これはもはやreturnではなくて gotoだからな。
185 名前:デフォルトの名無しさん mailto:sage [2007/04/30(月) 03:33:13 ] じゃあ「入り口が一つ」については?
186 名前:デフォルトの名無しさん mailto:sage [2007/04/30(月) 20:37:51 ] 入り口も出口も複数 subroutine hoge(i, j, k, *, *) k = i + j entry huge(k, *, *) k = k - 1 if (k .ne. 0) return 1 return 2 end program main read(*,*) n1, n2 call hoge(n1, n2, i, *100, *300) 100 write(*,*) n1, ' + ', n2, ' - 1 = ', i i = 10 200 write(*,*) i call huge(i, *200, *300) 300 write(*,*) 'end' end
187 名前:デフォルトの名無しさん mailto:sage [2007/05/01(火) 18:25:16 ] >>186 よーし、おじさんはCOBOLつかっちゃうぞ。 PERFORM xxx THRU yyyy
188 名前:デフォルトの名無しさん mailto:sage [2007/05/11(金) 20:53:36 ] goto 1;
189 名前:デフォルトの名無しさん mailto:sage [2007/05/12(土) 00:08:15 ] goto\s+[\w\d]+;|^\s*[\w\d]+: をショッキングピンクにしてgoto使いまくりだな。
190 名前:デフォルトの名無しさん mailto:sage [2007/05/12(土) 18:15:53 ] 色々謎な正規表現だな
191 名前:デフォルトの名無しさん mailto:sage [2007/05/13(日) 11:32:44 ] 189の目を盗んでラベルの後に空白文字を入れてやるぜ。 goto fuck189 ; fuck189 :
192 名前:デフォルトの名無しさん mailto:sage [2007/07/21(土) 19:14:32 ] 以下のケースってgotoしたくなる。 if(a && b && c){ 処理1 goto jmp; } else if(d){ 処理2 } if(a && b){ jmp: 処理3 }
193 名前:デフォルトの名無しさん mailto:sage [2007/07/21(土) 20:37:51 ] 真理値表を書いてみよう。 a b c d 処理1 処理2 処理3 0 0 0 0 x x x 0 0 0 1 x o x 0 0 1 0 x x x 0 0 1 1 x o x 0 1 0 0 x x x 0 1 0 1 x o x 0 1 1 0 x x x 0 1 1 1 x o x 1 0 0 0 x x x 1 0 0 1 x o x 1 0 1 0 x x x 1 0 1 1 x o x 1 1 0 0 x x o 1 1 0 1 x o o 1 1 1 0 o x o 1 1 1 1 o x o なんだ、goto要らないじゃん。
194 名前:デフォルトの名無しさん mailto:sage [2007/07/24(火) 10:55:01 ] で、バカを晒した>>192 はどこに行った? しかし、真理値表を書かないと結論が出ない>>193 も大概だがな。
195 名前:デフォルトの名無しさん mailto:sage [2007/07/24(火) 20:10:20 ] >>194 if(a && b){ を省略したいってことじゃないかな。auto a,bだとして。 コンパイラにやって欲しい処理だ。
196 名前:デフォルトの名無しさん mailto:sage [2007/10/28(日) 23:46:38 ] goto使ったら先輩にしつこくなじられるようになった うぜぇwwwwwgotoアレルギーうぜぇwwwwwww
197 名前:デフォルトの名無しさん mailto:sage [2007/10/29(月) 21:33:37 ] >>196 もともと人間関係うまくいってなかっただけじゃね?
198 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 14:45:06 ] うちの下っ端で考え無しにgoto使ってるアホがいやがる うぜぇwwwww無能下っ端うぜぇwwwwwww って感じだろ
199 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 17:53:27 ] pc11.2ch.net/test/read.cgi/tech/1169473442/553-578 あたりの続き > 578 :デフォルトの名無しさん:2008/02/09(土) 17:20:17 > >>570 > >556 名前:デフォルトの名無しさん [sage]: 2008/02/09(土) 13:55:24 > >まぁさ、例外あるような言語ではgotoいらないかもしれないけど、 > >Cとかだと普通に使うよ? > >557 名前:デフォルトの名無しさん [sage]: 2008/02/09(土) 14:28:31 > >いや,普通には使わないわ(ww > > ここから始まった話題なので、 > 今に限ってはCのgotoの話をしている。pythonは今のトピックにおいて関係なし。 > Cは例外ないから>>558 がgotoなしで書けるという話も決着がついてない。 > ここで例外使えばいいという指摘自体が的外れ。 > まあ実際gotoは無くてもいいが、あると遥かリソース開放とかは便利。 > むろんGCとか例外とかがあればそっちのが便利だが。 存分にどうぞ。 あ、setjmp/longjmp使うからgoto使わないわ、というオチは禁止ね。
200 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 17:55:48 ] >>199 リソース解放のためにgotoって、、、不必要に汚ないコードができるだけだろ
201 名前:デフォルトの名無しさん [2008/02/09(土) 17:59:11 ] >>200 goto使わないともっと汚くなるんじゃない。
202 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 18:00:29 ] まぁgoto禁止の会社で、あらゆるコードが以下のように なってるのを見たとき、「素直にgoto使え」とオモタ。 do { if (hoge) { break; } } while (0);
203 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 18:05:49 ] >>199 で問題になってるコードを天災 はっきり言って呼び出し側で解放したほうがいい典型例。 呼ばれた側で解放したければ、この関数を呼んでから 解放するような関数を書けと言いたい。 > 558 名前:デフォルトの名無しさん [sage]: 2008/02/09(土) 14:35:39 > >>557 > > そう?ファンクショントレース埋め込むときとか、以下のように > エラーの場合、リソース開放して戻るときとか頻繁に使うなぁ。 > { > A *a = NULL; B *b = NULL; C *c = NULL; int result = E_UNKNOWN; > > if ((a = A_new()) == NULL) { > result = E_MEM; goto END_FUNC; > } > if ((b = B_new()) == NULL) { > ... > > END_FUNC: > if (a !=NULL && result != E_SUCCESS) { > A_free(a); > } > ... > }
204 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 18:07:55 ] continueもある場合は、gotoよりも明確になるように思う。 breakで外側のループを脱出するために、switchで書いたほうが良さげな 内側の多分岐がif/else if/else ifになってたりするとgoto使え、だな。
205 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 18:12:33 ] >>203 関数がエラーで返った場合、オブジェクトに変更が加えられていないことが 保証されるとする場合、それじゃだめやね。エラーが発生したら、まき戻す 処理が必要になる。
206 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 18:15:49 ] >>205 エラーの発生箇所によって巻き戻し方が違うんなら、どのみちgotoでは処理できん。 巻き戻し方が同じなら、goto先で巻き戻すのもreturn先で巻き戻すのも同じ。 と思うのだが。
207 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 18:19:37 ] >>206 >エラーの発生箇所によって巻き戻し方が違うんなら、どのみちgotoでは処理できん。 でもgoto使ったほうがスッキリかけるでしょ。 >巻き戻し方が同じなら、goto先で巻き戻すのもreturn先で巻き戻すのも同じ。 APIの使い勝手が大きく違うじゃない。
208 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 18:57:34 ] >>207 いや、だからさ、APIとしては呼び出す側は何もしなくていいの。 処理とリソース管理を分離して実装しましょう、ってだけの話。 なんで無理にgotoなんて使いたがるのか、ワケワカラン。
209 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 19:02:43 ] >>208 抽象論が多くてわかりにくい。具体的なコード書いて改善してみてくれ。
210 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 19:12:49 ] >>203 でコピペされてるコードも全然具体的じゃないけどな。
211 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 19:30:27 ] 巻き戻し処理って、本当に巻き戻すのか単にコピーをしておくのかどっちが多いの? transactional memoryって効率を求めるとすると、なにかしら約束事があったほうがよいんだろうけど。 完全に透過に見える実装にしたいならos側からアプローチしたほうが楽な気もする。
212 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 20:28:38 ] >>210 結局「gotoはダメ!って教えられたからダメダ!」で、思考停止したダケの人なのね。 >>211 >巻き戻し処理って、本当に巻き戻すのか単にコピーをしておくのかどっちが多いの? 場合による。例えば、ある処理が1,2,3,4の順番で実行することがきめられてる場合 (1を実行しないと、2が実行できない場合)、実際に実行して3でエラーが発生したら、 1,2を巻き戻す処理が必要だし。 OS側からのアプローチってどんなアプローチ?
213 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 20:34:39 ] gotoなんて設計に何の影響もない 同一関数内でしか影響のないものによくもまあそんなに熱くなれるなw これ眺める限りさほど奇天烈な使い方があるようにも思えないが。 www.google.com/codesearch?q=goto+file%3A%5C.c&hl=ja&btnG=%E3%82%BD%E3%83%BC%E3%82%B9%E3%82%B3%E3%83%BC%E3%83%89%E3%82%92%E6%A4%9C%E7%B4%A2
214 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 20:43:49 ] >>213 >gotoなんて設計に何の影響もない gotoは設計に影響ないとしても、APIが保障するリソース管理の方針は 大いに影響がある。 下位のモジュールがエラーを返した場合、それ以下のリソースには影響 がなかったことが保障されるのであれば、モジュールは自身の管理する モジュールを開放すればよいことが保証される。 例外とデストラクタの伝播のようなもの。
215 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 20:44:26 ] んで、Cでそれを実装するには、gotoがいいよといってるわけで。
216 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 20:44:43 ] GCC の labels as value と computed goto を使うと結構豪快に遊べるけどなw
217 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 20:47:44 ] 嫌goto厨ってもしかして元N88ベーシッカーが多いのかねw
218 名前:デフォルトの名無しさん [2008/02/09(土) 20:49:13 ] コンパイラ言語で goto を使っても問題ない。 どうせ機械語のジャンプ命令に置き換わるだけなんだから。 ところがインタプリタ言語にとっては goto はパフォーマンスを低下させるやっかいもの。 10 FOR I=1 TO 100 20 FOR J=1 TO 200 30 PRINT "うんこ" 40 IF J=50 THEN GOTO 70 50 NEXT J 60 NEXT I 70 FOR J=1 TO 100 80 PRINT "しっこ" 90 NEXT J 仮にこのようなコードを実行するとしよう(細かいツッコミは無しね) インタプリタは 10行目で FOR 文に出会い、変数 I と 終了値 100 をスタックに積む 次に 20 行目で 変数 J と 終了値 200 をスタックに積む。 通常は NEXT に出会ったときに終了判定がなされ、終了値に達していれば FOR をスタックから捨てられる。 ところが 70行目で FOR〜NEXT ループの外に飛び出してしまったため スタックには先ほどの2つの FOR 変数 I と J が積まれたままになる。 さらに 70行目で FOR に出くわしたインタプリタはどういう振る舞いをするか。 スタックに FOR J が既に積まれていないかを検査し、もしあればそれを捨てる作業が必要になる。 実はインタプリタは FOR に出会うたびに、スタックをすべて検査して、重複していないか 確かめているのだ。 GOTO 文さえなければスタックをすべて検査する必要がなくなりパフォーマンスがいくらか上がるはずだな。 java が goto を目の敵にしているのは、このせい。インタプリタにとって goto は大敵なんか長文つかれた どうせ誰も読んでないだろなめんどくせぇもうやめたうんこちんちん!
219 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 20:52:59 ] >>207 こういう話ではないの? 別にどっち使ったからと言って使い勝手というかAPIが変わるとは思えない。 これだったら俺も1を選ぶけど。 //その1 void hoge() //外部に公開される関数 { void *p = malloc(65536); //ところどころでgoto END; END_FUNC: free(p); } //その2 static void hoge_impl(void *p) { //ところどころでreturn; } void hoge() //外部に公開される関数 { void *p = malloc(65536); if (!p) hoge_impl(p); free(p); }
220 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 20:57:27 ] うんこちんちん! まで読んだ。
221 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 20:58:35 ] >>212 ポカーン 自分では全然的確な例も出さずに認定かい
222 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 20:59:29 ] >>218 まだJavaをインタプリタ言語と呼んでる人がいるんだね。 正直驚いた。
223 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 21:06:34 ] 実際にバイトコードインタプリタだったとしても 機械語に翻訳されりゃasmリストのjmpと一緒じゃん。 jmp命令を使えないcpuって不便そう。
224 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 21:07:45 ] 結論 goto議論に熱中する奴は生産性が低い goto :eof
225 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 21:13:36 ] つーか、BASICのインタプリタと、 Javaのインタプリタのレベルを混同してるヴァカが現存してることに驚いた。 Javaのforでスタックなんか使ってねーっての。
226 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 21:24:38 ] >>219 その2のほうさ、管理するリソースが1つだけならまだマシだが、4つも5つも 管理している場合、そのためのサブ関数が4つも5つもできることに なるわけだが・・・。まぁgoto毛嫌いしている人には、そっちのほうが ウレピイのかもしれんが。
227 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 21:28:22 ] リソース管理なんてif文一発だろ。 お前らもっとでかいモニタ使えよ。 int ret = 0; if(init1()) { if(init2()) { if(init3()) { ret = execute(); fin3(); } fin2() } fin1(); } return ret;
228 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 21:45:05 ] >>227 そのコードは、俺の頭ではツライ。
229 名前:デフォルトの名無しさん [2008/02/09(土) 21:54:45 ] 意外にも java がインタプリタだという事を知らない人が複数いて驚いた。 「JIT」 について、もうすこし学びましょうね。
230 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 22:01:57 ] ほぉ。 Javaのバイトコードで、どういう風にforとスタックが関係するのか、 説明していただけますかね?
231 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 22:26:44 ] Code: Stack=3, Locals=2, Args_size=1 0: iconst_0 1: istore_1 2: iload_1 3: bipush 10 5: if_icmpgt 39 8: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream; 11: new #3; //class java/lang/StringBuilder 14: dup 15: invokespecial #4; //Method java/lang/StringBuilder."<init>":()V 18: ldc #5; //String line 20: invokevirtual #6; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; 23: iload_1 24: invokevirtual #7; //Method java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder; 27: invokevirtual #8; //Method java/lang/StringBuilder.toString:()Ljava/lang/String; 30: invokevirtual #9; //Method java/io/PrintStream.println:(Ljava/lang/String;)V 33: iinc 1, 1 36: goto 2 39: return public static void main(String args[]) { for(int i=0; i<=10; i++) { System.out.println("line " + i ); } } なんというひねりのないコード。
232 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 22:31:52 ] インタプリタなのはJVMの方でJavaはコンパイラだろ。
233 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 22:32:23 ] public static void main(String args[]) { try { for(int i=0; i<=10; i++) { System.out.println("line " + i ); } } catch (Exception e) { System.out.println("boo."); } } にすると Exception table: from to target type 0 39 42 Class java/lang/Exception が追加されて、ジャンプ命令で例外処理の飛ぶ先が決まるんだな。 -ここまで同じ- 39: goto 51 42: astore_1 43: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream; 46: ldc #11; //String boo. 48: invokevirtual #9; //Method java/io/PrintStream.println:(Ljava/lang/String;)V 51: return ただしキャッチしなければパレントクラスに飛ぶというのは例外の普通の使い方。 やってる事自体はあまり変わらないけど、言語が持ってる機構は有効に使ったほうが綺麗になるって感じなのかな?
234 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 22:40:13 ] で、どのように、 BASICインタプリタで起きるようなFOR-NEXTの対応のズレの ようなことと、関係してくるんですか、と。 (BASICのFOR-NEXTは、FORを実行する時、NEXTにぶち当たったら 戻るためのポインタをスタックに積んでいるわけですが、それに 相当するコードはどこ?) それに、 あるインストラクションを実行する時点での、スタックトップは コンパイル時に確定できますよね? 仮にgotoで気ままに飛んだとしても、飛ぶ時に適宜調整すれば 問題ないわけで。
235 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 22:41:34 ] java byte code書いた人とスタック云々の人は別だよw
236 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 22:50:35 ] こりゃ失礼しました m(__
237 名前:デフォルトの名無しさん [2008/02/09(土) 23:26:01 ] CPUが java のバイトコードを直接実行していると勘違いしている人が多いですね。 javac ⇒ バイトコード ⇒ インタプリタが実行
238 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 23:36:27 ] よくもまあこんな前世紀的話題を得々と・・・
239 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 23:37:55 ] 今のSunのJVMってJITコンパイルしてないの?
240 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 23:40:09 ] >>238 まぁ、新しくプログラミングの世界に入ってくる人たちが、そういう疑問を持つことは 当然というか、ソウであって欲しいものナわけで。「先人達が行ってたから」といって 自分の思考を停止して妄信するよりははるかに良い。
241 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 23:40:59 ] ていうか、釣りだろw 釣りとしか思えないよこのインタプリタ厨。
242 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 12:29:30 ] 釣りだ。 gotoのスレでパフォーマンスの話をして、釣れると思っているね
243 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 14:58:54 ] そもそも、大域変数しか使えない言語で「変数をスタックに積むって」ありえるのか? 変数宣言なし&局所変数なしの言語の場合、変数管理表と戻り先(jump先)管理表を使うのが普通だろ?
244 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 18:24:27 ] >>243 > そもそも、大域変数しか使えない言語で「変数をスタックに積むって」ありえるのか? > > 変数宣言なし&局所変数なしの言語の場合、変数管理表と戻り先(jump先)管理表を使うのが普通だろ? BASICのFOR-NEXT制御の場合、変数名をタグとして、 FOR x IN ... 〜 NEXT x を対応させる処理系がある。 (NEXTのあとの変数名はreminderで、処理系は無視するものもある) >>218 が得意そうに解説してるBASIC処理系では、NEXT x の x の 変数名を見て、対応するFORの処理に戻るような処理系なんだろうが、 そのような場合、FORの場所だけでなく、変数名もフレームに覚えておく 必要がある。変数の値じゃなくて、変数名そのものか、ポインタかを タグとして書いておくわけやね。
245 名前:デフォルトの名無しさん [2008/02/10(日) 18:53:17 ] じゃあgotoを使うなって言われるのは、 単純にスパゲッティ化するのを防ぐだけじゃなく、 スタックを開放する作業を確実にやるためだったってことだな。
246 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 18:55:43 ] つか今時どうやったら制御構文完備な言語で goto使ってスパゲッチなコードを書けるんだよw
247 名前:デフォルトの名無しさん [2008/02/10(日) 19:02:49 ] 完備ってほどでもないと思うけど。
248 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 19:04:48 ] gotoは悪だ!という宣伝がコレまで続けられてきて、普通のプログラマ はgotoを使ったスパゲティコードに関して十分知っているわけでしょ。 そういう意味では、goto邪悪論の目標は達していると思う。 それなのに会社のコーディング規約でgotoを禁止するのは、どうみても 自社のプログラマを信用していないとしか思えない。 goto禁止したところで、do { if (hoge) break; } while(0)で、gotoに近いことを やろうと思えば出来てしまうわけだぜ。そういう会社がやるべきは、社員の 教育であってgoto撲滅では決してない。
249 名前:デフォルトの名無しさん [2008/02/10(日) 19:29:20 ] 条件分岐とループで複雑に作ってもわけ分からんしな。
250 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 19:30:07 ] ゴトーさんが泣いているぞ
251 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 19:35:51 ] おまえは、BLASの後藤か、CINTの後藤か、パラメトロンの後藤か、 なんちゃって。
252 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 19:49:17 ] >>226 その2のほうさ、管理するリソースが1つだけならまだマシだが、4つも5つも > 管理している場合、そのためのサブ関数が4つも5つもできることに > なるわけだが・・・。 >>219 の2のどこをどう考えればリソース毎にサブ関数が必要になると思えるのやら。 hoge()の中身が増えるだけだろ。 まさかhoge_implのほうがリソース管理してるとでも読んだのか?
253 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 19:51:00 ] >>248 goto邪悪論も有害だが、goto気軽に利用論はもっと有害だな。 あくまで汚ないことをやっているという自覚を持って使うべきだ。
254 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 20:06:09 ] 相変わらず曖昧論ばっかりだな
255 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 20:16:53 ] >>252 いや、そうだな。だがしかし4つも5つもリソースがあるばあいはどうすんの。 そもそもその手法じゃダメやん。
256 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 20:25:56 ] つまり>>227 のようになってしまうわけだし。依存関係あると。 そうじゃないなら、やっぱりサブ関数をわけて依存関係を チェインさせる?正気の沙汰じゃないな。
257 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 20:30:00 ] //その2 static void hoge_impl(void *p) { //ところどころでreturn; } void hoge() //外部に公開される関数 { void *p1 = malloc(65536); void *p2 = malloc(65536); void *p3 = malloc(65536); void *p4 = malloc(65536); if (p1 && p2 && p3 && p4) ret = hoge_impl(p); if (p1) free(p1); if (p2) free(p2); if (p3) free(p3); if (p4) free(p4); return ret } で何か?
258 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 20:34:55 ] >>257 mallocならいいが、 >例えば、ある処理が1,2,3,4の順番で実行することがきめられてる場合 >(1を実行しないと、2が実行できない場合)、実際に実行して3でエラーが発生したら、 >1,2を巻き戻す処理が必要だし。 この場合はどうする
259 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 20:38:03 ] hoge()の最後でretの中身に応じて必要な回復処理すればいいだけじゃねーの?
260 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 20:39:28 ] >>259 書いてミレヨ
261 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 20:41:43 ] >>260 おいおい、どんな巻き戻しが必要なのか具体的なコードを出すのが先だろw
262 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 20:45:17 ] hoge_impl()の返り値にどこまで進んだかの情報を入れ込んでおけばOK
263 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 20:47:47 ] >>261 if (A_init() != 0) goto A_FAILED; if (B_init() != 0) goto B_FAILED; if (C_init() != 0) goto C_FAILED; if (D_init() != 0) goto D_FAILED; return 0; D_FAILED: D_finish(); C_FAILED: C_finish(); B_FAILED: B_finish(); A_FAILED: A_finish(); return -1;
264 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 20:49:18 ] >>263 それのどこが巻き戻しのコード?
265 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 20:53:08 ] 盛り上がってまいりました
266 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 20:53:26 ] >>263 initが失敗したら、finishでまき戻せると思ってくれ。
267 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 20:54:00 ] //その2 static void hoge_impl(void *p) { if (A_init() != 0) return A_FAILED; if (B_init() != 0) return B_FAILED; if (C_init() != 0) return C_FAILED; if (D_init() != 0) return D_FAILED; return 0; } void hoge() //外部に公開される関数 { switch (hoge_impl(p)) { case D_FAILED: D_finish(); case C_FAILED: C_finish(); case B_FAILED: B_finish(); case A_FAILED: A_finish(); return -1; default: return 0; } で何か?
268 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 20:57:00 ] もうこねーよ、ウワーン
269 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 20:58:18 ] そんなコード見たことねぇw goto避ける為にがんばりすぎだなw 大体ローカル変数にアクセスできねぇし いちいち引数で渡しますか。 C++厨のtry/finallyなんていらねぇ! がんばればclassのコンストラクタ、デストラクタで何とかなる!みたいだなw
270 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 21:01:22 ] >>269 御託はいいから、>>226 が筋違いだということは理解できたか?
271 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 21:02:23 ] >>269 回復に4つも別々の関数呼ばにゃならんコードな時点で糞ケテーイ
272 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 21:06:09 ] みんな、今271が良い事を言ったぞ!
273 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 21:09:51 ] がんばることある? 大抵のものは誰かがラッパー作っているし、 ないものは確かに作ることもあるけど、面倒ならboost::shared_ptrに任せられるし。
274 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 21:09:56 ] >>269 後出しイクナイ! ローカル変数うんぬんを言うのなら、A_finishとかが無引数なのはおかしいだろ。
275 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 21:12:22 ] >>273 禿同。こんな事にgotoとか使ってる奴はboost時代に乗り遅れてる。
276 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 21:18:15 ] でも削除子指定できるscoped_ptrほしい。 と思ったらunique_ptrは削除子していできるのか?
277 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 21:50:35 ] >>267 それってさ、一連の処理を分割してしまってるわけだけど、initしてからfinishする までの処理を。逆にメンテナンスせいが落ちそうじゃない。goto使うよりも。
278 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 21:52:09 ] アホが見ても分かるような用途にしかgotoは使わない。
279 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 21:55:02 ] >>278 アフォが見てもわかる用途って具体的には?
280 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 21:57:24 ] >>277 A_initって名前が悪いんじゃねーかな。 たぶん>>263 はA_init()は何か実際に処理をさせたいから"巻き戻し"なんて言ってるんじゃ。 だとするとA_init()はA_proc()と読みかえたほうがいいだろ。 そうすれば>>267 は>>208 が言うように処理とリソース管理の分離というデザインになる。
281 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 21:59:20 ] >>279 278じゃないけど多重breakとかかな? 多重breakできる言語が少しうらやましい。
282 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 22:01:20 ] それを言うとA_finishも変なネーミングだ
283 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 00:59:43 ] ファンクショントレースもgotoの話題にでてたけど、みなどうしてる? ftraceコマンドとかあるみたいだけど、どうも共有ライブラリとかの ファンクションコールをうまくトレースしてくんないのよね。
284 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 01:21:39 ] あぁちょっと調べてみたら、valgrindとか色々ありそうやね。
285 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 02:46:36 ] bool Init() { if (!InitHogeGraphics()) {goto FAILED_INIT_HOGE_GRAPHICS;} if (!InitHogeAudio()) {goto FAILED_INIT_HOGE_AUDIO;} if (!InitHogeInput()) {goto FAILED_INIT_HOGE_INPUT;} return true; FAILED_INIT_HOGE_INPUT: UninitHogeAudio(); FAILED_INIT_HOGE_AUDIO: UninitHogeGraphics(); FAILED_INIT_HOGE_GRAPHICS: return false; } こういう使い方もダメなのか?俺的にはスマートな方法だと思ってる 初期化が重なる場合でgoto文を使わない方法って何があるのよ
286 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 02:57:07 ] >>285 やりすぎかもしれんが・・・w こういうのも出来なくはないかもしれない、 気もしないでもない。 InitUninitFunc funcs[] = { {InitHogeGraphics, UninititHogeGraphics}, {InitHogeAudio, UninititHogeAudio}, ... }; bool Init() { for (int i = 0; i < NELEMS(funcs); i++) { if (!funcs[i].init()) { for (int j = i; j > 0; j--) { funcs[j].uninit(); } return false; } } return true; }
287 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 03:22:22 ] >>285 gotoいらないじゃん
288 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 03:25:46 ] >>287 別にgotoなんて無くてもいいんだが、分かりやすいことが重要じゃない? 極論すればwhile()だけで全ての制御構造は書けるわけだし。非常に面倒くさくなるけど。 >>285 で、InitHogeAudioの引数の一つがInitHogeGraphicsの結果だったりするみたいな感じで からみあってたりすると結構面倒くさいんじゃない?
289 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 03:31:26 ] ほら、ここでもinit関数と、finish関数のAPI仕様の統一の必要性がでてきた。 「gotoは設計に関係ない」っていったやつでてこい。プログラムのアマチュア が設計だけして、実装まるなげは本当に排除すべきだ。
290 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 03:41:18 ] >>287 いやまぁ、さきの例はそれぞれのinitとuninitが関数だからそうだけど、 たとえば単なる値の設定とそれをクリアするのに関数を用意するのはバカらしい。 それならgoto使うとかいう選択は十分にあると俺は思うな。
291 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 07:48:56 ] >>267 で結論が出た話を蒸し返してる香具師がいるぞw
292 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 08:07:30 ] >290 のように後出しジャンケンばかりやっている奴のコードは仕事に使えん
293 名前:デフォルトの名無しさん [2008/02/11(月) 08:15:32 ] >>285 =>>263
294 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 08:51:09 ] 半端なinit/finishを繰り返す時点でダメダメ
295 名前:デフォルトの名無しさん [2008/02/11(月) 10:50:15 ] >>288 確かにまとめてひとつの関数にすれば数は少なくてすむが、 ラベルの数が多すぎるだろ。 >分かりやすいことが重要じゃない? 分かりにくいんだよ。 制御が入ると、その制御全部チェックしないといけないだろ。 それ、順番間違ったらそれだけでバグになるだろ。
296 名前:デフォルトの名無しさん [2008/02/11(月) 11:05:02 ] gotoなしで実現しようとすれば、 ラベルの代わりにフラグ変数を使うことになるだけじゃないか? -- int ret_code = 0; ret_code = !(a_init() ? A_FAILED : 0) && ret_code = !(b_init() ? B_FAILED : 0) && ret_code = !(c_init() ? C_FAILED : 0); switch(ret_code) { case C_FAILED: c_rollback(); case B_FAILED: b_rollback(); case A_FAILED: a_rollback(); } return ret_code; -- かつ、何らかの事情でinit()やrollback()を同一関数内に まとめて書く必要がある場合(式でなく文になる場合) こういうコードは書けないのでgotoするしかない気がする。
297 名前:296 [2008/02/11(月) 11:10:43 ] 見直すと意味不明なコードだが気にするなw
298 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 12:01:53 ] >>296 > かつ、何らかの事情でinit()やrollback()を同一関数内に > まとめて書く必要がある場合(式でなく文になる場合) どんな状況を言いたいのかサパーリわかりません。 ちゃんとした日本語か、仮でいいからCか、どっちかで書いてくれ。
299 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 12:02:31 ] >>288 これで「わかりやすい」と思うのは書いた本人だけだと思うぞ。
300 名前:デフォルトの名無しさん [2008/02/11(月) 12:05:02 ] つーか、UnInitって未初期化のことじゃないか オマエラ本当にマなのか?w
301 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 12:12:09 ] >296 たぶん君は10万行以上のコード書いたことないでしょ。 それにチームでコードを書いた経験もほとんど無いように見受けられる。 素人はgoto避けたほうが身のためだよ。
302 名前:296 [2008/02/11(月) 12:16:53 ] gotoの代替手段があってそれがgotoより優れているならそうするw でも>>267 や>>286 みたいに、goto回避を目的としたトリッキーなコードを書くくらいなら イディオムとして理解できるgotoは素直に利用する方がよっぽどわかりやすい
303 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 12:19:41 ] >267をトリッキーと感じる感性でgotoを濫用されちゃ話になりませんな。
304 名前:296 [2008/02/11(月) 12:21:26 ] >>298 簡単な例で言えば>>267 のコードで hoge_implおよび*_initをインライン化する必要が出たら フラグをreturnしてswitchで受けるっていうのは無理だわな、 そんときはどうする?ってこと
305 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 12:21:45 ] >>267 はgoto回避のトリッキーなコードというよりも、 APIから抜ける前にチェックを「確実に」入れるための簡単なtipsなのだが。
306 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 12:23:14 ] >>300 Get:UnGetと書くマがこの世に実在してだな… >>302 IDEでデバッグできる環境なら多少強引でもgoto回避したほうが追いやすいよ。
307 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 12:23:27 ] >>304 具体的に。
308 名前:296 mailto:sage [2008/02/11(月) 12:23:33 ] >>303 LABELを定義してgoto label するのと フラグ定数をdefine してreturn -> switch するのと何が違うんだ?
309 名前:296 [2008/02/11(月) 12:29:49 ] こんな感じかな for (int i = 0; i < 10; i++) { if (x[i] == 0) { goto A_FAILED; } else { a /= x[i]; } for (int i = 0; i < 10; i++) { if (y[i] == 0) { goto B_FAILED; } else { b /= y[i]; } return 0; B_FAILED: something A_FAILED: something return -1;
310 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 12:29:50 ] 意図的に話をループさせて逃げようとしてますな >>298 に>>304 で答えたことになると思ってんの?
311 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 12:30:23 ] >>308 >>305
312 名前:296 [2008/02/11(月) 12:32:26 ] 309をgotoを使わずに上手く書くのってどうする?
313 名前:296 [2008/02/11(月) 12:34:10 ] 要望にこたえて>>309 に具体的に書いたので、 そちらも具体的なコードでよろしく 関数分割は無しな。 「美しい設計」にしたがって自由にリファクタリングできる業務なら 議論の余地なくgotoなんていらないだろ。ってかそんな環境ならC使わないし。
314 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 12:35:43 ] >>309 いいかげん同じようなコード書くのに飽きてきたよ。 int foo_impl() { for (int i = 0; i < 10; i++) { if (x[i] == 0) { return A_FAILED; } else { a /= x[i]; } for (int i = 0; i < 10; i++) { if (y[i] == 0) { return B_FAILED; } else { b /= y[i]; } return SUCCESS; } int foo() { //公開されるAPI switch (foo_impl()) { case B_FAILED: something case A_FAILED: something return -1; default: return 0; } で何がこまる?
315 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 12:38:16 ] どこまで条件の後付けを続けるのかしら…(´・ω・`)
316 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 12:38:19 ] >>313 お前な、はっきり言わせてもらうと、馬鹿じゃねーのか? 「goto使わずに、関数分割してリソース管理と処理本体を分離する設計にしろ、 そのほうがgotoでスパゲッティにせずにリソースの解放を確実に実行できる。」 という主張に大して「関数分割はなしな」じゃ議論から逃げているとしか 受け取りようがない。
317 名前:296 [2008/02/11(月) 12:42:30 ] >>314 そのコードが実質的に>>309 と何が違う?
318 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 12:46:08 ] >>317 過去ログ読んでろ。自分のレスだけでなく、相手のレスも真摯に読め。 話はそれからだ。
319 名前:296 [2008/02/11(月) 12:47:28 ] 過去ログ嫁は逃げるときに便利な言葉だな。
320 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 12:48:32 ] 正直、もう後出しジャンケンのワナビー初心者相手にするのは飽きた。
321 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 12:50:54 ] >319 条件の後付けで逃げてるのはキミのほうでしょ…(´・ω・`)
322 名前:320 [2008/02/11(月) 12:51:07 ] 飽きたといいつつ、お前は次の奴も相手するよw
323 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 12:52:17 ] >>317 過去ログと言わず、自分のレスの1つ前のレスを読んでみたらどうだ?
324 名前:315 mailto:sage [2008/02/11(月) 12:54:59 ] >>321 もしかして僕のレス見て言ってる…? >>296 へのレスだかんね(´・ω・`)
325 名前:321 mailto:sage [2008/02/11(月) 12:59:38 ] >>324 もちろん>>319 =>>296 へのレスだかんね(´・ω・`)
326 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 13:08:40 ] 296はトンヅラを決め込んだようですwwwwwwwwwwwカコワリwwwwwwwwwwwww
327 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 13:11:22 ] 誰もレスしていないが286が良い設計
328 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 13:33:25 ] >>267 が良いコードとされた時代が懐かしいな
329 名前:デフォルトの名無しさん [2008/02/11(月) 13:34:46 ] なんだ時代は後退してるのか
330 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 13:37:10 ] それを後退だと思うなら後退だ。
331 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 13:41:26 ] 時代の最先端のコードは>>285 です。
332 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 13:41:31 ] A_init() A_FAILED case A_FAILED A_finish() ソース上ばらばらなのに意味上は相変わらず密結合 メンテナンス性を悪化させる似非リファクタリングの典型
333 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 13:45:55 ] >>332 よく読むとわかるけど、ソース上の距離は>285も同じなんだよ。 文句があるのなら>285に言ってくれw
334 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 13:48:45 ] 「処理とリソース管理の分離」を掲げた設計に対して 「ソース上ばらばら」は誉め言葉だよwww
335 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 13:53:31 ] hoge_impl()に処理を分割した分だけ距離が離れている A_FAILEDを別途#defineしなければならない分だけ管理要素が増えている >>334 意味不明
336 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 13:57:34 ] >>335 gotoであちこちのブロックから飛びまくるのに比べれば > hoge_impl()に処理を分割した分だけ距離が離れている > A_FAILEDを別途#defineしなければならない分だけ管理要素が増えている なんて取るに足らない瑣末な問題だな
337 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 13:59:07 ] >>332 の日本語訳 意味上の結合を維持したまま、処理本体とリソース管理を分離できている。 メンテナンス性を向上させるリファクタリングの典型
338 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 13:59:47 ] 勘違いしないでほしいがgoto版との比較で>>267 が駄目だという事ではなく goto版も>>267 もどちらも駄目だということ 公開関数であるhoge()から内部一式全てを一人で管理するような小さなモジュールなら goto版でも>>267 でもどちらでも問題にならないだろう。 そうでない規模ならgoto版も>>267 もどちらも簡単に破綻する
339 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 14:01:14 ] 意味不明なのは>>267 のコードの どの部分が処理本体でどの部分がリソース管理なのかが意味不明ということ
340 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 14:03:33 ] >>339 それは296にしか答えられない質問では?
341 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 14:07:14 ] >>338 つまり、巻き戻し処理のためにgotoのほうが遥かに便利という、 大元の>>199 の引用元の主張は×ね。
342 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 14:08:15 ] initしてrollbackするだけという、中身が何もない例題じゃあなあ
343 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 14:12:21 ] // static void hoge_impl(void *p) { #define return goto if (A_init() != 0) return A_FAILED; if (B_init() != 0) return B_FAILED; if (C_init() != 0) return C_FAILED; if (D_init() != 0) return D_FAILED; #undef return return 0; // } // void hoge() { // switch (hoge_impl(p)) { #define case label case D_FAILED: D_finish(); case C_FAILED: C_finish(); case B_FAILED: B_finish(); case A_FAILED: A_finish(); return -1; #undef case // default: // return 0; // }
344 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 14:14:32 ] 嫌goto厨は早く>>213 の実例を全否定してまわる作業に戻るんだ
345 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 14:17:04 ] >>336 あちこちのブロックから飛びまくるのはgotoを無秩序に使う結果 >>267 で何かgotoの重要な欠点が解決されたと思う人は 343と267で何が違うのか考えてみればよい
346 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 14:21:27 ] >>345 そうなんだよ。>>343 の//で印(w)をつけてくれた部分が重要なんだよ。 あと、#defineの行もミソだね。 こんなつまらんgotoを使わなくても関数で出口を纏めることができるという好例だ。
347 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 14:22:29 ] >>344 嫌goto厨?濫用を嫌う人は何人かいるみたいだけど、 gotoを全否定してる人はいないんじゃない?俺も含めて。
348 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 14:31:06 ] そんなつまらん実装上の理由で関数分割をしなくとも gotoさえ使えば綺麗にまとまる好例とも言えるな
349 名前:デフォルトの名無しさん [2008/02/11(月) 14:39:18 ] 最近関数内関数なるものの存在を知ったんだけど、 それがあれば「関数を勝手に作れないからgoto使う」って人も、gotoなしでいけるんじゃないかな。
350 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 14:44:26 ] >>347 定石的な使い方すら絶対に許さないと必死になっているように見受けられるがw
351 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 14:52:36 ] 個人的にはgotoが全面禁止でない限り>>267 のようなコードは絶対書かないけどな
352 名前:デフォルトの名無しさん [2008/02/11(月) 15:09:11 ] 適当に書いた。 関数化したくなければブロックで書けば。 処理続行可能フラグとか変かもしれないけど、 戻り値に成功と失敗を返すなら、それをそのままこのブロックの制御に使える。 >>351 で参照 // 前処理 flg = true while(flg){ if error{ flg = false; break; } break; } // 主処理 while(flg){ if error{ flg = false; break; } break; } // 後処理 return flg;
353 名前:デフォルトの名無しさん [2008/02/11(月) 15:10:22 ] みす >>352 で参照。 まあ、専用ブラウザならレス番選択して右クリしたら見れる。
354 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 16:02:48 ] なんか必死なgoto厨房ががんばってるな。 実装上の都合と設計上の都合の区別もつかないとは。 まあ俺も>>267 みたいなコードはまず書かないけどなw
355 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 16:11:33 ] >>352 breakの数が多いのはなんでなんだぜ
356 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 16:13:43 ] 必死な嫌goto厨オツw
357 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 16:29:18 ] 設計云々なら、俺ならgotoを使わないなら最低限こう書く。 hoge_impl()だけ切り出して巻き戻しがベタ書きというのは本能的に気持ちが悪い。 int hoge_init(); // 略 void hoge_process(); // 略 void hoge_rollback(int r) { switch(r) { // 略 } } void hoge() { int ret = hoge_init(); if (!ret) { hoge_process(); } else { hoge_rollback(ret); } } でも実際goto使うよ。イディオムだろこんなの。
358 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 17:02:46 ] >>357 >hoge_impl()だけ切り出して巻き戻しがベタ書きというのは本能的に気持ちが悪い。 まぁハゲドウw
359 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 17:05:54 ] >>357 俺も > hoge_impl()だけ切り出して巻き戻しがベタ書きというのは本能的に気持ちが悪い。 に禿同。 こんなつまらんことにgotoを使ったりはせんが。 2重breakには使うけどな。
360 名前:デフォルトの名無しさん [2008/02/11(月) 17:31:18 ] >>355 whileを、breakで好きな段階で抜けられるブロックとして使うため、2度目の実行をしないためにループの最後にbreakを入れる。 これはgotoの代替として普通使ってると思うけど。 まあ、ループしないのにwhile使うのはおかしいって言う人もいるけど。 んで、while 1として無限ループにしたほうが、breakで抜けますよってのを明示できるけど、 flgを入れてみたのは、全体の流れを制御するflgだと明示しつつ、 最後にbreak入れ忘れた場合でも途中でリソース不足とか2度実行のエラーになれば抜けれて安全かなと。
361 名前:デフォルトの名無しさん [2008/02/11(月) 17:38:15 ] エラー終了と正常終了を分ける場合は、主処理のブロックの最後で、breakじゃなくreturnするかな。 配列から探して何番目かを返すようなのは、エラーとNULLが逆になる。 基本だよね。 参照は >>361 // 主処理 while(flg){ if error{ flg = false; break; } return flg; // 常にtrueが返される。 } // エラー処理 return flg; // エラーなのでfalseが返される。
362 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 17:46:24 ] 粘着同士のレベルの低い言い争い、おわった?
363 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 17:57:38 ] >>360 なんで do { ... } while (false) にしないんだぜ?
364 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 18:00:24 ] >>237 > CPUが java のバイトコードを直接実行していると勘違いしている人が多いですね。 > javac ⇒ バイトコード ⇒ インタプリタが実行 バイトコードを実行するのはインタプリタではなくてVM(仮想計算機)だ。 つまり、インタプリタじゃなくてエミュレータな。
365 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 18:01:48 ] バカ亀乙
366 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 18:07:01 ] 大域脱出に限りgotoを使うという人はgotoの宛先は常にループ直後?
367 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 18:19:53 ] while (condition) while (condition) if (something_wrong) goto A_FAILURE; else something; while (condition) while (condition) if (something_wrong) goto B_FAILURE; else something; return 0; B_FAILURE: something; A_FAILURE: something; return -1;
368 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 18:23:45 ] 大域脱出のときだけgoto使うよ派が書くとこうなる? result = 0; while (condition) while (condition) if (something_wrong) result = A_FAILURE; goto END_OF_A; else something; END_OF_A: if (result == 0) while (condition) while (condition) if (something_wrong) result = B_FAILURE; goto END_OF_B; else something; END_OF_B: switch (result) case B_FAILURE: something; case A_FAILURE: something; return -1; default: return 0;
369 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 18:32:13 ] またコイツか・・・いいかげんウザ
370 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 18:43:16 ] コミュニケーション能力より技術力の方が大切だと思うので こういう議論で野次馬からウザいと思われるかどうかは気にしませんw
371 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 18:56:38 ] >>363 ああそんなのもあったっけ。 doではじめるとwhileに書き換えられたことがあった。 それはともかく、 前処理に失敗したら主処理を飛び越して後処理ってするとき、 処理する前に判断しないとだめだろ。 それに、break忘れのリスクもあるが、戻り値の初期化忘れっていうミスを防ぐ効果もある。 どちらかというと正常か異常かを錯誤するほうが重大なミスだから whileよりdoがよいということはないと思う。 あと、エラーなら抜けるっていうまったく同じ目的のためのブロックだから、 前処理も主処理も同じ構文使ったほうがわかりやすいしミスしにくい。 とにかく頭使わずにミスなく書くのが目的だから。
372 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 19:00:40 ] >>371 >とにかく頭使わずにミスなく書くのが目的だから。 そか。俺は頭使わずにミスなく読めるコードを書くのが目的だから gotoで書く方が読み易い場面ではgotoを使うんだぜ
373 名前:デフォルトの名無しさん [2008/02/11(月) 19:11:03 ] 大域脱出の場合、pythonなら、breakでの脱出とfor文の判断での終了かが はっきり分けられてるから簡単だよ。 UWSCってマクロならbreak 2っていう、2重ループ脱出命令がある。 結局自分で工夫しないといけない言語と、想定された言語があるんだよね。 そもそも、breakは内部はjmpつまりgotoなんだから受け側をswitchみたいに 自動で分けてくれてれば余計なif文でスペック落としたり、 スペックあげるためにアセンブラ使ったりしなくてすむのにな。 結局、どの言語でも共通の設計でいけるように最小限の文法にしてしまったから使いにくいんだよな。 >>372 それはいいけど>>285 みたいなことされても困るんだよ。 あれは関数内でどうせリソースが有効かどうか判断する必要あるだろ。 if hoge { free(hoge); hoge = NULL } とかな だったらとび先は FAILED_INIT_HOGE_INPUT: FAILED_INIT_HOGE_AUDIO: FAILED_INIT_HOGE_GRAPHICS: とか全部いらなくて FAILED: 一つで足りるんだよ。 飛び先が一つなのは分かりやすいだろ。 そもそも、gotoが分かりにくくなる理由は、飛び元と飛び先に同じラベル名が出てきてどっちからどっちに飛んでるかいちいち確認が必要だからだよ。
374 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 19:17:57 ] >>364 少なくともGNUはインタプリタと呼んでいるようだ。 gcc.gnu.org/onlinedocs/gcj/Invoking-gij.html >gij is a Java bytecode interpreter included with libgcj.
375 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 19:18:04 ] >そもそも、gotoが分かりにくくなる理由は、飛び元と飛び先に同じラベル名が出てきてどっちからどっちに飛んでるかいちいち確認が必要だからだよ。 これは凄い
376 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 19:20:54 ] >>361 こんなコード書くやつがいたら、殴ってしまうかもしれない。ペシペシ
377 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 19:22:58 ] このスレってFizzBuzzすらパスしない奴がごろごろいそう・・・
378 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 19:25:23 ] 中身のないコードで空虚な議論 お前らヒマだな
379 名前:デフォルトの名無しさん [2008/02/11(月) 19:27:03 ] >>263 をちょっと書き換え if (A_init() != 0) goto A_FAILED; if (B_init() != 0) 80+0; B_FAILED: if (C_init() != 0) goto C_FAILED; if (D_init() != 0) goto B_FAILED; こっそりこういういたずらをしていく人がいるんだ。世の中には。 そういうやつと一緒に仕事しなかった人は幸せもん。 携帯開発の軍曹の話は有名らしいが、 あの戦場を生み出すのがこういうことをする人間なんだ。 本当に単なるミスであの地獄が生まれるとか思ってないよな? ああいうのをやるやつっていうのは、 周りを引きずりおろすことで自分を立派に見せてのし上がろうとする暴力主義のやつら。特に福岡県出身のやつら。
380 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 19:30:26 ] goto肯定論者の俺でもこのスレのgoto厨には賛成できない
381 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 19:31:09 ] 流れを読まずに横レス。 GOTO 使わず関数使えというのは、太古の昔、非構造化プログラミングから 構造化プログラミングへのパラダイムシフトが現在進行形だった時代の いわば「スローガン」だと思います。 時代は移り、今は構造化プログラミングが当たり前の時代です。 そのような現在のプログラマが、私たちの先祖が使っていた GOTO 730 と 関数内部での goto FAILED; を同列に論じてしまうことに 私はいささかの疑問を感じるのです。
382 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 19:33:42 ] > 周りを引きずりおろすことで自分を立派に見せてのし上がろうとする暴力主義のやつら。特に福岡県出身のやつら。 なんだそのビ妙〜な私怨はw
383 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 19:35:12 ] こっそりって。コミットログすら書かないのか携帯の開発は。
384 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 19:38:12 ] >>381 小さい関数ならいいが、ブクブク太った巨大関数の中でホイホイと飛ばれると 読むほうは疲れるんだよ。多重breakとか限定された状況ならまだ許せるけどな。 特に考えもせずにgoto多様する馬鹿にかぎって巨大な神関数をつくりたがる。
385 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 19:38:40 ] >>379 そういうやつと仕事したことないけど、そのコードだとコンパイラ警告 でるんじゃないか?B_FAILEDの行が意味を成していないとか何とか。 擬似コードにつっこむのもあれだが。
386 名前:デフォルトの名無しさん [2008/02/11(月) 19:39:47 ] >>381 飛び先が一箇所ならいいと思うよ。 >>379 みたいないたずらされても、ループするか飛ばすかのどっちかしかないから。 goto FAILED;とかは関数につき1回だし普通は最後に飛ぶだけだし問題になることはないからね。 >>383 証拠が残せるようなシステム使ってないから。 >>382 福岡はそういう地域なんだよ。 完成品チェックって横槍いれて完成してたら強奪。奪ったらパソコン初期化して証拠隠滅。 毎度毎度そればっかり。 完成してたら強奪→正社員 奪われるばっかりの人→派遣社員 いや、別に比喩してるわけじゃなくてね。 社員同士でもそうなんだよ。
387 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 19:41:27 ] それはgoto以前の問題だし因果関係が明らかに逆。 適切に関数分割できない馬鹿だから 巨大関数の中をgotoで飛び回るコードになる。 そういう馬鹿に言うべきは「処理のまとまりごとに関数に分けろ」であって そいつに「gotoを使うな」と言ったところで 今度は巨大なネストをフラグで引き回すコードを書くだけ。
388 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 19:42:12 ] >>385 B_FAILED の後ろがセミコロンからコロンになっているのに注意。 君はだまされる方だな。
389 名前:デフォルトの名無しさん [2008/02/11(月) 19:45:08 ] 馬鹿?
390 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 19:52:16 ] >>388 きづかなかった・・・w もしかしてあなたは、そういういたずらをチョコチョコやっているのではな いかと、疑いたくなってきたなw
391 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 19:52:52 ] 朱に交われば、なんとやら・・w
392 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 19:55:23 ] >>387 でもこのスレで出てきてるコード読むと、 神関数つくりそうな勢いのコードが目につくんだけど。
393 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 19:56:28 ] 昔一緒に仕事したひとで、 「1関数にreturnは1つしか書かない」 という信念を曲げない人がいた。 その人の書いた関数は、最後にラベルがたくさんあってgotoの山盛りだった・・・ ってあれ?デスマーチスレじゃないのか、ここ。
394 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 20:02:25 ] >>393 そいつってオレジャネ?
395 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 20:12:00 ] まさかの運命の再会
396 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 20:29:31 ] でもさ、数行の排他を必要とする関数で lock(); if (arg == NULL) { unlock(); return E_PARAM; } ... unlock(); よりも下のほうが好みだなぁ。lock()とunlock()内を関数に分離するのも馬鹿馬鹿しい ほどの小ささだと lock(); if (arg == NULL) { result = E_PARAM; goto END_FUNC;; } ... END_FUNC: unlock(); return result;
397 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 20:38:38 ] 一方、俺はfinallyを使った。
398 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 20:45:37 ] >>397 Cなんだよ、バーヤバーヤ
399 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 21:48:02 ] 某スレより 569 名前:デフォルトの名無しさん [sage]: 2008/02/09(土) 16:46:29 >>566 try finallyは例外を捕まえるための機構であって、ファンクション トレースのための機構ではない。 デストラクタでロギングするほうがよっぽどスマート。try finally に依存したロギングよりも。そしてアスペクト指向のほうが デストラクタロギングよりももっとスマートだといっているのだよ。
400 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 21:53:30 ] finallyって例外つかまえるための機構? 例外以外にもreturnとかでも呼ばれるんじゃないの?
401 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 21:57:43 ] C++厨かよ
402 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 21:59:16 ] gotoはダメだって言っているやつって、 ループ内break、continue、関数の途中のreturnとかもダメだと思ってるの?
403 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 22:01:34 ] >>402 少なくともこのスレではそんな主張をしているレスは見あたらないね。 で、それがどうしたの?
404 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 22:02:58 ] そもそもgotoはダメだという主張自体が見当たらないのだが。 できるだけ避けろ、とか、濫用するな、ってのはあるようだがな。
405 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 22:10:13 ] >402は脳内敵をプロファイリング中でーす
406 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 22:14:51 ] gotoを書く奴はスパゲティコードを書くという前時代の妄想で脳内敵を作り上げているのはどっちだか
407 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 22:15:56 ] 重要なのはgotoを使うか使わないかじゃなくて ちゃんとコードレビューしろよってことだ
408 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 22:21:14 ] >>400 > 例外以外にもreturnとかでも呼ばれるんじゃないの? 正確には、フレームが巻き戻されるのをトラップする機能。 それを利用して、例外のハンドリング(catch)や、後始末の処理(finally)の機構が 実装されている、という表現が正確。
409 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 22:24:36 ] その「できるだけ」とはどこまでなのかという議論をしていたんじゃ?
410 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 22:24:46 ] >>407 修正箇所だけのコードレビューとかなら確かにうまくいくけどさ、 何万行のソースコードをレビューで全部網羅するって、 全然うまくいったことがないな。みんなどうしてるのだろ。 ペアプロとかのがよさそうだけど、やったことないや。
411 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 22:28:34 ] ルール:gotoを使っている関数はコードレビューの対象とする
412 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 22:31:56 ] >>411 ごめん、俺「関数のreturnは必ず一箇所でやる」ポリシーもってるから、 全部レビュー対象となる^^
413 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 22:33:39 ] >>412 ^^と書いているが俺が去年やってたプロジェクトだと笑い事じゃなくて実際そうなる。
414 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 22:36:42 ] 具体的に言うと、gotoを使っている関数は フローチャートおよび詳細な動作説明をドキュメントとして準備してコードレビュー。 もちろんそういうドキュメントを用意してレビュー会で説明するのは実装者。 承認となった場合もドキュメントは保管。 なので濫用する奴なんか自然といなくなる。 誰も濫用しないから何万行のレビューなんてのも実際は発生しない。 無問題。
415 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 22:41:30 ] goto使ってる関数だけって、、、 あほらし。
416 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 22:45:08 ] if と if and only if の区別も付かない奴か。
417 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 22:49:57 ] >>414 それだけだとgoto濫用防止だけだけど、ホカにはどんなルールをきめてるん?
418 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 22:52:23 ] >>414 それとさ、組み込み系だとファンクショントレース機能があるICEとか 結構効果なのだけどさ、それも全開発者に配布?
419 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 22:52:57 ] 結構効果なのだけどさ→結構高価なのだけどさ
420 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 22:55:55 ] >>417 あれこれ言ったら個人特定されるでしょ 単純なのは、一関数が一定の行数を超えたらとか for文で()の中に書く内容が「普通じゃない」とか ちなみに>>412 の理由だけでgotoを使った場合はレビューで却下だよ。
421 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 22:58:23 ] >>420 世の中にドレダケぷろじぇくとまねーじゃが存在しているのか考えれば、 あなたがやっていることと同じようなことをやっている人は無数にいるから、 特定なんてされないと思うぞw
422 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 22:59:17 ] >>421 じゃあ先に君の関わったプロジェクトで採用されていたルールを教えてくれ
423 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 22:59:32 ] >>420 「普通じゃない」とかの基準で、資料作成させられて説明させられる プログラマかわいそすwww もうちょいまともな基準作ったほうがイインジャナイ?
424 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 23:00:47 ] んーとね。いちいち説明しないとわからんかな。 何が「普通」かは実際には定義されているの。ここでは書かないけど。 簡単に言えばループ変数の初期化、終了条件、増分を普通に書くのが普通
425 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 23:01:39 ] >>423 説明するのが手間になるようなコードを書くほうが悪いと思うが。
426 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 23:01:56 ] >>424 「なにが普通か」の基準をきめるための努力は世の中に一杯あって、 基準めいたものもあるんじゃない?
427 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 23:02:46 ] >>425 え〜だって、俺様基準で「普通じゃないから」っていわれて、「フローチャート」 まで用意させられるのだぜw
428 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 23:06:57 ] >>427 フローチャートはgotoの場合じゃないの? forの場合には何かトリッキーな式を書いた場合に そのトリッキーな式がなぜ必要なのかを説明する ドキュメント+プレゼンとかそんな感じだと思うが。
429 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 23:07:59 ] >>427 俺様標準じゃなくて、一応条件が示されてるらしいぞ。 まあ俺には関係ない話だからどうでもいいと言えばどうでもいいが。
430 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 23:08:47 ] gotoに拘る人間に100k行以上の開発蓄積のある人間はいない。
431 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 23:10:11 ] 1m行ならわからんでもないがさすがに100k行くらいは新人以外誰でも書いてるだろ
432 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 23:10:18 ] 好意のは時代を超えて無内容さが変わらないものだな
433 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 23:10:29 ] >>430 goto厨のコードを読めば、それは明らかだな。
434 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 23:12:43 ] >>431 1本の開発で一人100k行、の間違いじゃねーの?
435 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 23:13:56 ] そかも
436 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 23:16:18 ] goto使ったら詳細資料を用意しなければならないって、 使いたいとこでも使えないじゃねぇか。開発効率悪そう。
437 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 23:18:36 ] >>436 goto使うだけの理由があればそれを書けばいいんじゃないの? 処理の流れをちゃんと把握できていればフローチャートだって 簡単に書けるし。 それとも実装ドキュメントの類いを一切書かない人?
438 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 23:19:10 ] >>429 いやさ、その根拠が多くの開発者が納得いくものであればいいが、 「goto使ったら、フローチャート描かせて、説明させる。」っていってる ようなやつが、まともな基準を示せるとは到底思えないのよね。
439 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 23:20:17 ] フローチャート書ける程度のショボイ処理ならgotoいらないだろ
440 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 23:22:47 ] >>436 わかって使っている人にとってはその通り。 ただし、こういうレビューの目的の半分は、 将来そのコードの面倒を見る他社のために実装資料を残すこと。 それが、大人のマナー
441 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 23:24:07 ] >>437 だからさ、goto使うだけでフローチャート書けっていってるのは、 基準が曖昧すぎるといってるのよ。別にgotoが適切な場合もあるし、 そうでない場合もある。whileが適切でない場合もあるし、そうで ない場合もある。 そんなこといってたら、すべてのプログラムにたいして全部 フローチャート書けという事になるわけで。
442 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 23:24:44 ] フローチャート(笑)
443 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 23:26:59 ] 他社とは限らないな。自社の別チームでも何でも。 要するに、今の実装チームが未来永劫メンテするわけじゃないということ
444 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 23:29:30 ] >>443 せめてさ、世の中に「メンテナンス性が高いプログラム」を判別しようとする 努力があって、そのための基準が研究されている事実くらい勉強した上で そういうこといったほうがいいんじゃない? goto使ったらコードレビューだ!とかじゃなくてさ。
445 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 23:30:09 ] 可読性の定量化なぞ不可能さ。 管理面でどうしても何かしたいならば。 goto使用許可を出せる権限を 誰かに付与すればイイんじゃね?
446 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 23:34:14 ] >>441 gotoは他の構文要素と比較して、適切に使われない場合が多いという 共通認識があるからこそ、このスレも成立していると思うんだが。 適切なgotoもそうでないgotoもあり、適切なwhileもそうでないwhileもある。 だから全部やるか何もやらないかどちらかにしろ・・・では物は作れない。 現実的な判断として、かけるコストを回収できる効果があるかどうか。 というのが常識として書いていたが、考えてみればここはマ板でなく ム板だから学生や研究者も当然いるのか。
447 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 23:38:10 ] >>446 いや、あなたがいままで言ったような判断基準より、ましな判定基準を 提供するツールはあるし(商用、フリーかかわらず)、そのことすら 知らないまま、ぷろじぇくとまねぇじゃぁをやるのは周囲を不幸にするよ、 といってるだけだけど。
448 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 23:38:10 ] >>444 浅学にして知らなかった。ポインタを示してもらえるかな。 研究者ではないので、俺はそういう勉強は足りないと自分でも思う。
449 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 23:40:22 ] ところで、俺はそういうプロジェクトに開発者として関わっていたのだが どこからプロジェクトマネージャという誤解が発生しているのかな
450 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 23:40:51 ] コードレビューするのは結構なことだが、 くだらない決まり作って、くだらない作業させるようなプロジェクトは、 メンバのモチベーションも低いだろ。
451 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 23:50:07 ] >>448 とりあえず「複雑度」でぐぐってこいw
452 名前:デフォルトの名無しさん [2008/02/11(月) 23:51:32 ] 人の意見に文句だけいって自分は何も提供しない人って周囲のモチベーションさげるよねw 他の人、自分のかかわってたプロジェクトではどうだったのさ。 最低限そのくらい言ったら?
453 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 23:55:58 ] >>452 お前は、ナニサマナンダ
454 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 00:01:22 ] >>451 情報感謝。そういえば、そういうのも何か使ったことはあった。 ただ、そのプロジェクトだと単にビルド時に出していただけで、 それがどう使われていたのか知らない。値が高くても低くても特に何もなかった。 その値に適当な閾値を決めてレビューとかやればいいのか? 実際にプロジェクトでどういう運用がされていて、効果がどうだったのかとか、 そういう感想もあれば是非
455 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 00:05:25 ] これ以上ないくらいスレ違いだな
456 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 00:07:52 ] >>454 閾値はあるていどキビシ目にきめたほうがいいが、実際にレビューするか どうかは、閾値が異常な値を示しているコードがバグを良く出すとか、 新規作成のものであるかとかいう事情を加味して考慮したほうがいい。 安定して動作しているモジュールを閾値より外れているから、といって リファクタリングしたところで新たな不具合を生み出すだけ。 目的を見失わないようにしながら、やればいい。 しかし複雑度の計測もマダマダであって、あくまで一つの参考にしか ならないが。
457 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 00:45:08 ] こないだ、goto文が使われているコードを 昔作ったものから持ってった。 キー入力の評価だから これ以上重たくしたくもない・・・というところ。 select 文二重+if文の底から出るのに breakを掛けるのは・・・
458 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 00:48:03 ] 世の中のプロジェクトは、まだまだ、リーダーとかマネージャとか上司とかの 「コーディング規約」(訳:俺の理解できない しんきのう は使うな) が支配的なのな。
459 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 00:53:03 ] 分野によるが、多人数が関る(新人やアホが混じりやすい)プロジェクトでは必須 MISRA-Cとか
460 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 00:59:27 ] MISRA-Cってどの程度使われてるのかね それはさておき、MISRA-Cを適用するような分野に 新人やアホが混じってるというのはガクブルだな
461 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 01:18:15 ] MISRA-Cは、新人やアホがまじらないための基準という意味では まぁ有効だが、そういうやつがいない現場にとっては、無駄な 足かせにしかなっていないという矛盾がある。そして、そういうやつ が混じらないようにする努力というのは経営陣の仕事であって、現場の 規約を固めるのはあまり意味がない。 ミスを防ぐための基準が、よけいに複雑なコードを生み出して、 逆にミスを生み出してしまうような矛盾が今のMISRA-Cにはある。
462 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 01:56:39 ] そういうやつがいない現場の数のほうが少ない
463 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 07:33:58 ] 結局、まじめに処理構造を見直すのがマンドクセからgoto使うんでしょ。 gotoマンセ君は多人数での開発経験がないんじゃねーの?
464 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 08:11:19 ] C覚えて2-3年程度のアマチュアが「goto、ヤベーw」とはしゃいでるだけ。
465 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 11:30:23 ] >>463 gotoを使ったほうが可読性が高い場合に遭遇したことが無いね?
466 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 12:30:26 ] 基本文献はクヌースのStructured Programming with go to Statementsですかね。 あと、このへんで、 ttp://www.cmagazine.jp/src/kinjite/c/coding.html#index32 gotoと同じくらいダメとされている手を、gotoを避けるためだけに 使ってないか? というのは良い指標かと思う。
467 名前:463じゃないが mailto:sage [2008/02/12(火) 17:17:23 ] >>465 もちろんあるけど、しっかり考えれば考えるほど少なくなっていくよ。
468 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 17:37:19 ] >>466 break, continueがだめって書いてあるやつ、 使わなかったとしたらどう書く? ちょっと想像つかない。
469 名前:デフォルトの名無しさん [2008/02/12(火) 17:41:08 ] ちなみにこういうやつ書いたんです。 エラーはエラーなんだけどエラーの種類によって動作を変えるってやつ。 コードの参照は>>469 for i = 0 to 2 IE.navigate(str) REPEAT; sleep(0.1); UNTIL !IE.busy AND IE.readystate = 4 // エラーページチェック errortitles[4] = Status(ID, ST_TITLE) for e = 0 to 4 ifb 1 <= Pos(errortitles[e], errortitles[4]) Then select e case 4 // エラーがなければ続行する。 break 2 case 0 // 接続エラーなら規定回数試行する。 sleep(2) continue 2 default // その他エラーならエラー終了する。 SendSTR( メモ帳, errortitles[e] + "<#CR>", 1, false, false ) IE.navigate("about:blank") result = false exit selend endif next // ここには来ないはず msgbox("エラー判定ミス") exitexit next
470 名前:デフォルトの名無しさん [2008/02/12(火) 17:43:44 ] ちなみに>>469 のエラーチェックを関数化したやつもあるけど、 エラーの種類ごとに動作を変えるとしたら、 結局呼び出し元でswitchでそれぞれの動作をしないといけない。
471 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 17:50:14 ] >>468 breakやcontinueの乱用がだめという話で、 きちんと制御構造がわけるような書き方なら問題ないのでは。 実際List37の例はひどいものだし。
472 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 19:13:37 ] >>461 ベテランプログラマだけのユートピアを作るのが経営陣の仕事だぁ? アホか。
473 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 21:57:54 ] アセンブラ上がりのPGだが、JMP系述語+スタック使わないで 処理できて速い方法とか、日々そんなことばかり考えてる。 メンテナンス性以前に、論理的整合性が失われて美しくないから なんて話は、俺の頭には何のことかさっぱりわからない。
474 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 22:26:11 ] ルール:ソースは美しくなければならない
475 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 22:35:59 ] 美しくなくとも。簡潔で軽妙ならば
476 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 23:14:11 ] >>472 新人は情報学科出身で、かつ優秀じゃなきゃイラネ
477 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 23:38:18 ] >>469 何段抜けるかを数字で書く多段breakって糞じゃね?
478 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 23:46:47 ] >>469 こんなソースを新人が書いたら、確実に書き直させるな。
479 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 23:55:08 ] まずもって文法が意味不明なのでとりあえず C 風に書き下してみた。 for (int i = 0; i < 2) { IE.navigate(str); do { sleep(0.1); } while (IE.busy || IE.readystate != 4); errortitles[4] = Status(ID, ST_TITLE); for (int e = 0; e < 4; e++) { if (1 <= Pos(errortitles[e], errortitles[4])) { switch (e) { case 4: goto BREAK; case 0: sleep(2); goto CONTINUE; default: SendSTR(メモ帳, errortitles[4] + "<#CR>", 1, false, false); IE.navigate("about:blank"); result = false; exit; } } } msgbox("エラー判定ミス"); exitexit; CONTINUE: } BREAK:
480 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 00:01:50 ] >>479 途中で、読む気がうせた
481 名前:デフォルトの名無しさん [2008/02/13(水) 00:03:19 ] VBでもないし何かと思ったらUWSCって何だ 厨房スクリプト言語?
482 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 00:19:17 ] ひとまずコード*だけ*読んで、前提条件あんま読んでないけど >for (int i = 0; i < 2) { 「2回」ループする意図が良くワカラン。下のコード読めばわかるかと思って、 読もうとしたが、途中で挫折。 > IE.navigate(str); > do { > sleep(0.1); > } while (IE.busy || IE.readystate != 4); IE.readystate==4だけじゃだめなのかな。IE.busyじゃないときだけ、readystate が有効になるのか。ならIE.readystateが-1ならbusyとかしたほうが、 "while(IE.readystate!=4)"だけですむしわかりやすい。 > errortitles[4] = Status(ID, ST_TITLE); errortitles配列の、5番目にいきなり代入してるのが、なんじゃらほい。0〜4番目は、 どうなったのだろう? > for (int e = 0; e < 4; e++) { > if (1 <= Pos(errortitles[e], errortitles[4])) { このへんと、下をちょっと見た段階でギブアップ
483 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 00:22:21 ] 余計なものを全部省いて構造だけ残すと、たぶんこう。 void f() { while (some_condition()) { something(); for (int e = 0; e <= 4; e++) { if (some_condition(e)) { switch (e) { case 4: goto BREAK; case 0: goto CONTINUE; default: return; } } } exit(-1); CONTINUE: } BREAK: something(); }
484 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 00:30:02 ] >>483 やっぱりだめだ・・・こういう感覚を説明して理解してもらえるかわからないが、 そのコードは「普通」じゃない。読むのがすごいシンドイ。
485 名前:483 mailto:sage [2008/02/13(水) 00:32:42 ] で、俺ならこう書く。 頭の中でしか動かしていないので合ってるかどうかは自信ないが。 void f() { int state = 0; while (state == 0 && some_condition()) { something(); state = check_state(); } if (state == 4) { something(); } } int check_state() { for (int e = 0; e <= 4; e++) { if (some_condition(e)) { return e; } } exit(-1); // not reached }
486 名前:デフォルトの名無しさん [2008/02/13(水) 00:35:50 ] まだ、java はインタプリタじゃ無い、って言ってるヤツがいるみたいだけど。 中には、インタプリタじゃ無い、ヴァーチャルマシンだ、とか もっとひどいのになると、エミュレータだ、とか、もうメチャクチャ言いたい放題・・・ ちょっと呆れたな。 これって、「モモヒキじゃ無い、スパッツだよ!」って言ってるオバサンと同じじゃん。
487 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 00:38:14 ] >>485 あぁなんとか理解できる。サンクスw
488 名前:483 mailto:sage [2008/02/13(水) 00:52:25 ] せっかくだから俺からも一つネタ投下。 >>485 のf()と下のコードはどっちが良いと思う? void f() { while (some_condition()) { something(); switch (check_state()) { case 0: break; case 4: goto END_WHILE; default: return; } } END_WHILE: something(); }
489 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 00:57:07 ] >>488 俺は>>488 のほうがわかりやすいw
490 名前:デフォルトの名無しさん [2008/02/13(水) 01:40:46 ] >>488 case 4:でsomething呼び出して returnしてしまえばもっと見やすいと思うが。
491 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 01:44:51 ] (ノ∀`) アチャー 977 デフォルトの名無しさん[sage] 2008/02/13(水) 00:31:00 forループのネスト構造(2重)から一気に脱出したい時に、breakだと1重しか脱出できないので困ってます。 PHPではbreak 2;みたいに書くと2重のループから脱出できるみたいなんですが、C++で同じことができる方法はありますか? goto文はなるべく使いたくないので……。 980 デフォルトの名無しさん[sage] 2008/02/13(水) 00:50:26 >>978 ググった時に「大域脱出するとき例外処理で〜」とか書いてあるのを見たのですが、それでしょうか。 >>979 表を描くために座標をネスト構造で回しているのですが、 描画する要素がなくなったら外に出すっていうようにしたいんです。 大人しくflagにしたほうが良いですね……。ありがとうございました。
492 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 01:50:32 ] >>491 コピペもウザイが、意図もよくわからんぞw
493 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 02:05:31 ] (ノ∀`) アチャー 984 名前:デフォルトの名無しさん[sage] 投稿日:2008/02/13(水) 01:55:45 >>981 後で困りそうですがもっと単純に解決させました。 ループ部分だけクラス内で別のメンバ関数にして飛ばして、抜けたい所でreturnさせました……。
494 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 02:36:14 ] >>479 × for (int e = 0; e < 4; e++) { ○ for (int e = 0; e < 5; e++) { >>482 > 「2回」ループする意図 ADSLで瞬間的に切断される場合、数秒後に再度アクセスしたら接続される場合があるので。 >IE.readystate==4だけじゃだめなのかな。 やり方をググってまねしただけなんで。 >5番目にいきなり代入してるのが、なんじゃらほい。 終了フラグです。 まあいいやり方じゃないけどエラーを拾う判定がちゃんと働くかテストにもなるしと入れてみた。 代入してるのはウィンドウタイトル。 あと、ループはループだけ、判断は一箇所にすると、制御が単純でわかりやすいなと思ったんだけど、 forを抜けて「ここには来ないはず」と書いた場所でbreakすればいいだけだった。 もともとが長いスクリプトだったからdefaultをexitで抜けてなかったんで そんときのループ構造が頭にあって。 やっとすっきりしたと思ったんだけど見直せばもっとシンプルになるもんだね。
495 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 06:20:53 ] >>486 釣りいいかげんうざい。 あのね、じゃあ具体的にあんたが主張するBASICのようなコードを JavaVMのバイトコードで示してみやがれっての。できなきゃ去れ。 二度と来るな。
496 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 07:13:52 ] >>486 せめてJavaVM実装の書籍を1冊でいいから読破してから言え、マヌケ。
497 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 07:30:44 ] まあ多重break/continueは可読性を落とすね。gotoのほうがナンボかマシ。 多重break/continueもgotoも無いのがベストつーか常識だけどw
498 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 07:53:56 ] >>494 > やり方をググってまねしただけなんで。 やっぱりね… そういう姿勢だからbreakでもgotoでも汚ないコードになるんだよ。
499 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 07:55:56 ] JavaVMのハードウェア実装を知らないんだろうな、>486は。
500 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 08:11:16 ] JVMについて盛り上がっている人がいるようだが、 どのJVMのことだ?sunか?
501 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 08:12:39 ] >>500 特定の実装の話じゃないと思うが。つーか、吊りか?
502 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 08:30:34 ] ハードウェア実装?
503 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 08:43:59 ] 荒らしはスルーで > 兵共
504 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 08:53:16 ] picoJava のことじゃまいか<ハードウェア実装
505 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 08:58:45 ] Jazelleとか。 一部ソフトウエアで実行するけど。
506 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 09:05:28 ] いずれにせよBASICインタプリタとは大分違う罠
507 名前:デフォルトの名無しさん [2008/02/13(水) 09:16:38 ] >>498 勝手な思い込みで変更する馬鹿よりましだよ。 ぐぐったら出てくるけど、作業をしているか通信をしているかをチェックするんだって。 通信が完了してから作業をするだろうけど、作業が新しい通信を要求するかもしれないだろ。 どんな流れになるかはWebサイトの作り次第だし、テストするには通信帯域を制限したり・・・ コードの流用するならそれが確かに動くかテストするべきだが、 自分でテストできないなら基本的には信用することが必要だ。
508 名前:デフォルトの名無しさん [2008/02/13(水) 09:25:01 ] busyだけだとフレームのページで途中で抜けちゃうって話がどっかにあった。 まあレイアウトが自由にできる今はフレームなんか使ってないだろうけど。 ReadyStateだけの場合は↓。 つまり両方のチェックが必要。 hpcgi1.nifty.com/MADIA/VBBBS2/wwwlng.cgi?print+200510/05100089.txt IEオブジェクトで読み込み完了まで待たせるのに以下のコードで待たせてますが、 ちゃんと読み込み完了まで待ってくれません。 どのようにすれば確実に待たすことができますか? Do While IE.ReadyState <> READYSTATE_COMPLETE DoEvents Sleep 1 Loop これならうまくいきました。 Do While IE.Busy = True Or IE.ReadyState <> READYSTATE_COMPLETE DoEvents Sleep 1 Loop
509 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 10:21:31 ] >>507 > コードの流用するならそれが確かに動くかテストするべきだが、 > 自分でテストできないなら基本的には信用することが必要だ。 唖然・・・ おまえみたいのはgotoを絶対に使うべきじゃないし、 そもそもプログラミングをするべきじゃない。
510 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 10:24:35 ] 同意
511 名前:デフォルトの名無しさん [2008/02/13(水) 10:25:49 ] >>509 なに俺様は完璧とか言ってんの?
512 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 10:58:49 ] そもそもコードは、誰が書いたものでも信用できない。
513 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 11:10:41 ] 自分自身が書いたコードすら信用できないorz
514 名前:デフォルトの名無しさん [2008/02/13(水) 14:29:42 ] 「try 〜 catch」 を使おうが、「for/while 〜 break ラベル」 を使おうが、 汚いスパゲッティ・コードはいくらでも書ける。 たとえば、フラグ変数作って、break break break break 連発するヤツがいい例。 goto 使うやつに比べれば、「do 〜 while (false)」 や 「switch 〜 break」 を使うなど、 トリッキーなコード書いて得意満面になってるキチガイよりよっぽどマシだ。 要するに、「コードの美しさ・汚さ」と、「goto 使うな」 論は無関係。プログラミングの芸術的センスの問題だよ。 java、php、ruby そのた、言語によって大域脱出の仕方が違うのは どの方法が正しい・優れているという基準が無いからで、どの言語作者も頭を悩ませている問題なんだろう。 goto の何が問題なのかと言えば、インタプリタやコンパイラの内部処理の都合上、 パフォーマンスを低下させる要因になっているから。 特に while(・・・) {・・・} みたいに { } ブロックを多用する言語は、goto で ”あらぬ方向” へ脱出される事を極端に嫌う。 これは { } によって確保したスタックの管理がくずれるから。 ここらへんは実際に目には見えない部分なので、なかなか理解が難しいと思う。 自分でインタプリタやコンパイラを作ってみれば経験できる事なのだが、いまどき、そこまでするヤツはおっとまた 字数制限がうざいなもっと長文書ければいくらでも語れるんだが続きはまた暇なときにでも。うんこちんちん!
515 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 14:33:20 ] 長文とかどうでもいいからベンチの結果ひとつでも(張|貼)ってくれ
516 名前:デフォルトの名無しさん [2008/02/13(水) 14:39:27 ] 無茶言うなよ。java と basic と php とベンチで比べて何の意味がある?
517 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 14:43:13 ] >>514 > これは { } によって確保したスタックの管理がくずれるから。 今時、そんなソースコードにべたべたのインタプリタなんて珍しいわ。 コンパイラや、ソースコードを一回全部なめて、内部構造に するようなインタプリタなら、ローカル変数のアクセスのために、 処理系はスタックの現在のオフセットを常にわかっている必要がある。 だから、ジャンプ元とジャンプ先でスタックのオフセットがずれるなら、 そのぶんをジャンプの直前か直後に調整して終わり。難しい話じゃない。 Javaのバイトコードを示していただきたいなぁあなたにも。 (あ、Rubyのブロックはクロージャだから別物ね)
518 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 14:47:17 ] gotoでforループの中に飛び込もうとするコードを はじめて見たときはびっくりしたわ
519 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 14:51:06 ] というかスタックの奴等こっちでやれ。goto関係ないし。 pc11.2ch.net/test/read.cgi/tech/1188688416/l50
520 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 15:05:50 ] >>514 はN88BASICでブイブイ言わせているビルゲイツ
521 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 15:10:52 ] MS-DOS版N88日本語BASIC(86)コンパイラー ナゲー
522 名前:デフォルトの名無しさん [2008/02/13(水) 17:02:48 ] このすれは「どうして1たす1は2なの?どうして?どうして?」って言いそうな連中ばかりだな。
523 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 17:07:13 ] コンピュータの気持ちになってみると 1 + 1 は 10 です
524 名前:デフォルトの名無しさん [2008/02/13(水) 17:15:51 ] >>523 ここでコンピューターの気持ちで会話してきてください。 できれば↓のスレの書き込みの翻訳してくれるとありがたい。 1101011 1100001 1101001 1110111 1100001 pc11.2ch.net/test/read.cgi/prog/1201423463/
525 名前:デフォルトの名無しさん [2008/02/13(水) 17:56:17 ] goto師はどこいった
526 名前:デフォルトの名無しさん [2008/02/13(水) 18:30:05 ] 回線の問題というか、pingでtimeoutでまくり
527 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 19:08:23 ] >>518 コーヒーふいたじゃねーかw どんなコードかちょっと気になるw
528 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 19:25:24 ] 直接gotoを使ってはいないが、 ループの中にswitch-caseで飛び込むコードって奴があるな。 Duff's device でググると出てくる。 (CGの人ならPorter-Duff operatorのDuff氏とか言うと、へーとか思うはず)
529 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 19:40:41 ] do { /* count > 0 と仮定 */ *to = *from++; /* to がインクリメントされていないことに注意 */ } while (--count > 0); これを、下のようにして最適化か。こう書いてコンパイル通る ことすら知らなかったわw しかし昔memcpy実装させられたとき、条件判定へらす努力したり ワード単位でコピーしたりしたんだが、標準で用意されて いたARMのlibcに速度が遠くおよばなくて愕然とした記憶があるなw switch (count % 8) /* count > 0 とする */ { case 0: do { *to = *from++; case 7: *to = *from++; case 6: *to = *from++; case 5: *to = *from++; case 4: *to = *from++; case 3: *to = *from++; case 2: *to = *from++; case 1: *to = *from++; } while ((count -= 8) > 0); }
530 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 20:15:51 ] どのみち、天才の考えることは凡人には理解できないのでメンテ不可ですわ。
531 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 20:21:51 ] >>514 いいからJavaVMの実装本を読めって。 自分がどんなに時代遅れな発言をしているか よーくわかるから。
532 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 20:34:59 ] >>514 > goto 使うやつに比べれば、「do 〜 while (false)」 や 「switch 〜 break」 を使うなど、 > トリッキーなコード書いて得意満面になってるキチガイよりよっぽどマシだ。 日本語に訳すと、 1+1を3と言うやつに比べれば、2+3を6と言う奴や3+1を2と言って得意満面に なっているキチガイよりよっぽどマシだ。 といったところか。そんな>>514 に良い言葉を教えてあげよう。 目糞鼻糞、どっちも糞。
533 名前:デフォルトの名無しさん [2008/02/13(水) 20:50:16 ] 今老舗特集やってるけど、昔からの技術をそのまま受け継いで応用することで普通の工業機械では作れないものを作れてるってさ。 確かに技術は進歩してるし、クソなコードは多いが、よい結果を出しているものはよい方法かもしれない。 紙すきのでやってたけど、手作業を機械でやることで品質の安定したものを大量に低コストにやってるが、 技術の開発は道具こそ工夫するものの人間が手でやっている。 プログラミングで自動化機械といえば、ソースコードのコンパイルとかスクリプトでの作業。 機械設備はコーディングをサポートしてくれる開発環境とかライブラリ。 そういうのを駆使して効率よく新しいものを作るのがプログラマの仕事。 決まりきったやり方が正しいのか最適なのかたまには見直してみるのもいいが、 基本はそれをまねしてやることだ。 何もかも完璧に分かってないといけないとか言ってたら時代の波に飲まれておしまいだ。
534 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 20:59:14 ] >>533 先人のコードをまねることは大切だ。 だが、自分のプログラムに応用する時には そのコードをしっかり読んで動作を理解してから。 これができない奴はプログラムを書くべきではない。
535 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 21:00:03 ] つーか、>>494 、かなり必死だなw
536 名前:デフォルトの名無しさん [2008/02/13(水) 21:04:10 ] >>534 習うより慣れろだ。 正しいか間違ってるかは、うまくいくかいかないかで判断しろ。
537 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 21:08:24 ] ひょっとして、>>469 がうまくいってる例だと思ってる? まさかな。 まあ、少なくとも元のコードの動作を理解できるまでは、 それを使ったコードを人様に見せるのは止めたほうがいい。
538 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 21:09:18 ] >>536 > 習うより慣れろだ。 > 正しいか間違ってるかは、うまくいくかいかないかで判断しろ。 仕様に照らして、な。 「実は実装依存」なコードを量産されるよ?
539 名前:デフォルトの名無しさん [2008/02/13(水) 21:09:43 ] >>529 そりゃmemcpyがコンパイラに組み込まれてたんじゃね? そういう場合、libcのmemcpyは関数ポインタ取るためだけに用意されている。
540 名前:デフォルトの名無しさん [2008/02/13(水) 21:18:43 ] >>537 しっかり動いてますが何か。 テスト済みですが何か。
541 名前:デフォルトの名無しさん [2008/02/13(水) 21:29:23 ] 論破されて窮地に追い込まれると、 「関係ない話は別のスレでやれ」 とか 「〜の本を読め」 とか言って相手を囲いの外に追いやろうとする 典型的な厨房の集うスレはここですか?
542 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 21:46:36 ] >>539 コピーするサイズに応じて、最適なコードをそれ専用に生成するってこと?
543 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 21:56:02 ] >>540 動けばいいと公言する奴のコードに限って実は動かないんだよ。 どうせ自分で何回か使ってみただけなんでしょ? これだから、ゆとり世代は・・・
544 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 21:58:53 ] >>540 まさかとは思ったが、本気で>>469 がうまくいってる例だと思ってるのか。 このスレのgotoを恐れずに使う兵共にとっても>>469 は糞コードだぞ。
545 名前:デフォルトの名無しさん [2008/02/13(水) 22:00:21 ] >>543 「動く」と胸を張っていえるからリリースするもんだろ。 それが動かなくなるのがバグだろ。 バグに遭遇したことないやつが存在するんなら確かにそういえるかも知れんな。
546 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 22:05:31 ] gotoの弊害はむしろ保守性の低さだろ 自分だけが使う書き捨てのプログラムなら別に>>469 の糞コードでも良し
547 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 22:07:59 ] >>545 それがさあ、「動けばいい」って奴はロクなテストやってないのが相場なの。 大抵、自分の手元の環境で数回から数十回動かしてエラーが出なきゃOKって程度のテスト。 特に最近のゆとり君は適当にググってきたコードをコピペするからひどい。 何故動くのか理解しないまま数回動かしただけで「動きました」とか言い出す。 もうアフォかと。
548 名前:デフォルトの名無しさん [2008/02/13(水) 22:30:31 ] >>547 テストしてないのを問題視するのはいいとして、テストもせずに駄目出しするのもどうかと思うが。
549 名前:デフォルトの名無しさん [2008/02/13(水) 22:32:06 ] >>547 テストしてないのを問題視するのはいいとして、テストもせずに駄目出しするのもどうかと思うが。
550 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 22:35:55 ] >>548 テストしていないものは駄目出しされて当然だろう
551 名前:デフォルトの名無しさん [2008/02/13(水) 22:38:01 ] >>550 テスト済みと書いてる字が読めないならプログラム組むな
552 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 22:42:02 ] >>551 へー、どんなテストしたの? ちゃんと異常系までテストした?
553 名前:デフォルトの名無しさん [2008/02/13(水) 22:44:15 ] >>552 どんな異常だよ
554 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 22:47:37 ] 例えば >>494 > > 「2回」ループする意図 > ADSLで瞬間的に切断される場合、数秒後に再度アクセスしたら接続される場合があるので。 のあたり、実際に切断された場合の回復処理で正常にアクセスできたことを 切断時間などを変えながら複数の状況でテストしたのかい? 切断された後、一旦回復してすぐまた切断される状況は?
555 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 22:51:54 ] >>469 って、「多重continue、ヤベッーw」なワナビー風味だね
556 名前:デフォルトの名無しさん [2008/02/13(水) 22:58:51 ] >>554 再表示で接続できることは経験的に知っているし、 規定回数全部で接続できなかった場合でもエラーで中断するし、 中断した場合も呼び出し元からやり直すだけだし。 回復して切断したらって話だが、 REPEAT; sleep(0.1); UNTIL !IE.busy AND IE.readystate = 4 これを実行した後には、接続できたかできなかったかのどちらかしかない。 もちろん不完全な取得を完了とした場合、その先で実行できないってだけだが、 実行できなかった場合も呼び出し元で再チャレンジするし。
557 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 23:00:25 ] >>556 つまりテストしてないわけね。よくわかった。
558 名前:デフォルトの名無しさん [2008/02/13(水) 23:07:59 ] >>557 自分で切断はしてないけど切断があったことはログでチェックしてるよ。
559 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 23:09:48 ] >>558 切断時間はちゃんとカバーされてるのか?
560 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 23:12:55 ] おまえら、テストしたかどうか以前に>>469 は一見して糞。以上おわり。
561 名前:デフォルトの名無しさん [2008/02/13(水) 23:14:31 ] >>559 2回続けて失敗する現象はなかった。 昨日だったか2ch鯖にアクセスできなくなってたが、その場合そもそもここまで処理が回ってこないし。 >>560 が手本を見せてくれるそうです。
562 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 23:18:13 ] >>556 結局わけわからん部分は「呼び出し元で再チャレンジするから」なわけね。 だったら2回ループ回さなきゃいいのに。中途半端なことするから可読性が落ちる。
563 名前:デフォルトの名無しさん [2008/02/13(水) 23:24:55 ] >>562 前の処理がせっかくうまくいってるのにそれを無駄にすることはないだろ。 接続エラーになったからって前の処理をやり直したら、そっちまで接続エラーになるかもしれないだろ。 これは普通にブラウザ使ってたら分かる話だ。 試行回数とインターバルは経験的に、感覚的にだ。
564 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 23:27:09 ] >>563 つまり自分が使っていた環境のことしか考えていないし、 テストも自分の普段の環境から出ていないってことね。 なるほどね。
565 名前:デフォルトの名無しさん [2008/02/13(水) 23:30:13 ] >>542 ・インライン化の恩恵を受けられる。 ・人手で最適化されたコードを吐いてくれる可能性がある。 ・ポインタの型によって(intptr_t)pの値が最初から ワードの倍数になっていることを保証できる場合がある。
566 名前:デフォルトの名無しさん [2008/02/13(水) 23:44:24 ] >>564 待ち時間は秒数で指定してあるし。 IE使ってる時点で使用環境は固定されてるし。
567 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 23:45:36 ] しかしつまらんスレだな
568 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 23:46:10 ] もういいから gotoの話じゃないならよそでやれ
569 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 00:10:38 ] direct threaded code
570 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 01:24:26 ] gotoを一行足りと書かなくても、 容易にクラッシュしてデバッグすらできない環境があって・・・。 助けてくれ orz.
571 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 01:25:27 ] >>570 それははたして環境のせいなのか?
572 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 02:50:12 ] 異常系のテストは、まずは、そういう状況をわざわざ作り出して確認するもんだ。
573 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 06:49:41 ] >>566 > IE使ってる時点で使用環境は固定されてるし。 回線まで固定されるわけじゃなかろう
574 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 07:27:53 ] >>568 このスレはgotoを語るスレではなくて finallyや多重breakを語るスレなのでは。
575 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 07:31:57 ] >>563 > 試行回数とインターバルは経験的に、感覚的にだ。 ひでえ根拠だなwww うちに配属になった新人がこんなコード書いたら 即刻今のコードを完デリさせて最初から書きなおしだ。
576 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 08:23:43 ] インマルサット・インテルサットに積む電話交換機屋からブラウザアプリ屋まで 入り乱れての乱戦になっておりますw
577 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 09:01:44 ] キャプテンも忘れないであげてください
578 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 16:13:06 ] 「テスト済み」なんて堂々と言うからだ。 テストっていうのがどんな物かわかってたら簡単に言えないもんだ。 そういう意味では「ポインタは理解してる」に似てるな。 と、釣りっぽくまとめてみる也。
579 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 18:26:21 ] ポインタのややこしいのは、ポインタじゃなくて宣言の方だからな。
580 名前:デフォルトの名無しさん [2008/02/14(木) 18:41:46 ] 一応鯖に負荷のかかる土日流しっぱなしにして想定した全部のパターンでうまくいくのは確認してるし 自動でかかる連続投稿規制とアクセス規制と、さらに管理者からのアクセス規制を受けるまでやって、 そーゆー規制食らった場合にも適切に処理できるのは確認済み。 んでえらそうに語ってくれる人がどういう方法でどこまでのテストを要求してるのか知らんが、 サーバーまで自分で作ってるわけじゃないって事を分かっているのかいないのか・・・。 自分でできる範囲ってのは回線を切断したり接続したりだ。 ちなみに、ほとんどの場合は回線の異常じゃなくて、2ch鯖がただシカトしてただけだった。 自分のプロバイダまでのpingは30msで失敗しないけど2ch鯖は120msくらいかかってそのうち1回くらい失敗しまくり。 あと、エラー判定が実は正常なのを異常と判断する場合があるのは最初から分かってる。 完璧に自動で判断することができないんだからしょーがない。
581 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 18:57:51 ] >>565 あぁ・・・そりゃ勝てなくて当たり前かw トンクスw
582 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 19:58:15 ] 後出しの多いやつだな・・・
583 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 20:02:05 ] 単体テストと運用時のつなぐ相手のテストとの違いを 子供に理解させるのは無理だろう。
584 名前:デフォルトの名無しさん [2008/02/14(木) 20:27:38 ] ほうほう。 単体テストってのは1行1行テストすることを言うんですかそうですか。
585 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 20:28:28 ] な。 無理だろw
586 名前:デフォルトの名無しさん [2008/02/14(木) 20:30:44 ] あんな短いコードをあれ以上どう分割しろと
587 名前:デフォルトの名無しさん [2008/02/14(木) 20:37:15 ] 「単体テスト」でググレカス
588 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 20:40:00 ] >>580 結局は自分の環境でしかテストしてないと。 しかも普通に使っていただけで積極的に 様々な状況を設定したわけでもなし。 そういうのはテストとは言わないんだよ。
589 名前:デフォルトの名無しさん [2008/02/14(木) 20:52:16 ] 自分で設定しなくても実際にすべての場合で実行して結果を出してるんだからテストされてるだろ。 単体テストしろとかすべての環境でテストしろとかお前ら馬鹿かと。 たかだか数行のコードテストするために何十個もパソコン用意しろって?
590 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 20:53:36 ] >>584 ワロタ
591 名前:デフォルトの名無しさん [2008/02/14(木) 21:04:11 ] だから一度「単体テスト」でググってから物言えカス
592 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 21:19:19 ] 単体テストもせずに「テスト済み」かよ…こりゃダメだ。
593 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 21:21:29 ] 新たな爆弾発言が出ました。 >>589 > 実際にすべての場合で実行して結果を出してるんだから すべての場合だってさ・・・意味わかって言ってんのかね。んなわきゃないか。
594 名前:デフォルトの名無しさん [2008/02/14(木) 21:22:28 ] レオン最高 マチルダかわいい
595 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 21:23:49 ] >>586 は>>587 が自分に言ってる事もわかってないに100ガパス。
596 名前:デフォルトの名無しさん [2008/02/14(木) 21:37:26 ] IEを単体でテストできると思ってる馬鹿が多いな
597 名前:デフォルトの名無しさん [2008/02/14(木) 21:40:16 ] ちなみに +offsetが抜けてデータ構造が変わっていたやつは単体テストで出てきそうなもんだが、 実際には総合テストしないと出てこなかったな。 pc11.2ch.net/test/read.cgi/prog/1192192069/
598 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 21:44:38 ] >>596 単体テスト用のサーバ立ち上げて、 サーバ側でわざと切断したりレスポンスを変えたり、 外部仕様のカバレッジや実行パスのカバレッジが得られるような パターンでレスポンスさせるもんじゃないの?
599 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 21:44:40 ] 単体テストにIEは関係ないだろ・・・
600 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 21:48:41 ] >>596 テストする対象はIEじゃなくて糞スクリプトなんですが。
601 名前:デフォルトの名無しさん [2008/02/14(木) 21:50:36 ] つまりIEと同じメソッドを持つダミーのオブジェクトでテストしろってことね。
602 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 21:51:05 ] >>598 そのテスト環境は既に結合テストの範疇だな。 サーバーつないだら単体テストにならないだろ? 結論:「テスト済み」なんて簡単に言うなってこった。
603 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 21:53:00 ] >>602 いや、結合テストは実稼働のサーバとの接続でやるものでしょ。 実サービスではなく糞スクリプトのテストのためのレスポンスをする サーバにつなげるのなら単体テストの範疇と思われ。 まあ、スタブを使うようなもんだ。
604 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 21:53:51 ] >>602 > 結論:「テスト済み」なんて簡単に言うなってこった。 同意。
605 名前:デフォルトの名無しさん [2008/02/14(木) 21:54:48 ] それにしてもマチルダかわいい。 昔、うちに監禁してた少女は死んじゃったから代わりが欲しいな・・・(冗談) それはそうと、ぼろいビルの屋上でスナイプの練習してるけど、 周りはもっと高層なビルがたくさん・・・ ライフルが丸見えです。 僕も屋上セックスしてたら隣のビルの専門学校から丸見えでばればれだった。
606 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 21:56:55 ] >>603 ああ、そういう意味なら納得。 つまりそのサーバーはテスト用に設定した動作をするってことね。
607 名前:デフォルトの名無しさん [2008/02/14(木) 22:23:14 ] 49日連続稼動しないとバグが発覚しない某アレの例もあるからねぇ・・・
608 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 22:32:18 ] >>400 付近の遠いレスだけど、おまえらそもそもデストラクタロギングが どんなのかしってるのか。 class TRACE { TRACE(char *funcnamne, ...) { cout << log... <<endl; } ~TRACE() { cout << log.. <<endl; } } とかよういしといて、関数に下のように書くだけだぞ。tryもfinallyも いらない。スコープぬけるときにデストラクタが呼ばれて、 かってにロギングしてくれるから。 void func { TRACE trace("func", ...); ...実体... }
609 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 22:36:14 ] >>608 クロージャがエスケープした時にはどうすんの? finallyならクロージャがエスケープしようが例外が発生しようが ちゃんとロギングできるわけだが。
610 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 22:39:45 ] >>608 それは言語依存でしょ。 フルGCな言語や処理系だとスコープ抜けた直後にデストラクタが叩かれる保証はない。
611 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 22:43:45 ] >>609 てか、そもそもC++にクロージャなんてものあったけか
612 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 22:45:06 ] >>611 ないけど、このスレはC++限定じゃないでしょ?
613 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 22:47:06 ] じゃぁtryもfinallyも前提に出来ないだろ、すべてコード上にログを 書くしかない。ならgotoまんせーだな、ファンクショントレースには。
614 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 22:49:20 ] >>613 C++限定じゃないがC限定でもない。 JavaでもPythonでもJavaScriptでもModule-3でもアリじゃないの?
615 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 22:50:15 ] CとC++のみが漢の言語
616 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 22:55:27 ] >>614 わかった。じゃぁまずは、「デストラクタロギングさん、馬鹿にしてすいません。 tryとfinallyを使ったロギングなんてクソです」といえwww
617 名前:デフォルトの名無しさん [2008/02/14(木) 22:56:32 ] そういえばC言語のswitchはbreakで抜けるブロックだったな。 他の言語ではifの拡張だから普通にbreakでループが抜けれるから >>469 みたいなselect breakはおかしく見えちゃうんだな。
618 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 22:56:33 ] デストラクタでロギングできる言語よりも finallyでロギングできる言語のほうが多いだろうな そもそもfinallyに比べてデストラクタでロギングする メリットが見えないのだが
619 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 23:00:09 ] >>616 ワケワカランwww
620 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 23:34:48 ] C++厨がファビョりました
621 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 00:55:51 ] >>618 >そもそもfinallyに比べてデストラクタでロギングする >メリットが見えないのだが おまえバカだろ?
622 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 01:16:59 ] C++にfinallyが無い理由を考えろ
623 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 01:18:43 ] finallyロギングは使うたびにfinallyブロックごとコピペする必要がある。 デストラクタロギングなら変数宣言だけコピペすればよいので、 finallyロギングよりコピペ量が少なくて済む。 その点ではC#/VB.NETのusingも次点でまあ使えると俺は思う。 ロギング以外にも言えることだけど。
624 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 01:40:34 ] aspect 最強説
625 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 01:41:27 ] 粘着アスペルガー最狂
626 名前:デフォルトの名無しさん [2008/02/15(金) 04:38:51 ] うちのご近所さんたちが次から次にご近所さんを殺しまくったのは、 多分年金を全部懐に入れてて、いざ受け取ろうとしたら一円も受け取れなかったから、 「ばれたら仕方がない」って殺しまくったんだろうな。
627 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 06:41:34 ] >>623 その程度の利点かよ・・・ finallyだってマクロ一発じゃん・・・アフォらし・・・
628 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 07:23:28 ] >>613 なんだそりゃギャハwwwwwwww オマエ、もうちょっと色々な言語、できれば現代的な言語を勉強しろよwww
629 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 08:31:18 ] Aspect指向なんてどうでもいい。 CLOSのbefore-afterさえあれば十分。
630 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 08:50:21 ] おまえら朝っぱらから元気だな。 で、俺も>>623 以外のデストラクタロギングのメリットを知りたい。 デストラクタロギングはどうも間接的すぎて気持ち悪い。 つーか、そのうちオブジェクト解放のタイミングが変わったら とたんに使えなくなるような。 トリッキーではないが正道でもない方法に見える。
631 名前:デフォルトの名無しさん [2008/02/15(金) 13:28:19 ] スクリプト厨の次はデストラクタ厨かよ 勘弁してくれ
632 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 15:51:00 ] 急激に誰もいなくなった。 決算期前の需要で皆忙しいのかな。
633 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 16:56:03 ] >>627 マクロが使えるなんていい環境ですね。
634 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 17:36:29 ] とりあえず、仕様の表明の不十分なコード片を書くのはやめてもらいたい。 読まされるほうはたまったものではない。
635 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 17:49:12 ] >>634 読まなければ、いいじゃねーかw
636 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 17:59:15 ] たしかにw
637 名前:デフォルトの名無しさん [2008/02/15(金) 18:02:53 ] >>529 このコーディングがC言語が生まれて10年後くらいに発見されたとかwikiに書いてあるけど、 C言語作るときにこの書き方を想定して作ったからC言語ではswitchをbreakで抜ける仕様になってるって分かる人いるかな。
638 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 18:05:50 ] >>637 全く意味がわからないな。 switch を break で抜けられる全部の言語で >>529 が書けるなら信じてあげるよ。
639 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 18:16:29 ] >>638 >>637 の言う > switchをbreakで抜ける仕様 って、fall throughのことで、 ttp://www.catb.org/jargon//html/F/fall-through.html breakが無いと、次のcaseが現れても抜けない仕様、という ほうが正確かな。 複数のcaseをうまく利用することができる、という特性を生かす趣旨が ある仕様ということはわかるけど、ループと組み合わせるという技は 発見された、としてもいいんじゃないかと思うけど。
640 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 19:00:57 ] >>633 君のところじゃboostも使えないのかい?そりゃ可哀想に。
641 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 19:46:19 ] むしろ開発者の一存で、boostが使えることが少ない
642 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 19:49:36 ] デストラクタでログ取ると、ローカル変数のトレースを取れないんだよね。
643 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 20:23:45 ] >>642 トレースしたいローカル変数より後にロギング用の変数を宣言するのはダメ? リリース版でログを取るのでなければ、boost::formatとか使わなくても printfベースの実装で十分だと思うし。
644 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 20:41:48 ] >>643 トレースの対象がオブジェクト(またはその属性)の場合は?
645 名前:デフォルトの名無しさん [2008/02/15(金) 20:45:03 ] 昔、 goto aho: ... { int baka; ... aho: ...(bakaを使う) } ってやったら、bakaを確保せずにいきなりahoに飛ぶコードを吐かれた(MS-Cかな?)。 それ以来gotoは完全封印
646 名前:638 mailto:sage [2008/02/15(金) 21:24:01 ] >>639 fall through だけじゃダメだと思う。 「case は switch 直下に無くても文法的に正しい」 って仕様が含まれている必要がある。 C は case 〜 をそれ以外の単なるラベルと同列に扱うという仕様になっているから、 「>>529 のように switch 直下ではなく while の中に case を書いても正しく動く」 ということが後になって発見(正確には”確認”)されたんじゃないかと。 ところで、ふと java の仕様見たら www.y-adagio.com/public/standards/tr_javalang/14.doc.htm#35518 思いっきり >>529 が書いてあるし。
647 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 21:35:04 ] >>640 え、C++だったの? 627でfinallyって言っているからC++はないと思っていたんだけど。
648 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 21:52:40 ] >>644 テンプレートで超がんがる。 DebugLogger d("%d %d\n", &var, std::make_pair(obj, &A::func));
649 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 10:08:37 ] >>645 そんな入れ子の外から飛び込むのは、どんな言語の場合でも 自殺行為に近いだろ。 入れ子の外で定義が終わってれば 別だがね。
650 名前:デフォルトの名無しさん [2008/02/16(土) 12:03:37 ] Doで始まるループなんだけど最初の1回だけ途中までは飛ばしたいときってあるよね。 多分そういうときに使ってるんだと思うけど、 普通はなんとかする。
651 名前:デフォルトの名無しさん [2008/02/16(土) 12:29:19 ] goto使いたがる厨房は局所的な制御ばかり見て全体的な構造の見直しをしない、と、燃料注入w
652 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 12:31:14 ] C言語の仕様としては>>645 みたいなのはどうなってるのか、詳しい人教えてよ
653 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 12:35:43 ] 少なくとも変数の場所は確保されてるべき。 (最適化でレジスタに割り当てられると見た目じゃわかんないけど) goto foo; { int bar = 44; foo: printf("%d\n", bar); } で 44 が表示されるべきだったかどうだったか調べてみる...
654 名前:デフォルトの名無しさん [2008/02/16(土) 12:49:41 ] 647はfinallyの処理系依存実装を見たことないのかと
655 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 13:40:44 ] >>652 同じ関数内のループに飛び込んでるだけだろ
656 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 15:39:42 ] >>652 普通の実装ならブロックローカルな変数も関数呼び出した時点で スタックに領域確保するんじゃねーの?
657 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 15:51:47 ] >>651 gotoは「局所的な制御」にしか使わないから。 そして「構造」は「常に全体が対象」だ。 燃料としては不足だ。
658 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 16:03:24 ] >>657 > gotoは「局所的な制御」にしか使わないから。 > そして「構造」は「常に全体が対象」だ。 もちろん>>651 はそれが前提で書いていると思うが? 全体を見ずに局所だけを見ているからgotoを使いたがる というのが>>651 の趣旨だと思うが。
659 名前:657 mailto:sage [2008/02/16(土) 17:02:23 ] >>658 んじゃ。 全体を見て局所も見ていればgotoを使いたがらない。 という命題は正しいのかい?
660 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 17:15:16 ] >>659 それは言語の設計思想によるんじゃないかな。 goto前提な言語なら自然とgoto使うことになるし、 goto原則使わないのが前提な言語を使っていて、 かつ、全体の構造を考える習慣がついていれば、 gotoが必要っぽい状況になったら自然と全体の 構造を疑う方向に目が向くと思うよ。
661 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 17:57:34 ] gotoを使いたくないだけの理由で構造を変えるのは、本末転倒にならないように気をつけないとな。
662 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 18:21:23 ] gotoが必要になるのは全体の構造がおかしい兆候なのではと疑うのと、 gotoを使わないだけの理由で全体の構造を変えることとでは 天と地ほどの差があるけどな。
663 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 19:07:13 ] 紙一重だろw 構造を見直したい程gotoが気になるなら、まず 設計に対する姿勢から疑わないと。
664 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 19:09:49 ] かわいそうな>>663 には見直すことと疑うことの違いがわからないらしい。
665 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 19:13:47 ] 初心者向けの指標としては有りだろう。
666 名前:デフォルトの名無しさん [2008/02/16(土) 19:14:42 ] >>664 無駄だって、相手はgotoを使いたいという結論が先にある人なんだから。
667 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 19:16:31 ] >>664 は見直したら必ず変更しなくちゃ行けないと思ってるらしい。
668 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 19:17:27 ] わかりやすい自作自演をみた。
669 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 19:32:20 ] >>665 > 初心者向けの指標としては有りだろう。 gotoを使いたがるのは初心者が多いという意味で賛成だ。
670 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 19:34:40 ] >>667 そんな君の発言「紙一重」wwwwwwwwwwwww
671 名前:デフォルトの名無しさん [2008/02/16(土) 19:39:57 ] 疑うことと構造を変えることを紙一重と言っちゃってるからねえ かなり苦しいんじゃないの?
672 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 19:46:22 ] 燃料に引火しちゃったようで、ナイーブなgoto厨さんwwwwwwwwwwwwwww
673 名前:665 mailto:sage [2008/02/16(土) 19:56:31 ] >>669 そういう意味での賛成は遠慮させていただく。 「どうしてもgotoが必要な場面になったら、構造を見直してみよう」 のようなアドバイスは、初心者向けにはいいかもしれない。 終端条件やデータ構造を見直したら、もっといい方法がみつかるかもしれない。 けれど、そのgotoが適切だと思うなら、見直す必要もない。 gotoはあくまでもきっかけとして、である。 クロージャとかlambdaが欲しいな、と思いながらgotoを書く事もある。 goto(と飛び先のラベル)の場所が適切なら、問題ない。
674 名前:665 mailto:sage [2008/02/16(土) 19:57:15 ] 自演醜ス・・・
675 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 19:58:19 ] なんでgotoについて語るのに構造のことまで持ち出すんだかが 全然わかんない。論争根源の論文の www.cs.utexas.edu/users/EWD/ewd02xx/EWD215.PDF と同様なネガティヴキャンペーンにしか見えないぞ。
676 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 20:00:06 ] 問題ないと言ってgoto乱発する馬鹿は 他人のgotoまみれコードを保守した経験がない ビギナーさん
677 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 20:06:45 ] >>676 ぐちならマ板行でな。
678 名前:デフォルトの名無しさん [2008/02/16(土) 20:12:36 ] 自演認定したがる奴が自演常習者
679 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 20:15:42 ] ↓次はsageで同意、と。
680 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 20:15:59 ] まさか「gotoを使う人間は使いたいから使う」などと思っている人はいないよね? gotoつかう人は「goto使ったほうが良い」と判断しているから使うんだけど。 gotoを使わずに簡潔に書けるならば、好き好んで使ったりはしないよ。
681 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 20:16:45 ] ちぃ、はずしたか。
682 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 20:20:09 ] >>680 > gotoつかう人は「goto使ったほうが良い」と判断しているから使うんだけど。 その判断が狭すぎるという話じゃなかったのか?
683 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 20:35:45 ] goto厨は視野狭窄ということがプログラミングだけでなく議論においてもそうだということが証明されましたな
684 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 20:43:02 ] 存在しない相手に対して勝利宣言か・・・
685 名前:680 mailto:sage [2008/02/16(土) 20:48:32 ] >>680 ああそうさ。必要も無いのにgoto使うというのはたしかに判断が狭いということだ。 これは開発担当のスキルの不足を反映しているのに過ぎない。 この問題の根源は開発担当に対するスキル管理の不足/欠如だよ。 悪いのはgotoやgotoを使ったプログラムやgoto使った人間では無いことを確認したいわけよ。 だけどgotoの使用判断は開発担当の職掌さ。 どのようなロジックにおいてもgotoを使わないほうが優れているという証明が出来ない限り、 goto禁止ルール自体は不当なルールだと言いたいね。
686 名前:680 mailto:sage [2008/02/16(土) 20:49:45 ] >>682 だた。失礼
687 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 20:51:54 ] プログラミング言語を作るときには、 徹底的にgotoを使わなくて済むようにしてほしいね。 多重breakをできるようにしたり、try-catch-finallyにデストラクタを用意したり。
688 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 20:53:44 ] それはJavaだ
689 名前:デフォルトの名無しさん [2008/02/16(土) 20:54:14 ] 美しいgoto文だって書けるのに。 汚いgoto文を見ただけで、「goto禁止」は、まりにも短絡的すぎ。 for〜continue〜break文にせよ、do〜while文にせよ、if文にせよ、try〜catchにせよ、 ネストしまくりでワケワカラン汚いコードを書くヤツは、そこらへんにウヨウヨいる。 いったいどうやったら、構造化言語をここまで汚く書けるのか、もう信じられんほど。 なのになぜ、goto「だけ」がこれほどまでに差別されなければならないのか。 ・・・ま、そこらへを書くと、またキチガイが湧くんでホドホドにしとくが。 美しく書けばgotoは害では無い。これは確か。
690 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 20:56:25 ] >>685 とりあえず、モチツケ。 無条件goto禁止、については合理的な理由の説明は無かったはずだ。
691 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 20:56:46 ] それはわかるけど、現実は汚いgotoを書く奴が9割9分。 goto禁止したところで、そのうち9割くらいはフラグ付きwhileとか結局スパゲティを書く気がするけど。
692 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 21:02:41 ] >>689 gotoには「最後の手段」の側面もあるからね。 gotoとラベルの置き場所の自由さっぷりは両刃の剣なわけで。
693 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 21:04:39 ] で、自由奔放にgotoを使いまくってるコードを最後にみたのは何時なんだ? なんかもう脳内事例で語ってるようにしか見えないんだが。
694 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 21:06:34 ] 例えば、Linux kernel ではエラー処理に飛ぶためのgotoをいっぱい使ってるけど 全然読みづらくない。こういうgotoは全く問題にならないし、 Cで綺麗にエラー処理を書こうとしたらああならざるを得ないと思うけどな。 >>691 人格攻撃は生産的じゃない。もっと実になる議論をしようや。
695 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 21:08:16 ] g○ヒo きたないgoto
696 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 21:14:12 ] 肯定派 多重ループからの抜け出し、エラー処理、リソースの開放で定型的に使うならありだろ。 gotoを避けるというのを関数分割のタイミングにするのは馬鹿らしいし。 大体goto使ったが為のスパゲッティコードなんて大昔の非構造化BASIC以来見たことないぞ。 否定派 goto駄目。絶対。goto使う奴はコードが汚く低能!
697 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 21:24:22 ] >>696 を読んでいるとgoto厨の視野の狭さがよくわかるという罠www
698 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 21:26:41 ] Linux kernelのソースクオリティを高いなんていう香具師の言うことは、 その程度の扱いを受けて当然だな。
699 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 21:28:11 ] 構造を見直してもっといい設計にすれば使わずにすむgotoがあるという話と gotoを自由奔放に使いまくるという話の間にはずいぶんと開きがあることに >>693 が気付く時は来るのだろうか。。。(遠い目
700 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 21:34:55 ] そもそもgoto絶対禁止なんて主張してる香具師、このスレにはいないと思うが(藁
701 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 21:35:50 ] %sのソースクオリティを高いなんていう香具師の言うことは、 その程度の扱いを受けて当然だな。
702 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 21:37:07 ] 絶対禁止はないよな。 ただ現存する用法すべてに盲目的にケチつける奴がいるだけでw
703 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 21:39:47 ] >>702 そんな香具師いるか? つーか、そもそも現存する用法すべてのリスト、このスレに挙がってるのか?
704 名前:デフォルトの名無しさん [2008/02/16(土) 21:46:24 ] setjump, longjump だって綺麗に書きさえすればいい。
705 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 21:48:28 ] poor man's continuationか。 まあ使えばいいんじゃない?
706 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 21:50:22 ] goto厨は、なんかもう脳内事例で語ってるようにしか見えないんだが。
707 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 21:53:43 ] >>698 まぁまともな会社で、まともな品質のプログラムがかけるプログラマでも Linuxのソースクオリティで書けるプログラマなんて少ないけどな。
708 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 21:54:10 ] >>704 ナイ、ナイ
709 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 21:56:40 ] 時代は変わったな。 Linuxカーネルの可読性の低さはBSDハッカーの格好の標的だったのに。 今じゃLinuxカーネルが高品質と言われるようになったか。。。(遠い目
710 名前:デフォルトの名無しさん [2008/02/16(土) 21:59:19 ] 具体例には例外なく難癖つけるくせに そう指摘されるといや、そんなことないよとごまかす嫌goto厨。 もう年相応の趣味を持てずただリアルでの孤独を癒す為に宗教論争スレに常駐してるだけみたいだね。
711 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 22:00:11 ] >>708 Cのマクロで例外処理を実装するような使い方はきれいなsetjmpの使い方だと思う。
712 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 22:00:19 ] >>710 goto厨は、なんかもう脳内事例で語ってるようにしか見えないんだが。
713 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 22:01:45 ] >>705 なるほど、poor man's continuationね。確かにそうかも。
714 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 22:05:48 ] まぁ継続なんて、使わんよ。
715 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 22:07:12 ] >>711 Cで例外つっても、単にジャンプすればいいだけじゃなくて、それ以外にも C++でいうデストラクタの処理とか色々必要になるわけで。setjmpはつかわないわ。
716 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 22:07:50 ] Linuxカーネルでのgotoの使い方の話なのに、Linuxカーネルのコードの クオリティの高さに話を逸らしてるお馬鹿さんがいますね
717 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 22:26:19 ] Linuxカーネルの可読性の低さの話なのに 無関係だということにしたい人がいますね
718 名前:デフォルトの名無しさん [2008/02/16(土) 22:27:27 ] >>715 どうせマクロなんだからfinally実装しちゃえばいいじゃない。 NSAutoreleasePoolみたいに「暇なとき始末してね」と予約しておいて、 早めに開放したい資源(ファイルディスクリプタとか)を利用した後や、 イベントループのように定期的に戻ってくる場所で開放する手もある。
719 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 22:33:20 ] >>718 そんな難しいことできるわけないだろ お前実装してみろよ
720 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 22:33:49 ] だいたいgotoダメって行ってるやつは、 3年目くらいで、やっとできるとまわりから認められ、 ちょっと自信が付いてきたやつ。 後輩に教える機会も増えて、得意になって、よく分からんくせに 中途半端な知識でものを語ってるんだろ。 gotoの話なんて、もう十何年も繰り返されてるのに。
721 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 22:35:04 ] もう十何年も繰り返されていてもまだgotoにしがみついてる厨房がいるねえ
722 名前:デフォルトの名無しさん [2008/02/16(土) 22:37:11 ] 3年目の先輩に頭ごなしに教えられて反発してるビギナー君の登場です
723 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 22:40:58 ] これまでの傾向 -嫌goto厨の主張はいつも抽象論の域をでない -抽象論でgotoを否定するだけで、「おえらいさんが言ってただろ?だから従え」 という傲慢な主張しかない -goto肯定派の具体的な例に関しては、「構造的に考えれば、とか、構造を再度 検討しなおせば」とか、これまた抽象論でしか返さない。 要するに、嫌goto厨の主張なぞその辺の学者のタワゴトにしかすぎず、 なんら実務面の利点を示しているわけではない。
724 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 22:41:48 ] スパゲッティコードは絶滅したと思っている人必見。>>469 こんなコードを書く香具師がgotoを使ったらどんな恐しいことになることか。
725 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 22:43:00 ] >>723 goto厨の提示したソース、どうにも実務的なのはないのだが。 あるというのならアンカーで示してくれ。
726 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 22:46:13 ] これまでの傾向 -goto厨の主張はいつも抽象論の域をでない -抽象論でgotoを肯定するだけで、「おえらいさんが言ってただろ?だから従え」 という傲慢な主張しかない -goto否定派の具体的な例に関しては、「実用的ではない、とか、 gotoでも害がなければ」とか、これまた抽象論でしか返さない。 要するに、goto厨の主張なぞその辺のワナビーのタワゴトにしかすぎず、 なんら実務面の利点を示しているわけではない。
727 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 22:48:49 ] >>723 にも>>726 にも禿同 ようするに目糞鼻糞
728 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 22:50:36 ] GOTO 1
729 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 22:59:31 ] goto厨ってなんだよ。 goto使ったらダメとにかくダメって言ういかれぽんちに、 んなわけねーだろって言ってるだけだろ。
730 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 23:02:24 ] >>729 せいかい^^
731 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 23:31:19 ] ごとーさんがお怒りですよ
732 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 23:35:00 ] >>731 だれ?
733 名前:GOTO mailto:sage [2008/02/16(土) 23:56:15 ] 俺
734 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 00:18:43 ] 見やすかったらどっちでもいいよ
735 名前:デフォルトの名無しさん [2008/02/17(日) 03:32:45 ] >>719 でけた。TRY〜END_TRYの中からreturn出来ないけど。 typedef struct ex_handler_rec_ ex_handler_rec_; struct ex_handler_rec_ { ex_handler_rec_ *volatile prev_; jmp_buf jbuf_; const char *volatile ex_type_; void *volatile ex_data_; }; ex_handler_rec_ *volatile current_handler_ = NULL; #define EX_ABBREV(x) x #define TRY { \ ex_handler_rec_ EX_ABBREV(ex_handler_); \ int EX_ABBREV(need_rethrow_) = 0; \ if (0) BREAK_TRY; /* mandate finally clause */ \ EX_ABBREV(ex_handler_).prev_ = current_handler_; \ current_handler_ = &EX_ABBREV(ex_handler_); \ if (setjmp(EX_ABBREV(ex_handler_).jbuf_) == 0) { #define BREAK_TRY goto EX_ABBREV(break_entry_) #define RETHROW goto EX_ABBREV(rethrow_entry_) #define CATCH(extype) \ } else if (!extype || !strcmp(extype, EX_ABBREV(ex_handler_).ex_type_)) { \ void *EX_ABBREV(ex_data) = EX_ABBREV(ex_handler_).ex_data_; #define CATCH_ALL \ } else if (1) { \ void *EX_ABBREV(ex_data) = EX_ABBREV(ex_handler_).ex_data_;
736 名前:デフォルトの名無しさん [2008/02/17(日) 03:33:37 ] #define FINALLY \ } else { \ if (0) goto EX_ABBREV(rethrow_entry_); /* supress warning */ \ EX_ABBREV(rethrow_entry_): \ EX_ABBREV(need_rethrow_) = 1; \ } \ EX_ABBREV(break_entry_):; \ if (current_handler_ == &EX_ABBREV(ex_handler_)) /* no exception */ \ current_handler_ = EX_ABBREV(ex_handler_).prev_; \ { #define END_TRY } \ if (EX_ABBREV(need_rethrow_)) \ throw_exception(EX_ABBREV(ex_handler_).ex_type_, EX_ABBREV(ex_handler_).ex_data_); \ } void throw_exception(const char *ex_type, void *ex_data) { ex_handler_rec_ *handler = current_handler_; current_handler_ = handler->prev_; handler->ex_type_ = ex_type; handler->ex_data_ = ex_data; printf("throw_exception %s\n", ex_type); longjmp(handler->jbuf_, 1); }
737 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 03:40:13 ] こういう風に使う。EX_ABBREVマクロを再定義することでTRYのネストができる。 TRY { #undef EX_ABBREV #define EX_ABBREV(x) a_##x TRY { if (cond) BREAK_TRY; throw_exception("hoge", cond2 ? "abc" : NULL); } CATCH("fuga") { if (a_ex_data) /* throw_exceptionの第二引数はEX_ABBREV(ex_data)に入る */ printf("%s fuga\n", (char *)a_ex_data); else RETHROW; } FINALLY { printf("inner finally\n"); } END_TRY; #undef EX_ABBREV #define EX_ABBREV(x) x } CATCH("fuga") { printf("fuga %s\n", ex_data); } FINALLY { printf("outer finally\n"); } END_TRY;
738 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 03:46:42 ] きめぇぇぇぇ
739 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 04:21:39 ] 具体例なんて、普及しているオープンソースのコードを引っ張ってきて grep goto すりゃ見つかるだろ。
740 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 04:25:13 ] return 時に実行してくれない finallyに何の意味がある? あと、for,whileなどのループ内では、このマクロは使えないね。 (BREAK_TRY のあと、ループ脱出条件を再度判定してbreak文を実行しなきゃならない:二度手間)
741 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 04:47:21 ] >>725 2chは行数制限があるから実用されているコードを貼るのは無理だね。 アンカーではなくポインタは示すので、あとは自分で調べて。 # apache が実務的なコードでないという奴はいないよな? $ grep -r -n goto httpd-2.2.8/server httpd-2.2.8/server/vhost.c:717: goto bad; httpd-2.2.8/server/vhost.c:747: goto bad; httpd-2.2.8/server/vhost.c:754: goto bad; httpd-2.2.8/server/vhost.c:904: goto found; httpd-2.2.8/server/vhost.c:916: goto found; httpd-2.2.8/server/mpm/netware/mpm_netware.c:421: goto got_listener; httpd-2.2.8/server/mpm/winnt/child.c:954: goto shutdown; httpd-2.2.8/server/mpm/winnt/mpm_winnt.c:871: goto die_now; httpd-2.2.8/server/mpm/experimental/event/event.c:1140: goto worker_pop; httpd-2.2.8/server/mpm/worker/worker.c:882: goto worker_pop; httpd-2.2.8/server/mpm/prefork/prefork.c:614: goto got_fd; httpd-2.2.8/server/mpm/beos/beos.c:560: goto got_a_black_spot; httpd-2.2.8/server/mpm/beos/beos.c:562: goto got_fd; httpd-2.2.8/server/util_xml.c:58: goto read_error; httpd-2.2.8/server/util_xml.c:79: goto read_error; httpd-2.2.8/server/util_xml.c:88: goto read_error; httpd-2.2.8/server/util_xml.c:93: goto parser_error;
742 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 06:54:58 ] >>741 おいおい、今さら提示しても遅いって。>>723 に > -goto肯定派の具体的な例に関しては、「構造的に考えれば、とか、構造を再度 とか > なんら実務面の利点を示しているわけではない。 とか書いた時点で、じゃあgotoの実用的かつ正しい使い方というのは どんな具体例があったんだよって話なんだから。
743 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 06:55:01 ] goto肯定派曰く「何も考えずにgotoを使う奴などいない」 goto否定派曰く「全てのgotoが駄目だという奴などいない」 であれば、肯定派否定派など互いにレッテルを貼っているだけで不毛な言い合いだな。 「どういう場合にgotoを使うのか、使わないのか」という具体的な議論にこそ意味があると思うが。
744 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 06:59:38 ] >>742 linuxカーネルの話は723よりも前に出ている。 ま、くだらない貶しあいには興味がないので具体例で。 vhost.cの最初の3つはこういう構造。 static void fix_hostname(request_rec *r) { ... if (rv != APR_SUCCESS || scope_id) { goto bad; } ... if (r->hostname[0] != '[') { for (dst = host; *dst; dst++) { if (apr_islower(*dst)) { ... } else if (*dst == '.') { ...; goto bad; } else ... } } ... return; bad: ... return; }
745 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 07:03:07 ] 自分は>>744 のgotoの使い方は特に問題がないと思う。見やすい。 gotoを使わずにより良いコードを書ける人は代案をよろしく。 「744のように端折られると詳細がわからないから書けない」という言い訳はなしな。 「本物」のコードへのポインタは>>741 にある。必要なら本物を見てくれ。
746 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 07:05:30 ] それから、一つだけ。 抽象的な言い合いの間は散々吠えておいて、 こういう流れにされると何もいえなくなる人へ。 「お前はgotoを使うな」
747 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 07:22:04 ] vhost.cの下2つ(L904, L916)はこの関数。 static void check_hostalias(request_rec *r) { 処理 for (ループ条件) { 処理 // この部分に、条件を満たしたらcontinueというコードがある if (判定条件) goto found; 処理 // この部分に、条件を満たしたらcontinueというコードがある if (判定条件) goto found; } return; found: r->server = s; // この一文のみ } これはごく単純なgotoの例。多重ループでも何でもないが、使わない人フラグを立ててbreak? r->server=s; return;を二箇所に書くという書き方も、二箇所程度ならありかもね。
748 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 07:24:39 ] >>744 bad: ... return; な部分をマクロにしちゃえばgotoなんて使う必要ないんじゃ?
749 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 07:27:08 ] mpm_netware.cでの使われ方 for (ループ条件) { 処理 do { 処理 if (条件) goto got_listener; 処理 } while (ループ条件); continue; got_listener: 処理 }
750 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 07:32:07 ] >>749 goto got_listenerが一箇所なら if (条件) {処理; break;}で済む問題だな。 複数箇所なら処理をstatic関数にすればいい。 そもそも「処理」ってくくれるぐらいまとまってるんだろ?
751 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 07:33:27 ] ちなみにこうやって具体的なコード片で議論しても 全体の構造うんぬんの話の検証にはならない。 というか、むしろ局所的な制御しか考えてないと goto慎重派に言われても仕方ないことになるが。
752 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 07:37:26 ] このパターンは条件がどんどん後付けされるのでは? 過去何度かあったろ。いいかげん気付け。
753 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 07:41:45 ] 今度のパターンは条件を後付けする必要ありません。 次から次へのgrep gotoした結果がタレ流されるパターンです。 1つの例にレスがついたらその議論を先にするのが礼儀というものだが このスレのgoto厨は無視してひたすらgrepを続けます。 それがgotoクオリティ。
754 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 07:41:58 ] >>750 >そもそも「処理」ってくくれるぐらいまとまってるんだろ? いや。got_listenerの後の処理は長い。 do whileで条件を満たせなかった場合はcontinueするという意図のコード。 >>751 そうか。 >>752 ならばコードを読め。>>741 参照。
755 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 07:49:46 ] >>748 マクロは意図するところが十分に明確で、かつ処理が短い場合は良いアイデア。 今回の実際のコードではreturnを入れて3文なので悪くはないかも。 (r->statusに代入、ログ吐き、return) ただしマクロの濫用もコードの可読性を落とすので避けるべき。 vhost.cはマクロについては単純なものしか使っていないので、ポリシーの違いだろうね。
756 名前:デフォルトの名無しさん [2008/02/17(日) 07:52:51 ] 正解は753でしたw
757 名前:デフォルトの名無しさん [2008/02/17(日) 07:54:54 ] バカが浮き彫り
758 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 07:55:28 ] >>754 いや、俺が言ってる「まとまってる」のは長さじゃなくて、 使う変数の依存関係が閉じた傾向にあるという意味。
759 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 07:58:17 ] goto肯定派は実用的なコードから 「ここはこうgotoを使えばもっと綺麗になるのに」 という例を出すつもりはないのかね。 いつでもgoto慎重派にコードを書かせるのは フェアじゃないと思うのだが?
760 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 08:04:27 ] 今、>>759 が良い事を言った! さあ「gotoを恐れずに使う兵共」の腕の見せ所だ!
761 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 08:23:27 ] >>758 そうか。閉じた傾向とか何ともいえないのでソースを読んで。 >>759 それこそ全然フェアじゃない。 ・「Cで書かれた実用的なプログラムでgotoを一切使っていないもの」が一つも出されていない。 ・「ここはこう」の「ここ」を見つけるために、相手にそのプログラム全体を全て読めと? 相手にコードを書かせようと思うなら、題材くらい自分で出せ。
762 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 08:26:54 ] ていうか、プログラマとして非常にガッカリなのは、 情報として>>741 が出されて、それを題材にしているにも関わらず、 実際にhttpdのソースをダウンロードして自分でソースを追ってみた人が、 ここで議論している人の中に誰もいなそうってところだな。 コードリーディングしない人には、コードを語る資格も能力もないよ。
763 名前:デフォルトの名無しさん [2008/02/17(日) 08:40:57 ] 具体論になると机上の空論と違って盛り上がらないねえ
764 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 08:43:08 ] >>762 は>>748 や>>750 は無視ということか。 grep するだけなら楽でいいもんな。プ
765 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 08:46:32 ] >>764 750は明らかに749しか読んでいないと思われ。 実際のコードに当たったらこんな発言が疑問形で出るわけがない。 >そもそも「処理」ってくくれるぐらいまとまってるんだろ? そこに気付かない>>764 自身も、他人を煽るだけで自分はコードを読んでいない。
766 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 08:47:34 ] 強調するが、ここが重要ね。 そこに気付かない>>764 自身も、他人を煽るだけで自分はコードを読んでいない。
767 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 08:48:47 ] そういう>>765 は手あたり次第grepしただけ。 そうじゃないと言うのなら、 「ここはこうgotoを使えばもっと綺麗になるのに」 という例があるはずだから、それを提示しろ。 できないなら、コード読まない厨認定な。
768 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 08:49:28 ] 煽ったり議論したりする暇はあるんだから、ついでにちょっとコードも読めばいいのにね。 と思うよ俺は。
769 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 08:50:04 ] >>763 一方的に「コード読め」「改善策を出せ」と言うばかりの香具師がいるからな
770 名前:デフォルトの名無しさん [2008/02/17(日) 08:50:15 ] 悪魔の証明を知らない人w
771 名前:デフォルトの名無しさん [2008/02/17(日) 08:50:37 ] >>768 オマエガナー wwwwwwwwwwwwwwwwwwwwwwwwww
772 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 08:52:10 ] >>770 そうそう。grep厨はコードの断片を見せるだけで 議論は永遠に続くことになるんだよな。アフォらし。
773 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 09:02:40 ] 強調するが、ここが重要ね。 そこに気付かない>>766 自身も、他人を煽るだけで自分はコードを読んでいない。
774 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 09:08:42 ] こういうスレを読んでいると感じるけど 2chって「馬鹿しか得るものがない」場所だよね。 何の知識もない教えて君が相手を煽りながらタダで一方的に情報を得る。 教える側は何故か相手に罵倒されながら一方的に情報を提供して自分は何一つ得るものがない。 なので普通の人は嫌になってすぐに去り 2chに残るのは自己犠牲精神に満ち溢れた聖人と馬鹿だけ。
775 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 09:24:50 ] >>774 > 何の知識もない教えて君が相手を煽りながらタダで一方的に情報を得る。 goto厨のことだね。 goto慎重派はちゃんと改善例を提示しているのに goto厨は文句を言うばかりで何の改善例も提示しない。
776 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 09:33:40 ] >>774 たかがgrepしただけでそこまで上から目線で言える根性が気に入った。 >>775 goto肯定派もコード出してるよ。>>469 とか。目が腐りそうな糞コードだけど。 ちなみに>>469 は>>485 という形でgotoを使わずに可読性が上がったね。
777 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 09:35:56 ] 485=774=grepした人=744以降でコード断片を出した人=普通の人なので去ります
778 名前:デフォルトの名無しさん [2008/02/17(日) 09:38:20 ] と言いつつキリ番ゲットした>>777 、オメ。
779 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 09:56:30 ] 777が去った今このスレの運命は776の手腕にかかっている
780 名前:653 mailto:sage [2008/02/17(日) 10:11:45 ] 6.8 自動記憶域期間をもつオブジェクトの初期化子、(略)は、 文の場合と同じく実行中に宣言に到達するたびにこれを評価し、 値をそのオブジェクトに格納する。 とあるので、gotoで宣言(と初期化)をまたぎこしていると、 初期化はされないとすべきのようです。 また、C99では「可変修飾型をもつオブジェクトの宣言を飛び越しては ならない」という制限が加わってますね。なるほど。
781 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 10:37:43 ] >>776 goto否定派もコード出してるよ。>>267 とか。目が腐りそうな糞コードだけど。 ちなみに>>267 は>>263 という形でgotoを使って可読性が上がったね。
782 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 11:07:56 ] 一人で頑張ってる嫌goto厨。 後輩に得意になって言っちゃったの? gotoは使うなって。
783 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 11:12:38 ] 異議あり!代案なーし! 異議あり!代案なーし! 異議あり!代案なーし!
784 名前:デフォルトの名無しさん [2008/02/17(日) 11:16:33 ] >>263 は>>379 で否定されたがね。 if (A_init() != 0) goto FAILED; if (B_init() != 0) 80+0; FAILED: if (C_init() != 0) goto FAILED; if (D_init() != 0) goto FAlLED; FAlLED: しかしまいったね。 ・・
785 名前:デフォルトの名無しさん [2008/02/17(日) 11:17:33 ] アホなレス乞食ががんばっていますね
786 名前:デフォルトの名無しさん [2008/02/17(日) 11:18:12 ] >>783 代案? すべての法律がダメだけどそれを国会議員200人ぽっちで作れるわけないだろ。 社会保険庁ですら数万人いるのに。
787 名前:735 mailto:sage [2008/02/17(日) 11:18:51 ] >>735-736 はバグってた。 CATCH節の中でthrow_exceptionするとFINALLYが走らない。 こりゃ結構恥ずかしい。インデントも崩れてるし。
788 名前:デフォルトの名無しさん [2008/02/17(日) 11:19:23 ] ほお。 あなたに悪意を持つプログラマが goto を 80+0 と書いて 嫌がらせをするかもしれないから goto を使うべきではない と。 ヴァァァァァァァァァァァ ァァァァァァァァァァァ ァァァァァァァァァァァァァァァァァァァァァァ ァァァァァァァァァァァカ じゃねーの?wwwwwwwwwwwwwwwwwwwww
789 名前:デフォルトの名無しさん [2008/02/17(日) 11:20:41 ] どうでもいいけどダイクストラが言ってから今年で40周年か 見事な釣り師だな
790 名前:デフォルトの名無しさん [2008/02/17(日) 11:23:18 ] >>788 森田さんこんなところにいたんですか。 ちなみに80+0と書き換えた森田さんは日常的に2ch語を上司に向かって話す極めつけの2chネラで、 バカジャネーノってAA使いまくりな人。 生まれは九州は福岡のとある会社の社長の息子。
791 名前:デフォルトの名無しさん [2008/02/17(日) 11:23:28 ] 「gotoを使うな」の釣り糸一本で 40年間、たぶん何百万人という単位のプログラマを釣りあげてる 恐るべしダイクストラ
792 名前:デフォルトの名無しさん [2008/02/17(日) 11:25:34 ] >>791 大工さんはWhileをgotoで書くなと言っただけじゃね? goto使いだってwhile使えるところでgotoとか使わないだろ。
793 名前:デフォルトの名無しさん [2008/02/17(日) 11:28:53 ] sage不可能な良スレ
794 名前:デフォルトの名無しさん [2008/02/17(日) 11:30:33 ] >>790 『福岡人はgoto禁止』でいいんじゃね?
795 名前:デフォルトの名無しさん [2008/02/17(日) 11:31:49 ] 違うか。森田さんは80+0って書いただけでgotoは書いてないもんな。 『福岡人と仕事するときはgoto禁止』? いや『福岡人は面接で落とせ』?
796 名前:デフォルトの名無しさん [2008/02/17(日) 11:32:40 ] 福岡禁止
797 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 13:05:02 ] 80+0なんてキーワードハイライトがあれば容易に見抜けないか? あと、0に斜線が入ったフォント使うとか(0とoのような個別の事例にしか使えないけど)。
798 名前:デフォルトの名無しさん [2008/02/17(日) 13:26:42 ] >>797 いやそれがね、うちの会社、ウィルスバスターが更新しないように、インストーラーに手を加えた上でウィルス感染させやがるんですよ。 イントラネット管理者の統括してる本人がやるから信用しちゃうでしょ。 福岡に本社のある東京一部上場企業なんだけど。 だからエディタにキーワード追加くらい簡単にやってのけるよ。
799 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 13:39:04 ] もはや798が質の悪い吊りだと見抜く方が容易
800 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 13:41:59 ] >>797 つうか字形が違いすぎてしばらく話の流れが全く理解できなかったよ
801 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 14:10:20 ] じゃあ次、コンパイラで使われていないラベルに対して警告を出すようにする。
802 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 14:58:28 ] >>798 電子計算機損壊等業務妨害 で告訴しろ。 (告訴状作って会社の法務部に送りつけるだけでも効果あるぞ)
803 名前:デフォルトの名無しさん [2008/02/17(日) 15:07:57 ] >>802 人事部に電話したら、「会社の方針でお前を監視してるんだから逆らうな」って言われたから。 人事部長と直接話したいって言ったけど無視された。 会社クビにされるときに人事部長を名乗る人が来たけど、なんと創価学会の池田先生に瓜二つ。
804 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 15:16:56 ] >>803 こちらへどうぞ ttp://pc11.2ch.net/test/read.cgi/prog/1197192900/
805 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 15:26:19 ] >>803 「他人にいたずらされている」という妄想を抱いて、「なら反撃で、いたずら し返さなければ」とイタズラして、会社側から疑いをかけられて監視されて、 あげくのはてにイタズラしていたことがバレてクビになった。 としか、文章からは読み取れない。
806 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 15:58:23 ] むしろメンヘル逝きをお勧めしたい。
807 名前:デフォルトの名無しさん [2008/02/17(日) 16:30:11 ] 結局大工は釣りだとかいう観念論しかできないんだねw
808 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 17:20:45 ] いくら上げても技術要素0%のレスで火は起こせないか
809 名前:645 mailto:sage [2008/02/17(日) 20:42:55 ] 気になったので、gccでやってみた void bar(int); int func(int arg) { if(arg == 0) goto foo; { int i; i = arg*2; foo: bar(i); } }
810 名前:645 mailto:sage [2008/02/17(日) 20:43:39 ] .file "gototest.cpp" .text .align 2 .globl __Z4funci .def __Z4funci; .scl 2; .type 32; .endef __Z4funci: pushl %ebp movl %esp, %ebp subl $8, %esp cmpl $0, 8(%ebp) jne L2 jmp L3 L2: movl 8(%ebp), %eax addl %eax, %eax movl %eax, -4(%ebp) L3: movl -4(%ebp), %eax movl %eax, (%esp) call __Z3bari leave ret .def __Z3bari; .scl 2; .type 32; .endef こうなる。 やはりiは確保されません。
811 名前:デフォルトの名無しさん [2008/02/17(日) 20:48:02 ] >>810 goto使うなっての以上に、ブロックで変数定義するなってのもある。 しかし、オブジェクトはその場所で作るしかないんだな。
812 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 21:33:13 ] だからレジスタに割り当てられてるんじゃないの?
813 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 21:44:22 ] >>812 たった4つの32ビットレジスタで計算しないといけないのにそんな無駄なことできないでしょ。 少なくとも何かをするとしたらレジスタを使う。 やるとしても小さいループのループカウンタくらいか。
814 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 21:47:27 ] goto fooすりゃi=arg*2が実行されないのは当然ダロ 何を期待してんのかわからn
815 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 21:58:11 ] >>813 内側のブロックで宣言できないとしたら、 外側のブロックで宣言するだけ。 実態としては何も変わらない。
816 名前:645 mailto:sage [2008/02/17(日) 22:02:54 ] >>814 ああ、テキトーに作った例だから、実際の動作は気にしないでくれ。 問題は、ブロックの中で定義した変数の領域が確保されていないのに、関数呼び出しに使われてしまうという事実ね。 多分、foo: の後にi = i+argなんてやってもダメだと思う。
817 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 22:03:51 ] >>816 ヒント: jne L2 が実行された場合は L2 のどこで「領域が確保」されていますか?
818 名前:645 mailto:sage [2008/02/17(日) 22:04:03 ] 809のiの定義の後でiに代入してるのはコンパイラにiの定義をスルーさせないように、それらしい仕事をさせたかったから。
819 名前:645 mailto:sage [2008/02/17(日) 22:04:41 ] >>817 ああ、別にされてないね。
820 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 22:26:56 ] データフロー解析ぐらいは最近のコンパイラなら当たり前だよ? ガチガチにソースコードに対応するようなコードを吐いて欲しいなら -O0 を付けるとか...してもそこまでガチガチなコードが出るかどうか。
821 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 22:28:40 ] >>820 そういう問題じゃない。出ているコードは綺麗にソースに対応している
822 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 22:46:57 ] スタックフレームが >subl $8, %esp で8バイト確保されていて iが >-4(%ebp) なら、関数の先頭で「確保」されてるんじゃね?
823 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 22:48:59 ] >>822 正解
824 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 02:57:19 ] >>811 >goto使うなっての以上に、ブロックで変数定義するなってのもある。 いやこれはするだろ。 あれ、みんなしない派?
825 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 03:21:11 ] 俺は、近くで定義したい派。 ブロック内で変数定義することはある。 ただ、外の変数と名前がかぶらないほうがいいかなぁ〜、くらいは気を使う。
826 名前:デフォルトの名無しさん [2008/02/18(月) 08:18:56 ] 普通は最小スコープ(内側のスコープ)で定義するのが常識
827 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 09:06:07 ] それ厳密に適用するととんでもないことに
828 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 09:25:19 ] 手続き的にやろうとするから、変数を外のスコープにひっぱり出すとかが 必要になる。関数的に、なんでも再帰あちこちでreturnな書き方をすれば それでうまくいく。
829 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 12:26:48 ] >なんでも再帰あちこちでreturn 吊り?
830 名前:デフォルトの名無しさん mailto:sage [2008/02/20(水) 16:00:57 ] >>813 そんな特定のアーキテクチャに依存した話を突然持ち出されてもねえ、、、
831 名前:デフォルトの名無しさん mailto:sage [2008/02/20(水) 16:07:36 ] >>829 > >なんでも再帰あちこちでreturn > 吊り? 釣りでもなんでもない。ifやswitchが文でなく式なら、 return if (hoge) true else false; みたいに書けるのに(3項演算子は可読性が低いから却下)、 そうでないから、 if (hoge) return true; else return false; というように書かざるをえない、ってだけ。
832 名前:デフォルトの名無しさん mailto:sage [2008/02/20(水) 17:15:50 ] 3項演算子に対する嫌悪感って goto のそれに似たものがあるな
833 名前:デフォルトの名無しさん mailto:晒すとするか [2008/02/20(水) 17:18:18 ] 3項演算子とgotoじゃ全然違うだろ・・・これだからgoto厨は・・・
834 名前:デフォルトの名無しさん [2008/02/20(水) 18:46:16 ] 3項演算子はネストしない限りif文よりも可読性高い場合もあるだろ 特に>>831 のような単純な分岐の場合は。どうせ見た目で毛嫌いして るだけだろうけど。
835 名前:デフォルトの名無しさん mailto:sage [2008/02/20(水) 18:48:46 ] >>834 ネストしたって適切なカッコさえつければ問題ないだろ。 特に>>831 の場合には積極的に3項演算子を使うべき箇所と思われ。
836 名前:デフォルトの名無しさん mailto:sage [2008/02/20(水) 18:56:34 ] それは再帰とは呼ばない。 ということだけは覚えてほしい
837 名前:デフォルトの名無しさん mailto:sage [2008/02/20(水) 18:59:35 ] if 文のみで書こうとすると異常にネスティングが増えるケースについて 3項演算子をif文とともに使って、ネスティングを削減すると、コードがすっきりするので好きだ。
838 名前:デフォルトの名無しさん mailto:sage [2008/02/20(水) 19:16:21 ] 例えばループで書くと foo() { cond = true while (cond) { ・・・ ・・・ if (...) { cond = false } ・・・ ・・・ } } みたいな構造で、condのようなスコープの広い変数が 必要になるのが、再帰で処理するように書き直せば、 foo() { ・・・ ・・・ if (!...) { foo() } ・・・ ・・・ } で済む、かもしれない、ってこと。
839 名前:デフォルトの名無しさん mailto:sage [2008/02/20(水) 19:19:27 ] >>836 再帰かどうかが、returnがif文の中か3項演算子の外かで左右されるとでも?
840 名前:デフォルトの名無しさん mailto:sage [2008/02/20(水) 19:33:38 ] >>838 でっていう
841 名前:デフォルトの名無しさん mailto:sage [2008/02/20(水) 19:48:45 ] >>838 いや、皆が問題にしてるのはそういうことではなく while (cond) { int i; .... } みたいなスタック操作の無駄のことと思われ。
842 名前:デフォルトの名無しさん mailto:sage [2008/02/20(水) 21:19:37 ] 末尾再帰でもないのに、それは・・・
843 名前:デフォルトの名無しさん mailto:sage [2008/02/20(水) 22:22:30 ] >>838 の foo() { cond = true; while (cond) { s1;s2; if (...) {cond = false} s3;s4; } } これは、condが2回目のループでfalseになるとすると、 s1,s2,s3,s4,s1,s2,s3,s4の順で実行される。 で、 foo() { s1;s2; if (!...) {foo();} s3;s4; } これは、2回目のループで(!...)がfalseになるとすると、 s1,s2,s1,s2,s3,s4,s3,s4で実行されるから順番が変わる。そこでs3;s4をifの前に持ってくるわけだ。 すると、 foo() { _loop: s1;s2;s3;s4 if(...) goto _loop; } みんな末尾再帰でgoto使う?
844 名前:デフォルトの名無しさん mailto:sage [2008/02/20(水) 22:24:12 ] 末尾再帰をgotoにするのはコンパイラのお仕事。
845 名前:デフォルトの名無しさん mailto:sage [2008/02/21(木) 02:28:28 ] 再帰使うならgotoはいらん。 (再帰を中断するときには使うかもしれん)
846 名前:デフォルトの名無しさん mailto:sage [2008/02/21(木) 05:40:03 ] つかそれはdo{}while(..);
847 名前:デフォルトの名無しさん mailto:sage [2008/02/21(木) 07:36:46 ] >>843 が全然末尾再帰になっていない件について
848 名前:goto使わなければそれがいい派 mailto:sage [2008/02/21(木) 10:34:02 ] >>751 まあ、そういうコードが含まれているプログラムの中には 脆弱性だのバグだのいっぱい含まれているものだ。 セキュリティについて、潔癖で有名なDJBですら、結構gotoを 多くつかう。 まったく使わないで終わらせた作品としては は、比較的私家版パッチの突っ込みが少ない publicfile くらい。 後は山のようにgoto文があってDJBは嫌いだという人間もいる。
849 名前:デフォルトの名無しさん mailto:sage [2008/02/21(木) 10:37:28 ] >>841 {} がつくと何でも変数スコープを狭く取りたがるつか、 同じ変数を使いまわしてもバグにならないというか、 単たる手抜きか。
850 名前:デフォルトの名無しさん mailto:sage [2008/02/21(木) 14:08:08 ] pascalみたいに手続きの最初で全部まとめて宣言しろ
851 名前:デフォルトの名無しさん mailto:sage [2008/02/21(木) 15:58:33 ] >>841 それも違うだろ。それくらい最適化でどうにでもできる。
852 名前:デフォルトの名無しさん mailto:sage [2008/02/21(木) 20:22:54 ] >>845 ハァ?再帰からgotoで抜けるだぁ? これだからgoto厨は…
853 名前:デフォルトの名無しさん mailto:sage [2008/02/21(木) 21:49:55 ] 再帰からgotoどころかlongjmpだってしちゃうぜ!
854 名前:デフォルトの名無しさん mailto:sage [2008/02/21(木) 21:59:56 ] よーし、俺はexitだ。
855 名前:デフォルトの名無しさん [2008/02/21(木) 22:41:57 ] いいこと思いついた。 お前ら俺のプログラムのケツにストリームデータ流し込んで実行してみろ。
856 名前:デフォルトの名無しさん mailto:sage [2008/02/21(木) 22:50:35 ] >>855 えっ!お前のケツにすとりーむでーtlk;ghklj;
857 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 07:15:04 ] >>851 そんな最適化をされたらデストラクタロギングが使えなくなるじゃないか!!
858 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 13:10:22 ] >>857 コンストラクタ・デストラクタが呼ばれなくなるような最適化なんて行われるわけないだろ。 少なくともC++では。
859 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 19:14:27 ] いずれ呼ばれるにしても、呼ばれるタイミングは変わるかもよ?
860 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 22:05:58 ] >>859 どこの規格無視コンパイラだ?
861 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 23:47:10 ] gotoを使う想定でロジックを組むなら、それを分かりやすく図示する方法を発明してから にしてほしい。そうじゃないとレビューする気にもなれない。 ここで出たようなgotoを使った書き直しの例なら、gotoを使ってないロジックを例えば NSチャートとかで書いた方が、とてもとても分かりやすくて人にも説明し安いだろう。 チームメイトにロジックを説明するようにお願いてフローチャートをもってこられたら、 とりあえずバケツもって廊下に立っててくれるようにお願いしちゃうな。 システムが使われなくなるまでその人が死なずに内容も忘れずに保守するってのが保証さ れてたとしても、仕事ではそんなロジックは受け入れ難いな。 だいたい現実的にgotoを使った方が良い場合ってのが、想定しづらい。 リソースだのコードサイズだののためのためにgotoを使うってのは、やらないと用件が 満たせないからって理由で、設計とかコーディングとかのさらに後に最適化フェーズを 設けてそこでやるんなら認めなくもないが、元からgotoを使うのが正しい場合なんての を考慮しながらロジックを考えるような人とは一緒に仕事はできないなぁと思う。 なんでそんな書き方になってるか説明するための資料も作んないといけないし、仕事が 増えるばっかりだ。段階的抽象化とか物事を整理するとかに興味がないかできない人な んだなとしか思えない。 誰かが事故にあってもリカバリがきくような状態を維持しようと思ったら、少しくらい 冗長になっても、なるべくわかりやすい設計&実装にしたいって思うのは普通だと思う んだがなぁ。
862 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 23:56:49 ] わたしはソース読み力がありません。 まで読んだ。
863 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 06:15:25 ] >>862 は>>861 を読む力がありません まで読んだ。
864 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 06:38:46 ] resource *hoge(int arg) /*失敗でNULL、成功でリソース(p4)を返す*/ { resorce *p1 = NULL,*p2 = NULL,*p3 = NULL, *p4 = NULL; p1 = GetResource1(arg); /* GetResoruce*は失敗した時にNULLを返す */ if(!p1) goto failed; 処理1 p2 = GetResource2(p1); if(!p2) goto failed; 処理2 p3 = GetResource3(p1,p2); if(!p3) goto failed; 処理3 p4 = GetResource4(p3); if(!p4) goto failed; 処理4 FreeResource(p3); FreeResource(p2); FreeResource(p1); return p4; failed: if(p4) FreeResource4(p4); if(p3) FreeResource3(p3); if(p2) FreeResource2(p2); if(p1) FreeResource1(p1); return NULL; } これgoto使わないとどう書く?もちろんスマートポインタ、GC、例外は使用不可。
865 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 06:43:29 ] >>864 もうそれ飽きた。いいかげん空気読め、アフォ。
866 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 06:45:43 ] 各GetResourceの前にifつけてやって、 処理4
867 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 06:52:11 ] p1 = GetResource1(arg); if(p1) { 処理1 p2 = GetResource2(p1); if(p2) { 処理2 p3 = GetResource3(p1,p2); if(p3) { 処理3 p4 = GetResource4(p3); if(p4) { 処理4 } } } } if (p3) FreeResource(p3); if (p2) FreeResource(p2); if (p1) FreeResource(p1); return p4;
868 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 06:58:18 ] 俺の感覚だと、読んだだけで「ああ失敗なんだな」って分かる>>864 のが好きなんだよね。 あとネストが深くならないのが。
869 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 07:02:22 ] >>868 処理そのものがネスト構造になっているんだから、 コードもネストしたほうが実態がわかっていいんじゃねーの?
870 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 07:03:52 ] >>863 なにがそんなに悔しいの?
871 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 07:05:33 ] ↓いつものgdgdな展開へ・・・
872 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 07:05:36 ] >>869 なるほどねー。 >>870 いや別に。リソース確保でネストさせるのが嫌いだってだけで。
873 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 07:07:28 ] 自演シッパイ、オツwwww
874 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 07:08:19 ] gdgdだな
875 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 07:08:50 ] >>872 リソース確保の条件がネストしているのだから、 コードもネストしたほうが実態がわかっていいんじゃねーの?
876 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 07:09:53 ] アンカー打ち間違える奴は、gotoでもラベル打ち間違えるに決まってる件について。
877 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 07:10:19 ] >>875 なるほどねー。
878 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 07:11:50 ] >>876 >>870 の>>863 を>>869 に読み間違えてたわwww
879 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 07:12:06 ] 処理1〜3にもよるだろう。 短いならいいけど、長ければネストしたくないって人もいるだろう。 あと、エラーならその場で関数から抜けたいタイプのひともいるし、 あれだけじゃなんとも。
880 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 07:12:17 ] あ、上の>>869 は>>868 ねwwwww
881 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 07:13:09 ] わざとだろwwww
882 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 07:14:03 ] >>881 >>878 ⇒>>880 はねwwww読み間違えてたのはホント。
883 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 07:14:41 ] gdgdだーwww
884 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 07:15:37 ] >>879 ネストしたくなきゃ、 if (p1 && p2 && ...) { とすればいいだけなんじゃ?
885 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 07:19:58 ] >>879 たった3つの解放だけなんだから、解放をマクロにしちゃって goto failedのかわりにFreeAll; return NULL;しちゃってもいいな。 いずれにせよ、このネタはもうイトフユだろ。
886 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 07:47:58 ] ネストするなとか、あいかわらず後出しジャンケンなんだね、goto厨は… まあその後出しジャンケンも>>885 で残念賞なわけだがw
887 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 07:52:42 ] ↑と、ここまでいつものgdgdな展開ですた。
888 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 08:06:03 ] 嫌goto厨は「異議あり対案なし」であることが証明されました。
889 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 08:25:52 ] >>882 リアルでアンカー読み違える香具師がgotoを使うのは キ チ ガ イ に 刃 物
890 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 08:27:06 ] >>888 gotoを使わない対案ならこの短い間に3つも出ましたが何か?
891 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 08:31:07 ] 「出る」と「出す」の違いくらいわかってもいいとおもうぞ。
892 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 08:47:16 ] >>891 おいおい、>>888 の主語は「嫌goto厨は」なんだから、 gotoを使わない対案が出ていればそれで十分に反証になるだろw
893 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 09:25:38 ] 自分の他人の区別さえつかないのか、かわいそうに。
894 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 09:32:55 ] 他人が書こうが誰が書こうがgotoを使わない対案であることに何の変わりもないが?
895 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 09:37:31 ] 嫌goto厨は「異議あり対案なし」であることが証明されました。
896 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 09:58:53 ] >>895 gotoを使わない対案ならこの短い間に3つも出ましたが何か?
897 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 10:01:08 ] それがなにか?
898 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 10:06:18 ] いいよ〜gdgdいいよ〜
899 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 10:09:56 ] 864のgotoは不要ということで。
900 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 10:39:25 ] 俺の感覚だと、見た瞬間に 864>>>867 なんだがなあ。 えーとさ。FAILEDっていうラベルの存在自体が 「物凄くソースコードの見通しを良くする、これ以上無い最高のコメント」 だと思うんだよ。
901 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 10:51:29 ] >>900 =>>864 オツw
902 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 10:55:29 ] >>901 goto派が一人しかいないと思ってるなら、 君はたった一人のgoto厨に向かって何を必死に反論しているのかしら?w
903 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 10:59:26 ] goto派が一人しかいないなんて話、どこの脳内議論から降ってきたのだろうか・・・ 脳ミソがスパゲッティになってるんじゃないの?
904 名前:デフォルトの名無しさん [2008/02/23(土) 11:00:48 ] ラベルに適切な英語名を振れない低学歴が吠えてるだけ
905 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 11:02:13 ] 1000までgdgd
906 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 11:05:46 ] >>900 FAILEDなんてラベル、>>864 にはないんだけど・・・ ラベルも扱えない香具師がgotoを使うのは キ チ ガ イ に 刃 物
907 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 11:06:50 ] すげぇ、TYPOも許容しないほどの厳格な議論なのかと思ったら ただの罵り合いじゃん。
908 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 11:08:20 ] gotoを適切に使うことで見通しよく書けているコードなど オープンソースソフトウェアを少し読めばいくらでも見つかるし まともなプログラマならばgotoを使うべきコードパターンというのを イディオムとして持っている が 業務の中で頭の固い奴を説き伏せてまで良いコードを書こうとは 思わないので仕事では適当にwhileやifをネストさせてその場限りの コードをぐちゃぐちゃに書く。保守性など知らない とりあえず「見た目上構造化」しておけばよいのだからそれ以上 考えても無駄無駄無駄。所詮は仕事
909 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 11:11:14 ] >>908 ifをネストさせない対案も複数出ているが? さあ、今度はどんな条件を後出しするのかなwwwwwww
910 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 11:11:36 ] という思想で書き散らかされたプログラムに 腐れUMLと自動生成された糞doc、スパイスとして捏造されたテスト報告書をくっつければ ほら高品質ソフトウェアの出来上がりでござい
911 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 11:14:22 ] if (p1 && p2 && ...) { 馬鹿馬鹿しく肥大化した分岐条件 goto failedのかわりにFreeAll; return NULL; 馬鹿が思いつきで定義する糞マクロ イイヨイイヨー
912 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 11:26:33 ] >>861 >誰かが事故にあってもリカバリがきくような状態を維持しようと思ったら、少しくらい >冗長になっても、なるべくわかりやすい設計&実装にしたいって思うのは普通だと思う >んだがなぁ。 設計については正しい。 だが 実装については正しくない。 そしてここは実装について話すスレだよ。
913 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 11:30:38 ] goto厨のオナニースレなんだから、まともな論理は通用しないよ > goto自重派
914 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 11:31:51 ] >>908 その場かぎりのgotoでグチャグチャになってる>>864 にどんな保守性を期待してるのやら。 他人のコードレビュー受けたことないでしょ、君は。
915 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 11:33:01 ] >>908 > まともなプログラマならばgotoを使うべきコードパターンというのを > イディオムとして持っている それが他人に読まれた時にどんな混乱をもたらすか 考えたこともないのがgoto厨クオリティ
916 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 11:36:59 ] whileやifがネストしただけで混乱するようなプログラミング初心者がgotoを使うのは キ チ ガ イ に 刃 物
917 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 11:38:50 ] >>876 > 876 名前:デフォルトの名無しさん [sage]: 2008/02/23(土) 07:09:53 > アンカー打ち間違える奴は、gotoでもラベル打ち間違えるに決まってる件について。 > 900 名前:デフォルトの名無しさん [sage]: 2008/02/23(土) 10:39:25 > えーとさ。FAILEDっていうラベルの存在自体が まさにご名答。先見の明がありますな。 どこぞの後出しジャンケンと大違い。
918 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 11:49:14 ] だめだここはれべるがひくい
919 名前:デフォルトの名無しさん [2008/02/23(土) 11:50:45 ] 864 finally使え
920 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 11:53:47 ] >>919 正解ですな。 finallyはスマートポインタ、GC、例外ではないからねえw
921 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 12:03:48 ] 大域脱出と例外処理には使うかな。 使わなくても書けるけど、特に宗教が無ければ使うよね普通。
922 名前:デフォルトの名無しさん [2008/02/23(土) 12:06:04 ] >>864 p1からp3まで格納するオブジェクトをつくって、 デストラクタでp1からp3を解放しろ。 ところで > failed: > if (p4) FreeResource4(p4); これは何の冗談だ?p4はNULLなはずだが?
923 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 12:07:23 ] >>921 特に宗教が無ければそういうのを「例外処理」とは呼ばないよね普通。
924 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 12:07:24 ] あさってのほうこうをむいているぞきみは
925 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 12:11:13 ] >>283 そうやって評論家ばかり集まって何も生み出さないから日本は駄目なんだよ
926 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 12:11:33 ] >>922 ほんと、>>867 のように書いてみれば、failed:に来た場合p4はNULLだということに気付くはずなのに、 ツギハギだらけの思考で書いたんだろうな、>>864 は。
927 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 12:11:39 ] 誤爆
928 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 12:13:43 ] 誤爆だが、このスレの実情を的確に表現した名文だ。
929 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 12:18:21 ] goto乱用厨が出すコード例はほとんどgoto慎重派によって対案が出されている。 なのにgoto乱用厨は次から次へとほとんど同じようなコードを出してくる。 >>864 のパターンはこのスレだけでも何度も出てきている。 いくら対案を出しても、 「オプソ探せばいくらでも例はあるモン、goto使ったほうがいいモン」 と言って駄々をこねる。 結論: goto乱用厨=ゆとり脳。
930 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 12:23:10 ] その対案は改善でなく改悪だという意見が何度も出ていますが?
931 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 12:26:34 ] tesu
932 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 12:28:14 ] >>930 アンカー打ちまちがえたりラベル打ちまちがえたりする オッチョコチョイさんからねwww
933 名前:デフォルトの名無しさん [2008/02/23(土) 12:28:46 ] p4 = GetResource4(p3); のあとlこ if (p4) FreeResource(p4); が書かれていない件
934 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 12:31:05 ] >>933 へえお前はfreeしたポインタを返すのか。なかなか凄いな
935 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 12:32:28 ] ここで結局932のような攻撃しかこないのが駄目 内容のある議論の入口にすら立てない
936 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 12:35:20 ] 相手の技量もわからず内容のある議論ができるわけもなし 933みたいな素人が知ったかぶりで自説を語るのが2ch
937 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 12:36:08 ] ところで > failed: > if (p4) FreeResource4(p4); これは何の冗談だ?p4はNULLなはずだが?
938 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 12:36:27 ] まぁ、そんなスレもそろそろ終盤。 うめ。
939 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 12:36:52 ] 恥ずかしい間違いを指摘されても別人のふりで再登場だしな 実際このスレもせいぜい4,5人の素人が回してるだけだろ
940 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 12:36:52 ] >>934 それがgoto厨クオリティ
941 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 12:39:03 ] goto 禁止 とか適当なキーワードでぐぐれば このスレを読む1%の労力でこのスレを読む100倍の内容が得られる
942 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 12:39:11 ] >>930 finallyについては? デストラクタについては? さあ、finallyやデストラクタを使った方法が改悪だというレスへのアンカー示してみろよ。
943 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 12:40:19 ] >>942 例外やスマートポインタやGC禁止って言ってるところで finallyだのデストラクタだの、なぞなぞはお前のガキ相手にやってろ
944 名前:デフォルトの名無しさん [2008/02/23(土) 12:41:37 ] >>930 余計なif (p4) FreeResource(p4);が消えた点だけでも >>867 は>>864 よりも優れているが?
945 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 12:42:34 ] >>943 あのー、finallyは例外でもスマートポインタでもGCでもないんですがwww 君、プログラミング言語に関する知識が決定的に不足してるんじゃない?
946 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 12:44:24 ] >>944 ありうる状態や制御の流れについての理解を促すというのも 構造化プログラミングの利点の1つだな。 簡単にgotoに逃げちまうと>>864 のようなお粗末なコードになる。
947 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 12:44:47 ] >>945 例外処理機構を備えていなくてfinallyだけ持っている言語を挙げよ
948 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 12:46:26 ] >>943 アンカー示せないわけね。 まあ示してもどうせまた打ち間違えるだろうけど。
949 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 12:46:35 ] 945は947に対して逃げて次は別人のふり
950 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 12:47:20 ] >>947 単に現代的な言語なら例外もfinallyも持ってるというだけの話だろ。 何をマヌケな事をぬかしているのやら…
951 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 12:48:12 ] >>949 他人がみな自分と同じ行動を取るとは限らないのだよ、おマヌケさんw
952 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 12:48:53 ] throwしなければ例外「は」使っていないからfinallyはいいじゃん とかね。 finallyやデストラクタと言った奴は軽いネタだったと思うんだが ネタがネタとして扱われない議論厨の厨っぷりに呆然
953 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 12:54:20 ] >>952 finallyと例外機構は実装としてほとんど独立なんだけど… 実際、finally句が実行されるのは例外の時だけじゃないし。 try…catchとの類似で混同してる人が多いけど。 gotoたまに使う派として恥かしいんでROMやめてレスしてみた。
954 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 12:55:17 ] >>951 そんなのはどうでもいいよ。 問題なのは945(か他の誰かでもいいけどさ)が 947 に正面から答えられるかどうかだけ。 だいたい、945がちゃんと知識を持って書いてるなら、 そういう言語をすぐに答えれば逆に俺が大恥を書くことになる。 実は何の知識も無いくせに知ったかぶりで煽ってるから すぐにケツをまくって格好悪く逃るハメになるのさ。
955 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 12:55:59 ] しかし、マジレスが浮かばれないスレなので、それも燃料にされてしまう悲しさ・・・ ↓具体化してください、どーぞ。
956 名前:デフォルトの名無しさん [2008/02/23(土) 12:58:28 ] 次スレ pc11.2ch.net/test/read.cgi/tech/1203658291/
957 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 12:58:42 ] ↑具が大きい
958 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 13:00:03 ] >>954 まあ落ち着いて>>950 でも読んでみたら?
959 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 13:00:38 ] もう技術的な話は出尽くしていて後は 2chリロードするしか生きがいのないクズどもが goto使う・使わない人間の人間性叩きしかやってないし 次はマ板でやれよ。
960 名前:デフォルトの名無しさん [2008/02/23(土) 13:01:57 ] いろんな文法の変更を試している人がいるから、その中のひとつとして考えてみる
961 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 13:02:39 ] tesu
962 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 13:03:11 ] gotoは何も悪くない。 悪いのはラベルだ。
963 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 13:03:22 ] >>958 「例外もfinallyも持っている言語で>>864 のようなコードを書くこと」 について議論してたの?
964 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 13:03:59 ] 技術的な話はあめぞうが生まれる前から出尽くしているような気が。
965 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 13:04:03 ] 次スレ pc11.2ch.net/test/read.cgi/tech/1123726695/
966 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 13:06:59 ] >>963 わざわざ具体的な例を挙げて「使用不可」と断りを入れてるぐらいだから、 そこに挙げられていないものはデフォルト使用可なんじゃねーの? いいかげんにしないとまた「条件後付け」と指摘されるぞw
967 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 13:08:31 ] まあこのスレの大半の奴はgoto行番号でプログラムを書いた経験なんてないだろ? 構造化以前を実体験として知らない年代の人がgoto議論なんてするもんじゃないよ。 それは別にレベルの高い低いじゃなくて、時代が違うというだけ。
968 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 13:11:34 ] 代入を恐れず使う兵共が継続やモナドを語るスレきぼんぬ
969 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 13:12:46 ] >>966 わざわざ例外だのGCだのと言うぐらいだから、 少なくともC限定の話だとは思えないよな。
970 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 13:15:05 ] while文を恐れず使う兵共が再帰やgotoを語るスレきぼんぬ。
971 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 13:15:25 ] forやwhileも十分見通しが悪い再帰で書け
972 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 13:15:53 ] 安易に破壊的代入を使う奴は素人
973 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 13:16:25 ] 忘れられたデストラクタたん、かわいそス
974 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 13:16:37 ] ここはひとつmapで。
975 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 13:18:20 ] 急にム板らしくなってきた
976 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 13:25:26 ] tes
977 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 13:26:34 ] goto hell;
978 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 13:28:16 ] hell: goto heaven;
979 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 13:29:55 ] >>963 スレタイ読め。 このスレは、finallyや多重breakを語るスレだ。 finallyを対案に使って何が悪い?
980 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 13:32:28 ] てs
981 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 13:34:50 ] g-gg-g-gg-g-gg-gg--
982 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 13:40:48 ] >>979 それは正論だがもう遅い。皆帰ってしまったよ。
983 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 13:42:09 ] goto jail
984 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 13:44:18 ] goto mental_hospital;
985 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 13:45:59 ] それは元ネタがわからん
986 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 14:16:01 ] ってst
987 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 14:18:12 ] >>967 あるよ。 でも「構造化以前に開発経験のある者」に限定するなら、レスの98%位が不合格だ。 今現在もコードを書いている人間が語るから面白いのさ。
988 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 14:22:40 ] 俺も行番号でgotoとか書いていたし、現在でもコードを書いているが、 このスレの99%のレスは落第だと思うな。
989 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 14:24:30 ] 生め
990 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 14:25:42 ] 関数って考えがなかったからな サブルーチンはgotoかgosubでしか実装できなかったろ
991 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 14:31:29 ] >>990 でもNEXT J, Iとかはあったな。うめ。
992 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 14:34:04 ] gosubは理解するのに時間かかったな・・・
993 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 14:34:04 ] test
994 名前: ◆.CzKQna1OU mailto:sage [2008/02/23(土) 14:34:33 ] te
995 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 14:34:59 ] 俺は次すれでもthrowしまくるぜ
996 名前: ◆84g/KG3Nug mailto:sage [2008/02/23(土) 14:35:11 ] st
997 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 14:35:17 ] DEF FUNみたいのもあったな。方言か?うめ
998 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 14:35:41 ] next
999 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 14:36:01 ] .
1000 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 14:36:20 ] goto 1
1001 名前:1001 [Over 1000 Thread] このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。