gotoを恐れず使う兵共がfinallyや多重breakを語るスレ
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん
2005/08/11(木) 11:18:150002デフォルトの名無しさん
2005/08/11(木) 11:29:020003デフォルトの名無しさん
2005/08/11(木) 12:32:08どうやって実装する?
0004デフォルトの名無しさん
2005/08/11(木) 12:42:54トップレベルウィンドウを閉じる処理をするんだろうなぁ。
いずれにしてもメッセージ操作だけだね。
0005デフォルトの名無しさん
2005/08/11(木) 12:51:53外部割り込み
0006デフォルトの名無しさん
2005/08/11(木) 13:07:400007デフォルトの名無しさん
2005/08/11(木) 13:36:100008マイク ◆yrBrqfF1Ew
2005/08/11(木) 14:38:370009デフォルトの名無しさん
2005/08/11(木) 16:00:29トートロジー
0010デフォルトの名無しさん
2005/08/11(木) 16:01:10gotoを恐れずに使いたくないからfinallyや多重breakを使うわけだが。
0011デフォルトの名無しさん
2005/08/11(木) 16:23:09本格的なプログラムを作成するために存在するC++にはなぜfinallyや多重break,continueがないのですか?
0012マイク ◆yrBrqfF1Ew
2005/08/11(木) 16:36:160013デフォルトの名無しさん
2005/08/11(木) 16:37:290014デフォルトの名無しさん
2005/08/11(木) 17:14:38finallyがないのはクラスを作ってデストラクタで何とかしなさいということ。
しかもstd::auto_ptrを始めとして大体は既にそのようなクラスが存在するから自分で作ることは少ない。
//俺が思うにfinallyや多重break, continueがないのは単に思いつかなかっただけではないかという気がする。
0015デフォルトの名無しさん
2005/08/11(木) 19:13:460016デフォルトの名無しさん
2005/08/11(木) 19:16:08俺の脳内的には「あとしまつ部」なんだけど、これじゃ格好悪いし。
0017デフォルトの名無しさん
2005/08/11(木) 19:25:31ってことは、お主は try とか catch は何て言うのよ
「finally 節」 で良いじゃん
0018デフォルトの名無しさん
2005/08/11(木) 19:55:49C++「おまえ、それでよくガベージコレクタがあるって言えたな」
Java「みんなCが好きなんだよ」
0019デフォルトの名無しさん
2005/08/11(木) 20:08:20ああ、メモリ以外は自分で解放する必要があるってことか
0020デフォルトの名無しさん
2005/08/11(木) 20:41:06女の子とか
0021デフォルトの名無しさん
2005/08/11(木) 20:44:16偏見。私は女だがCが嫌いというわけでもない。
0022デフォルトの名無しさん
2005/08/11(木) 20:57:05お前が本当に女なら、おっぱい晒せ。
0023デフォルトの名無しさん
2005/08/11(木) 21:03:21ずっと前からお前の事好きだった
0024デフォルトの名無しさん
2005/08/11(木) 23:21:320025デフォルトの名無しさん
2005/08/11(木) 23:22:24どーも〜〜〜、ゲイでぇ〜〜〜〜〜す〜〜〜〜
0026デフォルトの名無しさん
2005/08/11(木) 23:30:580027デフォルトの名無しさん
2005/08/12(金) 00:20:340028デフォルトの名無しさん
2005/08/12(金) 11:54:430029デフォルトの名無しさん
2005/08/12(金) 12:30:22>>22は氏んでくれ
0030デフォルトの名無しさん
2005/08/16(火) 23:30:11>10
然り。
0031デフォルトの名無しさん
2005/08/17(水) 01:41:130032デフォルトの名無しさん
2005/08/17(水) 11:41:55組み込みの場合のマジレス。
while(1) ;
0033デフォルトの名無しさん
2005/08/18(木) 00:02:44やっぱfinally無しではキツい気がする。
finallyの中身は後片付けでしかないんで
デストラクタに書けばいいだろと言う主張は
なんか面倒くさい気もするけど納得できた。
C++とは無関係にCにも例外処理とfinallyが欲しい。
0034デフォルトの名無しさん
2005/08/18(木) 00:18:21try-catchに関しては、普通にC++コンパイラ使えば良いじゃん。
0035デフォルトの名無しさん
2005/08/18(木) 01:17:31使ったらそれはもうC++だよw
0036デフォルトの名無しさん
2005/08/18(木) 03:16:490037デフォルトの名無しさん
2005/08/18(木) 09:11:42>C++とは無関係にCにも例外処理とfinallyが欲しい。
あるんだけど。
これまた、C++と無関係なCの例外処理だから、catchに困るんだけどね。
0038デフォルトの名無しさん
2005/08/20(土) 12:32:28:i|||||||||||||||
/''';:|||||||||||||||||l:、
/:i :||||||貞|||||||i `'! gotoやめれ〜・・ ・
/ :| :||||||||||||||||||l ノ!
| ヽ |||||||||||||||||||| :|
! !;ヽ:||||||||||||||||||||!; |
.__| |/|||||||||||||||||||||; |____
| _| .|/||||||||||||||||||||; |_____ .|
| |:='ヾ‐イ:||:|l|l|l|l|l|l|ll|||||' |::::::::::::| |
| |:::::::: | |;:|||||:l|:l|l|l|:l|:||||| イ=::::::| | ザー ……
| |:::::::::/ };|||||||||l|:l|l|l|:l|:|||.ノ:=:::::| |
| |:::=!川!;|||||!l|||l|:l|l||||ー'‐'.;:::::::::::| |
| |:::::::::!l.|ノ / ./:::::=:::::::| |
| |::::::::::::|::: ノ }::::::::=::::::| |
|  ̄ ̄~|::: 川リ ̄ ̄ ̄ ̄ |
| ̄l ̄ ̄|:::: | ~ ̄ ̄ ̄| ̄|
|_|:.::.:.:.:|::::: |:.:.:.:.:.::..:.:.:|_|
.:.:.:.:.:.:.:.:.:|;;;:::: .|.:.:.:.:.:.:.:.:.:..:.:.:.:
0039デフォルトの名無しさん
2005/08/20(土) 12:52:560040デフォルトの名無しさん
2005/08/21(日) 10:43:27必要としない言語は何でしょうか?
0041デフォルトの名無しさん
2005/08/21(日) 11:01:17「Fortranのような言語で使用されていたGOTO」というと、こんなのか?
ttp://xlsoft.com/jp/products/intel/cvf/docs/vf-html/az/az05_54.htm
0042デフォルトの名無しさん
2005/08/21(日) 11:13:07CやC++等ではGOTO使わないと思うのですが、GOTOを必要としない
ための構造というと、どういうものなのでしょうか?
もちろんFORやWHILEループ、SWITCH等はそれだとはおもうのですが。
0043デフォルトの名無しさん
2005/08/21(日) 14:27:40つ[COME FROM文]
ttp://www.fortran.com/fortran/come_from.html
0044デフォルトの名無しさん
2005/08/21(日) 14:43:51ダイキストラたんに聞いてこい。
0045デフォルトの名無しさん
2005/08/21(日) 23:26:50つ[構造化定理]
0046デフォルトの名無しさん
2005/08/22(月) 13:51:36>CやC++等ではGOTO使わないと思うのですが
あなたがどう思うかに関わらず
goto を必要とする人々はいます。
つーか、そういう質問をするスレではありません。
0047デフォルトの名無しさん
2005/08/25(木) 10:04:14継続(current-continuation)。
明示的に扱えるのはschemeくらいしか無いが。
0048デフォルトの名無しさん
2005/09/27(火) 12:40:41さりとてこれといった話題があるでもない。
0049デフォルトの名無しさん
2005/10/23(日) 18:03:340050デフォルトの名無しさん
2005/10/23(日) 18:07:55統計とってよ。
0051デフォルトの名無しさん
2005/10/23(日) 23:06:540052デフォルトの名無しさん
2005/10/23(日) 23:19:170053デフォルトの名無しさん
2005/10/23(日) 23:21:130054デフォルトの名無しさん
2005/10/23(日) 23:22:210055デフォルトの名無しさん
2005/10/23(日) 23:23:37定義はいらん。主観だからだ。
ヒューマンインターフェースチックな評価手法が妥当だと思われる。
0056デフォルトの名無しさん
2005/10/23(日) 23:25:07gotoを使わないコードはgotoを使うコードの100倍どころか
1000倍以上存在しているだろうから、
goto使った汚いコードよりgoto使わない汚いコードのほうがはるかに多いだろう。
0057デフォルトの名無しさん
2005/10/23(日) 23:27:22ただgotoを排除したがる人間は噂レベルの情報を鵜呑みにする思考停止したコーディングレベルの低い人間だからコードが汚い。
0058デフォルトの名無しさん
2005/10/24(月) 09:58:240059デフォルトの名無しさん
2005/10/24(月) 10:24:45統計とってよ。
0060デフォルトの名無しさん
2005/10/24(月) 13:55:43ご自身の主張をなされば良いでしょう
0061デフォルトの名無しさん
2005/10/24(月) 16:35:130062デフォルトの名無しさん
2005/10/24(月) 17:39:59具体的にどんな得があるというのか説明してください。
とか?
0063デフォルトの名無しさん
2006/01/05(木) 19:14:32それはないよ
ジャンプも知らない奴はデバッグできない
0064デフォルトの名無しさん
2006/01/05(木) 19:19:090065デフォルトの名無しさん
2006/01/05(木) 19:20:290066デフォルトの名無しさん
2006/01/05(木) 19:21:450067デフォルトの名無しさん
2006/01/09(月) 00:09:17プログラミングってのがそんな定型的な作業ならわざわざ人間様がやる必要はないはずです!><
0068デフォルトの名無しさん
2006/01/09(月) 00:20:44自分で考えているかどうかっつーより、思考停止しているだけの話だろ。
0069デフォルトの名無しさん
2006/01/10(火) 00:05:450070デフォルトの名無しさん
2006/01/15(日) 22:31:060071デフォルトの名無しさん
2006/01/16(月) 00:10:04同意するけど。
「何が美しいか」は完全に個人的な感覚に属する問題だからw
0072デフォルトの名無しさん
2006/03/03(金) 02:45:41どこか出してくれないかな。買うぜ。
0073デフォルトの名無しさん
2006/03/03(金) 21:13:04goto排斥原理主義者にとっては「gotoが使われている」=「最悪に醜い」だからなぁw
0074デフォルトの名無しさん
2006/03/05(日) 14:23:47確かミニマックスαβ探索だったと思う。
knuth先生だって必要最低限のgoto使うことがあるのだから、原理主義はやめるべき。
0075デフォルトの名無しさん
2006/05/03(水) 20:41:230076デフォルトの名無しさん
2006/05/03(水) 20:52:18ってか、knuth は goto 擁護論者の筆頭だろ。
0077デフォルトの名無しさん
2006/05/03(水) 21:42:420078デフォルトの名無しさん
2006/05/04(木) 17:16:510079デフォルトの名無しさん
2006/05/04(木) 22:28:29ハァハァ
0080デフォルトの名無しさん
2006/05/04(木) 22:53:190081デフォルトの名無しさん
2006/08/08(火) 15:08:54else if (B) { procY; procX; }
という処理をしたいのですが、procX、procYともに関数にするほどではないけれども、
上の位置にベタで書くにはちょっと無駄なタイプをしている気がするような処理なのです。
そこで
if (A) goto labelX;
else if (B) goto labelY;
else return;
labelY: procY;
labelX: procX;
という書き方をしました。procXとprocYの実装を一度しか書かないという縛りで
gotoを使わずに書く書き方があれば教えてくださいm(_ _)m
008281
2006/08/08(火) 15:09:56すみません。
0083デフォルトの名無しさん
2006/08/08(火) 15:14:08else if(!A) return;
procX;
普通にこれではマズいのか?
008481
2006/08/08(火) 15:57:02ぉぅっ。エレガントです…。思いつきませんでした。
実際のコードはAで判定できる箇所が多くかつ判定自体も速いので、
できればAの判定を先に持ってきたいのですが…。
先に書くべきでしたね。
0085デフォルトの名無しさん
2006/08/08(火) 16:58:17if(B) procY;
else return;
}
procX;
これで>>81と等価かな。
0087デフォルトの名無しさん
2006/08/08(火) 20:00:420088デフォルトの名無しさん
2006/08/08(火) 20:15:33俺ならこうやってネストしちゃうな。
(例として、条件がCまで、処理がprocZまでの三段階に増えたとする)
if(!A) {
if(!B) {
if(!C) return;
procZ;
}
procY;
}
procX;
0089デフォルトの名無しさん
2006/08/08(火) 21:43:380090デフォルトの名無しさん
2006/08/08(火) 22:43:540091デフォルトの名無しさん
2006/08/08(火) 22:54:29コードが短くも速くもならないなら
使うなとは言えるなw
0092デフォルトの名無しさん
2006/08/08(火) 23:20:51goto N0021;
return;
N0021:
〜
こういうコードならつい最近見た。Fortran から C に単純変換したものらしい。
こういうのがいたるところに orz
0093デフォルトの名無しさん
2006/08/08(火) 23:37:24実行形式から逆コンパイルした結果も
それと同様に goto だらけになったりするんだろうなぁ。
0094デフォルトの名無しさん
2006/08/09(水) 19:48:06では今度からきちんと指名 (無料) するように。
0095デフォルトの名無しさん
2006/09/06(水) 08:55:100096デフォルトの名無しさん
2006/09/06(水) 20:08:23それを破壊するような使い方をするなっていうのがgotoは悪派の主張なわけで、
機械語に落ちれば全部jmpだろってのはあんまり関係ないよな。
まあ、機械語レベルのjmp命令がif等の制御構文と同等のレベルで
読み書きできるような人間にゃgotoだろうがforだろうが関係ないのかもしれんが、
そうじゃない人もいるんでそういう人も思いやってくれよということで。
0097デフォルトの名無しさん
2006/09/28(木) 07:51:362.gotoはなるべく使わない方がいい
初心者に教えるなら1の方が正しいと思う。
0098デフォルトの名無しさん
2006/09/28(木) 08:24:3092年ごろこんな事やってた。
// ポートからマウス移動量を取得
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のコードだが、今となってはよく分からん。
見ての通り組み込みに近い処理なので、こういうウェイトが
必要な場合もあったんだろうな、たぶん。
0099デフォルトの名無しさん
2006/09/28(木) 19:48:42要するにnop代わりにgotoを使ったと…結構アレげだな
010098
2006/09/28(木) 20:20:07たぶん、そういう事をやりたかったのだと思う。
gotoはCで書けるけど、nopはasmブロックで書かなくてはならないので
gotoを選択したんじゃないかねー。「念のため」的なコードは書かない
主義なので、このgotoが無ければ動かない機種があったのだとは思う。
14〜15年前の若かりし日のコードなんで詳しい事は思い出せないなw
0101デフォルトの名無しさん
2006/09/28(木) 23:28:51約15年前のキミに言っておきたい。
そのコードにはコメントを入れておけとw
0102デフォルトの名無しさん
2006/09/28(木) 23:29:290103デフォルトの名無しさん
2006/09/29(金) 00:27:57010498
2006/09/29(金) 00:49:32まったくもってそうかも知れない。。。
ちなみに別な所はこんな感じ
// マウス割り込みを許可する
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
0105デフォルトの名無しさん
2006/09/29(金) 06:52:140106デフォルトの名無しさん
2006/09/29(金) 23:52:01マジックナンバー(0x7fdfとか)に対するコメントはgoodだが、
「ベクタの更新」はコメント要らない気がする。
ていうか、だからgotoにコメント入れろとw
0107デフォルトの名無しさん
2006/09/30(土) 02:16:480108デフォルトの名無しさん
2006/09/30(土) 02:17:28酔ってるんで許してくれ。
0109デフォルトの名無しさん
2006/09/30(土) 02:21:430110デフォルトの名無しさん
2006/12/01(金) 12:12:09gotoより強力な継続をバリバリに活用する方法を語るべきだろ。
0111デフォルトの名無しさん
2006/12/01(金) 12:34:53個人で開発するぶんには、完全に好みと言うか主観なわけで。
0112デフォルトの名無しさん
2006/12/04(月) 10:41:090113デフォルトの名無しさん
2006/12/23(土) 22:52:440114デフォルトの名無しさん
2006/12/24(日) 15:34:120115デフォルトの名無しさん
2006/12/24(日) 15:46:17当時のPC98ではそれが普通だったっつーか俺が覚えてるくらいだから広まってはいたんじゃないか
0116デフォルトの名無しさん
2006/12/25(月) 13:40:26「個人で開発するぶんには・・・」とか「***で事足りるから***は不要」とか
無意味だとは思わんかね?
0117デフォルトの名無しさん
2006/12/25(月) 14:15:250118デフォルトの名無しさん
2006/12/27(水) 00:36:010119デフォルトの名無しさん
2006/12/28(木) 15:51:000120デフォルトの名無しさん
2006/12/29(金) 00:38:20フルアセンブラで組むのはさすがにバカ→C言語を使う俺、最高→いやいやC++使いの俺、最高→(以下略
0121デフォルトの名無しさん
2006/12/29(金) 01:11:440122デフォルトの名無しさん
2006/12/29(金) 06:34:330123デフォルトの名無しさん
2007/01/02(火) 20:09:15if(A){
if(B){
procX;
} else {
procY;
}
} else {
procY;
}
ってなってたら判断回数を増やさずにprocYを
一箇所だけにしたい場合、
if(A){
if(B){
procX;
} else {
goto _Y;
}
} else {
_Y:
procY;
}
って書く以外にある?
0124デフォルトの名無しさん
2007/01/02(火) 20:28:59procX;
} else {
procY;
}
じゃいけないの?
0125デフォルトの名無しさん
2007/01/02(火) 20:55:360126デフォルトの名無しさん
2007/01/02(火) 20:58:390127デフォルトの名無しさん
2007/01/02(火) 21:07:49すげー
gotoは絶対禁止ってルール作った方がいいよw
0128デフォルトの名無しさん
2007/01/02(火) 21:20:41特に変わってないように見えるんだけど
0129デフォルトの名無しさん
2007/01/02(火) 22:20:23>>126
0130デフォルトの名無しさん
2007/01/02(火) 22:22:590131デフォルトの名無しさん
2007/01/03(水) 19:40:17ああそうか、 >>125=>>126 なのか。
>>124=>126 だと思ってた
0132デフォルトの名無しさん
2007/01/03(水) 20:01:01ネタ提供
0133デフォルトの名無しさん
2007/01/04(木) 20:07:360134デフォルトの名無しさん
2007/01/04(木) 21:43:080135デフォルトの名無しさん
2007/01/04(木) 21:49:000137デフォルトの名無しさん
2007/01/04(木) 22:17:010138デフォルトの名無しさん
2007/01/04(木) 22:33:010139デフォルトの名無しさん
2007/01/04(木) 23:21:510140デフォルトの名無しさん
2007/01/04(木) 23:23:35実際多少gotoつかったぐらいじゃ、可読性など落ちはしない
可読性を決める要因は、goto文の有無とは殆ど関係ないところにあるのにな
C++でgoto使うと、gotoでコンストラクタすっ飛ばすんじゃねえ
とか、コンパイラに怒られたりするな
goto文はなかなか教育的だ
0141デフォルトの名無しさん
2007/01/04(木) 23:35:33使わなきゃならない、もしくは使ったほうがいい場合が思い浮かばん
もっともJava使ってんだけどJavaにはgotoって無いよね?
0142デフォルトの名無しさん
2007/01/05(金) 01:10:070143デフォルトの名無しさん
2007/01/05(金) 01:23:310144デフォルトの名無しさん
2007/01/05(金) 01:25:250145デフォルトの名無しさん
2007/01/05(金) 01:27:060146デフォルトの名無しさん
2007/01/05(金) 01:33:27goto
ゴト行為はやめましょう
0147デフォルトの名無しさん
2007/01/05(金) 01:36:05詳しくもなにもそのまんまなだけ。Javaが現代COBOLだとか言われているのって聞いたことない?
"普通のプログラマはまともに使いこせない"という理由で他にも元ネタの言語であるC++からtemplateなどを排除し、
メモリ管理ひとつまともにできないプログラマの為にGCを標準装備したりしている。
0148デフォルトの名無しさん
2007/01/05(金) 01:37:48そういえばそういうコードはよく見るなw
0149デフォルトの名無しさん
2007/01/05(金) 11:29:43実際には goto なくてもスパゲッティ作れる人が大量投入されてる。
(そうじゃない人も多数いるけど。まぁどの言語もなんだが。)
0150デフォルトの名無しさん
2007/01/05(金) 11:50:030151デフォルトの名無しさん
2007/01/05(金) 12:02:540152デフォルトの名無しさん
2007/01/05(金) 21:53:430153デフォルトの名無しさん
2007/01/06(土) 17:24:39それだと評価順が変わるのでいいのか?
>>85
あとにコードが続いてたらreturnはまずい気が。
0154デフォルトの名無しさん
2007/01/06(土) 17:51:23詳しくのニュアンスに違和感を覚えるのは俺だけではないはずだ
0155デフォルトの名無しさん
2007/01/06(土) 18:46:18IT土方の現代コボラーさん、いらっしゃ〜い。
まぁ、IT土方なんて沢山いるから、違和感を覚えたのは君だけじゃないよ、きっと、うん。
0156デフォルトの名無しさん
2007/01/06(土) 19:10:460157デフォルトの名無しさん
2007/01/06(土) 19:14:03IT土方さん、いらっしゃい。
0158デフォルトの名無しさん
2007/01/06(土) 20:13:020159デフォルトの名無しさん
2007/01/06(土) 20:34:180160デフォルトの名無しさん
2007/01/06(土) 22:01:30コボラーにあやまれ! そこの現代コボラー!
0161デフォルトの名無しさん
2007/01/06(土) 22:15:190162デフォルトの名無しさん
2007/01/06(土) 22:38:270163デフォルトの名無しさん
2007/01/06(土) 22:44:530164デフォルトの名無しさん
2007/01/07(日) 16:28:26機能限定のラベル付きbreak、continueなら・・・
0165デフォルトの名無しさん
2007/01/07(日) 17:57:190166デフォルトの名無しさん
2007/01/08(月) 01:37:160167デフォルトの名無しさん
2007/01/08(月) 17:48:22Javaも書けるCOBOLプログラマはそもそもコボラーとは呼ばれない
0168デフォルトの名無しさん
2007/01/08(月) 18:02:11そのJavaコードがコボルチックだったりするからコボラーと呼ばれる。
コボラーが書いたC言語のコード見たらすごかった。
全部グローバル変数にしてw
0169デフォルトの名無しさん
2007/01/08(月) 18:38:23そりゃそうだ、現代コボラーと呼ばれるだけだから。
>>168
あるあるw
0170デフォルトの名無しさん
2007/01/08(月) 20:15:24コボルにはローカル変数無いの?
ちなみにおれ、コボル覚えられなかったんだよね…(´・ω・`)
C系よりよほど難しいと思うんだが。
0171デフォルトの名無しさん
2007/01/08(月) 20:23:1110年以上前にやったCOBOL85あたりではローカル変数って言う考え方は無かった
アドレスとかポインタとか意識する必要が無いからCOBOLのほうが圧倒的に簡単だと思うがの
0172デフォルトの名無しさん
2007/01/08(月) 20:26:56>ちなみにおれ、コボル覚えられなかったんだよね…(´・ω・`)
>C系よりよほど難しいと思うんだが。
ナカーマ( ・∀・)人(・∀・ )
俺もC++ならtemplateもバッチリ使いこなせてメタプロもできるし、
アセンブラやスクリプト系の言語も問題なくこなせるんだが、
COBOLだけはダメっす。
0173デフォルトの名無しさん
2007/01/08(月) 23:47:19逆に、それを使わないとグローバル変数しかない非常に貧弱な言語になってしまう。
0174デフォルトの名無しさん
2007/01/15(月) 23:15:26当時は、それが生産性が高かったんだよ。
0175デフォルトの名無しさん
2007/03/03(土) 23:23:27goto完全毛嫌い派ってそこんとこどうなん?
0176デフォルトの名無しさん
2007/03/04(日) 16:11:26あいつら馬鹿だから、もちろんそれも否定するよ。
0177デフォルトの名無しさん
2007/03/04(日) 16:29:080178デフォルトの名無しさん
2007/03/04(日) 16:53:2310行ぐらいのエラー処理
return ERROR;
}
if( is_error( next, hoge ) ) {
上のと同じ10行ぐらいのエラー処理
return ERROR;
}
if( is_error( next_next, hoge ) ) {
やっぱり同じ10行ぐらいのエラー処理
return ERROR;
}
以下続く
こんな感じの無残なコードは、何度も見かけたもんだがw
0179デフォルトの名無しさん
2007/03/29(木) 14:58:090180デフォルトの名無しさん
2007/03/29(木) 21:42:18それって catch ブロックの中から try ブロックの中あるいはその前へ飛ぶの?
0181デフォルトの名無しさん
2007/04/02(月) 23:02:59// 例外が起きそうな処理
break;
}
catch(e){
}
0182デフォルトの名無しさん
2007/04/02(月) 23:46:110183デフォルトの名無しさん
2007/04/03(火) 01:25:490184デフォルトの名無しさん
2007/04/29(日) 03:54:13returnが複数でも出口は一つだし。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だからな。
0185デフォルトの名無しさん
2007/04/30(月) 03:33:130186デフォルトの名無しさん
2007/04/30(月) 20:37:51subroutine 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
0187デフォルトの名無しさん
2007/05/01(火) 18:25:16よーし、おじさんはCOBOLつかっちゃうぞ。
PERFORM xxx THRU yyyy
0188デフォルトの名無しさん
2007/05/11(金) 20:53:360189デフォルトの名無しさん
2007/05/12(土) 00:08:15をショッキングピンクにしてgoto使いまくりだな。
0190デフォルトの名無しさん
2007/05/12(土) 18:15:530191デフォルトの名無しさん
2007/05/13(日) 11:32:44goto fuck189 ;
fuck189 :
0192デフォルトの名無しさん
2007/07/21(土) 19:14:32if(a && b && c){
処理1
goto jmp;
} else if(d){
処理2
}
if(a && b){
jmp:
処理3
}
0193デフォルトの名無しさん
2007/07/21(土) 20:37:51a 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要らないじゃん。
0194デフォルトの名無しさん
2007/07/24(火) 10:55:01しかし、真理値表を書かないと結論が出ない>>193も大概だがな。
0195デフォルトの名無しさん
2007/07/24(火) 20:10:20if(a && b){
を省略したいってことじゃないかな。auto a,bだとして。
コンパイラにやって欲しい処理だ。
0196デフォルトの名無しさん
2007/10/28(日) 23:46:38うぜぇwwwwwgotoアレルギーうぜぇwwwwwww
0197デフォルトの名無しさん
2007/10/29(月) 21:33:37もともと人間関係うまくいってなかっただけじゃね?
0198デフォルトの名無しさん
2007/11/02(金) 14:45:06うぜぇwwwww無能下っ端うぜぇwwwwwww
って感じだろ
0199デフォルトの名無しさん
2008/02/09(土) 17:53:27> 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使わないわ、というオチは禁止ね。
0200デフォルトの名無しさん
2008/02/09(土) 17:55:48リソース解放のためにgotoって、、、不必要に汚ないコードができるだけだろ
0201デフォルトの名無しさん
2008/02/09(土) 17:59:11goto使わないともっと汚くなるんじゃない。
0202デフォルトの名無しさん
2008/02/09(土) 18:00:29なってるのを見たとき、「素直にgoto使え」とオモタ。
do {
if (hoge) {
break;
}
} while (0);
0203デフォルトの名無しさん
2008/02/09(土) 18:05:49はっきり言って呼び出し側で解放したほうがいい典型例。
呼ばれた側で解放したければ、この関数を呼んでから
解放するような関数を書けと言いたい。
> 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);
> }
> ...
> }
0204デフォルトの名無しさん
2008/02/09(土) 18:07:55breakで外側のループを脱出するために、switchで書いたほうが良さげな
内側の多分岐がif/else if/else ifになってたりするとgoto使え、だな。
0205デフォルトの名無しさん
2008/02/09(土) 18:12:33関数がエラーで返った場合、オブジェクトに変更が加えられていないことが
保証されるとする場合、それじゃだめやね。エラーが発生したら、まき戻す
処理が必要になる。
0206デフォルトの名無しさん
2008/02/09(土) 18:15:49エラーの発生箇所によって巻き戻し方が違うんなら、どのみちgotoでは処理できん。
巻き戻し方が同じなら、goto先で巻き戻すのもreturn先で巻き戻すのも同じ。
と思うのだが。
0207デフォルトの名無しさん
2008/02/09(土) 18:19:37>エラーの発生箇所によって巻き戻し方が違うんなら、どのみちgotoでは処理できん。
でもgoto使ったほうがスッキリかけるでしょ。
>巻き戻し方が同じなら、goto先で巻き戻すのもreturn先で巻き戻すのも同じ。
APIの使い勝手が大きく違うじゃない。
0208デフォルトの名無しさん
2008/02/09(土) 18:57:34いや、だからさ、APIとしては呼び出す側は何もしなくていいの。
処理とリソース管理を分離して実装しましょう、ってだけの話。
なんで無理にgotoなんて使いたがるのか、ワケワカラン。
0209デフォルトの名無しさん
2008/02/09(土) 19:02:43抽象論が多くてわかりにくい。具体的なコード書いて改善してみてくれ。
0210デフォルトの名無しさん
2008/02/09(土) 19:12:490211デフォルトの名無しさん
2008/02/09(土) 19:30:27transactional memoryって効率を求めるとすると、なにかしら約束事があったほうがよいんだろうけど。
完全に透過に見える実装にしたいならos側からアプローチしたほうが楽な気もする。
0212デフォルトの名無しさん
2008/02/09(土) 20:28:38結局「gotoはダメ!って教えられたからダメダ!」で、思考停止したダケの人なのね。
>>211
>巻き戻し処理って、本当に巻き戻すのか単にコピーをしておくのかどっちが多いの?
場合による。例えば、ある処理が1,2,3,4の順番で実行することがきめられてる場合
(1を実行しないと、2が実行できない場合)、実際に実行して3でエラーが発生したら、
1,2を巻き戻す処理が必要だし。
OS側からのアプローチってどんなアプローチ?
0213デフォルトの名無しさん
2008/02/09(土) 20:34:39同一関数内でしか影響のないものによくもまあそんなに熱くなれるなw
これ眺める限りさほど奇天烈な使い方があるようにも思えないが。
http://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
0214デフォルトの名無しさん
2008/02/09(土) 20:43:49>gotoなんて設計に何の影響もない
gotoは設計に影響ないとしても、APIが保障するリソース管理の方針は
大いに影響がある。
下位のモジュールがエラーを返した場合、それ以下のリソースには影響
がなかったことが保障されるのであれば、モジュールは自身の管理する
モジュールを開放すればよいことが保証される。
例外とデストラクタの伝播のようなもの。
0215デフォルトの名無しさん
2008/02/09(土) 20:44:260216デフォルトの名無しさん
2008/02/09(土) 20:44:430217デフォルトの名無しさん
2008/02/09(土) 20:47:440218デフォルトの名無しさん
2008/02/09(土) 20:49:13どうせ機械語のジャンプ命令に置き換わるだけなんだから。
ところがインタプリタ言語にとっては 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 は大敵なんか長文つかれた
どうせ誰も読んでないだろなめんどくせぇもうやめたうんこちんちん!
0219デフォルトの名無しさん
2008/02/09(土) 20:52:59こういう話ではないの?
別にどっち使ったからと言って使い勝手というか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);
}
0220デフォルトの名無しさん
2008/02/09(土) 20:57:27まで読んだ。
0221デフォルトの名無しさん
2008/02/09(土) 20:58:350222デフォルトの名無しさん
2008/02/09(土) 20:59:29まだJavaをインタプリタ言語と呼んでる人がいるんだね。
正直驚いた。
0223デフォルトの名無しさん
2008/02/09(土) 21:06:34機械語に翻訳されりゃasmリストのjmpと一緒じゃん。
jmp命令を使えないcpuって不便そう。
0224デフォルトの名無しさん
2008/02/09(土) 21:07:45goto議論に熱中する奴は生産性が低い
goto :eof
0225デフォルトの名無しさん
2008/02/09(土) 21:13:36Javaのインタプリタのレベルを混同してるヴァカが現存してることに驚いた。
Javaのforでスタックなんか使ってねーっての。
0226デフォルトの名無しさん
2008/02/09(土) 21:24:38その2のほうさ、管理するリソースが1つだけならまだマシだが、4つも5つも
管理している場合、そのためのサブ関数が4つも5つもできることに
なるわけだが・・・。まぁgoto毛嫌いしている人には、そっちのほうが
ウレピイのかもしれんが。
0227デフォルトの名無しさん
2008/02/09(土) 21:28:22お前らもっとでかいモニタ使えよ。
int ret = 0;
if(init1())
{
if(init2())
{
if(init3())
{
ret = execute();
fin3();
}
fin2()
}
fin1();
}
return ret;
0228デフォルトの名無しさん
2008/02/09(土) 21:45:05そのコードは、俺の頭ではツライ。
0229デフォルトの名無しさん
2008/02/09(土) 21:54:45「JIT」 について、もうすこし学びましょうね。
0230デフォルトの名無しさん
2008/02/09(土) 22:01:57Javaのバイトコードで、どういう風にforとスタックが関係するのか、
説明していただけますかね?
0231デフォルトの名無しさん
2008/02/09(土) 22:26:440: 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 );
}
}
なんというひねりのないコード。
0232デフォルトの名無しさん
2008/02/09(土) 22:31:520233デフォルトの名無しさん
2008/02/09(土) 22:32:23{
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
ただしキャッチしなければパレントクラスに飛ぶというのは例外の普通の使い方。
やってる事自体はあまり変わらないけど、言語が持ってる機構は有効に使ったほうが綺麗になるって感じなのかな?
0234デフォルトの名無しさん
2008/02/09(土) 22:40:13BASICインタプリタで起きるようなFOR-NEXTの対応のズレの
ようなことと、関係してくるんですか、と。
(BASICのFOR-NEXTは、FORを実行する時、NEXTにぶち当たったら
戻るためのポインタをスタックに積んでいるわけですが、それに
相当するコードはどこ?)
それに、
あるインストラクションを実行する時点での、スタックトップは
コンパイル時に確定できますよね?
仮にgotoで気ままに飛んだとしても、飛ぶ時に適宜調整すれば
問題ないわけで。
0235デフォルトの名無しさん
2008/02/09(土) 22:41:340236デフォルトの名無しさん
2008/02/09(土) 22:50:350237デフォルトの名無しさん
2008/02/09(土) 23:26:01javac ⇒ バイトコード ⇒ インタプリタが実行
0238デフォルトの名無しさん
2008/02/09(土) 23:36:270239デフォルトの名無しさん
2008/02/09(土) 23:37:550240デフォルトの名無しさん
2008/02/09(土) 23:40:09まぁ、新しくプログラミングの世界に入ってくる人たちが、そういう疑問を持つことは
当然というか、ソウであって欲しいものナわけで。「先人達が行ってたから」といって
自分の思考を停止して妄信するよりははるかに良い。
0241デフォルトの名無しさん
2008/02/09(土) 23:40:59釣りとしか思えないよこのインタプリタ厨。
0242デフォルトの名無しさん
2008/02/10(日) 12:29:30gotoのスレでパフォーマンスの話をして、釣れると思っているね
0243デフォルトの名無しさん
2008/02/10(日) 14:58:54変数宣言なし&局所変数なしの言語の場合、変数管理表と戻り先(jump先)管理表を使うのが普通だろ?
0244デフォルトの名無しさん
2008/02/10(日) 18:24:27> そもそも、大域変数しか使えない言語で「変数をスタックに積むって」ありえるのか?
>
> 変数宣言なし&局所変数なしの言語の場合、変数管理表と戻り先(jump先)管理表を使うのが普通だろ?
BASICのFOR-NEXT制御の場合、変数名をタグとして、
FOR x IN ... 〜 NEXT x を対応させる処理系がある。
(NEXTのあとの変数名はreminderで、処理系は無視するものもある)
>>218 が得意そうに解説してるBASIC処理系では、NEXT x の x の
変数名を見て、対応するFORの処理に戻るような処理系なんだろうが、
そのような場合、FORの場所だけでなく、変数名もフレームに覚えておく
必要がある。変数の値じゃなくて、変数名そのものか、ポインタかを
タグとして書いておくわけやね。
0245デフォルトの名無しさん
2008/02/10(日) 18:53:17単純にスパゲッティ化するのを防ぐだけじゃなく、
スタックを開放する作業を確実にやるためだったってことだな。
0246デフォルトの名無しさん
2008/02/10(日) 18:55:43goto使ってスパゲッチなコードを書けるんだよw
0247デフォルトの名無しさん
2008/02/10(日) 19:02:490248デフォルトの名無しさん
2008/02/10(日) 19:04:48はgotoを使ったスパゲティコードに関して十分知っているわけでしょ。
そういう意味では、goto邪悪論の目標は達していると思う。
それなのに会社のコーディング規約でgotoを禁止するのは、どうみても
自社のプログラマを信用していないとしか思えない。
goto禁止したところで、do { if (hoge) break; } while(0)で、gotoに近いことを
やろうと思えば出来てしまうわけだぜ。そういう会社がやるべきは、社員の
教育であってgoto撲滅では決してない。
0249デフォルトの名無しさん
2008/02/10(日) 19:29:200250デフォルトの名無しさん
2008/02/10(日) 19:30:070251デフォルトの名無しさん
2008/02/10(日) 19:35:51なんちゃって。
0252デフォルトの名無しさん
2008/02/10(日) 19:49:17その2のほうさ、管理するリソースが1つだけならまだマシだが、4つも5つも
> 管理している場合、そのためのサブ関数が4つも5つもできることに
> なるわけだが・・・。
>>219の2のどこをどう考えればリソース毎にサブ関数が必要になると思えるのやら。
hoge()の中身が増えるだけだろ。
まさかhoge_implのほうがリソース管理してるとでも読んだのか?
0253デフォルトの名無しさん
2008/02/10(日) 19:51:00goto邪悪論も有害だが、goto気軽に利用論はもっと有害だな。
あくまで汚ないことをやっているという自覚を持って使うべきだ。
0254デフォルトの名無しさん
2008/02/10(日) 20:06:090255デフォルトの名無しさん
2008/02/10(日) 20:16:53いや、そうだな。だがしかし4つも5つもリソースがあるばあいはどうすんの。
そもそもその手法じゃダメやん。
0256デフォルトの名無しさん
2008/02/10(日) 20:25:56そうじゃないなら、やっぱりサブ関数をわけて依存関係を
チェインさせる?正気の沙汰じゃないな。
0257デフォルトの名無しさん
2008/02/10(日) 20:30:00static 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
}
で何か?
0258デフォルトの名無しさん
2008/02/10(日) 20:34:55mallocならいいが、
>例えば、ある処理が1,2,3,4の順番で実行することがきめられてる場合
>(1を実行しないと、2が実行できない場合)、実際に実行して3でエラーが発生したら、
>1,2を巻き戻す処理が必要だし。
この場合はどうする
0259デフォルトの名無しさん
2008/02/10(日) 20:38:030260デフォルトの名無しさん
2008/02/10(日) 20:39:28書いてミレヨ
0261デフォルトの名無しさん
2008/02/10(日) 20:41:43おいおい、どんな巻き戻しが必要なのか具体的なコードを出すのが先だろw
0262デフォルトの名無しさん
2008/02/10(日) 20:45:170263デフォルトの名無しさん
2008/02/10(日) 20:47:47if (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;
0264デフォルトの名無しさん
2008/02/10(日) 20:49:18それのどこが巻き戻しのコード?
0265デフォルトの名無しさん
2008/02/10(日) 20:53:080266デフォルトの名無しさん
2008/02/10(日) 20:53:26initが失敗したら、finishでまき戻せると思ってくれ。
0267デフォルトの名無しさん
2008/02/10(日) 20:54:00static 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;
}
で何か?
0268デフォルトの名無しさん
2008/02/10(日) 20:57:000269デフォルトの名無しさん
2008/02/10(日) 20:58:18goto避ける為にがんばりすぎだなw
大体ローカル変数にアクセスできねぇし
いちいち引数で渡しますか。
C++厨のtry/finallyなんていらねぇ!
がんばればclassのコンストラクタ、デストラクタで何とかなる!みたいだなw
0270デフォルトの名無しさん
2008/02/10(日) 21:01:220271デフォルトの名無しさん
2008/02/10(日) 21:02:23回復に4つも別々の関数呼ばにゃならんコードな時点で糞ケテーイ
0272デフォルトの名無しさん
2008/02/10(日) 21:06:090273デフォルトの名無しさん
2008/02/10(日) 21:09:51大抵のものは誰かがラッパー作っているし、
ないものは確かに作ることもあるけど、面倒ならboost::shared_ptrに任せられるし。
0274デフォルトの名無しさん
2008/02/10(日) 21:09:56ローカル変数うんぬんを言うのなら、A_finishとかが無引数なのはおかしいだろ。
0275デフォルトの名無しさん
2008/02/10(日) 21:12:22禿同。こんな事にgotoとか使ってる奴はboost時代に乗り遅れてる。
0276デフォルトの名無しさん
2008/02/10(日) 21:18:15と思ったらunique_ptrは削除子していできるのか?
0277デフォルトの名無しさん
2008/02/10(日) 21:50:35それってさ、一連の処理を分割してしまってるわけだけど、initしてからfinishする
までの処理を。逆にメンテナンスせいが落ちそうじゃない。goto使うよりも。
0278デフォルトの名無しさん
2008/02/10(日) 21:52:090279デフォルトの名無しさん
2008/02/10(日) 21:55:02アフォが見てもわかる用途って具体的には?
0280デフォルトの名無しさん
2008/02/10(日) 21:57:24A_initって名前が悪いんじゃねーかな。
たぶん>>263はA_init()は何か実際に処理をさせたいから"巻き戻し"なんて言ってるんじゃ。
だとするとA_init()はA_proc()と読みかえたほうがいいだろ。
そうすれば>>267は>>208が言うように処理とリソース管理の分離というデザインになる。
0281デフォルトの名無しさん
2008/02/10(日) 21:59:20278じゃないけど多重breakとかかな?
多重breakできる言語が少しうらやましい。
0282デフォルトの名無しさん
2008/02/10(日) 22:01:200283デフォルトの名無しさん
2008/02/11(月) 00:59:43ftraceコマンドとかあるみたいだけど、どうも共有ライブラリとかの
ファンクションコールをうまくトレースしてくんないのよね。
0284デフォルトの名無しさん
2008/02/11(月) 01:21:390285デフォルトの名無しさん
2008/02/11(月) 02:46:36bool 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文を使わない方法って何があるのよ
0286デフォルトの名無しさん
2008/02/11(月) 02:57:07やりすぎかもしれんが・・・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;
}
0287デフォルトの名無しさん
2008/02/11(月) 03:22:22gotoいらないじゃん
0288デフォルトの名無しさん
2008/02/11(月) 03:25:46別にgotoなんて無くてもいいんだが、分かりやすいことが重要じゃない?
極論すればwhile()だけで全ての制御構造は書けるわけだし。非常に面倒くさくなるけど。
>>285で、InitHogeAudioの引数の一つがInitHogeGraphicsの結果だったりするみたいな感じで
からみあってたりすると結構面倒くさいんじゃない?
0289デフォルトの名無しさん
2008/02/11(月) 03:31:26「gotoは設計に関係ない」っていったやつでてこい。プログラムのアマチュア
が設計だけして、実装まるなげは本当に排除すべきだ。
0290デフォルトの名無しさん
2008/02/11(月) 03:41:18いやまぁ、さきの例はそれぞれのinitとuninitが関数だからそうだけど、
たとえば単なる値の設定とそれをクリアするのに関数を用意するのはバカらしい。
それならgoto使うとかいう選択は十分にあると俺は思うな。
0291デフォルトの名無しさん
2008/02/11(月) 07:48:560292デフォルトの名無しさん
2008/02/11(月) 08:07:300294デフォルトの名無しさん
2008/02/11(月) 08:51:090295デフォルトの名無しさん
2008/02/11(月) 10:50:15確かにまとめてひとつの関数にすれば数は少なくてすむが、
ラベルの数が多すぎるだろ。
>分かりやすいことが重要じゃない?
分かりにくいんだよ。
制御が入ると、その制御全部チェックしないといけないだろ。
それ、順番間違ったらそれだけでバグになるだろ。
0296デフォルトの名無しさん
2008/02/11(月) 11:05:02ラベルの代わりにフラグ変数を使うことになるだけじゃないか?
--
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するしかない気がする。
0297296
2008/02/11(月) 11:10:430298デフォルトの名無しさん
2008/02/11(月) 12:01:53> かつ、何らかの事情でinit()やrollback()を同一関数内に
> まとめて書く必要がある場合(式でなく文になる場合)
どんな状況を言いたいのかサパーリわかりません。
ちゃんとした日本語か、仮でいいからCか、どっちかで書いてくれ。
0299デフォルトの名無しさん
2008/02/11(月) 12:02:31これで「わかりやすい」と思うのは書いた本人だけだと思うぞ。
0300デフォルトの名無しさん
2008/02/11(月) 12:05:02オマエラ本当にマなのか?w
0301デフォルトの名無しさん
2008/02/11(月) 12:12:09それにチームでコードを書いた経験もほとんど無いように見受けられる。
素人はgoto避けたほうが身のためだよ。
0302296
2008/02/11(月) 12:16:53でも>>267や>>286みたいに、goto回避を目的としたトリッキーなコードを書くくらいなら
イディオムとして理解できるgotoは素直に利用する方がよっぽどわかりやすい
0303デフォルトの名無しさん
2008/02/11(月) 12:19:410304296
2008/02/11(月) 12:21:26簡単な例で言えば>>267のコードで
hoge_implおよび*_initをインライン化する必要が出たら
フラグをreturnしてswitchで受けるっていうのは無理だわな、
そんときはどうする?ってこと
0305デフォルトの名無しさん
2008/02/11(月) 12:21:45APIから抜ける前にチェックを「確実に」入れるための簡単なtipsなのだが。
0306デフォルトの名無しさん
2008/02/11(月) 12:23:14Get:UnGetと書くマがこの世に実在してだな…
>>302
IDEでデバッグできる環境なら多少強引でもgoto回避したほうが追いやすいよ。
0307デフォルトの名無しさん
2008/02/11(月) 12:23:270308296
2008/02/11(月) 12:23:33LABELを定義してgoto label するのと
フラグ定数をdefine してreturn -> switch するのと何が違うんだ?
0309296
2008/02/11(月) 12:29:49for (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;
0310デフォルトの名無しさん
2008/02/11(月) 12:29:50>>298に>>304で答えたことになると思ってんの?
0311デフォルトの名無しさん
2008/02/11(月) 12:30:230312296
2008/02/11(月) 12:32:260313296
2008/02/11(月) 12:34:10そちらも具体的なコードでよろしく
関数分割は無しな。
「美しい設計」にしたがって自由にリファクタリングできる業務なら
議論の余地なくgotoなんていらないだろ。ってかそんな環境ならC使わないし。
0314デフォルトの名無しさん
2008/02/11(月) 12:35:43int 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;
}
で何がこまる?
0315デフォルトの名無しさん
2008/02/11(月) 12:38:160316デフォルトの名無しさん
2008/02/11(月) 12:38:19お前な、はっきり言わせてもらうと、馬鹿じゃねーのか?
「goto使わずに、関数分割してリソース管理と処理本体を分離する設計にしろ、
そのほうがgotoでスパゲッティにせずにリソースの解放を確実に実行できる。」
という主張に大して「関数分割はなしな」じゃ議論から逃げているとしか
受け取りようがない。
0318デフォルトの名無しさん
2008/02/11(月) 12:46:08話はそれからだ。
0319296
2008/02/11(月) 12:47:280320デフォルトの名無しさん
2008/02/11(月) 12:48:320321デフォルトの名無しさん
2008/02/11(月) 12:50:540322320
2008/02/11(月) 12:51:070323デフォルトの名無しさん
2008/02/11(月) 12:52:170326デフォルトの名無しさん
2008/02/11(月) 13:08:400327デフォルトの名無しさん
2008/02/11(月) 13:11:220328デフォルトの名無しさん
2008/02/11(月) 13:33:250329デフォルトの名無しさん
2008/02/11(月) 13:34:460330デフォルトの名無しさん
2008/02/11(月) 13:37:100331デフォルトの名無しさん
2008/02/11(月) 13:41:260332デフォルトの名無しさん
2008/02/11(月) 13:41:31A_FAILED
case A_FAILED
A_finish()
ソース上ばらばらなのに意味上は相変わらず密結合
メンテナンス性を悪化させる似非リファクタリングの典型
0333デフォルトの名無しさん
2008/02/11(月) 13:45:55文句があるのなら>285に言ってくれw
0334デフォルトの名無しさん
2008/02/11(月) 13:48:45「ソース上ばらばら」は誉め言葉だよwww
0335デフォルトの名無しさん
2008/02/11(月) 13:53:31A_FAILEDを別途#defineしなければならない分だけ管理要素が増えている
>>334意味不明
0336デフォルトの名無しさん
2008/02/11(月) 13:57:34gotoであちこちのブロックから飛びまくるのに比べれば
> hoge_impl()に処理を分割した分だけ距離が離れている
> A_FAILEDを別途#defineしなければならない分だけ管理要素が増えている
なんて取るに足らない瑣末な問題だな
0337デフォルトの名無しさん
2008/02/11(月) 13:59:07意味上の結合を維持したまま、処理本体とリソース管理を分離できている。
メンテナンス性を向上させるリファクタリングの典型
0338デフォルトの名無しさん
2008/02/11(月) 13:59:47goto版も>>267もどちらも駄目だということ
公開関数であるhoge()から内部一式全てを一人で管理するような小さなモジュールなら
goto版でも>>267でもどちらでも問題にならないだろう。
そうでない規模ならgoto版も>>267もどちらも簡単に破綻する
0339デフォルトの名無しさん
2008/02/11(月) 14:01:14どの部分が処理本体でどの部分がリソース管理なのかが意味不明ということ
0340デフォルトの名無しさん
2008/02/11(月) 14:03:330341デフォルトの名無しさん
2008/02/11(月) 14:07:14つまり、巻き戻し処理のためにgotoのほうが遥かに便利という、
大元の>>199の引用元の主張は×ね。
0342デフォルトの名無しさん
2008/02/11(月) 14:08:150343デフォルトの名無しさん
2008/02/11(月) 14:12:21#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;
// }
0344デフォルトの名無しさん
2008/02/11(月) 14:14:320345デフォルトの名無しさん
2008/02/11(月) 14:17:04あちこちのブロックから飛びまくるのはgotoを無秩序に使う結果
>>267で何かgotoの重要な欠点が解決されたと思う人は
343と267で何が違うのか考えてみればよい
0346デフォルトの名無しさん
2008/02/11(月) 14:21:27そうなんだよ。>>343の//で印(w)をつけてくれた部分が重要なんだよ。
あと、#defineの行もミソだね。
こんなつまらんgotoを使わなくても関数で出口を纏めることができるという好例だ。
0347デフォルトの名無しさん
2008/02/11(月) 14:22:29嫌goto厨?濫用を嫌う人は何人かいるみたいだけど、
gotoを全否定してる人はいないんじゃない?俺も含めて。
0348デフォルトの名無しさん
2008/02/11(月) 14:31:06gotoさえ使えば綺麗にまとまる好例とも言えるな
0349デフォルトの名無しさん
2008/02/11(月) 14:39:18それがあれば「関数を勝手に作れないからgoto使う」って人も、gotoなしでいけるんじゃないかな。
0350デフォルトの名無しさん
2008/02/11(月) 14:44:26定石的な使い方すら絶対に許さないと必死になっているように見受けられるがw
0351デフォルトの名無しさん
2008/02/11(月) 14:52:360352デフォルトの名無しさん
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;
0353デフォルトの名無しさん
2008/02/11(月) 15:10:22>>352で参照。
まあ、専用ブラウザならレス番選択して右クリしたら見れる。
0354デフォルトの名無しさん
2008/02/11(月) 16:02:48実装上の都合と設計上の都合の区別もつかないとは。
まあ俺も>>267みたいなコードはまず書かないけどなw
0355デフォルトの名無しさん
2008/02/11(月) 16:11:33breakの数が多いのはなんでなんだぜ
0356デフォルトの名無しさん
2008/02/11(月) 16:13:430357デフォルトの名無しさん
2008/02/11(月) 16:29:18hoge_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使うよ。イディオムだろこんなの。
0358デフォルトの名無しさん
2008/02/11(月) 17:02:46>hoge_impl()だけ切り出して巻き戻しがベタ書きというのは本能的に気持ちが悪い。
まぁハゲドウw
0359デフォルトの名無しさん
2008/02/11(月) 17:05:54俺も
> hoge_impl()だけ切り出して巻き戻しがベタ書きというのは本能的に気持ちが悪い。
に禿同。
こんなつまらんことにgotoを使ったりはせんが。
2重breakには使うけどな。
0360デフォルトの名無しさん
2008/02/11(月) 17:31:18whileを、breakで好きな段階で抜けられるブロックとして使うため、2度目の実行をしないためにループの最後にbreakを入れる。
これはgotoの代替として普通使ってると思うけど。
まあ、ループしないのにwhile使うのはおかしいって言う人もいるけど。
んで、while 1として無限ループにしたほうが、breakで抜けますよってのを明示できるけど、
flgを入れてみたのは、全体の流れを制御するflgだと明示しつつ、
最後にbreak入れ忘れた場合でも途中でリソース不足とか2度実行のエラーになれば抜けれて安全かなと。
0361デフォルトの名無しさん
2008/02/11(月) 17:38:15配列から探して何番目かを返すようなのは、エラーとNULLが逆になる。
基本だよね。
参照は
>>361
// 主処理
while(flg){
if error{
flg = false;
break;
}
return flg; // 常にtrueが返される。
}
// エラー処理
return flg; // エラーなのでfalseが返される。
0362デフォルトの名無しさん
2008/02/11(月) 17:46:240363デフォルトの名無しさん
2008/02/11(月) 17:57:38なんで do { ... } while (false) にしないんだぜ?
0364デフォルトの名無しさん
2008/02/11(月) 18:00:24> CPUが java のバイトコードを直接実行していると勘違いしている人が多いですね。
> javac ⇒ バイトコード ⇒ インタプリタが実行
バイトコードを実行するのはインタプリタではなくてVM(仮想計算機)だ。
つまり、インタプリタじゃなくてエミュレータな。
0365デフォルトの名無しさん
2008/02/11(月) 18:01:480366デフォルトの名無しさん
2008/02/11(月) 18:07:010367デフォルトの名無しさん
2008/02/11(月) 18:19:53while (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;
0368デフォルトの名無しさん
2008/02/11(月) 18:23:45result = 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;
0369デフォルトの名無しさん
2008/02/11(月) 18:32:130370デフォルトの名無しさん
2008/02/11(月) 18:43:16こういう議論で野次馬からウザいと思われるかどうかは気にしませんw
0371デフォルトの名無しさん
2008/02/11(月) 18:56:38ああそんなのもあったっけ。
doではじめるとwhileに書き換えられたことがあった。
それはともかく、
前処理に失敗したら主処理を飛び越して後処理ってするとき、
処理する前に判断しないとだめだろ。
それに、break忘れのリスクもあるが、戻り値の初期化忘れっていうミスを防ぐ効果もある。
どちらかというと正常か異常かを錯誤するほうが重大なミスだから
whileよりdoがよいということはないと思う。
あと、エラーなら抜けるっていうまったく同じ目的のためのブロックだから、
前処理も主処理も同じ構文使ったほうがわかりやすいしミスしにくい。
とにかく頭使わずにミスなく書くのが目的だから。
0372デフォルトの名無しさん
2008/02/11(月) 19:00:40>とにかく頭使わずにミスなく書くのが目的だから。
そか。俺は頭使わずにミスなく読めるコードを書くのが目的だから
gotoで書く方が読み易い場面ではgotoを使うんだぜ
0373デフォルトの名無しさん
2008/02/11(月) 19:11:03はっきり分けられてるから簡単だよ。
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が分かりにくくなる理由は、飛び元と飛び先に同じラベル名が出てきてどっちからどっちに飛んでるかいちいち確認が必要だからだよ。
0374デフォルトの名無しさん
2008/02/11(月) 19:17:57少なくともGNUはインタプリタと呼んでいるようだ。
http://gcc.gnu.org/onlinedocs/gcj/Invoking-gij.html
>gij is a Java bytecode interpreter included with libgcj.
0375デフォルトの名無しさん
2008/02/11(月) 19:18:04これは凄い
0376デフォルトの名無しさん
2008/02/11(月) 19:20:54こんなコード書くやつがいたら、殴ってしまうかもしれない。ペシペシ
0377デフォルトの名無しさん
2008/02/11(月) 19:22:580378デフォルトの名無しさん
2008/02/11(月) 19:25:23お前らヒマだな
0379デフォルトの名無しさん
2008/02/11(月) 19:27:03if (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;
こっそりこういういたずらをしていく人がいるんだ。世の中には。
そういうやつと一緒に仕事しなかった人は幸せもん。
携帯開発の軍曹の話は有名らしいが、
あの戦場を生み出すのがこういうことをする人間なんだ。
本当に単なるミスであの地獄が生まれるとか思ってないよな?
ああいうのをやるやつっていうのは、
周りを引きずりおろすことで自分を立派に見せてのし上がろうとする暴力主義のやつら。特に福岡県出身のやつら。
0380デフォルトの名無しさん
2008/02/11(月) 19:30:260381デフォルトの名無しさん
2008/02/11(月) 19:31:09GOTO 使わず関数使えというのは、太古の昔、非構造化プログラミングから
構造化プログラミングへのパラダイムシフトが現在進行形だった時代の
いわば「スローガン」だと思います。
時代は移り、今は構造化プログラミングが当たり前の時代です。
そのような現在のプログラマが、私たちの先祖が使っていた GOTO 730 と
関数内部での goto FAILED; を同列に論じてしまうことに
私はいささかの疑問を感じるのです。
0382デフォルトの名無しさん
2008/02/11(月) 19:33:42なんだそのビ妙〜な私怨はw
0383デフォルトの名無しさん
2008/02/11(月) 19:35:120384デフォルトの名無しさん
2008/02/11(月) 19:38:12小さい関数ならいいが、ブクブク太った巨大関数の中でホイホイと飛ばれると
読むほうは疲れるんだよ。多重breakとか限定された状況ならまだ許せるけどな。
特に考えもせずにgoto多様する馬鹿にかぎって巨大な神関数をつくりたがる。
0385デフォルトの名無しさん
2008/02/11(月) 19:38:40そういうやつと仕事したことないけど、そのコードだとコンパイラ警告
でるんじゃないか?B_FAILEDの行が意味を成していないとか何とか。
擬似コードにつっこむのもあれだが。
0386デフォルトの名無しさん
2008/02/11(月) 19:39:47飛び先が一箇所ならいいと思うよ。
>>379みたいないたずらされても、ループするか飛ばすかのどっちかしかないから。
goto FAILED;とかは関数につき1回だし普通は最後に飛ぶだけだし問題になることはないからね。
>>383
証拠が残せるようなシステム使ってないから。
>>382
福岡はそういう地域なんだよ。
完成品チェックって横槍いれて完成してたら強奪。奪ったらパソコン初期化して証拠隠滅。
毎度毎度そればっかり。
完成してたら強奪→正社員
奪われるばっかりの人→派遣社員
いや、別に比喩してるわけじゃなくてね。
社員同士でもそうなんだよ。
0387デフォルトの名無しさん
2008/02/11(月) 19:41:27適切に関数分割できない馬鹿だから
巨大関数の中をgotoで飛び回るコードになる。
そういう馬鹿に言うべきは「処理のまとまりごとに関数に分けろ」であって
そいつに「gotoを使うな」と言ったところで
今度は巨大なネストをフラグで引き回すコードを書くだけ。
0388デフォルトの名無しさん
2008/02/11(月) 19:42:12B_FAILED の後ろがセミコロンからコロンになっているのに注意。
君はだまされる方だな。
0389デフォルトの名無しさん
2008/02/11(月) 19:45:080390デフォルトの名無しさん
2008/02/11(月) 19:52:16きづかなかった・・・w
もしかしてあなたは、そういういたずらをチョコチョコやっているのではな
いかと、疑いたくなってきたなw
0391デフォルトの名無しさん
2008/02/11(月) 19:52:520392デフォルトの名無しさん
2008/02/11(月) 19:55:23でもこのスレで出てきてるコード読むと、
神関数つくりそうな勢いのコードが目につくんだけど。
0393デフォルトの名無しさん
2008/02/11(月) 19:56:28「1関数にreturnは1つしか書かない」
という信念を曲げない人がいた。
その人の書いた関数は、最後にラベルがたくさんあってgotoの山盛りだった・・・
ってあれ?デスマーチスレじゃないのか、ここ。
0394デフォルトの名無しさん
2008/02/11(月) 20:02:25そいつってオレジャネ?
0395デフォルトの名無しさん
2008/02/11(月) 20:12:000396デフォルトの名無しさん
2008/02/11(月) 20:29:31lock();
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;
0397デフォルトの名無しさん
2008/02/11(月) 20:38:380398デフォルトの名無しさん
2008/02/11(月) 20:45:37Cなんだよ、バーヤバーヤ
0399デフォルトの名無しさん
2008/02/11(月) 21:48:02569 名前:デフォルトの名無しさん [sage]: 2008/02/09(土) 16:46:29
>>566
try finallyは例外を捕まえるための機構であって、ファンクション
トレースのための機構ではない。
デストラクタでロギングするほうがよっぽどスマート。try finally
に依存したロギングよりも。そしてアスペクト指向のほうが
デストラクタロギングよりももっとスマートだといっているのだよ。
0400デフォルトの名無しさん
2008/02/11(月) 21:53:30例外以外にもreturnとかでも呼ばれるんじゃないの?
0401デフォルトの名無しさん
2008/02/11(月) 21:57:430402デフォルトの名無しさん
2008/02/11(月) 21:59:16ループ内break、continue、関数の途中のreturnとかもダメだと思ってるの?
0403デフォルトの名無しさん
2008/02/11(月) 22:01:34少なくともこのスレではそんな主張をしているレスは見あたらないね。
で、それがどうしたの?
0404デフォルトの名無しさん
2008/02/11(月) 22:02:58できるだけ避けろ、とか、濫用するな、ってのはあるようだがな。
0405デフォルトの名無しさん
2008/02/11(月) 22:10:130406デフォルトの名無しさん
2008/02/11(月) 22:14:510407デフォルトの名無しさん
2008/02/11(月) 22:15:56ちゃんとコードレビューしろよってことだ
0408デフォルトの名無しさん
2008/02/11(月) 22:21:14> 例外以外にもreturnとかでも呼ばれるんじゃないの?
正確には、フレームが巻き戻されるのをトラップする機能。
それを利用して、例外のハンドリング(catch)や、後始末の処理(finally)の機構が
実装されている、という表現が正確。
0409デフォルトの名無しさん
2008/02/11(月) 22:24:360410デフォルトの名無しさん
2008/02/11(月) 22:24:46修正箇所だけのコードレビューとかなら確かにうまくいくけどさ、
何万行のソースコードをレビューで全部網羅するって、
全然うまくいったことがないな。みんなどうしてるのだろ。
ペアプロとかのがよさそうだけど、やったことないや。
0411デフォルトの名無しさん
2008/02/11(月) 22:28:340412デフォルトの名無しさん
2008/02/11(月) 22:31:56ごめん、俺「関数のreturnは必ず一箇所でやる」ポリシーもってるから、
全部レビュー対象となる^^
0413デフォルトの名無しさん
2008/02/11(月) 22:33:39^^と書いているが俺が去年やってたプロジェクトだと笑い事じゃなくて実際そうなる。
0414デフォルトの名無しさん
2008/02/11(月) 22:36:42フローチャートおよび詳細な動作説明をドキュメントとして準備してコードレビュー。
もちろんそういうドキュメントを用意してレビュー会で説明するのは実装者。
承認となった場合もドキュメントは保管。
なので濫用する奴なんか自然といなくなる。
誰も濫用しないから何万行のレビューなんてのも実際は発生しない。
無問題。
0415デフォルトの名無しさん
2008/02/11(月) 22:41:30あほらし。
0416デフォルトの名無しさん
2008/02/11(月) 22:45:080417デフォルトの名無しさん
2008/02/11(月) 22:49:57それだけだとgoto濫用防止だけだけど、ホカにはどんなルールをきめてるん?
0418デフォルトの名無しさん
2008/02/11(月) 22:52:23それとさ、組み込み系だとファンクショントレース機能があるICEとか
結構効果なのだけどさ、それも全開発者に配布?
0419デフォルトの名無しさん
2008/02/11(月) 22:52:570420デフォルトの名無しさん
2008/02/11(月) 22:55:55あれこれ言ったら個人特定されるでしょ
単純なのは、一関数が一定の行数を超えたらとか
for文で()の中に書く内容が「普通じゃない」とか
ちなみに>>412の理由だけでgotoを使った場合はレビューで却下だよ。
0421デフォルトの名無しさん
2008/02/11(月) 22:58:23世の中にドレダケぷろじぇくとまねーじゃが存在しているのか考えれば、
あなたがやっていることと同じようなことをやっている人は無数にいるから、
特定なんてされないと思うぞw
0422デフォルトの名無しさん
2008/02/11(月) 22:59:17じゃあ先に君の関わったプロジェクトで採用されていたルールを教えてくれ
0423デフォルトの名無しさん
2008/02/11(月) 22:59:32「普通じゃない」とかの基準で、資料作成させられて説明させられる
プログラマかわいそすwww
もうちょいまともな基準作ったほうがイインジャナイ?
0424デフォルトの名無しさん
2008/02/11(月) 23:00:47何が「普通」かは実際には定義されているの。ここでは書かないけど。
簡単に言えばループ変数の初期化、終了条件、増分を普通に書くのが普通
0425デフォルトの名無しさん
2008/02/11(月) 23:01:39説明するのが手間になるようなコードを書くほうが悪いと思うが。
0426デフォルトの名無しさん
2008/02/11(月) 23:01:56「なにが普通か」の基準をきめるための努力は世の中に一杯あって、
基準めいたものもあるんじゃない?
0427デフォルトの名無しさん
2008/02/11(月) 23:02:46え〜だって、俺様基準で「普通じゃないから」っていわれて、「フローチャート」
まで用意させられるのだぜw
0428デフォルトの名無しさん
2008/02/11(月) 23:06:57フローチャートはgotoの場合じゃないの?
forの場合には何かトリッキーな式を書いた場合に
そのトリッキーな式がなぜ必要なのかを説明する
ドキュメント+プレゼンとかそんな感じだと思うが。
0429デフォルトの名無しさん
2008/02/11(月) 23:07:59俺様標準じゃなくて、一応条件が示されてるらしいぞ。
まあ俺には関係ない話だからどうでもいいと言えばどうでもいいが。
0430デフォルトの名無しさん
2008/02/11(月) 23:08:470431デフォルトの名無しさん
2008/02/11(月) 23:10:110432デフォルトの名無しさん
2008/02/11(月) 23:10:180433デフォルトの名無しさん
2008/02/11(月) 23:10:29goto厨のコードを読めば、それは明らかだな。
0434デフォルトの名無しさん
2008/02/11(月) 23:12:431本の開発で一人100k行、の間違いじゃねーの?
0435デフォルトの名無しさん
2008/02/11(月) 23:13:560436デフォルトの名無しさん
2008/02/11(月) 23:16:18使いたいとこでも使えないじゃねぇか。開発効率悪そう。
0437デフォルトの名無しさん
2008/02/11(月) 23:18:36goto使うだけの理由があればそれを書けばいいんじゃないの?
処理の流れをちゃんと把握できていればフローチャートだって
簡単に書けるし。
それとも実装ドキュメントの類いを一切書かない人?
0438デフォルトの名無しさん
2008/02/11(月) 23:19:10いやさ、その根拠が多くの開発者が納得いくものであればいいが、
「goto使ったら、フローチャート描かせて、説明させる。」っていってる
ようなやつが、まともな基準を示せるとは到底思えないのよね。
0439デフォルトの名無しさん
2008/02/11(月) 23:20:170440デフォルトの名無しさん
2008/02/11(月) 23:22:47わかって使っている人にとってはその通り。
ただし、こういうレビューの目的の半分は、
将来そのコードの面倒を見る他社のために実装資料を残すこと。
それが、大人のマナー
0441デフォルトの名無しさん
2008/02/11(月) 23:24:07だからさ、goto使うだけでフローチャート書けっていってるのは、
基準が曖昧すぎるといってるのよ。別にgotoが適切な場合もあるし、
そうでない場合もある。whileが適切でない場合もあるし、そうで
ない場合もある。
そんなこといってたら、すべてのプログラムにたいして全部
フローチャート書けという事になるわけで。
0442デフォルトの名無しさん
2008/02/11(月) 23:24:440443デフォルトの名無しさん
2008/02/11(月) 23:26:59要するに、今の実装チームが未来永劫メンテするわけじゃないということ
0444デフォルトの名無しさん
2008/02/11(月) 23:29:30せめてさ、世の中に「メンテナンス性が高いプログラム」を判別しようとする
努力があって、そのための基準が研究されている事実くらい勉強した上で
そういうこといったほうがいいんじゃない?
goto使ったらコードレビューだ!とかじゃなくてさ。
0445デフォルトの名無しさん
2008/02/11(月) 23:30:09管理面でどうしても何かしたいならば。
goto使用許可を出せる権限を
誰かに付与すればイイんじゃね?
0446デフォルトの名無しさん
2008/02/11(月) 23:34:14gotoは他の構文要素と比較して、適切に使われない場合が多いという
共通認識があるからこそ、このスレも成立していると思うんだが。
適切なgotoもそうでないgotoもあり、適切なwhileもそうでないwhileもある。
だから全部やるか何もやらないかどちらかにしろ・・・では物は作れない。
現実的な判断として、かけるコストを回収できる効果があるかどうか。
というのが常識として書いていたが、考えてみればここはマ板でなく
ム板だから学生や研究者も当然いるのか。
0447デフォルトの名無しさん
2008/02/11(月) 23:38:10いや、あなたがいままで言ったような判断基準より、ましな判定基準を
提供するツールはあるし(商用、フリーかかわらず)、そのことすら
知らないまま、ぷろじぇくとまねぇじゃぁをやるのは周囲を不幸にするよ、
といってるだけだけど。
0448デフォルトの名無しさん
2008/02/11(月) 23:38:10浅学にして知らなかった。ポインタを示してもらえるかな。
研究者ではないので、俺はそういう勉強は足りないと自分でも思う。
0449デフォルトの名無しさん
2008/02/11(月) 23:40:22どこからプロジェクトマネージャという誤解が発生しているのかな
0450デフォルトの名無しさん
2008/02/11(月) 23:40:51くだらない決まり作って、くだらない作業させるようなプロジェクトは、
メンバのモチベーションも低いだろ。
0451デフォルトの名無しさん
2008/02/11(月) 23:50:07とりあえず「複雑度」でぐぐってこいw
0452デフォルトの名無しさん
2008/02/11(月) 23:51:32他の人、自分のかかわってたプロジェクトではどうだったのさ。
最低限そのくらい言ったら?
0453デフォルトの名無しさん
2008/02/11(月) 23:55:58お前は、ナニサマナンダ
0454デフォルトの名無しさん
2008/02/12(火) 00:01:22情報感謝。そういえば、そういうのも何か使ったことはあった。
ただ、そのプロジェクトだと単にビルド時に出していただけで、
それがどう使われていたのか知らない。値が高くても低くても特に何もなかった。
その値に適当な閾値を決めてレビューとかやればいいのか?
実際にプロジェクトでどういう運用がされていて、効果がどうだったのかとか、
そういう感想もあれば是非
0455デフォルトの名無しさん
2008/02/12(火) 00:05:250456デフォルトの名無しさん
2008/02/12(火) 00:07:52閾値はあるていどキビシ目にきめたほうがいいが、実際にレビューするか
どうかは、閾値が異常な値を示しているコードがバグを良く出すとか、
新規作成のものであるかとかいう事情を加味して考慮したほうがいい。
安定して動作しているモジュールを閾値より外れているから、といって
リファクタリングしたところで新たな不具合を生み出すだけ。
目的を見失わないようにしながら、やればいい。
しかし複雑度の計測もマダマダであって、あくまで一つの参考にしか
ならないが。
0457デフォルトの名無しさん
2008/02/12(火) 00:45:08昔作ったものから持ってった。 キー入力の評価だから
これ以上重たくしたくもない・・・というところ。
select 文二重+if文の底から出るのに breakを掛けるのは・・・
0458デフォルトの名無しさん
2008/02/12(火) 00:48:03「コーディング規約」(訳:俺の理解できない しんきのう は使うな)
が支配的なのな。
0459デフォルトの名無しさん
2008/02/12(火) 00:53:03MISRA-Cとか
0460デフォルトの名無しさん
2008/02/12(火) 00:59:27それはさておき、MISRA-Cを適用するような分野に
新人やアホが混じってるというのはガクブルだな
0461デフォルトの名無しさん
2008/02/12(火) 01:18:15まぁ有効だが、そういうやつがいない現場にとっては、無駄な
足かせにしかなっていないという矛盾がある。そして、そういうやつ
が混じらないようにする努力というのは経営陣の仕事であって、現場の
規約を固めるのはあまり意味がない。
ミスを防ぐための基準が、よけいに複雑なコードを生み出して、
逆にミスを生み出してしまうような矛盾が今のMISRA-Cにはある。
0462デフォルトの名無しさん
2008/02/12(火) 01:56:390463デフォルトの名無しさん
2008/02/12(火) 07:33:58gotoマンセ君は多人数での開発経験がないんじゃねーの?
0464デフォルトの名無しさん
2008/02/12(火) 08:11:190465デフォルトの名無しさん
2008/02/12(火) 11:30:23gotoを使ったほうが可読性が高い場合に遭遇したことが無いね?
0466デフォルトの名無しさん
2008/02/12(火) 12:30:26あと、このへんで、
ttp://www.cmagazine.jp/src/kinjite/c/coding.html#index32
gotoと同じくらいダメとされている手を、gotoを避けるためだけに
使ってないか? というのは良い指標かと思う。
0468デフォルトの名無しさん
2008/02/12(火) 17:37:19break, continueがだめって書いてあるやつ、
使わなかったとしたらどう書く?
ちょっと想像つかない。
0469デフォルトの名無しさん
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
0470デフォルトの名無しさん
2008/02/12(火) 17:43:44エラーの種類ごとに動作を変えるとしたら、
結局呼び出し元でswitchでそれぞれの動作をしないといけない。
0471デフォルトの名無しさん
2008/02/12(火) 17:50:14breakやcontinueの乱用がだめという話で、
きちんと制御構造がわけるような書き方なら問題ないのでは。
実際List37の例はひどいものだし。
0472デフォルトの名無しさん
2008/02/12(火) 19:13:37ベテランプログラマだけのユートピアを作るのが経営陣の仕事だぁ?
アホか。
0473デフォルトの名無しさん
2008/02/12(火) 21:57:54処理できて速い方法とか、日々そんなことばかり考えてる。
メンテナンス性以前に、論理的整合性が失われて美しくないから
なんて話は、俺の頭には何のことかさっぱりわからない。
0474デフォルトの名無しさん
2008/02/12(火) 22:26:110475デフォルトの名無しさん
2008/02/12(火) 22:35:590476デフォルトの名無しさん
2008/02/12(火) 23:14:11新人は情報学科出身で、かつ優秀じゃなきゃイラネ
0477デフォルトの名無しさん
2008/02/12(火) 23:38:18何段抜けるかを数字で書く多段breakって糞じゃね?
0478デフォルトの名無しさん
2008/02/12(火) 23:46:47こんなソースを新人が書いたら、確実に書き直させるな。
0479デフォルトの名無しさん
2008/02/12(火) 23:55:08for (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:
0480デフォルトの名無しさん
2008/02/13(水) 00:01:50途中で、読む気がうせた
0481デフォルトの名無しさん
2008/02/13(水) 00:03:19厨房スクリプト言語?
0482デフォルトの名無しさん
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])) {
このへんと、下をちょっと見た段階でギブアップ
0483デフォルトの名無しさん
2008/02/13(水) 00:22:21void 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();
}
0484デフォルトの名無しさん
2008/02/13(水) 00:30:02やっぱりだめだ・・・こういう感覚を説明して理解してもらえるかわからないが、
そのコードは「普通」じゃない。読むのがすごいシンドイ。
0485483
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
}
0486デフォルトの名無しさん
2008/02/13(水) 00:35:50中には、インタプリタじゃ無い、ヴァーチャルマシンだ、とか
もっとひどいのになると、エミュレータだ、とか、もうメチャクチャ言いたい放題・・・
ちょっと呆れたな。
これって、「モモヒキじゃ無い、スパッツだよ!」って言ってるオバサンと同じじゃん。
0487デフォルトの名無しさん
2008/02/13(水) 00:38:14あぁなんとか理解できる。サンクスw
0488483
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();
}
0489デフォルトの名無しさん
2008/02/13(水) 00:57:07俺は>>488のほうがわかりやすいw
0490デフォルトの名無しさん
2008/02/13(水) 01:40:46case 4:でsomething呼び出して
returnしてしまえばもっと見やすいと思うが。
0491デフォルトの名無しさん
2008/02/13(水) 01:44:51977 デフォルトの名無しさん[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にしたほうが良いですね……。ありがとうございました。
0492デフォルトの名無しさん
2008/02/13(水) 01:50:32コピペもウザイが、意図もよくわからんぞw
0493デフォルトの名無しさん
2008/02/13(水) 02:05:31984 名前:デフォルトの名無しさん[sage] 投稿日:2008/02/13(水) 01:55:45
>>981
後で困りそうですがもっと単純に解決させました。
ループ部分だけクラス内で別のメンバ関数にして飛ばして、抜けたい所でreturnさせました……。
0494デフォルトの名無しさん
2008/02/13(水) 02:36:14× 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で抜けてなかったんで
そんときのループ構造が頭にあって。
やっとすっきりしたと思ったんだけど見直せばもっとシンプルになるもんだね。
0495デフォルトの名無しさん
2008/02/13(水) 06:20:53釣りいいかげんうざい。
あのね、じゃあ具体的にあんたが主張するBASICのようなコードを
JavaVMのバイトコードで示してみやがれっての。できなきゃ去れ。
二度と来るな。
0496デフォルトの名無しさん
2008/02/13(水) 07:13:52せめてJavaVM実装の書籍を1冊でいいから読破してから言え、マヌケ。
0497デフォルトの名無しさん
2008/02/13(水) 07:30:44多重break/continueもgotoも無いのがベストつーか常識だけどw
0498デフォルトの名無しさん
2008/02/13(水) 07:53:56> やり方をググってまねしただけなんで。
やっぱりね…
そういう姿勢だからbreakでもgotoでも汚ないコードになるんだよ。
0499デフォルトの名無しさん
2008/02/13(水) 07:55:560500デフォルトの名無しさん
2008/02/13(水) 08:11:16どのJVMのことだ?sunか?
0501デフォルトの名無しさん
2008/02/13(水) 08:12:39特定の実装の話じゃないと思うが。つーか、吊りか?
0502デフォルトの名無しさん
2008/02/13(水) 08:30:340503デフォルトの名無しさん
2008/02/13(水) 08:43:590504デフォルトの名無しさん
2008/02/13(水) 08:53:160505デフォルトの名無しさん
2008/02/13(水) 08:58:45一部ソフトウエアで実行するけど。
0506デフォルトの名無しさん
2008/02/13(水) 09:05:280507デフォルトの名無しさん
2008/02/13(水) 09:16:38勝手な思い込みで変更する馬鹿よりましだよ。
ぐぐったら出てくるけど、作業をしているか通信をしているかをチェックするんだって。
通信が完了してから作業をするだろうけど、作業が新しい通信を要求するかもしれないだろ。
どんな流れになるかはWebサイトの作り次第だし、テストするには通信帯域を制限したり・・・
コードの流用するならそれが確かに動くかテストするべきだが、
自分でテストできないなら基本的には信用することが必要だ。
0508デフォルトの名無しさん
2008/02/13(水) 09:25:01まあレイアウトが自由にできる今はフレームなんか使ってないだろうけど。
ReadyStateだけの場合は↓。
つまり両方のチェックが必要。
http://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
0509デフォルトの名無しさん
2008/02/13(水) 10:21:31> コードの流用するならそれが確かに動くかテストするべきだが、
> 自分でテストできないなら基本的には信用することが必要だ。
唖然・・・
おまえみたいのはgotoを絶対に使うべきじゃないし、
そもそもプログラミングをするべきじゃない。
0510デフォルトの名無しさん
2008/02/13(水) 10:24:350511デフォルトの名無しさん
2008/02/13(水) 10:25:49なに俺様は完璧とか言ってんの?
0512デフォルトの名無しさん
2008/02/13(水) 10:58:490513デフォルトの名無しさん
2008/02/13(水) 11:10:410514デフォルトの名無しさん
2008/02/13(水) 14:29:42汚いスパゲッティ・コードはいくらでも書ける。
たとえば、フラグ変数作って、break break break break 連発するヤツがいい例。
goto 使うやつに比べれば、「do 〜 while (false)」 や 「switch 〜 break」 を使うなど、
トリッキーなコード書いて得意満面になってるキチガイよりよっぽどマシだ。
要するに、「コードの美しさ・汚さ」と、「goto 使うな」 論は無関係。プログラミングの芸術的センスの問題だよ。
java、php、ruby そのた、言語によって大域脱出の仕方が違うのは
どの方法が正しい・優れているという基準が無いからで、どの言語作者も頭を悩ませている問題なんだろう。
goto の何が問題なのかと言えば、インタプリタやコンパイラの内部処理の都合上、
パフォーマンスを低下させる要因になっているから。
特に while(・・・) {・・・} みたいに { } ブロックを多用する言語は、goto で ”あらぬ方向” へ脱出される事を極端に嫌う。
これは { } によって確保したスタックの管理がくずれるから。
ここらへんは実際に目には見えない部分なので、なかなか理解が難しいと思う。
自分でインタプリタやコンパイラを作ってみれば経験できる事なのだが、いまどき、そこまでするヤツはおっとまた
字数制限がうざいなもっと長文書ければいくらでも語れるんだが続きはまた暇なときにでも。うんこちんちん!
0515デフォルトの名無しさん
2008/02/13(水) 14:33:200516デフォルトの名無しさん
2008/02/13(水) 14:39:270517デフォルトの名無しさん
2008/02/13(水) 14:43:13> これは { } によって確保したスタックの管理がくずれるから。
今時、そんなソースコードにべたべたのインタプリタなんて珍しいわ。
コンパイラや、ソースコードを一回全部なめて、内部構造に
するようなインタプリタなら、ローカル変数のアクセスのために、
処理系はスタックの現在のオフセットを常にわかっている必要がある。
だから、ジャンプ元とジャンプ先でスタックのオフセットがずれるなら、
そのぶんをジャンプの直前か直後に調整して終わり。難しい話じゃない。
Javaのバイトコードを示していただきたいなぁあなたにも。
(あ、Rubyのブロックはクロージャだから別物ね)
0518デフォルトの名無しさん
2008/02/13(水) 14:47:17はじめて見たときはびっくりしたわ
0519デフォルトの名無しさん
2008/02/13(水) 14:51:06http://pc11.2ch.net/test/read.cgi/tech/1188688416/l50
0520デフォルトの名無しさん
2008/02/13(水) 15:05:500521デフォルトの名無しさん
2008/02/13(水) 15:10:52ナゲー
0522デフォルトの名無しさん
2008/02/13(水) 17:02:480523デフォルトの名無しさん
2008/02/13(水) 17:07:130524デフォルトの名無しさん
2008/02/13(水) 17:15:51ここでコンピューターの気持ちで会話してきてください。
できれば↓のスレの書き込みの翻訳してくれるとありがたい。
1101011 1100001 1101001 1110111 1100001
http://pc11.2ch.net/test/read.cgi/prog/1201423463/
0525デフォルトの名無しさん
2008/02/13(水) 17:56:170526デフォルトの名無しさん
2008/02/13(水) 18:30:050527デフォルトの名無しさん
2008/02/13(水) 19:08:23コーヒーふいたじゃねーかw
どんなコードかちょっと気になるw
0528デフォルトの名無しさん
2008/02/13(水) 19:25:24ループの中にswitch-caseで飛び込むコードって奴があるな。
Duff's device でググると出てくる。
(CGの人ならPorter-Duff operatorのDuff氏とか言うと、へーとか思うはず)
0529デフォルトの名無しさん
2008/02/13(水) 19:40:41*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);
}
0530デフォルトの名無しさん
2008/02/13(水) 20:15:510531デフォルトの名無しさん
2008/02/13(水) 20:21:51いいからJavaVMの実装本を読めって。
自分がどんなに時代遅れな発言をしているか
よーくわかるから。
0532デフォルトの名無しさん
2008/02/13(水) 20:34:59> goto 使うやつに比べれば、「do 〜 while (false)」 や 「switch 〜 break」 を使うなど、
> トリッキーなコード書いて得意満面になってるキチガイよりよっぽどマシだ。
日本語に訳すと、
1+1を3と言うやつに比べれば、2+3を6と言う奴や3+1を2と言って得意満面に
なっているキチガイよりよっぽどマシだ。
といったところか。そんな>>514に良い言葉を教えてあげよう。
目糞鼻糞、どっちも糞。
0533デフォルトの名無しさん
2008/02/13(水) 20:50:16確かに技術は進歩してるし、クソなコードは多いが、よい結果を出しているものはよい方法かもしれない。
紙すきのでやってたけど、手作業を機械でやることで品質の安定したものを大量に低コストにやってるが、
技術の開発は道具こそ工夫するものの人間が手でやっている。
プログラミングで自動化機械といえば、ソースコードのコンパイルとかスクリプトでの作業。
機械設備はコーディングをサポートしてくれる開発環境とかライブラリ。
そういうのを駆使して効率よく新しいものを作るのがプログラマの仕事。
決まりきったやり方が正しいのか最適なのかたまには見直してみるのもいいが、
基本はそれをまねしてやることだ。
何もかも完璧に分かってないといけないとか言ってたら時代の波に飲まれておしまいだ。
0534デフォルトの名無しさん
2008/02/13(水) 20:59:14先人のコードをまねることは大切だ。
だが、自分のプログラムに応用する時には
そのコードをしっかり読んで動作を理解してから。
これができない奴はプログラムを書くべきではない。
0535デフォルトの名無しさん
2008/02/13(水) 21:00:030536デフォルトの名無しさん
2008/02/13(水) 21:04:10習うより慣れろだ。
正しいか間違ってるかは、うまくいくかいかないかで判断しろ。
0537デフォルトの名無しさん
2008/02/13(水) 21:08:24まあ、少なくとも元のコードの動作を理解できるまでは、
それを使ったコードを人様に見せるのは止めたほうがいい。
0538デフォルトの名無しさん
2008/02/13(水) 21:09:18> 習うより慣れろだ。
> 正しいか間違ってるかは、うまくいくかいかないかで判断しろ。
仕様に照らして、な。
「実は実装依存」なコードを量産されるよ?
0539デフォルトの名無しさん
2008/02/13(水) 21:09:43そりゃmemcpyがコンパイラに組み込まれてたんじゃね?
そういう場合、libcのmemcpyは関数ポインタ取るためだけに用意されている。
0540デフォルトの名無しさん
2008/02/13(水) 21:18:43しっかり動いてますが何か。
テスト済みですが何か。
0541デフォルトの名無しさん
2008/02/13(水) 21:29:23「関係ない話は別のスレでやれ」 とか
「〜の本を読め」 とか言って相手を囲いの外に追いやろうとする
典型的な厨房の集うスレはここですか?
0542デフォルトの名無しさん
2008/02/13(水) 21:46:36コピーするサイズに応じて、最適なコードをそれ専用に生成するってこと?
0543デフォルトの名無しさん
2008/02/13(水) 21:56:02動けばいいと公言する奴のコードに限って実は動かないんだよ。
どうせ自分で何回か使ってみただけなんでしょ?
これだから、ゆとり世代は・・・
0544デフォルトの名無しさん
2008/02/13(水) 21:58:53まさかとは思ったが、本気で>>469がうまくいってる例だと思ってるのか。
このスレのgotoを恐れずに使う兵共にとっても>>469は糞コードだぞ。
0545デフォルトの名無しさん
2008/02/13(水) 22:00:21「動く」と胸を張っていえるからリリースするもんだろ。
それが動かなくなるのがバグだろ。
バグに遭遇したことないやつが存在するんなら確かにそういえるかも知れんな。
0546デフォルトの名無しさん
2008/02/13(水) 22:05:31自分だけが使う書き捨てのプログラムなら別に>>469の糞コードでも良し
0547デフォルトの名無しさん
2008/02/13(水) 22:07:59それがさあ、「動けばいい」って奴はロクなテストやってないのが相場なの。
大抵、自分の手元の環境で数回から数十回動かしてエラーが出なきゃOKって程度のテスト。
特に最近のゆとり君は適当にググってきたコードをコピペするからひどい。
何故動くのか理解しないまま数回動かしただけで「動きました」とか言い出す。
もうアフォかと。
0548デフォルトの名無しさん
2008/02/13(水) 22:30:31テストしてないのを問題視するのはいいとして、テストもせずに駄目出しするのもどうかと思うが。
0549デフォルトの名無しさん
2008/02/13(水) 22:32:06テストしてないのを問題視するのはいいとして、テストもせずに駄目出しするのもどうかと思うが。
0550デフォルトの名無しさん
2008/02/13(水) 22:35:550551デフォルトの名無しさん
2008/02/13(水) 22:38:01テスト済みと書いてる字が読めないならプログラム組むな
0552デフォルトの名無しさん
2008/02/13(水) 22:42:02へー、どんなテストしたの?
ちゃんと異常系までテストした?
0553デフォルトの名無しさん
2008/02/13(水) 22:44:15どんな異常だよ
0554デフォルトの名無しさん
2008/02/13(水) 22:47:37>>494
> > 「2回」ループする意図
> ADSLで瞬間的に切断される場合、数秒後に再度アクセスしたら接続される場合があるので。
のあたり、実際に切断された場合の回復処理で正常にアクセスできたことを
切断時間などを変えながら複数の状況でテストしたのかい?
切断された後、一旦回復してすぐまた切断される状況は?
0555デフォルトの名無しさん
2008/02/13(水) 22:51:540556デフォルトの名無しさん
2008/02/13(水) 22:58:51再表示で接続できることは経験的に知っているし、
規定回数全部で接続できなかった場合でもエラーで中断するし、
中断した場合も呼び出し元からやり直すだけだし。
回復して切断したらって話だが、
REPEAT; sleep(0.1); UNTIL !IE.busy AND IE.readystate = 4
これを実行した後には、接続できたかできなかったかのどちらかしかない。
もちろん不完全な取得を完了とした場合、その先で実行できないってだけだが、
実行できなかった場合も呼び出し元で再チャレンジするし。
0557デフォルトの名無しさん
2008/02/13(水) 23:00:25つまりテストしてないわけね。よくわかった。
0558デフォルトの名無しさん
2008/02/13(水) 23:07:59自分で切断はしてないけど切断があったことはログでチェックしてるよ。
0559デフォルトの名無しさん
2008/02/13(水) 23:09:480560デフォルトの名無しさん
2008/02/13(水) 23:12:550561デフォルトの名無しさん
2008/02/13(水) 23:14:312回続けて失敗する現象はなかった。
昨日だったか2ch鯖にアクセスできなくなってたが、その場合そもそもここまで処理が回ってこないし。
>>560が手本を見せてくれるそうです。
0562デフォルトの名無しさん
2008/02/13(水) 23:18:13結局わけわからん部分は「呼び出し元で再チャレンジするから」なわけね。
だったら2回ループ回さなきゃいいのに。中途半端なことするから可読性が落ちる。
0563デフォルトの名無しさん
2008/02/13(水) 23:24:55前の処理がせっかくうまくいってるのにそれを無駄にすることはないだろ。
接続エラーになったからって前の処理をやり直したら、そっちまで接続エラーになるかもしれないだろ。
これは普通にブラウザ使ってたら分かる話だ。
試行回数とインターバルは経験的に、感覚的にだ。
0564デフォルトの名無しさん
2008/02/13(水) 23:27:09つまり自分が使っていた環境のことしか考えていないし、
テストも自分の普段の環境から出ていないってことね。
なるほどね。
0565デフォルトの名無しさん
2008/02/13(水) 23:30:13・インライン化の恩恵を受けられる。
・人手で最適化されたコードを吐いてくれる可能性がある。
・ポインタの型によって(intptr_t)pの値が最初から
ワードの倍数になっていることを保証できる場合がある。
0566デフォルトの名無しさん
2008/02/13(水) 23:44:24待ち時間は秒数で指定してあるし。
IE使ってる時点で使用環境は固定されてるし。
0567デフォルトの名無しさん
2008/02/13(水) 23:45:360568デフォルトの名無しさん
2008/02/13(水) 23:46:10gotoの話じゃないならよそでやれ
0569デフォルトの名無しさん
2008/02/14(木) 00:10:380570デフォルトの名無しさん
2008/02/14(木) 01:24:26容易にクラッシュしてデバッグすらできない環境があって・・・。
助けてくれ orz.
0571デフォルトの名無しさん
2008/02/14(木) 01:25:27それははたして環境のせいなのか?
0572デフォルトの名無しさん
2008/02/14(木) 02:50:120573デフォルトの名無しさん
2008/02/14(木) 06:49:41> IE使ってる時点で使用環境は固定されてるし。
回線まで固定されるわけじゃなかろう
0574デフォルトの名無しさん
2008/02/14(木) 07:27:53このスレはgotoを語るスレではなくて
finallyや多重breakを語るスレなのでは。
0575デフォルトの名無しさん
2008/02/14(木) 07:31:57> 試行回数とインターバルは経験的に、感覚的にだ。
ひでえ根拠だなwww
うちに配属になった新人がこんなコード書いたら
即刻今のコードを完デリさせて最初から書きなおしだ。
0576デフォルトの名無しさん
2008/02/14(木) 08:23:43入り乱れての乱戦になっておりますw
0577デフォルトの名無しさん
2008/02/14(木) 09:01:440578デフォルトの名無しさん
2008/02/14(木) 16:13:06テストっていうのがどんな物かわかってたら簡単に言えないもんだ。
そういう意味では「ポインタは理解してる」に似てるな。
と、釣りっぽくまとめてみる也。
0579デフォルトの名無しさん
2008/02/14(木) 18:26:210580デフォルトの名無しさん
2008/02/14(木) 18:41:46自動でかかる連続投稿規制とアクセス規制と、さらに管理者からのアクセス規制を受けるまでやって、
そーゆー規制食らった場合にも適切に処理できるのは確認済み。
んでえらそうに語ってくれる人がどういう方法でどこまでのテストを要求してるのか知らんが、
サーバーまで自分で作ってるわけじゃないって事を分かっているのかいないのか・・・。
自分でできる範囲ってのは回線を切断したり接続したりだ。
ちなみに、ほとんどの場合は回線の異常じゃなくて、2ch鯖がただシカトしてただけだった。
自分のプロバイダまでのpingは30msで失敗しないけど2ch鯖は120msくらいかかってそのうち1回くらい失敗しまくり。
あと、エラー判定が実は正常なのを異常と判断する場合があるのは最初から分かってる。
完璧に自動で判断することができないんだからしょーがない。
0581デフォルトの名無しさん
2008/02/14(木) 18:57:51あぁ・・・そりゃ勝てなくて当たり前かw
トンクスw
0582デフォルトの名無しさん
2008/02/14(木) 19:58:150583デフォルトの名無しさん
2008/02/14(木) 20:02:05子供に理解させるのは無理だろう。
0584デフォルトの名無しさん
2008/02/14(木) 20:27:38単体テストってのは1行1行テストすることを言うんですかそうですか。
0585デフォルトの名無しさん
2008/02/14(木) 20:28:28無理だろw
0586デフォルトの名無しさん
2008/02/14(木) 20:30:440587デフォルトの名無しさん
2008/02/14(木) 20:37:150588デフォルトの名無しさん
2008/02/14(木) 20:40:00結局は自分の環境でしかテストしてないと。
しかも普通に使っていただけで積極的に
様々な状況を設定したわけでもなし。
そういうのはテストとは言わないんだよ。
0589デフォルトの名無しさん
2008/02/14(木) 20:52:16単体テストしろとかすべての環境でテストしろとかお前ら馬鹿かと。
たかだか数行のコードテストするために何十個もパソコン用意しろって?
0590デフォルトの名無しさん
2008/02/14(木) 20:53:36ワロタ
0591デフォルトの名無しさん
2008/02/14(木) 21:04:110592デフォルトの名無しさん
2008/02/14(木) 21:19:190593デフォルトの名無しさん
2008/02/14(木) 21:21:29>>589
> 実際にすべての場合で実行して結果を出してるんだから
すべての場合だってさ・・・意味わかって言ってんのかね。んなわきゃないか。
0594デフォルトの名無しさん
2008/02/14(木) 21:22:28マチルダかわいい
0595デフォルトの名無しさん
2008/02/14(木) 21:23:490596デフォルトの名無しさん
2008/02/14(木) 21:37:260597デフォルトの名無しさん
2008/02/14(木) 21:40:16+offsetが抜けてデータ構造が変わっていたやつは単体テストで出てきそうなもんだが、
実際には総合テストしないと出てこなかったな。
http://pc11.2ch.net/test/read.cgi/prog/1192192069/
0598デフォルトの名無しさん
2008/02/14(木) 21:44:38単体テスト用のサーバ立ち上げて、
サーバ側でわざと切断したりレスポンスを変えたり、
外部仕様のカバレッジや実行パスのカバレッジが得られるような
パターンでレスポンスさせるもんじゃないの?
0599デフォルトの名無しさん
2008/02/14(木) 21:44:400600デフォルトの名無しさん
2008/02/14(木) 21:48:41テストする対象はIEじゃなくて糞スクリプトなんですが。
0601デフォルトの名無しさん
2008/02/14(木) 21:50:360602デフォルトの名無しさん
2008/02/14(木) 21:51:05そのテスト環境は既に結合テストの範疇だな。
サーバーつないだら単体テストにならないだろ?
結論:「テスト済み」なんて簡単に言うなってこった。
0603デフォルトの名無しさん
2008/02/14(木) 21:53:00いや、結合テストは実稼働のサーバとの接続でやるものでしょ。
実サービスではなく糞スクリプトのテストのためのレスポンスをする
サーバにつなげるのなら単体テストの範疇と思われ。
まあ、スタブを使うようなもんだ。
0604デフォルトの名無しさん
2008/02/14(木) 21:53:51> 結論:「テスト済み」なんて簡単に言うなってこった。
同意。
0605デフォルトの名無しさん
2008/02/14(木) 21:54:48昔、うちに監禁してた少女は死んじゃったから代わりが欲しいな・・・(冗談)
それはそうと、ぼろいビルの屋上でスナイプの練習してるけど、
周りはもっと高層なビルがたくさん・・・
ライフルが丸見えです。
僕も屋上セックスしてたら隣のビルの専門学校から丸見えでばればれだった。
0606デフォルトの名無しさん
2008/02/14(木) 21:56:55ああ、そういう意味なら納得。
つまりそのサーバーはテスト用に設定した動作をするってことね。
0607デフォルトの名無しさん
2008/02/14(木) 22:23:140608デフォルトの名無しさん
2008/02/14(木) 22:32:18どんなのかしってるのか。
class TRACE {
TRACE(char *funcnamne, ...) { cout << log... <<endl; }
~TRACE() { cout << log.. <<endl; }
}
とかよういしといて、関数に下のように書くだけだぞ。tryもfinallyも
いらない。スコープぬけるときにデストラクタが呼ばれて、
かってにロギングしてくれるから。
void func {
TRACE trace("func", ...);
...実体...
}
0609デフォルトの名無しさん
2008/02/14(木) 22:36:14クロージャがエスケープした時にはどうすんの?
finallyならクロージャがエスケープしようが例外が発生しようが
ちゃんとロギングできるわけだが。
0610デフォルトの名無しさん
2008/02/14(木) 22:39:45それは言語依存でしょ。
フルGCな言語や処理系だとスコープ抜けた直後にデストラクタが叩かれる保証はない。
0611デフォルトの名無しさん
2008/02/14(木) 22:43:45てか、そもそもC++にクロージャなんてものあったけか
0612デフォルトの名無しさん
2008/02/14(木) 22:45:06ないけど、このスレはC++限定じゃないでしょ?
0613デフォルトの名無しさん
2008/02/14(木) 22:47:06書くしかない。ならgotoまんせーだな、ファンクショントレースには。
0614デフォルトの名無しさん
2008/02/14(木) 22:49:20C++限定じゃないがC限定でもない。
JavaでもPythonでもJavaScriptでもModule-3でもアリじゃないの?
0615デフォルトの名無しさん
2008/02/14(木) 22:50:150616デフォルトの名無しさん
2008/02/14(木) 22:55:27わかった。じゃぁまずは、「デストラクタロギングさん、馬鹿にしてすいません。
tryとfinallyを使ったロギングなんてクソです」といえwww
0617デフォルトの名無しさん
2008/02/14(木) 22:56:32他の言語ではifの拡張だから普通にbreakでループが抜けれるから
>>469みたいなselect breakはおかしく見えちゃうんだな。
0618デフォルトの名無しさん
2008/02/14(木) 22:56:33finallyでロギングできる言語のほうが多いだろうな
そもそもfinallyに比べてデストラクタでロギングする
メリットが見えないのだが
0619デフォルトの名無しさん
2008/02/14(木) 23:00:090620デフォルトの名無しさん
2008/02/14(木) 23:34:480621デフォルトの名無しさん
2008/02/15(金) 00:55:51>そもそもfinallyに比べてデストラクタでロギングする
>メリットが見えないのだが
おまえバカだろ?
0622デフォルトの名無しさん
2008/02/15(金) 01:16:590623デフォルトの名無しさん
2008/02/15(金) 01:18:43デストラクタロギングなら変数宣言だけコピペすればよいので、
finallyロギングよりコピペ量が少なくて済む。
その点ではC#/VB.NETのusingも次点でまあ使えると俺は思う。
ロギング以外にも言えることだけど。
0624デフォルトの名無しさん
2008/02/15(金) 01:40:340625デフォルトの名無しさん
2008/02/15(金) 01:41:270626デフォルトの名無しさん
2008/02/15(金) 04:38:51多分年金を全部懐に入れてて、いざ受け取ろうとしたら一円も受け取れなかったから、
「ばれたら仕方がない」って殺しまくったんだろうな。
0627デフォルトの名無しさん
2008/02/15(金) 06:41:34その程度の利点かよ・・・
finallyだってマクロ一発じゃん・・・アフォらし・・・
0628デフォルトの名無しさん
2008/02/15(金) 07:23:28なんだそりゃギャハwwwwwwww
オマエ、もうちょっと色々な言語、できれば現代的な言語を勉強しろよwww
0629デフォルトの名無しさん
2008/02/15(金) 08:31:18CLOSのbefore-afterさえあれば十分。
0630デフォルトの名無しさん
2008/02/15(金) 08:50:21で、俺も>>623以外のデストラクタロギングのメリットを知りたい。
デストラクタロギングはどうも間接的すぎて気持ち悪い。
つーか、そのうちオブジェクト解放のタイミングが変わったら
とたんに使えなくなるような。
トリッキーではないが正道でもない方法に見える。
0631デフォルトの名無しさん
2008/02/15(金) 13:28:19勘弁してくれ
0632デフォルトの名無しさん
2008/02/15(金) 15:51:00決算期前の需要で皆忙しいのかな。
0633デフォルトの名無しさん
2008/02/15(金) 16:56:03マクロが使えるなんていい環境ですね。
0634デフォルトの名無しさん
2008/02/15(金) 17:36:29読まされるほうはたまったものではない。
0635デフォルトの名無しさん
2008/02/15(金) 17:49:12読まなければ、いいじゃねーかw
0636デフォルトの名無しさん
2008/02/15(金) 17:59:150637デフォルトの名無しさん
2008/02/15(金) 18:02:53このコーディングがC言語が生まれて10年後くらいに発見されたとかwikiに書いてあるけど、
C言語作るときにこの書き方を想定して作ったからC言語ではswitchをbreakで抜ける仕様になってるって分かる人いるかな。
0638デフォルトの名無しさん
2008/02/15(金) 18:05:50全く意味がわからないな。
switch を break で抜けられる全部の言語で >>529 が書けるなら信じてあげるよ。
0639デフォルトの名無しさん
2008/02/15(金) 18:16:29>>637の言う
> switchをbreakで抜ける仕様
って、fall throughのことで、
ttp://www.catb.org/jargon//html/F/fall-through.html
breakが無いと、次のcaseが現れても抜けない仕様、という
ほうが正確かな。
複数のcaseをうまく利用することができる、という特性を生かす趣旨が
ある仕様ということはわかるけど、ループと組み合わせるという技は
発見された、としてもいいんじゃないかと思うけど。
0640デフォルトの名無しさん
2008/02/15(金) 19:00:57君のところじゃboostも使えないのかい?そりゃ可哀想に。
0641デフォルトの名無しさん
2008/02/15(金) 19:46:190642デフォルトの名無しさん
2008/02/15(金) 19:49:360643デフォルトの名無しさん
2008/02/15(金) 20:23:45トレースしたいローカル変数より後にロギング用の変数を宣言するのはダメ?
リリース版でログを取るのでなければ、boost::formatとか使わなくても
printfベースの実装で十分だと思うし。
0644デフォルトの名無しさん
2008/02/15(金) 20:41:48トレースの対象がオブジェクト(またはその属性)の場合は?
0645デフォルトの名無しさん
2008/02/15(金) 20:45:03goto aho:
...
{
int baka;
...
aho:
...(bakaを使う)
}
ってやったら、bakaを確保せずにいきなりahoに飛ぶコードを吐かれた(MS-Cかな?)。
それ以来gotoは完全封印
0646638
2008/02/15(金) 21:24:01fall through だけじゃダメだと思う。
「case は switch 直下に無くても文法的に正しい」 って仕様が含まれている必要がある。
C は case 〜 をそれ以外の単なるラベルと同列に扱うという仕様になっているから、
「>>529 のように switch 直下ではなく while の中に case を書いても正しく動く」
ということが後になって発見(正確には”確認”)されたんじゃないかと。
ところで、ふと java の仕様見たら
http://www.y-adagio.com/public/standards/tr_javalang/14.doc.htm#35518
思いっきり >>529 が書いてあるし。
0647デフォルトの名無しさん
2008/02/15(金) 21:35:04え、C++だったの?
627でfinallyって言っているからC++はないと思っていたんだけど。
0648デフォルトの名無しさん
2008/02/15(金) 21:52:40テンプレートで超がんがる。
DebugLogger d("%d %d\n", &var, std::make_pair(obj, &A::func));
0649デフォルトの名無しさん
2008/02/16(土) 10:08:37そんな入れ子の外から飛び込むのは、どんな言語の場合でも
自殺行為に近いだろ。 入れ子の外で定義が終わってれば
別だがね。
0650デフォルトの名無しさん
2008/02/16(土) 12:03:37多分そういうときに使ってるんだと思うけど、
普通はなんとかする。
0651デフォルトの名無しさん
2008/02/16(土) 12:29:190652デフォルトの名無しさん
2008/02/16(土) 12:31:140653デフォルトの名無しさん
2008/02/16(土) 12:35:43(最適化でレジスタに割り当てられると見た目じゃわかんないけど)
goto foo;
{
int bar = 44;
foo:
printf("%d\n", bar);
}
で 44 が表示されるべきだったかどうだったか調べてみる...
0654デフォルトの名無しさん
2008/02/16(土) 12:49:410655デフォルトの名無しさん
2008/02/16(土) 13:40:44同じ関数内のループに飛び込んでるだけだろ
0656デフォルトの名無しさん
2008/02/16(土) 15:39:42普通の実装ならブロックローカルな変数も関数呼び出した時点で
スタックに領域確保するんじゃねーの?
0657デフォルトの名無しさん
2008/02/16(土) 15:51:47gotoは「局所的な制御」にしか使わないから。
そして「構造」は「常に全体が対象」だ。
燃料としては不足だ。
0658デフォルトの名無しさん
2008/02/16(土) 16:03:24> gotoは「局所的な制御」にしか使わないから。
> そして「構造」は「常に全体が対象」だ。
もちろん>>651はそれが前提で書いていると思うが?
全体を見ずに局所だけを見ているからgotoを使いたがる
というのが>>651の趣旨だと思うが。
0660デフォルトの名無しさん
2008/02/16(土) 17:15:16それは言語の設計思想によるんじゃないかな。
goto前提な言語なら自然とgoto使うことになるし、
goto原則使わないのが前提な言語を使っていて、
かつ、全体の構造を考える習慣がついていれば、
gotoが必要っぽい状況になったら自然と全体の
構造を疑う方向に目が向くと思うよ。
0661デフォルトの名無しさん
2008/02/16(土) 17:57:340662デフォルトの名無しさん
2008/02/16(土) 18:21:23gotoを使わないだけの理由で全体の構造を変えることとでは
天と地ほどの差があるけどな。
0663デフォルトの名無しさん
2008/02/16(土) 19:07:13構造を見直したい程gotoが気になるなら、まず
設計に対する姿勢から疑わないと。
0664デフォルトの名無しさん
2008/02/16(土) 19:09:490665デフォルトの名無しさん
2008/02/16(土) 19:13:470666デフォルトの名無しさん
2008/02/16(土) 19:14:420667デフォルトの名無しさん
2008/02/16(土) 19:16:310668デフォルトの名無しさん
2008/02/16(土) 19:17:270669デフォルトの名無しさん
2008/02/16(土) 19:32:20> 初心者向けの指標としては有りだろう。
gotoを使いたがるのは初心者が多いという意味で賛成だ。
0670デフォルトの名無しさん
2008/02/16(土) 19:34:40そんな君の発言「紙一重」wwwwwwwwwwwww
0671デフォルトの名無しさん
2008/02/16(土) 19:39:57かなり苦しいんじゃないの?
0672デフォルトの名無しさん
2008/02/16(土) 19:46:220673665
2008/02/16(土) 19:56:31そういう意味での賛成は遠慮させていただく。
「どうしてもgotoが必要な場面になったら、構造を見直してみよう」
のようなアドバイスは、初心者向けにはいいかもしれない。
終端条件やデータ構造を見直したら、もっといい方法がみつかるかもしれない。
けれど、そのgotoが適切だと思うなら、見直す必要もない。
gotoはあくまでもきっかけとして、である。
クロージャとかlambdaが欲しいな、と思いながらgotoを書く事もある。
goto(と飛び先のラベル)の場所が適切なら、問題ない。
0674665
2008/02/16(土) 19:57:150675デフォルトの名無しさん
2008/02/16(土) 19:58:19全然わかんない。論争根源の論文の
http://www.cs.utexas.edu/users/EWD/ewd02xx/EWD215.PDF
と同様なネガティヴキャンペーンにしか見えないぞ。
0676デフォルトの名無しさん
2008/02/16(土) 20:00:06他人のgotoまみれコードを保守した経験がない
ビギナーさん
0677デフォルトの名無しさん
2008/02/16(土) 20:06:450678デフォルトの名無しさん
2008/02/16(土) 20:12:360679デフォルトの名無しさん
2008/02/16(土) 20:15:420680デフォルトの名無しさん
2008/02/16(土) 20:15:59gotoつかう人は「goto使ったほうが良い」と判断しているから使うんだけど。
gotoを使わずに簡潔に書けるならば、好き好んで使ったりはしないよ。
0681デフォルトの名無しさん
2008/02/16(土) 20:16:450682デフォルトの名無しさん
2008/02/16(土) 20:20:09> gotoつかう人は「goto使ったほうが良い」と判断しているから使うんだけど。
その判断が狭すぎるという話じゃなかったのか?
0683デフォルトの名無しさん
2008/02/16(土) 20:35:450684デフォルトの名無しさん
2008/02/16(土) 20:43:020685680
2008/02/16(土) 20:48:32ああそうさ。必要も無いのにgoto使うというのはたしかに判断が狭いということだ。
これは開発担当のスキルの不足を反映しているのに過ぎない。
この問題の根源は開発担当に対するスキル管理の不足/欠如だよ。
悪いのはgotoやgotoを使ったプログラムやgoto使った人間では無いことを確認したいわけよ。
だけどgotoの使用判断は開発担当の職掌さ。
どのようなロジックにおいてもgotoを使わないほうが優れているという証明が出来ない限り、
goto禁止ルール自体は不当なルールだと言いたいね。
0687デフォルトの名無しさん
2008/02/16(土) 20:51:54徹底的にgotoを使わなくて済むようにしてほしいね。
多重breakをできるようにしたり、try-catch-finallyにデストラクタを用意したり。
0688デフォルトの名無しさん
2008/02/16(土) 20:53:440689デフォルトの名無しさん
2008/02/16(土) 20:54:14汚いgoto文を見ただけで、「goto禁止」は、まりにも短絡的すぎ。
for〜continue〜break文にせよ、do〜while文にせよ、if文にせよ、try〜catchにせよ、
ネストしまくりでワケワカラン汚いコードを書くヤツは、そこらへんにウヨウヨいる。
いったいどうやったら、構造化言語をここまで汚く書けるのか、もう信じられんほど。
なのになぜ、goto「だけ」がこれほどまでに差別されなければならないのか。
・・・ま、そこらへを書くと、またキチガイが湧くんでホドホドにしとくが。
美しく書けばgotoは害では無い。これは確か。
0690デフォルトの名無しさん
2008/02/16(土) 20:56:25とりあえず、モチツケ。
無条件goto禁止、については合理的な理由の説明は無かったはずだ。
0691デフォルトの名無しさん
2008/02/16(土) 20:56:46goto禁止したところで、そのうち9割くらいはフラグ付きwhileとか結局スパゲティを書く気がするけど。
0692デフォルトの名無しさん
2008/02/16(土) 21:02:41gotoには「最後の手段」の側面もあるからね。
gotoとラベルの置き場所の自由さっぷりは両刃の剣なわけで。
0693デフォルトの名無しさん
2008/02/16(土) 21:04:39なんかもう脳内事例で語ってるようにしか見えないんだが。
0694デフォルトの名無しさん
2008/02/16(土) 21:06:34全然読みづらくない。こういうgotoは全く問題にならないし、
Cで綺麗にエラー処理を書こうとしたらああならざるを得ないと思うけどな。
>>691
人格攻撃は生産的じゃない。もっと実になる議論をしようや。
0695デフォルトの名無しさん
2008/02/16(土) 21:08:160696デフォルトの名無しさん
2008/02/16(土) 21:14:12多重ループからの抜け出し、エラー処理、リソースの開放で定型的に使うならありだろ。
gotoを避けるというのを関数分割のタイミングにするのは馬鹿らしいし。
大体goto使ったが為のスパゲッティコードなんて大昔の非構造化BASIC以来見たことないぞ。
否定派
goto駄目。絶対。goto使う奴はコードが汚く低能!
0697デフォルトの名無しさん
2008/02/16(土) 21:24:220698デフォルトの名無しさん
2008/02/16(土) 21:26:41その程度の扱いを受けて当然だな。
0699デフォルトの名無しさん
2008/02/16(土) 21:28:11gotoを自由奔放に使いまくるという話の間にはずいぶんと開きがあることに
>>693が気付く時は来るのだろうか。。。(遠い目
0700デフォルトの名無しさん
2008/02/16(土) 21:34:550701デフォルトの名無しさん
2008/02/16(土) 21:35:50その程度の扱いを受けて当然だな。
0702デフォルトの名無しさん
2008/02/16(土) 21:37:07ただ現存する用法すべてに盲目的にケチつける奴がいるだけでw
0703デフォルトの名無しさん
2008/02/16(土) 21:39:47つーか、そもそも現存する用法すべてのリスト、このスレに挙がってるのか?
0704デフォルトの名無しさん
2008/02/16(土) 21:46:240705デフォルトの名無しさん
2008/02/16(土) 21:48:28まあ使えばいいんじゃない?
0706デフォルトの名無しさん
2008/02/16(土) 21:50:220707デフォルトの名無しさん
2008/02/16(土) 21:53:43まぁまともな会社で、まともな品質のプログラムがかけるプログラマでも
Linuxのソースクオリティで書けるプログラマなんて少ないけどな。
0708デフォルトの名無しさん
2008/02/16(土) 21:54:10ナイ、ナイ
0709デフォルトの名無しさん
2008/02/16(土) 21:56:40Linuxカーネルの可読性の低さはBSDハッカーの格好の標的だったのに。
今じゃLinuxカーネルが高品質と言われるようになったか。。。(遠い目
0710デフォルトの名無しさん
2008/02/16(土) 21:59:19そう指摘されるといや、そんなことないよとごまかす嫌goto厨。
もう年相応の趣味を持てずただリアルでの孤独を癒す為に宗教論争スレに常駐してるだけみたいだね。
0711デフォルトの名無しさん
2008/02/16(土) 22:00:11Cのマクロで例外処理を実装するような使い方はきれいなsetjmpの使い方だと思う。
0712デフォルトの名無しさん
2008/02/16(土) 22:00:190713デフォルトの名無しさん
2008/02/16(土) 22:01:45なるほど、poor man's continuationね。確かにそうかも。
0714デフォルトの名無しさん
2008/02/16(土) 22:05:480715デフォルトの名無しさん
2008/02/16(土) 22:07:12Cで例外つっても、単にジャンプすればいいだけじゃなくて、それ以外にも
C++でいうデストラクタの処理とか色々必要になるわけで。setjmpはつかわないわ。
0716デフォルトの名無しさん
2008/02/16(土) 22:07:50クオリティの高さに話を逸らしてるお馬鹿さんがいますね
0717デフォルトの名無しさん
2008/02/16(土) 22:26:19無関係だということにしたい人がいますね
0718デフォルトの名無しさん
2008/02/16(土) 22:27:27どうせマクロなんだからfinally実装しちゃえばいいじゃない。
NSAutoreleasePoolみたいに「暇なとき始末してね」と予約しておいて、
早めに開放したい資源(ファイルディスクリプタとか)を利用した後や、
イベントループのように定期的に戻ってくる場所で開放する手もある。
0719デフォルトの名無しさん
2008/02/16(土) 22:33:20そんな難しいことできるわけないだろ
お前実装してみろよ
0720デフォルトの名無しさん
2008/02/16(土) 22:33:493年目くらいで、やっとできるとまわりから認められ、
ちょっと自信が付いてきたやつ。
後輩に教える機会も増えて、得意になって、よく分からんくせに
中途半端な知識でものを語ってるんだろ。
gotoの話なんて、もう十何年も繰り返されてるのに。
0721デフォルトの名無しさん
2008/02/16(土) 22:35:040722デフォルトの名無しさん
2008/02/16(土) 22:37:110723デフォルトの名無しさん
2008/02/16(土) 22:40:58-嫌goto厨の主張はいつも抽象論の域をでない
-抽象論でgotoを否定するだけで、「おえらいさんが言ってただろ?だから従え」
という傲慢な主張しかない
-goto肯定派の具体的な例に関しては、「構造的に考えれば、とか、構造を再度
検討しなおせば」とか、これまた抽象論でしか返さない。
要するに、嫌goto厨の主張なぞその辺の学者のタワゴトにしかすぎず、
なんら実務面の利点を示しているわけではない。
0724デフォルトの名無しさん
2008/02/16(土) 22:41:48こんなコードを書く香具師がgotoを使ったらどんな恐しいことになることか。
0725デフォルトの名無しさん
2008/02/16(土) 22:43:00goto厨の提示したソース、どうにも実務的なのはないのだが。
あるというのならアンカーで示してくれ。
0726デフォルトの名無しさん
2008/02/16(土) 22:46:13-goto厨の主張はいつも抽象論の域をでない
-抽象論でgotoを肯定するだけで、「おえらいさんが言ってただろ?だから従え」
という傲慢な主張しかない
-goto否定派の具体的な例に関しては、「実用的ではない、とか、
gotoでも害がなければ」とか、これまた抽象論でしか返さない。
要するに、goto厨の主張なぞその辺のワナビーのタワゴトにしかすぎず、
なんら実務面の利点を示しているわけではない。
0727デフォルトの名無しさん
2008/02/16(土) 22:48:49ようするに目糞鼻糞
0728デフォルトの名無しさん
2008/02/16(土) 22:50:360729デフォルトの名無しさん
2008/02/16(土) 22:59:31goto使ったらダメとにかくダメって言ういかれぽんちに、
んなわけねーだろって言ってるだけだろ。
0730デフォルトの名無しさん
2008/02/16(土) 23:02:24せいかい^^
0731デフォルトの名無しさん
2008/02/16(土) 23:31:190732デフォルトの名無しさん
2008/02/16(土) 23:35:00だれ?
0733GOTO
2008/02/16(土) 23:56:150734デフォルトの名無しさん
2008/02/17(日) 00:18:430735デフォルトの名無しさん
2008/02/17(日) 03:32:45typedef 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_;
0736デフォルトの名無しさん
2008/02/17(日) 03:33:37} 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);
}
0737デフォルトの名無しさん
2008/02/17(日) 03:40:13TRY {
#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;
0738デフォルトの名無しさん
2008/02/17(日) 03:46:420739デフォルトの名無しさん
2008/02/17(日) 04:21:39grep goto すりゃ見つかるだろ。
0740デフォルトの名無しさん
2008/02/17(日) 04:25:13あと、for,whileなどのループ内では、このマクロは使えないね。
(BREAK_TRY のあと、ループ脱出条件を再度判定してbreak文を実行しなきゃならない:二度手間)
0741デフォルトの名無しさん
2008/02/17(日) 04:47:212chは行数制限があるから実用されているコードを貼るのは無理だね。
アンカーではなくポインタは示すので、あとは自分で調べて。
# 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;
0742デフォルトの名無しさん
2008/02/17(日) 06:54:58おいおい、今さら提示しても遅いって。>>723に
> -goto肯定派の具体的な例に関しては、「構造的に考えれば、とか、構造を再度
とか
> なんら実務面の利点を示しているわけではない。
とか書いた時点で、じゃあgotoの実用的かつ正しい使い方というのは
どんな具体例があったんだよって話なんだから。
0743デフォルトの名無しさん
2008/02/17(日) 06:55:01goto否定派曰く「全てのgotoが駄目だという奴などいない」
であれば、肯定派否定派など互いにレッテルを貼っているだけで不毛な言い合いだな。
「どういう場合にgotoを使うのか、使わないのか」という具体的な議論にこそ意味があると思うが。
0744デフォルトの名無しさん
2008/02/17(日) 06:59:38linuxカーネルの話は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;
}
0745デフォルトの名無しさん
2008/02/17(日) 07:03:07gotoを使わずにより良いコードを書ける人は代案をよろしく。
「744のように端折られると詳細がわからないから書けない」という言い訳はなしな。
「本物」のコードへのポインタは>>741にある。必要なら本物を見てくれ。
0746デフォルトの名無しさん
2008/02/17(日) 07:05:30抽象的な言い合いの間は散々吠えておいて、
こういう流れにされると何もいえなくなる人へ。
「お前はgotoを使うな」
0747デフォルトの名無しさん
2008/02/17(日) 07:22:04static 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;を二箇所に書くという書き方も、二箇所程度ならありかもね。
0748デフォルトの名無しさん
2008/02/17(日) 07:24:39bad:
...
return;
な部分をマクロにしちゃえばgotoなんて使う必要ないんじゃ?
0749デフォルトの名無しさん
2008/02/17(日) 07:27:08for (ループ条件) {
処理
do {
処理
if (条件) goto got_listener;
処理
} while (ループ条件);
continue;
got_listener:
処理
}
0750デフォルトの名無しさん
2008/02/17(日) 07:32:07goto got_listenerが一箇所なら
if (条件) {処理; break;}で済む問題だな。
複数箇所なら処理をstatic関数にすればいい。
そもそも「処理」ってくくれるぐらいまとまってるんだろ?
0751デフォルトの名無しさん
2008/02/17(日) 07:33:27全体の構造うんぬんの話の検証にはならない。
というか、むしろ局所的な制御しか考えてないと
goto慎重派に言われても仕方ないことになるが。
0752デフォルトの名無しさん
2008/02/17(日) 07:37:26過去何度かあったろ。いいかげん気付け。
0753デフォルトの名無しさん
2008/02/17(日) 07:41:45次から次へのgrep gotoした結果がタレ流されるパターンです。
1つの例にレスがついたらその議論を先にするのが礼儀というものだが
このスレのgoto厨は無視してひたすらgrepを続けます。
それがgotoクオリティ。
0754デフォルトの名無しさん
2008/02/17(日) 07:41:58>そもそも「処理」ってくくれるぐらいまとまってるんだろ?
いや。got_listenerの後の処理は長い。
do whileで条件を満たせなかった場合はcontinueするという意図のコード。
>>751
そうか。
>>752
ならばコードを読め。>>741参照。
0755デフォルトの名無しさん
2008/02/17(日) 07:49:46マクロは意図するところが十分に明確で、かつ処理が短い場合は良いアイデア。
今回の実際のコードではreturnを入れて3文なので悪くはないかも。
(r->statusに代入、ログ吐き、return)
ただしマクロの濫用もコードの可読性を落とすので避けるべき。
vhost.cはマクロについては単純なものしか使っていないので、ポリシーの違いだろうね。
0756デフォルトの名無しさん
2008/02/17(日) 07:52:510757デフォルトの名無しさん
2008/02/17(日) 07:54:540758デフォルトの名無しさん
2008/02/17(日) 07:55:28いや、俺が言ってる「まとまってる」のは長さじゃなくて、
使う変数の依存関係が閉じた傾向にあるという意味。
0759デフォルトの名無しさん
2008/02/17(日) 07:58:17「ここはこうgotoを使えばもっと綺麗になるのに」
という例を出すつもりはないのかね。
いつでもgoto慎重派にコードを書かせるのは
フェアじゃないと思うのだが?
0760デフォルトの名無しさん
2008/02/17(日) 08:04:27さあ「gotoを恐れずに使う兵共」の腕の見せ所だ!
0761デフォルトの名無しさん
2008/02/17(日) 08:23:27そうか。閉じた傾向とか何ともいえないのでソースを読んで。
>>759
それこそ全然フェアじゃない。
・「Cで書かれた実用的なプログラムでgotoを一切使っていないもの」が一つも出されていない。
・「ここはこう」の「ここ」を見つけるために、相手にそのプログラム全体を全て読めと?
相手にコードを書かせようと思うなら、題材くらい自分で出せ。
0762デフォルトの名無しさん
2008/02/17(日) 08:26:54情報として>>741が出されて、それを題材にしているにも関わらず、
実際にhttpdのソースをダウンロードして自分でソースを追ってみた人が、
ここで議論している人の中に誰もいなそうってところだな。
コードリーディングしない人には、コードを語る資格も能力もないよ。
0763デフォルトの名無しさん
2008/02/17(日) 08:40:570764デフォルトの名無しさん
2008/02/17(日) 08:43:08grep するだけなら楽でいいもんな。プ
0765デフォルトの名無しさん
2008/02/17(日) 08:46:32750は明らかに749しか読んでいないと思われ。
実際のコードに当たったらこんな発言が疑問形で出るわけがない。
>そもそも「処理」ってくくれるぐらいまとまってるんだろ?
そこに気付かない>>764自身も、他人を煽るだけで自分はコードを読んでいない。
0766デフォルトの名無しさん
2008/02/17(日) 08:47:34そこに気付かない>>764自身も、他人を煽るだけで自分はコードを読んでいない。
0767デフォルトの名無しさん
2008/02/17(日) 08:48:47そうじゃないと言うのなら、
「ここはこうgotoを使えばもっと綺麗になるのに」
という例があるはずだから、それを提示しろ。
できないなら、コード読まない厨認定な。
0768デフォルトの名無しさん
2008/02/17(日) 08:49:28と思うよ俺は。
0769デフォルトの名無しさん
2008/02/17(日) 08:50:04一方的に「コード読め」「改善策を出せ」と言うばかりの香具師がいるからな
0770デフォルトの名無しさん
2008/02/17(日) 08:50:150771デフォルトの名無しさん
2008/02/17(日) 08:50:370772デフォルトの名無しさん
2008/02/17(日) 08:52:10そうそう。grep厨はコードの断片を見せるだけで
議論は永遠に続くことになるんだよな。アフォらし。
0773デフォルトの名無しさん
2008/02/17(日) 09:02:40そこに気付かない>>766自身も、他人を煽るだけで自分はコードを読んでいない。
0774デフォルトの名無しさん
2008/02/17(日) 09:08:422chって「馬鹿しか得るものがない」場所だよね。
何の知識もない教えて君が相手を煽りながらタダで一方的に情報を得る。
教える側は何故か相手に罵倒されながら一方的に情報を提供して自分は何一つ得るものがない。
なので普通の人は嫌になってすぐに去り
2chに残るのは自己犠牲精神に満ち溢れた聖人と馬鹿だけ。
0775デフォルトの名無しさん
2008/02/17(日) 09:24:50> 何の知識もない教えて君が相手を煽りながらタダで一方的に情報を得る。
goto厨のことだね。
goto慎重派はちゃんと改善例を提示しているのに
goto厨は文句を言うばかりで何の改善例も提示しない。
0776デフォルトの名無しさん
2008/02/17(日) 09:33:40たかがgrepしただけでそこまで上から目線で言える根性が気に入った。
>>775
goto肯定派もコード出してるよ。>>469とか。目が腐りそうな糞コードだけど。
ちなみに>>469は>>485という形でgotoを使わずに可読性が上がったね。
0777デフォルトの名無しさん
2008/02/17(日) 09:35:560778デフォルトの名無しさん
2008/02/17(日) 09:38:200779デフォルトの名無しさん
2008/02/17(日) 09:56:300780653
2008/02/17(日) 10:11:45自動記憶域期間をもつオブジェクトの初期化子、(略)は、
文の場合と同じく実行中に宣言に到達するたびにこれを評価し、
値をそのオブジェクトに格納する。
とあるので、gotoで宣言(と初期化)をまたぎこしていると、
初期化はされないとすべきのようです。
また、C99では「可変修飾型をもつオブジェクトの宣言を飛び越しては
ならない」という制限が加わってますね。なるほど。
0781デフォルトの名無しさん
2008/02/17(日) 10:37:43goto否定派もコード出してるよ。>>267とか。目が腐りそうな糞コードだけど。
ちなみに>>267は>>263という形でgotoを使って可読性が上がったね。
0782デフォルトの名無しさん
2008/02/17(日) 11:07:56後輩に得意になって言っちゃったの?
gotoは使うなって。
0783デフォルトの名無しさん
2008/02/17(日) 11:12:38異議あり!代案なーし!
異議あり!代案なーし!
0784デフォルトの名無しさん
2008/02/17(日) 11:16:33if (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:
しかしまいったね。
・・
0785デフォルトの名無しさん
2008/02/17(日) 11:17:330786デフォルトの名無しさん
2008/02/17(日) 11:18:12代案?
すべての法律がダメだけどそれを国会議員200人ぽっちで作れるわけないだろ。
社会保険庁ですら数万人いるのに。
0787735
2008/02/17(日) 11:18:51CATCH節の中でthrow_exceptionするとFINALLYが走らない。
こりゃ結構恥ずかしい。インデントも崩れてるし。
0788デフォルトの名無しさん
2008/02/17(日) 11:19:23あなたに悪意を持つプログラマが goto を 80+0 と書いて
嫌がらせをするかもしれないから goto を使うべきではない
と。
ヴァァァァァァァァァァァ
ァァァァァァァァァァァ
ァァァァァァァァァァァァァァァァァァァァァァ
ァァァァァァァァァァァカ
じゃねーの?wwwwwwwwwwwwwwwwwwwww
0789デフォルトの名無しさん
2008/02/17(日) 11:20:41見事な釣り師だな
0790デフォルトの名無しさん
2008/02/17(日) 11:23:18森田さんこんなところにいたんですか。
ちなみに80+0と書き換えた森田さんは日常的に2ch語を上司に向かって話す極めつけの2chネラで、
バカジャネーノってAA使いまくりな人。
生まれは九州は福岡のとある会社の社長の息子。
0791デフォルトの名無しさん
2008/02/17(日) 11:23:2840年間、たぶん何百万人という単位のプログラマを釣りあげてる
恐るべしダイクストラ
0792デフォルトの名無しさん
2008/02/17(日) 11:25:34大工さんはWhileをgotoで書くなと言っただけじゃね?
goto使いだってwhile使えるところでgotoとか使わないだろ。
0793デフォルトの名無しさん
2008/02/17(日) 11:28:530794デフォルトの名無しさん
2008/02/17(日) 11:30:33『福岡人はgoto禁止』でいいんじゃね?
0795デフォルトの名無しさん
2008/02/17(日) 11:31:49『福岡人と仕事するときはgoto禁止』?
いや『福岡人は面接で落とせ』?
0796デフォルトの名無しさん
2008/02/17(日) 11:32:400797デフォルトの名無しさん
2008/02/17(日) 13:05:02あと、0に斜線が入ったフォント使うとか(0とoのような個別の事例にしか使えないけど)。
0798デフォルトの名無しさん
2008/02/17(日) 13:26:42いやそれがね、うちの会社、ウィルスバスターが更新しないように、インストーラーに手を加えた上でウィルス感染させやがるんですよ。
イントラネット管理者の統括してる本人がやるから信用しちゃうでしょ。
福岡に本社のある東京一部上場企業なんだけど。
だからエディタにキーワード追加くらい簡単にやってのけるよ。
0799デフォルトの名無しさん
2008/02/17(日) 13:39:040800デフォルトの名無しさん
2008/02/17(日) 13:41:59つうか字形が違いすぎてしばらく話の流れが全く理解できなかったよ
0801デフォルトの名無しさん
2008/02/17(日) 14:10:200802デフォルトの名無しさん
2008/02/17(日) 14:58:28電子計算機損壊等業務妨害 で告訴しろ。
(告訴状作って会社の法務部に送りつけるだけでも効果あるぞ)
0803デフォルトの名無しさん
2008/02/17(日) 15:07:57人事部に電話したら、「会社の方針でお前を監視してるんだから逆らうな」って言われたから。
人事部長と直接話したいって言ったけど無視された。
会社クビにされるときに人事部長を名乗る人が来たけど、なんと創価学会の池田先生に瓜二つ。
0804デフォルトの名無しさん
2008/02/17(日) 15:16:56こちらへどうぞ
ttp://pc11.2ch.net/test/read.cgi/prog/1197192900/
0805デフォルトの名無しさん
2008/02/17(日) 15:26:19「他人にいたずらされている」という妄想を抱いて、「なら反撃で、いたずら
し返さなければ」とイタズラして、会社側から疑いをかけられて監視されて、
あげくのはてにイタズラしていたことがバレてクビになった。
としか、文章からは読み取れない。
0806デフォルトの名無しさん
2008/02/17(日) 15:58:230807デフォルトの名無しさん
2008/02/17(日) 16:30:110808デフォルトの名無しさん
2008/02/17(日) 17:20:450809645
2008/02/17(日) 20:42:55void bar(int);
int func(int arg)
{
if(arg == 0)
goto foo;
{
int i;
i = arg*2;
foo:
bar(i);
}
}
0810645
2008/02/17(日) 20:43:39.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は確保されません。
0811デフォルトの名無しさん
2008/02/17(日) 20:48:02goto使うなっての以上に、ブロックで変数定義するなってのもある。
しかし、オブジェクトはその場所で作るしかないんだな。
0812デフォルトの名無しさん
2008/02/17(日) 21:33:130813デフォルトの名無しさん
2008/02/17(日) 21:44:22たった4つの32ビットレジスタで計算しないといけないのにそんな無駄なことできないでしょ。
少なくとも何かをするとしたらレジスタを使う。
やるとしても小さいループのループカウンタくらいか。
0814デフォルトの名無しさん
2008/02/17(日) 21:47:27何を期待してんのかわからn
0815デフォルトの名無しさん
2008/02/17(日) 21:58:11内側のブロックで宣言できないとしたら、
外側のブロックで宣言するだけ。
実態としては何も変わらない。
0816645
2008/02/17(日) 22:02:54ああ、テキトーに作った例だから、実際の動作は気にしないでくれ。
問題は、ブロックの中で定義した変数の領域が確保されていないのに、関数呼び出しに使われてしまうという事実ね。
多分、foo: の後にi = i+argなんてやってもダメだと思う。
0817デフォルトの名無しさん
2008/02/17(日) 22:03:51ヒント: jne L2 が実行された場合は L2 のどこで「領域が確保」されていますか?
0818645
2008/02/17(日) 22:04:030820デフォルトの名無しさん
2008/02/17(日) 22:26:56ガチガチにソースコードに対応するようなコードを吐いて欲しいなら
-O0 を付けるとか...してもそこまでガチガチなコードが出るかどうか。
0821デフォルトの名無しさん
2008/02/17(日) 22:28:40そういう問題じゃない。出ているコードは綺麗にソースに対応している
0822デフォルトの名無しさん
2008/02/17(日) 22:46:57>subl $8, %esp
で8バイト確保されていて
iが
>-4(%ebp)
なら、関数の先頭で「確保」されてるんじゃね?
0823デフォルトの名無しさん
2008/02/17(日) 22:48:59正解
0824デフォルトの名無しさん
2008/02/18(月) 02:57:19>goto使うなっての以上に、ブロックで変数定義するなってのもある。
いやこれはするだろ。
あれ、みんなしない派?
0825デフォルトの名無しさん
2008/02/18(月) 03:21:11ブロック内で変数定義することはある。
ただ、外の変数と名前がかぶらないほうがいいかなぁ〜、くらいは気を使う。
0826デフォルトの名無しさん
2008/02/18(月) 08:18:560827デフォルトの名無しさん
2008/02/18(月) 09:06:070828デフォルトの名無しさん
2008/02/18(月) 09:25:19必要になる。関数的に、なんでも再帰あちこちでreturnな書き方をすれば
それでうまくいく。
0829デフォルトの名無しさん
2008/02/18(月) 12:26:48吊り?
0830デフォルトの名無しさん
2008/02/20(水) 16:00:57そんな特定のアーキテクチャに依存した話を突然持ち出されてもねえ、、、
0831デフォルトの名無しさん
2008/02/20(水) 16:07:36> >なんでも再帰あちこちでreturn
> 吊り?
釣りでもなんでもない。ifやswitchが文でなく式なら、
return if (hoge) true else false;
みたいに書けるのに(3項演算子は可読性が低いから却下)、
そうでないから、
if (hoge) return true; else return false;
というように書かざるをえない、ってだけ。
0832デフォルトの名無しさん
2008/02/20(水) 17:15:500833デフォルトの名無しさん
2008/02/20(水) 17:18:180834デフォルトの名無しさん
2008/02/20(水) 18:46:16特に>>831のような単純な分岐の場合は。どうせ見た目で毛嫌いして
るだけだろうけど。
0835デフォルトの名無しさん
2008/02/20(水) 18:48:46ネストしたって適切なカッコさえつければ問題ないだろ。
特に>>831の場合には積極的に3項演算子を使うべき箇所と思われ。
0836デフォルトの名無しさん
2008/02/20(水) 18:56:34ということだけは覚えてほしい
0837デフォルトの名無しさん
2008/02/20(水) 18:59:353項演算子をif文とともに使って、ネスティングを削減すると、コードがすっきりするので好きだ。
0838デフォルトの名無しさん
2008/02/20(水) 19:16:21foo() {
cond = true
while (cond) {
・・・
・・・
if (...) {
cond = false
}
・・・
・・・
}
}
みたいな構造で、condのようなスコープの広い変数が
必要になるのが、再帰で処理するように書き直せば、
foo() {
・・・
・・・
if (!...) {
foo()
}
・・・
・・・
}
で済む、かもしれない、ってこと。
0839デフォルトの名無しさん
2008/02/20(水) 19:19:27再帰かどうかが、returnがif文の中か3項演算子の外かで左右されるとでも?
0840デフォルトの名無しさん
2008/02/20(水) 19:33:38でっていう
0841デフォルトの名無しさん
2008/02/20(水) 19:48:45いや、皆が問題にしてるのはそういうことではなく
while (cond) {
int i;
....
}
みたいなスタック操作の無駄のことと思われ。
0842デフォルトの名無しさん
2008/02/20(水) 21:19:370843デフォルトの名無しさん
2008/02/20(水) 22:22:30foo() {
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使う?
0844デフォルトの名無しさん
2008/02/20(水) 22:24:120845デフォルトの名無しさん
2008/02/21(木) 02:28:28(再帰を中断するときには使うかもしれん)
0846デフォルトの名無しさん
2008/02/21(木) 05:40:030847デフォルトの名無しさん
2008/02/21(木) 07:36:460848goto使わなければそれがいい派
2008/02/21(木) 10:34:02まあ、そういうコードが含まれているプログラムの中には
脆弱性だのバグだのいっぱい含まれているものだ。
セキュリティについて、潔癖で有名なDJBですら、結構gotoを
多くつかう。 まったく使わないで終わらせた作品としては
は、比較的私家版パッチの突っ込みが少ない publicfile くらい。
後は山のようにgoto文があってDJBは嫌いだという人間もいる。
0849デフォルトの名無しさん
2008/02/21(木) 10:37:28{} がつくと何でも変数スコープを狭く取りたがるつか、
同じ変数を使いまわしてもバグにならないというか、
単たる手抜きか。
0850デフォルトの名無しさん
2008/02/21(木) 14:08:080851デフォルトの名無しさん
2008/02/21(木) 15:58:33それも違うだろ。それくらい最適化でどうにでもできる。
0852デフォルトの名無しさん
2008/02/21(木) 20:22:54ハァ?再帰からgotoで抜けるだぁ?
これだからgoto厨は…
0853デフォルトの名無しさん
2008/02/21(木) 21:49:550854デフォルトの名無しさん
2008/02/21(木) 21:59:560855デフォルトの名無しさん
2008/02/21(木) 22:41:57お前ら俺のプログラムのケツにストリームデータ流し込んで実行してみろ。
0856デフォルトの名無しさん
2008/02/21(木) 22:50:35えっ!お前のケツにすとりーむでーtlk;ghklj;
0857デフォルトの名無しさん
2008/02/22(金) 07:15:04そんな最適化をされたらデストラクタロギングが使えなくなるじゃないか!!
0858デフォルトの名無しさん
2008/02/22(金) 13:10:22コンストラクタ・デストラクタが呼ばれなくなるような最適化なんて行われるわけないだろ。
少なくともC++では。
0859デフォルトの名無しさん
2008/02/22(金) 19:14:270860デフォルトの名無しさん
2008/02/22(金) 22:05:58どこの規格無視コンパイラだ?
0861デフォルトの名無しさん
2008/02/22(金) 23:47:10にしてほしい。そうじゃないとレビューする気にもなれない。
ここで出たようなgotoを使った書き直しの例なら、gotoを使ってないロジックを例えば
NSチャートとかで書いた方が、とてもとても分かりやすくて人にも説明し安いだろう。
チームメイトにロジックを説明するようにお願いてフローチャートをもってこられたら、
とりあえずバケツもって廊下に立っててくれるようにお願いしちゃうな。
システムが使われなくなるまでその人が死なずに内容も忘れずに保守するってのが保証さ
れてたとしても、仕事ではそんなロジックは受け入れ難いな。
だいたい現実的にgotoを使った方が良い場合ってのが、想定しづらい。
リソースだのコードサイズだののためのためにgotoを使うってのは、やらないと用件が
満たせないからって理由で、設計とかコーディングとかのさらに後に最適化フェーズを
設けてそこでやるんなら認めなくもないが、元からgotoを使うのが正しい場合なんての
を考慮しながらロジックを考えるような人とは一緒に仕事はできないなぁと思う。
なんでそんな書き方になってるか説明するための資料も作んないといけないし、仕事が
増えるばっかりだ。段階的抽象化とか物事を整理するとかに興味がないかできない人な
んだなとしか思えない。
誰かが事故にあってもリカバリがきくような状態を維持しようと思ったら、少しくらい
冗長になっても、なるべくわかりやすい設計&実装にしたいって思うのは普通だと思う
んだがなぁ。
0862デフォルトの名無しさん
2008/02/22(金) 23:56:49まで読んだ。
0863デフォルトの名無しさん
2008/02/23(土) 06:15:25まで読んだ。
0864デフォルトの名無しさん
2008/02/23(土) 06:38:46{
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、例外は使用不可。
0865デフォルトの名無しさん
2008/02/23(土) 06:43:29もうそれ飽きた。いいかげん空気読め、アフォ。
0866デフォルトの名無しさん
2008/02/23(土) 06:45:43処理4
0867デフォルトの名無しさん
2008/02/23(土) 06:52:11if(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;
0868デフォルトの名無しさん
2008/02/23(土) 06:58:18あとネストが深くならないのが。
0869デフォルトの名無しさん
2008/02/23(土) 07:02:22処理そのものがネスト構造になっているんだから、
コードもネストしたほうが実態がわかっていいんじゃねーの?
0870デフォルトの名無しさん
2008/02/23(土) 07:03:52なにがそんなに悔しいの?
0871デフォルトの名無しさん
2008/02/23(土) 07:05:330872デフォルトの名無しさん
2008/02/23(土) 07:05:36なるほどねー。
>>870
いや別に。リソース確保でネストさせるのが嫌いだってだけで。
0873デフォルトの名無しさん
2008/02/23(土) 07:07:280874デフォルトの名無しさん
2008/02/23(土) 07:08:190875デフォルトの名無しさん
2008/02/23(土) 07:08:50リソース確保の条件がネストしているのだから、
コードもネストしたほうが実態がわかっていいんじゃねーの?
0876デフォルトの名無しさん
2008/02/23(土) 07:09:530877デフォルトの名無しさん
2008/02/23(土) 07:10:19なるほどねー。
0878デフォルトの名無しさん
2008/02/23(土) 07:11:50>>870の>>863を>>869に読み間違えてたわwww
0879デフォルトの名無しさん
2008/02/23(土) 07:12:06短いならいいけど、長ければネストしたくないって人もいるだろう。
あと、エラーならその場で関数から抜けたいタイプのひともいるし、
あれだけじゃなんとも。
0880デフォルトの名無しさん
2008/02/23(土) 07:12:170881デフォルトの名無しさん
2008/02/23(土) 07:13:090882デフォルトの名無しさん
2008/02/23(土) 07:14:03>>878⇒>>880はねwwww読み間違えてたのはホント。
0883デフォルトの名無しさん
2008/02/23(土) 07:14:410884デフォルトの名無しさん
2008/02/23(土) 07:15:37ネストしたくなきゃ、
if (p1 && p2 && ...) {
とすればいいだけなんじゃ?
0885デフォルトの名無しさん
2008/02/23(土) 07:19:58たった3つの解放だけなんだから、解放をマクロにしちゃって
goto failedのかわりにFreeAll; return NULL;しちゃってもいいな。
いずれにせよ、このネタはもうイトフユだろ。
0886デフォルトの名無しさん
2008/02/23(土) 07:47:58まあその後出しジャンケンも>>885で残念賞なわけだがw
0887デフォルトの名無しさん
2008/02/23(土) 07:52:420888デフォルトの名無しさん
2008/02/23(土) 08:06:030889デフォルトの名無しさん
2008/02/23(土) 08:25:52リアルでアンカー読み違える香具師がgotoを使うのは
キ チ ガ イ に 刃 物
0890デフォルトの名無しさん
2008/02/23(土) 08:27:06gotoを使わない対案ならこの短い間に3つも出ましたが何か?
0891デフォルトの名無しさん
2008/02/23(土) 08:31:070892デフォルトの名無しさん
2008/02/23(土) 08:47:16おいおい、>>888の主語は「嫌goto厨は」なんだから、
gotoを使わない対案が出ていればそれで十分に反証になるだろw
0893デフォルトの名無しさん
2008/02/23(土) 09:25:380894デフォルトの名無しさん
2008/02/23(土) 09:32:550895デフォルトの名無しさん
2008/02/23(土) 09:37:310896デフォルトの名無しさん
2008/02/23(土) 09:58:53gotoを使わない対案ならこの短い間に3つも出ましたが何か?
0897デフォルトの名無しさん
2008/02/23(土) 10:01:080898デフォルトの名無しさん
2008/02/23(土) 10:06:180899デフォルトの名無しさん
2008/02/23(土) 10:09:560900デフォルトの名無しさん
2008/02/23(土) 10:39:25えーとさ。FAILEDっていうラベルの存在自体が
「物凄くソースコードの見通しを良くする、これ以上無い最高のコメント」
だと思うんだよ。
0901デフォルトの名無しさん
2008/02/23(土) 10:51:290902デフォルトの名無しさん
2008/02/23(土) 10:55:29goto派が一人しかいないと思ってるなら、
君はたった一人のgoto厨に向かって何を必死に反論しているのかしら?w
0903デフォルトの名無しさん
2008/02/23(土) 10:59:26脳ミソがスパゲッティになってるんじゃないの?
0904デフォルトの名無しさん
2008/02/23(土) 11:00:480905デフォルトの名無しさん
2008/02/23(土) 11:02:130906デフォルトの名無しさん
2008/02/23(土) 11:05:46FAILEDなんてラベル、>>864にはないんだけど・・・
ラベルも扱えない香具師がgotoを使うのは
キ チ ガ イ に 刃 物
0907デフォルトの名無しさん
2008/02/23(土) 11:06:50ただの罵り合いじゃん。
0908デフォルトの名無しさん
2008/02/23(土) 11:08:20オープンソースソフトウェアを少し読めばいくらでも見つかるし
まともなプログラマならばgotoを使うべきコードパターンというのを
イディオムとして持っている
が
業務の中で頭の固い奴を説き伏せてまで良いコードを書こうとは
思わないので仕事では適当にwhileやifをネストさせてその場限りの
コードをぐちゃぐちゃに書く。保守性など知らない
とりあえず「見た目上構造化」しておけばよいのだからそれ以上
考えても無駄無駄無駄。所詮は仕事
0909デフォルトの名無しさん
2008/02/23(土) 11:11:14ifをネストさせない対案も複数出ているが?
さあ、今度はどんな条件を後出しするのかなwwwwwww
0910デフォルトの名無しさん
2008/02/23(土) 11:11:36腐れUMLと自動生成された糞doc、スパイスとして捏造されたテスト報告書をくっつければ
ほら高品質ソフトウェアの出来上がりでござい
0911デフォルトの名無しさん
2008/02/23(土) 11:14:22馬鹿馬鹿しく肥大化した分岐条件
goto failedのかわりにFreeAll; return NULL;
馬鹿が思いつきで定義する糞マクロ
イイヨイイヨー
0912デフォルトの名無しさん
2008/02/23(土) 11:26:33>誰かが事故にあってもリカバリがきくような状態を維持しようと思ったら、少しくらい
>冗長になっても、なるべくわかりやすい設計&実装にしたいって思うのは普通だと思う
>んだがなぁ。
設計については正しい。
だが
実装については正しくない。
そしてここは実装について話すスレだよ。
0913デフォルトの名無しさん
2008/02/23(土) 11:30:380914デフォルトの名無しさん
2008/02/23(土) 11:31:51その場かぎりのgotoでグチャグチャになってる>>864にどんな保守性を期待してるのやら。
他人のコードレビュー受けたことないでしょ、君は。
0915デフォルトの名無しさん
2008/02/23(土) 11:33:01> まともなプログラマならばgotoを使うべきコードパターンというのを
> イディオムとして持っている
それが他人に読まれた時にどんな混乱をもたらすか
考えたこともないのがgoto厨クオリティ
0916デフォルトの名無しさん
2008/02/23(土) 11:36:59キ チ ガ イ に 刃 物
0917デフォルトの名無しさん
2008/02/23(土) 11:38:50> 876 名前:デフォルトの名無しさん [sage]: 2008/02/23(土) 07:09:53
> アンカー打ち間違える奴は、gotoでもラベル打ち間違えるに決まってる件について。
> 900 名前:デフォルトの名無しさん [sage]: 2008/02/23(土) 10:39:25
> えーとさ。FAILEDっていうラベルの存在自体が
まさにご名答。先見の明がありますな。
どこぞの後出しジャンケンと大違い。
0918デフォルトの名無しさん
2008/02/23(土) 11:49:140919デフォルトの名無しさん
2008/02/23(土) 11:50:450920デフォルトの名無しさん
2008/02/23(土) 11:53:47finallyはスマートポインタ、GC、例外ではないからねえw
0921デフォルトの名無しさん
2008/02/23(土) 12:03:48使わなくても書けるけど、特に宗教が無ければ使うよね普通。
0922デフォルトの名無しさん
2008/02/23(土) 12:06:04p1からp3まで格納するオブジェクトをつくって、
デストラクタでp1からp3を解放しろ。
ところで
> failed:
> if (p4) FreeResource4(p4);
これは何の冗談だ?p4はNULLなはずだが?
0923デフォルトの名無しさん
2008/02/23(土) 12:07:230924デフォルトの名無しさん
2008/02/23(土) 12:07:240925デフォルトの名無しさん
2008/02/23(土) 12:11:13そうやって評論家ばかり集まって何も生み出さないから日本は駄目なんだよ
0926デフォルトの名無しさん
2008/02/23(土) 12:11:33ほんと、>>867のように書いてみれば、failed:に来た場合p4はNULLだということに気付くはずなのに、
ツギハギだらけの思考で書いたんだろうな、>>864は。
0927デフォルトの名無しさん
2008/02/23(土) 12:11:390928デフォルトの名無しさん
2008/02/23(土) 12:13:430929デフォルトの名無しさん
2008/02/23(土) 12:18:21なのにgoto乱用厨は次から次へとほとんど同じようなコードを出してくる。
>>864のパターンはこのスレだけでも何度も出てきている。
いくら対案を出しても、
「オプソ探せばいくらでも例はあるモン、goto使ったほうがいいモン」
と言って駄々をこねる。
結論: goto乱用厨=ゆとり脳。
0930デフォルトの名無しさん
2008/02/23(土) 12:23:100931デフォルトの名無しさん
2008/02/23(土) 12:26:340932デフォルトの名無しさん
2008/02/23(土) 12:28:14アンカー打ちまちがえたりラベル打ちまちがえたりする
オッチョコチョイさんからねwww
0933デフォルトの名無しさん
2008/02/23(土) 12:28:46のあとlこ
if (p4) FreeResource(p4);
が書かれていない件
0934デフォルトの名無しさん
2008/02/23(土) 12:31:05へえお前はfreeしたポインタを返すのか。なかなか凄いな
0935デフォルトの名無しさん
2008/02/23(土) 12:32:28内容のある議論の入口にすら立てない
0936デフォルトの名無しさん
2008/02/23(土) 12:35:20933みたいな素人が知ったかぶりで自説を語るのが2ch
0937デフォルトの名無しさん
2008/02/23(土) 12:36:08> failed:
> if (p4) FreeResource4(p4);
これは何の冗談だ?p4はNULLなはずだが?
0938デフォルトの名無しさん
2008/02/23(土) 12:36:27うめ。
0939デフォルトの名無しさん
2008/02/23(土) 12:36:52実際このスレもせいぜい4,5人の素人が回してるだけだろ
0940デフォルトの名無しさん
2008/02/23(土) 12:36:52それがgoto厨クオリティ
0941デフォルトの名無しさん
2008/02/23(土) 12:39:03このスレを読む1%の労力でこのスレを読む100倍の内容が得られる
0942デフォルトの名無しさん
2008/02/23(土) 12:39:11finallyについては?
デストラクタについては?
さあ、finallyやデストラクタを使った方法が改悪だというレスへのアンカー示してみろよ。
0943デフォルトの名無しさん
2008/02/23(土) 12:40:19例外やスマートポインタやGC禁止って言ってるところで
finallyだのデストラクタだの、なぞなぞはお前のガキ相手にやってろ
0944デフォルトの名無しさん
2008/02/23(土) 12:41:37余計なif (p4) FreeResource(p4);が消えた点だけでも
>>867は>>864よりも優れているが?
0945デフォルトの名無しさん
2008/02/23(土) 12:42:34あのー、finallyは例外でもスマートポインタでもGCでもないんですがwww
君、プログラミング言語に関する知識が決定的に不足してるんじゃない?
0946デフォルトの名無しさん
2008/02/23(土) 12:44:24ありうる状態や制御の流れについての理解を促すというのも
構造化プログラミングの利点の1つだな。
簡単にgotoに逃げちまうと>>864のようなお粗末なコードになる。
0947デフォルトの名無しさん
2008/02/23(土) 12:44:47例外処理機構を備えていなくてfinallyだけ持っている言語を挙げよ
0948デフォルトの名無しさん
2008/02/23(土) 12:46:26アンカー示せないわけね。
まあ示してもどうせまた打ち間違えるだろうけど。
0949デフォルトの名無しさん
2008/02/23(土) 12:46:350950デフォルトの名無しさん
2008/02/23(土) 12:47:20単に現代的な言語なら例外もfinallyも持ってるというだけの話だろ。
何をマヌケな事をぬかしているのやら…
0951デフォルトの名無しさん
2008/02/23(土) 12:48:120952デフォルトの名無しさん
2008/02/23(土) 12:48:53とかね。
finallyやデストラクタと言った奴は軽いネタだったと思うんだが
ネタがネタとして扱われない議論厨の厨っぷりに呆然
0953デフォルトの名無しさん
2008/02/23(土) 12:54:20finallyと例外機構は実装としてほとんど独立なんだけど…
実際、finally句が実行されるのは例外の時だけじゃないし。
try…catchとの類似で混同してる人が多いけど。
gotoたまに使う派として恥かしいんでROMやめてレスしてみた。
0954デフォルトの名無しさん
2008/02/23(土) 12:55:17そんなのはどうでもいいよ。
問題なのは945(か他の誰かでもいいけどさ)が
947 に正面から答えられるかどうかだけ。
だいたい、945がちゃんと知識を持って書いてるなら、
そういう言語をすぐに答えれば逆に俺が大恥を書くことになる。
実は何の知識も無いくせに知ったかぶりで煽ってるから
すぐにケツをまくって格好悪く逃るハメになるのさ。
0955デフォルトの名無しさん
2008/02/23(土) 12:55:59↓具体化してください、どーぞ。
0956デフォルトの名無しさん
2008/02/23(土) 12:58:28http://pc11.2ch.net/test/read.cgi/tech/1203658291/
0957デフォルトの名無しさん
2008/02/23(土) 12:58:420958デフォルトの名無しさん
2008/02/23(土) 13:00:03まあ落ち着いて>>950でも読んでみたら?
0959デフォルトの名無しさん
2008/02/23(土) 13:00:382chリロードするしか生きがいのないクズどもが
goto使う・使わない人間の人間性叩きしかやってないし
次はマ板でやれよ。
0960デフォルトの名無しさん
2008/02/23(土) 13:01:570961デフォルトの名無しさん
2008/02/23(土) 13:02:390962デフォルトの名無しさん
2008/02/23(土) 13:03:11悪いのはラベルだ。
0963デフォルトの名無しさん
2008/02/23(土) 13:03:22「例外もfinallyも持っている言語で>>864のようなコードを書くこと」
について議論してたの?
0964デフォルトの名無しさん
2008/02/23(土) 13:03:590965デフォルトの名無しさん
2008/02/23(土) 13:04:03http://pc11.2ch.net/test/read.cgi/tech/1123726695/
0966デフォルトの名無しさん
2008/02/23(土) 13:06:59わざわざ具体的な例を挙げて「使用不可」と断りを入れてるぐらいだから、
そこに挙げられていないものはデフォルト使用可なんじゃねーの?
いいかげんにしないとまた「条件後付け」と指摘されるぞw
0967デフォルトの名無しさん
2008/02/23(土) 13:08:31構造化以前を実体験として知らない年代の人がgoto議論なんてするもんじゃないよ。
それは別にレベルの高い低いじゃなくて、時代が違うというだけ。
0968デフォルトの名無しさん
2008/02/23(土) 13:11:340969デフォルトの名無しさん
2008/02/23(土) 13:12:46わざわざ例外だのGCだのと言うぐらいだから、
少なくともC限定の話だとは思えないよな。
0970デフォルトの名無しさん
2008/02/23(土) 13:15:050971デフォルトの名無しさん
2008/02/23(土) 13:15:250972デフォルトの名無しさん
2008/02/23(土) 13:15:530973デフォルトの名無しさん
2008/02/23(土) 13:16:250974デフォルトの名無しさん
2008/02/23(土) 13:16:370975デフォルトの名無しさん
2008/02/23(土) 13:18:200976デフォルトの名無しさん
2008/02/23(土) 13:25:260977デフォルトの名無しさん
2008/02/23(土) 13:26:340978デフォルトの名無しさん
2008/02/23(土) 13:28:16goto heaven;
0979デフォルトの名無しさん
2008/02/23(土) 13:29:55スレタイ読め。
このスレは、finallyや多重breakを語るスレだ。
finallyを対案に使って何が悪い?
0980デフォルトの名無しさん
2008/02/23(土) 13:32:280981デフォルトの名無しさん
2008/02/23(土) 13:34:500982デフォルトの名無しさん
2008/02/23(土) 13:40:480983デフォルトの名無しさん
2008/02/23(土) 13:42:090984デフォルトの名無しさん
2008/02/23(土) 13:44:180985デフォルトの名無しさん
2008/02/23(土) 13:45:590986デフォルトの名無しさん
2008/02/23(土) 14:16:010987デフォルトの名無しさん
2008/02/23(土) 14:18:12あるよ。
でも「構造化以前に開発経験のある者」に限定するなら、レスの98%位が不合格だ。
今現在もコードを書いている人間が語るから面白いのさ。
0988デフォルトの名無しさん
2008/02/23(土) 14:22:40このスレの99%のレスは落第だと思うな。
0989デフォルトの名無しさん
2008/02/23(土) 14:24:300990デフォルトの名無しさん
2008/02/23(土) 14:25:42サブルーチンはgotoかgosubでしか実装できなかったろ
0991デフォルトの名無しさん
2008/02/23(土) 14:31:29でもNEXT J, Iとかはあったな。うめ。
0992デフォルトの名無しさん
2008/02/23(土) 14:34:040993デフォルトの名無しさん
2008/02/23(土) 14:34:040995デフォルトの名無しさん
2008/02/23(土) 14:34:590997デフォルトの名無しさん
2008/02/23(土) 14:35:170998デフォルトの名無しさん
2008/02/23(土) 14:35:410999デフォルトの名無しさん
2008/02/23(土) 14:36:011000デフォルトの名無しさん
2008/02/23(土) 14:36:2010011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。