5ちゃんねる ★スマホ版★ ■掲示板に戻る■ 全部 1- 最新50  

■ このスレッドは過去ログ倉庫に格納されています

gotoを恐れず使う兵共がfinallyや多重breakを語るスレ

1 :デフォルトの名無しさん:2005/08/11(木) 11:18:15
前スレ http://pc8.2ch.net/test/read.cgi/tech/1021364372/

2 :デフォルトの名無しさん:2005/08/11(木) 11:29:02
goto 1000

3 :デフォルトの名無しさん:2005/08/11(木) 12:32:08
このボタンを押せば強制終了っていう場合は
どうやって実装する?

4 :デフォルトの名無しさん:2005/08/11(木) 12:42:54
一般的には、ボタンが押されたことを通知するメッセージを捕捉して、
トップレベルウィンドウを閉じる処理をするんだろうなぁ。
いずれにしてもメッセージ操作だけだね。

5 :デフォルトの名無しさん:2005/08/11(木) 12:51:53
>>3
外部割り込み

6 :デフォルトの名無しさん:2005/08/11(木) 13:07:40
ボタンの後ろに機械接点があって、押すと接点が解放しPCの電力供給を絶つようにする。

7 :デフォルトの名無しさん:2005/08/11(木) 13:36:10
核ミサイルを発射する処理をすれば

8 :マイク ◆yrBrqfF1Ew :2005/08/11(木) 14:38:37
例外的な状況こそ例外

9 :デフォルトの名無しさん:2005/08/11(木) 16:00:29
>>8
トートロジー

10 :デフォルトの名無しさん:2005/08/11(木) 16:01:10
>>1
gotoを恐れずに使いたくないからfinallyや多重breakを使うわけだが。

11 :デフォルトの名無しさん:2005/08/11(木) 16:23:09

本格的なプログラムを作成するために存在するC++にはなぜfinallyや多重break,continueがないのですか?

12 :マイク ◆yrBrqfF1Ew :2005/08/11(木) 16:36:16
トートロジー?(▽

13 :デフォルトの名無しさん:2005/08/11(木) 16:37:29
トポロジーの親戚さ

14 :デフォルトの名無しさん:2005/08/11(木) 17:14:38
>>11
finallyがないのはクラスを作ってデストラクタで何とかしなさいということ。
しかもstd::auto_ptrを始めとして大体は既にそのようなクラスが存在するから自分で作ることは少ない。

//俺が思うにfinallyや多重break, continueがないのは単に思いつかなかっただけではないかという気がする。

15 :デフォルトの名無しさん:2005/08/11(木) 19:13:46
初代C++から幾度も仕様拡張・改変が繰り返されているのに?

16 :デフォルトの名無しさん:2005/08/11(木) 19:16:08
ところで、finallyって機能の一般的な名称としては何て言うの?
俺の脳内的には「あとしまつ部」なんだけど、これじゃ格好悪いし。

17 :デフォルトの名無しさん:2005/08/11(木) 19:25:31
>>16
ってことは、お主は try とか catch は何て言うのよ
「finally 節」 で良いじゃん

18 :デフォルトの名無しさん:2005/08/11(木) 19:55:49
C++がJavaのfinallyを見て言った
C++「おまえ、それでよくガベージコレクタがあるって言えたな」
Java「みんなCが好きなんだよ」

19 :デフォルトの名無しさん:2005/08/11(木) 20:08:20
??

ああ、メモリ以外は自分で解放する必要があるってことか

20 :デフォルトの名無しさん:2005/08/11(木) 20:41:06
Cが嫌いな奴もいるだろ
女の子とか

21 :デフォルトの名無しさん:2005/08/11(木) 20:44:16
>>20
偏見。私は女だがCが嫌いというわけでもない。

22 :デフォルトの名無しさん:2005/08/11(木) 20:57:05
>>21
お前が本当に女なら、おっぱい晒せ。


23 :デフォルトの名無しさん:2005/08/11(木) 21:03:21
>>21
ずっと前からお前の事好きだった

24 :デフォルトの名無しさん:2005/08/11(木) 23:21:32
実は私、男なの。ゲイなのよ。

25 :デフォルトの名無しさん:2005/08/11(木) 23:22:24
ポーーーーーーーーーーーーゥゥゥゥゥゥッッッ!!!
どーも〜〜〜、ゲイでぇ〜〜〜〜〜す〜〜〜〜

26 :デフォルトの名無しさん:2005/08/11(木) 23:30:58
gotoを恐れず使う兵共はゲイだと

27 :デフォルトの名無しさん:2005/08/12(金) 00:20:34
ニューハーフなら受け止める

28 :デフォルトの名無しさん:2005/08/12(金) 11:54:43
スレが危険な方向に……

29 :デフォルトの名無しさん:2005/08/12(金) 12:30:22
これでまたさらにム板住民→キモイという方程式が確固たるものに…
>>22は氏んでくれ

30 :デフォルトの名無しさん:2005/08/16(火) 23:30:11
次スレ立ってたのか。

>10
然り。

31 :デフォルトの名無しさん:2005/08/17(水) 01:41:13
age

32 :デフォルトの名無しさん:2005/08/17(水) 11:41:55
>>3
組み込みの場合のマジレス。

while(1) ;

33 :デフォルトの名無しさん:2005/08/18(木) 00:02:44
Cとかでtry-catchサポートするようになったら
やっぱfinally無しではキツい気がする。

finallyの中身は後片付けでしかないんで
デストラクタに書けばいいだろと言う主張は
なんか面倒くさい気もするけど納得できた。

C++とは無関係にCにも例外処理とfinallyが欲しい。

34 :デフォルトの名無しさん:2005/08/18(木) 00:18:21
>>33
try-catchに関しては、普通にC++コンパイラ使えば良いじゃん。


35 :デフォルトの名無しさん:2005/08/18(木) 01:17:31
try-catch
使ったらそれはもうC++だよw

36 :デフォルトの名無しさん:2005/08/18(木) 03:16:49
つ Objective-C (Cocoa)

37 :デフォルトの名無しさん:2005/08/18(木) 09:11:42
>>33
>C++とは無関係にCにも例外処理とfinallyが欲しい。

あるんだけど。

これまた、C++と無関係なCの例外処理だから、catchに困るんだけどね。

38 :デフォルトの名無しさん:2005/08/20(土) 12:32:28
              :ill||||||||||l:
             :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 ̄ ̄|::::      | ~ ̄ ̄ ̄| ̄|
      |_|:.::.:.:.:|:::::      |:.:.:.:.:.::..:.:.:|_|
      .:.:.:.:.:.:.:.:.:|;;;::::      .|.:.:.:.:.:.:.:.:.:..:.:.:.:

39 :デフォルトの名無しさん:2005/08/20(土) 12:52:56
((((;゚д゚))))ヤメマス!

40 :デフォルトの名無しさん:2005/08/21(日) 10:43:27
現代のプログラミング言語で、Fortranのような言語で使用されていたGOTOを
必要としない言語は何でしょうか?


41 :デフォルトの名無しさん:2005/08/21(日) 11:01:17
>>40
「Fortranのような言語で使用されていたGOTO」というと、こんなのか?
ttp://xlsoft.com/jp/products/intel/cvf/docs/vf-html/az/az05_54.htm

42 :デフォルトの名無しさん:2005/08/21(日) 11:13:07
一般的なGOTOですね。
CやC++等ではGOTO使わないと思うのですが、GOTOを必要としない
ための構造というと、どういうものなのでしょうか?

もちろんFORやWHILEループ、SWITCH等はそれだとはおもうのですが。

43 :デフォルトの名無しさん:2005/08/21(日) 14:27:40
>GOTOを必要としないための構造というと、どういうものなのでしょうか?
つ[COME FROM文]

ttp://www.fortran.com/fortran/come_from.html

44 :デフォルトの名無しさん:2005/08/21(日) 14:43:51
>>42
ダイキストラたんに聞いてこい。

45 :デフォルトの名無しさん:2005/08/21(日) 23:26:50
>>40
つ[構造化定理]

46 :デフォルトの名無しさん:2005/08/22(月) 13:51:36
>>42
>CやC++等ではGOTO使わないと思うのですが
あなたがどう思うかに関わらず
goto を必要とする人々はいます。
つーか、そういう質問をするスレではありません。

47 :デフォルトの名無しさん:2005/08/25(木) 10:04:14
>>42
継続(current-continuation)。
明示的に扱えるのはschemeくらいしか無いが。

48 :デフォルトの名無しさん:2005/09/27(火) 12:40:41
スレタイの無理やり加減が結構好きなんだが
さりとてこれといった話題があるでもない。

49 :デフォルトの名無しさん:2005/10/23(日) 18:03:34
現実問題goto使った汚いコードよりgoto使わない汚いコードのほうが100倍多い件

50 :デフォルトの名無しさん:2005/10/23(日) 18:07:55
よくわかんない。
統計とってよ。

51 :デフォルトの名無しさん:2005/10/23(日) 23:06:54
取ったら取ったでサンプルが偏ってるとか言われそうだな

52 :デフォルトの名無しさん:2005/10/23(日) 23:19:17
ちゃんと、そう言われないと思うようなデータを取ってこいよ。

53 :デフォルトの名無しさん:2005/10/23(日) 23:21:13
「汚い」の定義もしないで何を話しているのか・・・

54 :デフォルトの名無しさん:2005/10/23(日) 23:22:21
お前ら良くこんな底の方にあるスレに気がついたな

55 :デフォルトの名無しさん:2005/10/23(日) 23:23:37
>>53
定義はいらん。主観だからだ。
ヒューマンインターフェースチックな評価手法が妥当だと思われる。

56 :デフォルトの名無しさん:2005/10/23(日) 23:25:07
汚ないコードとgotoを使う・使わないが直交しているし、
gotoを使わないコードはgotoを使うコードの100倍どころか
1000倍以上存在しているだろうから、
goto使った汚いコードよりgoto使わない汚いコードのほうがはるかに多いだろう。


57 :デフォルトの名無しさん:2005/10/23(日) 23:27:22
goto使いたがる人間はコーディングに対して意識の高い人間だからコードはきれい。
ただgotoを排除したがる人間は噂レベルの情報を鵜呑みにする思考停止したコーディングレベルの低い人間だからコードが汚い。

58 :デフォルトの名無しさん:2005/10/24(月) 09:58:24
すでにgotoの存在自体を知らないプログラマが大多数を占めている罠


59 :デフォルトの名無しさん:2005/10/24(月) 10:24:45
よくわかんない。
統計とってよ。

60 :デフォルトの名無しさん:2005/10/24(月) 13:55:43
統計統計と連呼しないで下さい。話を止める効果しかありませんよ。
ご自身の主張をなされば良いでしょう

61 :デフォルトの名無しさん:2005/10/24(月) 16:35:13
「早起きは三文の得」と言われても、統計を要求する人なんだよ、たぶん。

62 :デフォルトの名無しさん:2005/10/24(月) 17:39:59
その三文とは金額のことですか? それとも距離のことですか?
具体的にどんな得があるというのか説明してください。

とか?

63 :デフォルトの名無しさん:2006/01/05(木) 19:14:32
>>58
それはないよ
ジャンプも知らない奴はデバッグできない

64 :デフォルトの名無しさん:2006/01/05(木) 19:19:09
なぜアセンブリのgotoは許されるのかについて

65 :デフォルトの名無しさん:2006/01/05(木) 19:20:29
っていうか、アセンブリでjmpなかったら何もできん・・・w

66 :デフォルトの名無しさん:2006/01/05(木) 19:21:45
つかお前らassertスレが大分前に落ちましたよ

67 :デフォルトの名無しさん:2006/01/09(月) 00:09:17
gotoだろうが何だろうが頭ごなしに否定あるいは肯定をするのは自分でモノを考えていない証拠です!><
プログラミングってのがそんな定型的な作業ならわざわざ人間様がやる必要はないはずです!><

68 :デフォルトの名無しさん:2006/01/09(月) 00:20:44
>>67
自分で考えているかどうかっつーより、思考停止しているだけの話だろ。

69 :デフォルトの名無しさん:2006/01/10(火) 00:05:45
「自分で考えていない」と「思考停止している」はどう違うのか

70 :デフォルトの名無しさん:2006/01/15(日) 22:31:06
gotoは使ってより美しくなるのなら使え、そうでないなら使うな、ではないか?



71 :デフォルトの名無しさん:2006/01/16(月) 00:10:04
>>70
同意するけど。
「何が美しいか」は完全に個人的な感覚に属する問題だからw

72 :デフォルトの名無しさん:2006/03/03(金) 02:45:41
gotoにまつわる話だけで一冊の本になりそうなんだが
どこか出してくれないかな。買うぜ。

73 :デフォルトの名無しさん:2006/03/03(金) 21:13:04
>>71
goto排斥原理主義者にとっては「gotoが使われている」=「最悪に醜い」だからなぁw

74 :デフォルトの名無しさん:2006/03/05(日) 14:23:47
knuth先生のコードにもgotoが使われているものがあったぞ。
確かミニマックスαβ探索だったと思う。

knuth先生だって必要最低限のgoto使うことがあるのだから、原理主義はやめるべき。



75 :デフォルトの名無しさん:2006/05/03(水) 20:41:23
goto 1

76 :デフォルトの名無しさん:2006/05/03(水) 20:52:18
>>74
ってか、knuth は goto 擁護論者の筆頭だろ。


77 :デフォルトの名無しさん:2006/05/03(水) 21:42:42
高徳納には先生ってつける奴多いけど何で?

78 :デフォルトの名無しさん:2006/05/04(木) 17:16:51
趣味だろ

79 :デフォルトの名無しさん:2006/05/04(木) 22:28:29
先生と 生徒

ハァハァ

80 :デフォルトの名無しさん:2006/05/04(木) 22:53:19
ジジイは趣味じゃないからパス

81 :デフォルトの名無しさん:2006/08/08(火) 15:08:54
 if (A) { procX; }
 else 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


82 :81:2006/08/08(火) 15:09:56
書き込んで気が付きましたがスレ違いっぽいですね。
すみません。

83 :デフォルトの名無しさん:2006/08/08(火) 15:14:08
if(B) procY;
else if(!A) return;
procX;

普通にこれではマズいのか?

84 :81:2006/08/08(火) 15:57:02
>>83
ぉぅっ。エレガントです…。思いつきませんでした。

実際のコードはAで判定できる箇所が多くかつ判定自体も速いので、
できればAの判定を先に持ってきたいのですが…。
先に書くべきでしたね。

85 :デフォルトの名無しさん:2006/08/08(火) 16:58:17
if(!A) {
 if(B) procY;
 else return;
}
procX;

これで>>81と等価かな。

86 :81:2006/08/08(火) 18:22:30
>>85
できるもんなんですねぇ…。
勉強になりました。ありがとうございました。


87 :デフォルトの名無しさん:2006/08/08(火) 20:00:42
そういう思考ができない人はあまりプログラマに向いて無い希ガス

88 :デフォルトの名無しさん:2006/08/08(火) 20:15:33
>>81
俺ならこうやってネストしちゃうな。
(例として、条件がCまで、処理がprocZまでの三段階に増えたとする)

if(!A) {
 if(!B) {
  if(!C) return;
  procZ;
 }
 procY;
}
procX;

89 :デフォルトの名無しさん:2006/08/08(火) 21:43:38
誰もお前には聞いてないんだよカス

90 :デフォルトの名無しさん:2006/08/08(火) 22:43:54
GOTO使う事によってコードが短くなる件

91 :デフォルトの名無しさん:2006/08/08(火) 22:54:29
まあ、goto使うことで
コードが短くも速くもならないなら
使うなとは言えるなw

92 :デフォルトの名無しさん:2006/08/08(火) 23:20:51
    if (flag)
        goto N0021;
    return;

N0021:
    〜

こういうコードならつい最近見た。Fortran から C に単純変換したものらしい。
こういうのがいたるところに orz

93 :デフォルトの名無しさん:2006/08/08(火) 23:37:24
>>92
実行形式から逆コンパイルした結果も
それと同様に goto だらけになったりするんだろうなぁ。

94 :デフォルトの名無しさん:2006/08/09(水) 19:48:06
>>89
では今度からきちんと指名 (無料) するように。

95 :デフォルトの名無しさん:2006/09/06(水) 08:55:10
コンパイル済みの汗ソース見ればくだらない議論と気付くはずw

96 :デフォルトの名無しさん:2006/09/06(水) 20:08:23
ちうか、わざわざ高級言語つって読み書きしやすい制御構文を用意しているのに、
それを破壊するような使い方をするなっていうのがgotoは悪派の主張なわけで、
機械語に落ちれば全部jmpだろってのはあんまり関係ないよな。

まあ、機械語レベルのjmp命令がif等の制御構文と同等のレベルで
読み書きできるような人間にゃgotoだろうがforだろうが関係ないのかもしれんが、
そうじゃない人もいるんでそういう人も思いやってくれよということで。

97 :デフォルトの名無しさん:2006/09/28(木) 07:51:36
1.gotoはどんな事があっても絶対使うな!
2.gotoはなるべく使わない方がいい

初心者に教えるなら1の方が正しいと思う。

98 :デフォルトの名無しさん:2006/09/28(木) 08:24:30
ちなみに俺自身がどの程度使っているか調べてみたら、
92年ごろこんな事やってた。

// ポートからマウス移動量を取得
outp(0x7fdd,0x80);goto L1;
L1: x1 =inp(0x7fd9)&0xf;
outp(0x7fdd,0xa0);goto L2;
L2: x1+=(inp(0x7fd9)&0xf)<<4;
outp(0x7fdd,0xc0);goto L3;
L3: y1 =inp(0x7fd9)&0xf;
outp(0x7fdd,0xe0);goto L4;
L4: y1+=(inp(0x7fd9)&0xf)<<4;
outp(0x7fdd,0);goto L5;
L5: wark =inp(0x7fd9);

pc98のコードだが、今となってはよく分からん。
見ての通り組み込みに近い処理なので、こういうウェイトが
必要な場合もあったんだろうな、たぶん。


99 :デフォルトの名無しさん:2006/09/28(木) 19:48:42
ジャンプ系の命令を挟んで数clockをwaitするってこと…なのか?
要するにnop代わりにgotoを使ったと…結構アレげだな

100 :98:2006/09/28(木) 20:20:07
>ジャンプ系の命令を挟んで数clockをwaitするってこと…なのか?

たぶん、そういう事をやりたかったのだと思う。
gotoはCで書けるけど、nopはasmブロックで書かなくてはならないので
gotoを選択したんじゃないかねー。「念のため」的なコードは書かない
主義なので、このgotoが無ければ動かない機種があったのだとは思う。
14〜15年前の若かりし日のコードなんで詳しい事は思い出せないなw

101 :デフォルトの名無しさん:2006/09/28(木) 23:28:51
>>100
約15年前のキミに言っておきたい。
そのコードにはコメントを入れておけとw

102 :デフォルトの名無しさん:2006/09/28(木) 23:29:29
おっと、もちろん、goto使用理由に関するコメントな。

103 :デフォルトの名無しさん:2006/09/29(金) 00:27:57
最近のコンパイラだと、最適化で消される悪寒・・・

104 :98:2006/09/29(金) 00:49:32
>そのコードにはコメントを入れておけとw
まったくもってそうかも知れない。。。

ちなみに別な所はこんな感じ

// マウス割り込みを許可する
void pascal MOUSE::_enable()
{
asm pushf
disable();
setvect(MOUSE_VECT,MOUSE::main); // ベクタの更新
outp(0x7fdf,0x93); // マウスモードセット
int a = inp(0x0a) & 0xdf; // 8259A(スレーブ)読みだし
outp(0x0a,a); // マウス割り込み許可(8259A)
goto w1;
w1: outp(0x7fdf,0x08); // マウス割り込み許可(8255A)
goto w2;
w2: asm popf
}

これだけマメにコメント入れているのに問題のgotoだけ何のコメントも
入ってないのは一体。。。。orz



105 :デフォルトの名無しさん:2006/09/29(金) 06:52:14
自信の有無か、切羽詰ってたのか、或いは煮詰まっていたのか。

106 :デフォルトの名無しさん:2006/09/29(金) 23:52:01
>>104
マジックナンバー(0x7fdfとか)に対するコメントはgoodだが、
「ベクタの更新」はコメント要らない気がする。
ていうか、だからgotoにコメント入れろとw

107 :デフォルトの名無しさん:2006/09/30(土) 02:16:48
goto を入れるまでも無いくらい、自然で当然な行為だったんでわ。

108 :デフォルトの名無しさん:2006/09/30(土) 02:17:28
goto を、じゃなくてコメントを、だった。
酔ってるんで許してくれ。

109 :デフォルトの名無しさん:2006/09/30(土) 02:21:43
nopするだけのasmブロックをマクロで定義した方が良かったと思われる。

110 :デフォルトの名無しさん:2006/12/01(金) 12:12:09
gotoを恐れなく使うのなら、finallyやbreakなんてヌルい物じゃなく、
gotoより強力な継続をバリバリに活用する方法を語るべきだろ。

111 :デフォルトの名無しさん:2006/12/01(金) 12:34:53
ま、要するに使う側にとっては多少CPU時間が変わろうが仕様通り動けば良いわけだから
個人で開発するぶんには、完全に好みと言うか主観なわけで。


112 :デフォルトの名無しさん:2006/12/04(月) 10:41:09
それは議論の対象外だろ

113 :デフォルトの名無しさん:2006/12/23(土) 22:52:44
個人的に、breakとか使わなくてもifとgotoで事足りるんだが。

114 :デフォルトの名無しさん:2006/12/24(日) 15:34:12
そりゃ、そうだろ…

115 :デフォルトの名無しさん:2006/12/24(日) 15:46:17
プリフェッチの関係でnopではなくjmp shortを使わないとウエイトにならないとかでしょ?
当時のPC98ではそれが普通だったっつーか俺が覚えてるくらいだから広まってはいたんじゃないか

116 :デフォルトの名無しさん:2006/12/25(月) 13:40:26
これまで何度も言われてきたことだけど
「個人で開発するぶんには・・・」とか「***で事足りるから***は不要」とか
無意味だとは思わんかね?

117 :デフォルトの名無しさん:2006/12/25(月) 14:15:25
andとnotとorとgotoで事足りるから制御構造は不要

118 :デフォルトの名無しさん:2006/12/27(水) 00:36:01
nand さえあれば、andもnotもorも不要なんじゃなかったっけ?

119 :デフォルトの名無しさん:2006/12/28(木) 15:51:00
最終的にはチューリングマシン云々とかマシン語云々に行き着くんだろうな

120 :デフォルトの名無しさん:2006/12/29(金) 00:38:20
>>119
フルアセンブラで組むのはさすがにバカ→C言語を使う俺、最高→いやいやC++使いの俺、最高→(以下略

121 :デフォルトの名無しさん:2006/12/29(金) 01:11:44
プログラマを顎で使うクライアントの俺、最高

122 :デフォルトの名無しさん:2006/12/29(金) 06:34:33
作業に見合うだけのお金を払ってくれるならな。

123 :デフォルトの名無しさん:2007/01/02(火) 20:09:15
>>81と似たケースなんだけど
if(A){
 if(B){
  procX;
 } else {
  procY;
 }
} else {
 procY;
}

ってなってたら判断回数を増やさずにprocYを
一箇所だけにしたい場合、

if(A){
 if(B){
  procX;
 } else {
  goto _Y;
 }
} else {
_Y:
 procY;
}

って書く以外にある?


124 :デフォルトの名無しさん:2007/01/02(火) 20:28:59
if (A && B){
  procX;
} else {
  procY;
}
じゃいけないの?

125 :デフォルトの名無しさん:2007/01/02(火) 20:55:36
それじゃプログラムが変わってしまう。

126 :デフォルトの名無しさん:2007/01/02(火) 20:58:39
あれ、ぼけてたかも…

127 :デフォルトの名無しさん:2007/01/02(火) 21:07:49
>>123
すげー
gotoは絶対禁止ってルール作った方がいいよw

128 :デフォルトの名無しさん:2007/01/02(火) 21:20:41
>>125
特に変わってないように見えるんだけど

129 :デフォルトの名無しさん:2007/01/02(火) 22:20:23
>>128
>>126

130 :デフォルトの名無しさん:2007/01/02(火) 22:22:59
だいたいgoto無くて困った事ないなw

131 :デフォルトの名無しさん:2007/01/03(水) 19:40:17
>>129
ああそうか、 >>125=>>126 なのか。
>>124=>126 だと思ってた

132 :デフォルトの名無しさん:2007/01/03(水) 20:01:01
(A && B && (procX || 1)) || procY;
ネタ提供

133 :デフォルトの名無しさん:2007/01/04(木) 20:07:36
自分はこんなくだらないことでgotoを使う/使わないなどと悩むことはしないよ。

134 :デフォルトの名無しさん:2007/01/04(木) 21:43:08
悩むまでもなくgotoを使うということか

135 :デフォルトの名無しさん:2007/01/04(木) 21:49:00
goto眼中無しだろ普通

136 :133:2007/01/04(木) 22:00:10
>>134
当然noだ。
故意に曲解していないか?
>>135 yes

137 :デフォルトの名無しさん:2007/01/04(木) 22:17:01
134 はギャグで言っただけだろう

138 :デフォルトの名無しさん:2007/01/04(木) 22:33:01
はいはいthrowthrow

139 :デフォルトの名無しさん:2007/01/04(木) 23:21:51
しかしcatch

140 :デフォルトの名無しさん:2007/01/04(木) 23:23:35
しかしgotoの嫌われっぷりも、相当なもんだよな
実際多少gotoつかったぐらいじゃ、可読性など落ちはしない
可読性を決める要因は、goto文の有無とは殆ど関係ないところにあるのにな

C++でgoto使うと、gotoでコンストラクタすっ飛ばすんじゃねえ
とか、コンパイラに怒られたりするな
goto文はなかなか教育的だ

141 :デフォルトの名無しさん:2007/01/04(木) 23:35:33
使うシーンが思い浮かばん
使わなきゃならない、もしくは使ったほうがいい場合が思い浮かばん
もっともJava使ってんだけどJavaにはgotoって無いよね?

142 :デフォルトの名無しさん:2007/01/05(金) 01:10:07
残念ながらJavaはgotoをサポートしていない。

143 :デフォルトの名無しさん:2007/01/05(金) 01:23:31
特に残念でもないw

144 :デフォルトの名無しさん:2007/01/05(金) 01:25:25
まぁ、Java は goto なんか使わせたら速攻でスパゲッティなコードを書くようなプログラマを対象にした言語だからな。

145 :デフォルトの名無しさん:2007/01/05(金) 01:27:06
kwsk

146 :デフォルトの名無しさん:2007/01/05(金) 01:33:27
このコマンドをいれると自動で玉が出る
goto

ゴト行為はやめましょう

147 :デフォルトの名無しさん:2007/01/05(金) 01:36:05
>>145
詳しくもなにもそのまんまなだけ。Javaが現代COBOLだとか言われているのって聞いたことない?
"普通のプログラマはまともに使いこせない"という理由で他にも元ネタの言語であるC++からtemplateなどを排除し、
メモリ管理ひとつまともにできないプログラマの為にGCを標準装備したりしている。

148 :デフォルトの名無しさん:2007/01/05(金) 01:37:48
>>147
そういえばそういうコードはよく見るなw

149 :デフォルトの名無しさん:2007/01/05(金) 11:29:43
>>144
実際には goto なくてもスパゲッティ作れる人が大量投入されてる。
(そうじゃない人も多数いるけど。まぁどの言語もなんだが。)

150 :デフォルトの名無しさん:2007/01/05(金) 11:50:03
Javaでmainに全コードベタ書きするスタイルを採用したらgotoが必要になると思うぞ。

151 :デフォルトの名無しさん:2007/01/05(金) 12:02:54
Dr.goto

152 :デフォルトの名無しさん:2007/01/05(金) 21:53:43
手続き指向言語(?)にはgoto欲しいかもね

153 :デフォルトの名無しさん:2007/01/06(土) 17:24:39
>>83
それだと評価順が変わるのでいいのか?
>>85
あとにコードが続いてたらreturnはまずい気が。

154 :デフォルトの名無しさん:2007/01/06(土) 17:51:23
>>147
詳しくのニュアンスに違和感を覚えるのは俺だけではないはずだ

155 :デフォルトの名無しさん:2007/01/06(土) 18:46:18
>>154
IT土方の現代コボラーさん、いらっしゃ〜い。
まぁ、IT土方なんて沢山いるから、違和感を覚えたのは君だけじゃないよ、きっと、うん。

156 :デフォルトの名無しさん:2007/01/06(土) 19:10:46
違和感を覚えた部分はそこじゃないと思うよ多分。

157 :デフォルトの名無しさん:2007/01/06(土) 19:14:03
>>156
IT土方さん、いらっしゃい。

158 :デフォルトの名無しさん:2007/01/06(土) 20:13:02
コボラーにはJAVAすら使えない。

159 :デフォルトの名無しさん:2007/01/06(土) 20:34:18
こぼらーってJavaっていう言語があること知ってるの?

160 :デフォルトの名無しさん:2007/01/06(土) 22:01:30
>>158-159
コボラーにあやまれ! そこの現代コボラー!

161 :デフォルトの名無しさん:2007/01/06(土) 22:15:19
コボラーってアトランティス人みたいなもんでしょ

162 :デフォルトの名無しさん:2007/01/06(土) 22:38:27
コボラーってどんな言語?

163 :デフォルトの名無しさん:2007/01/06(土) 22:44:53
コボラーって伝承とか伝説でだけ出てくる空想上の生物じゃね?

164 :デフォルトの名無しさん:2007/01/07(日) 16:28:26
>>141
機能限定のラベル付きbreak、continueなら・・・

165 :デフォルトの名無しさん:2007/01/07(日) 17:57:19
高速電脳の斜向かいにある美容院の名前はコボル

166 :デフォルトの名無しさん:2007/01/08(月) 01:37:16
コボルちゃん

167 :デフォルトの名無しさん:2007/01/08(月) 17:48:22
>>158-159
Javaも書けるCOBOLプログラマはそもそもコボラーとは呼ばれない

168 :デフォルトの名無しさん:2007/01/08(月) 18:02:11
>>167
そのJavaコードがコボルチックだったりするからコボラーと呼ばれる。
コボラーが書いたC言語のコード見たらすごかった。
全部グローバル変数にしてw

169 :デフォルトの名無しさん:2007/01/08(月) 18:38:23
>>167
そりゃそうだ、現代コボラーと呼ばれるだけだから。

>>168
あるあるw

170 :デフォルトの名無しさん:2007/01/08(月) 20:15:24
>>168
コボルにはローカル変数無いの?

ちなみにおれ、コボル覚えられなかったんだよね…(´・ω・`)
C系よりよほど難しいと思うんだが。

171 :デフォルトの名無しさん:2007/01/08(月) 20:23:11
>>170
10年以上前にやったCOBOL85あたりではローカル変数って言う考え方は無かった
アドレスとかポインタとか意識する必要が無いからCOBOLのほうが圧倒的に簡単だと思うがの

172 :デフォルトの名無しさん:2007/01/08(月) 20:26:56
>170
>ちなみにおれ、コボル覚えられなかったんだよね…(´・ω・`)
>C系よりよほど難しいと思うんだが。

ナカーマ( ・∀・)人(・∀・ )

俺もC++ならtemplateもバッチリ使いこなせてメタプロもできるし、
アセンブラやスクリプト系の言語も問題なくこなせるんだが、
COBOLだけはダメっす。

173 :デフォルトの名無しさん:2007/01/08(月) 23:47:19
cobolはデータ依存プログラミングができるから、ある意味非常に強力。
逆に、それを使わないとグローバル変数しかない非常に貧弱な言語になってしまう。

174 :デフォルトの名無しさん:2007/01/15(月) 23:15:26
だから、商用システムなんかにはよく使われていた。
当時は、それが生産性が高かったんだよ。

175 :デフォルトの名無しさん:2007/03/03(土) 23:23:27
漏れのトコはエラー処理へすっ飛ばす時にgoto使ってるんだが。

goto完全毛嫌い派ってそこんとこどうなん?


176 :デフォルトの名無しさん:2007/03/04(日) 16:11:26
>>175
あいつら馬鹿だから、もちろんそれも否定するよ。

177 :デフォルトの名無しさん:2007/03/04(日) 16:29:08
たまに1関数1returnとか言い出す。

178 :デフォルトの名無しさん:2007/03/04(日) 16:53:23
if( is_error( hoge, hoge ) ) {
 10行ぐらいのエラー処理
 return ERROR;
}

if( is_error( next, hoge ) ) {
 上のと同じ10行ぐらいのエラー処理
 return ERROR;
}

if( is_error( next_next, hoge ) ) {
 やっぱり同じ10行ぐらいのエラー処理
 return ERROR;
}

以下続く

こんな感じの無残なコードは、何度も見かけたもんだがw

179 :デフォルトの名無しさん:2007/03/29(木) 14:58:09
例外キャッチしたら頭に戻ってやり直しってコードには躊躇なくgotoを使うな

180 :デフォルトの名無しさん:2007/03/29(木) 21:42:18
>>179
それって catch ブロックの中から try ブロックの中あるいはその前へ飛ぶの?

181 :デフォルトの名無しさん:2007/04/02(月) 23:02:59
for(;;) try{
// 例外が起きそうな処理
break;
}
catch(e){
}


182 :デフォルトの名無しさん:2007/04/02(月) 23:46:11
ダサッ

183 :デフォルトの名無しさん:2007/04/03(火) 01:25:49
摩訶不思議

184 :デフォルトの名無しさん:2007/04/29(日) 03:54:13
1関数1returnというのは「出口はひとつ」を誤解してるんだろうな。
returnが複数でも出口は一つだし。returnはある意味"goto 最後の}"だと
思えばいい。

本当の「出口が一つじゃない」というのはBASICの
100 GOSUB 200
110 PRINT "1"
120 PRINT "2"
130 END
200 INPUT A
210 IF A=1 THEN RETURN 110
220 RETURN 120
の210行と220行みたいな話を言っているはず。これはもはやreturnではなくて
gotoだからな。

185 :デフォルトの名無しさん:2007/04/30(月) 03:33:13
じゃあ「入り口が一つ」については?

186 :デフォルトの名無しさん:2007/04/30(月) 20:37:51
入り口も出口も複数

   subroutine hoge(i, j, k, *, *)
   k = i + j
   entry huge(k, *, *)
   k = k - 1
   if (k .ne. 0) return 1
   return 2
   end

   program main
   read(*,*) n1, n2
   call hoge(n1, n2, i, *100, *300)
100 write(*,*) n1, ' + ', n2, ' - 1 = ', i
   i = 10
200 write(*,*) i
   call huge(i, *200, *300)
300 write(*,*) 'end'
   end


187 :デフォルトの名無しさん:2007/05/01(火) 18:25:16
>>186
よーし、おじさんはCOBOLつかっちゃうぞ。

PERFORM xxx THRU yyyy

188 :デフォルトの名無しさん:2007/05/11(金) 20:53:36
goto 1;

189 :デフォルトの名無しさん:2007/05/12(土) 00:08:15
goto\s+[\w\d]+;|^\s*[\w\d]+:
をショッキングピンクにしてgoto使いまくりだな。

190 :デフォルトの名無しさん:2007/05/12(土) 18:15:53
色々謎な正規表現だな

191 :デフォルトの名無しさん:2007/05/13(日) 11:32:44
189の目を盗んでラベルの後に空白文字を入れてやるぜ。
goto fuck189 ;
fuck189 :

192 :デフォルトの名無しさん:2007/07/21(土) 19:14:32
以下のケースってgotoしたくなる。

if(a && b && c){
処理1
goto jmp;
} else if(d){
処理2
}
if(a && b){
jmp:
処理3
}


193 :デフォルトの名無しさん:2007/07/21(土) 20:37:51
真理値表を書いてみよう。
a b c d 処理1 処理2 処理3
0 0 0 0 x x x
0 0 0 1 x o x
0 0 1 0 x x x
0 0 1 1 x o x
0 1 0 0 x x x
0 1 0 1 x o x
0 1 1 0 x x x
0 1 1 1 x o x
1 0 0 0 x x x
1 0 0 1 x o x
1 0 1 0 x x x
1 0 1 1 x o x
1 1 0 0 x x o
1 1 0 1 x o o
1 1 1 0 o x o
1 1 1 1 o x o
なんだ、goto要らないじゃん。

194 :デフォルトの名無しさん:2007/07/24(火) 10:55:01
で、バカを晒した>>192はどこに行った?
しかし、真理値表を書かないと結論が出ない>>193も大概だがな。

195 :デフォルトの名無しさん:2007/07/24(火) 20:10:20
>>194
if(a && b){
を省略したいってことじゃないかな。auto a,bだとして。
コンパイラにやって欲しい処理だ。

196 :デフォルトの名無しさん:2007/10/28(日) 23:46:38
goto使ったら先輩にしつこくなじられるようになった
うぜぇwwwwwgotoアレルギーうぜぇwwwwwww

197 :デフォルトの名無しさん:2007/10/29(月) 21:33:37
>>196
もともと人間関係うまくいってなかっただけじゃね?

198 :デフォルトの名無しさん:2007/11/02(金) 14:45:06
うちの下っ端で考え無しにgoto使ってるアホがいやがる
うぜぇwwwww無能下っ端うぜぇwwwwwww

って感じだろ

199 :デフォルトの名無しさん:2008/02/09(土) 17:53:27
http://pc11.2ch.net/test/read.cgi/tech/1169473442/553-578 あたりの続き
> 578 :デフォルトの名無しさん:2008/02/09(土) 17:20:17
> >>570
> >556 名前:デフォルトの名無しさん [sage]: 2008/02/09(土) 13:55:24
> >まぁさ、例外あるような言語ではgotoいらないかもしれないけど、
> >Cとかだと普通に使うよ?
> >557 名前:デフォルトの名無しさん [sage]: 2008/02/09(土) 14:28:31
> >いや,普通には使わないわ(ww
>
> ここから始まった話題なので、
> 今に限ってはCのgotoの話をしている。pythonは今のトピックにおいて関係なし。
> Cは例外ないから>>558がgotoなしで書けるという話も決着がついてない。
> ここで例外使えばいいという指摘自体が的外れ。
> まあ実際gotoは無くてもいいが、あると遥かリソース開放とかは便利。
> むろんGCとか例外とかがあればそっちのが便利だが。

存分にどうぞ。

あ、setjmp/longjmp使うからgoto使わないわ、というオチは禁止ね。

200 :デフォルトの名無しさん:2008/02/09(土) 17:55:48
>>199
リソース解放のためにgotoって、、、不必要に汚ないコードができるだけだろ

201 :デフォルトの名無しさん:2008/02/09(土) 17:59:11
>>200
goto使わないともっと汚くなるんじゃない。

202 :デフォルトの名無しさん:2008/02/09(土) 18:00:29
まぁgoto禁止の会社で、あらゆるコードが以下のように
なってるのを見たとき、「素直にgoto使え」とオモタ。

do {
  if (hoge) {
    break;
  }
} while (0);

203 :デフォルトの名無しさん:2008/02/09(土) 18:05:49
>>199で問題になってるコードを天災
はっきり言って呼び出し側で解放したほうがいい典型例。
呼ばれた側で解放したければ、この関数を呼んでから
解放するような関数を書けと言いたい。

> 558 名前:デフォルトの名無しさん [sage]: 2008/02/09(土) 14:35:39
> >>557
>
> そう?ファンクショントレース埋め込むときとか、以下のように
> エラーの場合、リソース開放して戻るときとか頻繁に使うなぁ。
> {
>   A *a = NULL; B *b = NULL; C *c = NULL; int result = E_UNKNOWN;
>
>   if ((a = A_new()) == NULL) {
>     result = E_MEM; goto END_FUNC;
>   }
>   if ((b = B_new()) == NULL) {
> ...
>
> END_FUNC:
>   if (a !=NULL && result != E_SUCCESS) {
>     A_free(a);
>   }
>   ...
> }


204 :デフォルトの名無しさん:2008/02/09(土) 18:07:55
continueもある場合は、gotoよりも明確になるように思う。

breakで外側のループを脱出するために、switchで書いたほうが良さげな
内側の多分岐がif/else if/else ifになってたりするとgoto使え、だな。

205 :デフォルトの名無しさん:2008/02/09(土) 18:12:33
>>203
関数がエラーで返った場合、オブジェクトに変更が加えられていないことが
保証されるとする場合、それじゃだめやね。エラーが発生したら、まき戻す
処理が必要になる。

206 :デフォルトの名無しさん:2008/02/09(土) 18:15:49
>>205
エラーの発生箇所によって巻き戻し方が違うんなら、どのみちgotoでは処理できん。
巻き戻し方が同じなら、goto先で巻き戻すのもreturn先で巻き戻すのも同じ。

と思うのだが。

207 :デフォルトの名無しさん:2008/02/09(土) 18:19:37
>>206
>エラーの発生箇所によって巻き戻し方が違うんなら、どのみちgotoでは処理できん。

でもgoto使ったほうがスッキリかけるでしょ。

>巻き戻し方が同じなら、goto先で巻き戻すのもreturn先で巻き戻すのも同じ。

APIの使い勝手が大きく違うじゃない。

208 :デフォルトの名無しさん:2008/02/09(土) 18:57:34
>>207
いや、だからさ、APIとしては呼び出す側は何もしなくていいの。
処理とリソース管理を分離して実装しましょう、ってだけの話。
なんで無理にgotoなんて使いたがるのか、ワケワカラン。

209 :デフォルトの名無しさん:2008/02/09(土) 19:02:43
>>208
抽象論が多くてわかりにくい。具体的なコード書いて改善してみてくれ。

210 :デフォルトの名無しさん:2008/02/09(土) 19:12:49
>>203でコピペされてるコードも全然具体的じゃないけどな。

211 :デフォルトの名無しさん:2008/02/09(土) 19:30:27
巻き戻し処理って、本当に巻き戻すのか単にコピーをしておくのかどっちが多いの?
transactional memoryって効率を求めるとすると、なにかしら約束事があったほうがよいんだろうけど。
完全に透過に見える実装にしたいならos側からアプローチしたほうが楽な気もする。

212 :デフォルトの名無しさん:2008/02/09(土) 20:28:38
>>210
結局「gotoはダメ!って教えられたからダメダ!」で、思考停止したダケの人なのね。

>>211
>巻き戻し処理って、本当に巻き戻すのか単にコピーをしておくのかどっちが多いの?

場合による。例えば、ある処理が1,2,3,4の順番で実行することがきめられてる場合
(1を実行しないと、2が実行できない場合)、実際に実行して3でエラーが発生したら、
1,2を巻き戻す処理が必要だし。

OS側からのアプローチってどんなアプローチ?

213 :デフォルトの名無しさん:2008/02/09(土) 20:34:39
gotoなんて設計に何の影響もない
同一関数内でしか影響のないものによくもまあそんなに熱くなれるな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

214 :デフォルトの名無しさん:2008/02/09(土) 20:43:49
>>213
>gotoなんて設計に何の影響もない

gotoは設計に影響ないとしても、APIが保障するリソース管理の方針は
大いに影響がある。

下位のモジュールがエラーを返した場合、それ以下のリソースには影響
がなかったことが保障されるのであれば、モジュールは自身の管理する
モジュールを開放すればよいことが保証される。

例外とデストラクタの伝播のようなもの。

215 :デフォルトの名無しさん:2008/02/09(土) 20:44:26
んで、Cでそれを実装するには、gotoがいいよといってるわけで。

216 :デフォルトの名無しさん:2008/02/09(土) 20:44:43
GCC の labels as value と computed goto を使うと結構豪快に遊べるけどなw

217 :デフォルトの名無しさん:2008/02/09(土) 20:47:44
嫌goto厨ってもしかして元N88ベーシッカーが多いのかねw

218 :デフォルトの名無しさん:2008/02/09(土) 20:49:13
コンパイラ言語で goto を使っても問題ない。
どうせ機械語のジャンプ命令に置き換わるだけなんだから。

ところがインタプリタ言語にとっては goto はパフォーマンスを低下させるやっかいもの。
10 FOR I=1 TO 100
20   FOR J=1 TO 200
30     PRINT "うんこ"
40     IF J=50 THEN GOTO 70
50   NEXT J
60 NEXT I
70 FOR J=1 TO 100
80   PRINT "しっこ"
90 NEXT J
仮にこのようなコードを実行するとしよう(細かいツッコミは無しね)
インタプリタは 10行目で FOR 文に出会い、変数 I と 終了値 100 をスタックに積む
次に 20 行目で 変数 J と 終了値 200 をスタックに積む。
通常は NEXT に出会ったときに終了判定がなされ、終了値に達していれば
FOR をスタックから捨てられる。
ところが 70行目で FOR〜NEXT ループの外に飛び出してしまったため
スタックには先ほどの2つの FOR 変数 I と J が積まれたままになる。
さらに 70行目で FOR に出くわしたインタプリタはどういう振る舞いをするか。
スタックに FOR J が既に積まれていないかを検査し、もしあればそれを捨てる作業が必要になる。
実はインタプリタは FOR に出会うたびに、スタックをすべて検査して、重複していないか
確かめているのだ。
GOTO 文さえなければスタックをすべて検査する必要がなくなりパフォーマンスがいくらか上がるはずだな。

java が goto を目の敵にしているのは、このせい。インタプリタにとって goto は大敵なんか長文つかれた
どうせ誰も読んでないだろなめんどくせぇもうやめたうんこちんちん!

219 :デフォルトの名無しさん:2008/02/09(土) 20:52:59
>>207
こういう話ではないの?
別にどっち使ったからと言って使い勝手というかAPIが変わるとは思えない。
これだったら俺も1を選ぶけど。
//その1
void hoge() //外部に公開される関数
{
void *p = malloc(65536);
//ところどころでgoto END;
END_FUNC:
free(p);
}

//その2
static void hoge_impl(void *p)
{
//ところどころでreturn;
}

void hoge() //外部に公開される関数
{
void *p = malloc(65536);
if (!p)
  hoge_impl(p);
free(p);
}

220 :デフォルトの名無しさん:2008/02/09(土) 20:57:27
うんこちんちん!
まで読んだ。

221 :デフォルトの名無しさん:2008/02/09(土) 20:58:35
>>212 ポカーン 自分では全然的確な例も出さずに認定かい

222 :デフォルトの名無しさん:2008/02/09(土) 20:59:29
>>218
まだJavaをインタプリタ言語と呼んでる人がいるんだね。
正直驚いた。

223 :デフォルトの名無しさん:2008/02/09(土) 21:06:34
実際にバイトコードインタプリタだったとしても
機械語に翻訳されりゃasmリストのjmpと一緒じゃん。
jmp命令を使えないcpuって不便そう。

224 :デフォルトの名無しさん:2008/02/09(土) 21:07:45
結論
goto議論に熱中する奴は生産性が低い

goto :eof

225 :デフォルトの名無しさん:2008/02/09(土) 21:13:36
つーか、BASICのインタプリタと、
Javaのインタプリタのレベルを混同してるヴァカが現存してることに驚いた。

Javaのforでスタックなんか使ってねーっての。

226 :デフォルトの名無しさん:2008/02/09(土) 21:24:38
>>219
その2のほうさ、管理するリソースが1つだけならまだマシだが、4つも5つも
管理している場合、そのためのサブ関数が4つも5つもできることに
なるわけだが・・・。まぁgoto毛嫌いしている人には、そっちのほうが
ウレピイのかもしれんが。

227 :デフォルトの名無しさん:2008/02/09(土) 21:28:22
リソース管理なんてif文一発だろ。
お前らもっとでかいモニタ使えよ。
int ret = 0;
if(init1())
{
        if(init2())
        {
                if(init3())
                {
                        ret = execute();
                        fin3();
                }
                fin2()
        }
        fin1();
}
return ret;

228 :デフォルトの名無しさん:2008/02/09(土) 21:45:05
>>227
そのコードは、俺の頭ではツライ。

229 :デフォルトの名無しさん:2008/02/09(土) 21:54:45
意外にも java がインタプリタだという事を知らない人が複数いて驚いた。
「JIT」 について、もうすこし学びましょうね。

230 :デフォルトの名無しさん:2008/02/09(土) 22:01:57
ほぉ。

Javaのバイトコードで、どういう風にforとスタックが関係するのか、
説明していただけますかね?

231 :デフォルトの名無しさん:2008/02/09(土) 22:26:44
Code: Stack=3, Locals=2, Args_size=1
0: iconst_0
1: istore_1
2: iload_1
3: bipush 10
5: if_icmpgt 39
8: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream;
11: new #3; //class java/lang/StringBuilder
14: dup
15: invokespecial #4; //Method java/lang/StringBuilder."<init>":()V
18: ldc #5; //String line
20: invokevirtual #6; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
23: iload_1
24: invokevirtual #7; //Method java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder;
27: invokevirtual #8; //Method java/lang/StringBuilder.toString:()Ljava/lang/String;
30: invokevirtual #9; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
33: iinc 1, 1
36: goto 2
39: return

public static void main(String args[])
{
for(int i=0; i<=10; i++) {
System.out.println("line " + i );
}
}
なんというひねりのないコード。

232 :デフォルトの名無しさん:2008/02/09(土) 22:31:52
インタプリタなのはJVMの方でJavaはコンパイラだろ。

233 :デフォルトの名無しさん:2008/02/09(土) 22:32:23
public static void main(String args[])
{
try {
for(int i=0; i<=10; i++) {
System.out.println("line " + i );
}
} catch (Exception e) {
System.out.println("boo.");
}
}
にすると
Exception table:
from to target type
0 39 42 Class java/lang/Exception
が追加されて、ジャンプ命令で例外処理の飛ぶ先が決まるんだな。
-ここまで同じ-
39: goto 51
42: astore_1
43: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream;
46: ldc #11; //String boo.
48: invokevirtual #9; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
51: return
ただしキャッチしなければパレントクラスに飛ぶというのは例外の普通の使い方。
やってる事自体はあまり変わらないけど、言語が持ってる機構は有効に使ったほうが綺麗になるって感じなのかな?

234 :デフォルトの名無しさん:2008/02/09(土) 22:40:13
で、どのように、
BASICインタプリタで起きるようなFOR-NEXTの対応のズレの
ようなことと、関係してくるんですか、と。

(BASICのFOR-NEXTは、FORを実行する時、NEXTにぶち当たったら
戻るためのポインタをスタックに積んでいるわけですが、それに
相当するコードはどこ?)

それに、
あるインストラクションを実行する時点での、スタックトップは
コンパイル時に確定できますよね?

仮にgotoで気ままに飛んだとしても、飛ぶ時に適宜調整すれば
問題ないわけで。

235 :デフォルトの名無しさん:2008/02/09(土) 22:41:34
java byte code書いた人とスタック云々の人は別だよw

236 :デフォルトの名無しさん:2008/02/09(土) 22:50:35
こりゃ失礼しました m(__

237 :デフォルトの名無しさん:2008/02/09(土) 23:26:01
CPUが java のバイトコードを直接実行していると勘違いしている人が多いですね。
javac ⇒ バイトコード ⇒ インタプリタが実行

238 :デフォルトの名無しさん:2008/02/09(土) 23:36:27
よくもまあこんな前世紀的話題を得々と・・・

239 :デフォルトの名無しさん:2008/02/09(土) 23:37:55
今のSunのJVMってJITコンパイルしてないの?

240 :デフォルトの名無しさん:2008/02/09(土) 23:40:09
>>238
まぁ、新しくプログラミングの世界に入ってくる人たちが、そういう疑問を持つことは
当然というか、ソウであって欲しいものナわけで。「先人達が行ってたから」といって
自分の思考を停止して妄信するよりははるかに良い。

241 :デフォルトの名無しさん:2008/02/09(土) 23:40:59
ていうか、釣りだろw

釣りとしか思えないよこのインタプリタ厨。

242 :デフォルトの名無しさん:2008/02/10(日) 12:29:30
釣りだ。
gotoのスレでパフォーマンスの話をして、釣れると思っているね

243 :デフォルトの名無しさん:2008/02/10(日) 14:58:54
そもそも、大域変数しか使えない言語で「変数をスタックに積むって」ありえるのか?

変数宣言なし&局所変数なしの言語の場合、変数管理表と戻り先(jump先)管理表を使うのが普通だろ?

244 :デフォルトの名無しさん:2008/02/10(日) 18:24:27
>>243
> そもそも、大域変数しか使えない言語で「変数をスタックに積むって」ありえるのか?
>
> 変数宣言なし&局所変数なしの言語の場合、変数管理表と戻り先(jump先)管理表を使うのが普通だろ?

BASICのFOR-NEXT制御の場合、変数名をタグとして、
FOR x IN ... 〜 NEXT x を対応させる処理系がある。
(NEXTのあとの変数名はreminderで、処理系は無視するものもある)

>>218 が得意そうに解説してるBASIC処理系では、NEXT x の x の
変数名を見て、対応するFORの処理に戻るような処理系なんだろうが、
そのような場合、FORの場所だけでなく、変数名もフレームに覚えておく
必要がある。変数の値じゃなくて、変数名そのものか、ポインタかを
タグとして書いておくわけやね。

245 :デフォルトの名無しさん:2008/02/10(日) 18:53:17
じゃあgotoを使うなって言われるのは、
単純にスパゲッティ化するのを防ぐだけじゃなく、
スタックを開放する作業を確実にやるためだったってことだな。


246 :デフォルトの名無しさん:2008/02/10(日) 18:55:43
つか今時どうやったら制御構文完備な言語で
goto使ってスパゲッチなコードを書けるんだよw

247 :デフォルトの名無しさん:2008/02/10(日) 19:02:49
完備ってほどでもないと思うけど。


248 :デフォルトの名無しさん:2008/02/10(日) 19:04:48
gotoは悪だ!という宣伝がコレまで続けられてきて、普通のプログラマ
はgotoを使ったスパゲティコードに関して十分知っているわけでしょ。
そういう意味では、goto邪悪論の目標は達していると思う。

それなのに会社のコーディング規約でgotoを禁止するのは、どうみても
自社のプログラマを信用していないとしか思えない。

goto禁止したところで、do { if (hoge) break; } while(0)で、gotoに近いことを
やろうと思えば出来てしまうわけだぜ。そういう会社がやるべきは、社員の
教育であってgoto撲滅では決してない。

249 :デフォルトの名無しさん:2008/02/10(日) 19:29:20
条件分岐とループで複雑に作ってもわけ分からんしな。

250 :デフォルトの名無しさん:2008/02/10(日) 19:30:07
ゴトーさんが泣いているぞ

251 :デフォルトの名無しさん:2008/02/10(日) 19:35:51
おまえは、BLASの後藤か、CINTの後藤か、パラメトロンの後藤か、
なんちゃって。

252 :デフォルトの名無しさん:2008/02/10(日) 19:49:17
>>226
その2のほうさ、管理するリソースが1つだけならまだマシだが、4つも5つも
> 管理している場合、そのためのサブ関数が4つも5つもできることに
> なるわけだが・・・。

>>219の2のどこをどう考えればリソース毎にサブ関数が必要になると思えるのやら。
hoge()の中身が増えるだけだろ。
まさかhoge_implのほうがリソース管理してるとでも読んだのか?

253 :デフォルトの名無しさん:2008/02/10(日) 19:51:00
>>248
goto邪悪論も有害だが、goto気軽に利用論はもっと有害だな。
あくまで汚ないことをやっているという自覚を持って使うべきだ。


254 :デフォルトの名無しさん:2008/02/10(日) 20:06:09
相変わらず曖昧論ばっかりだな

255 :デフォルトの名無しさん:2008/02/10(日) 20:16:53
>>252
いや、そうだな。だがしかし4つも5つもリソースがあるばあいはどうすんの。
そもそもその手法じゃダメやん。

256 :デフォルトの名無しさん:2008/02/10(日) 20:25:56
つまり>>227のようになってしまうわけだし。依存関係あると。
そうじゃないなら、やっぱりサブ関数をわけて依存関係を
チェインさせる?正気の沙汰じゃないな。

257 :デフォルトの名無しさん:2008/02/10(日) 20:30:00
//その2
static void hoge_impl(void *p)
{
//ところどころでreturn;
}

void hoge() //外部に公開される関数
{
void *p1 = malloc(65536);
void *p2 = malloc(65536);
void *p3 = malloc(65536);
void *p4 = malloc(65536);
if (p1 && p2 && p3 && p4)
ret = hoge_impl(p);
if (p1) free(p1);
if (p2) free(p2);
if (p3) free(p3);
if (p4) free(p4);
return ret
}

で何か?

258 :デフォルトの名無しさん:2008/02/10(日) 20:34:55
>>257
mallocならいいが、

>例えば、ある処理が1,2,3,4の順番で実行することがきめられてる場合
>(1を実行しないと、2が実行できない場合)、実際に実行して3でエラーが発生したら、
>1,2を巻き戻す処理が必要だし。

この場合はどうする

259 :デフォルトの名無しさん:2008/02/10(日) 20:38:03
hoge()の最後でretの中身に応じて必要な回復処理すればいいだけじゃねーの?

260 :デフォルトの名無しさん:2008/02/10(日) 20:39:28
>>259
書いてミレヨ

261 :デフォルトの名無しさん:2008/02/10(日) 20:41:43
>>260
おいおい、どんな巻き戻しが必要なのか具体的なコードを出すのが先だろw

262 :デフォルトの名無しさん:2008/02/10(日) 20:45:17
hoge_impl()の返り値にどこまで進んだかの情報を入れ込んでおけばOK

263 :デフォルトの名無しさん:2008/02/10(日) 20:47:47
>>261
  if (A_init() != 0) goto A_FAILED;
  if (B_init() != 0) goto B_FAILED;
  if (C_init() != 0) goto C_FAILED;
  if (D_init() != 0) goto D_FAILED;

  return 0;

D_FAILED:
  D_finish();
C_FAILED:
  C_finish();
B_FAILED:
  B_finish();
A_FAILED:
  A_finish();
  return -1;

264 :デフォルトの名無しさん:2008/02/10(日) 20:49:18
>>263
それのどこが巻き戻しのコード?

265 :デフォルトの名無しさん:2008/02/10(日) 20:53:08
盛り上がってまいりました

266 :デフォルトの名無しさん:2008/02/10(日) 20:53:26
>>263
initが失敗したら、finishでまき戻せると思ってくれ。

267 :デフォルトの名無しさん:2008/02/10(日) 20:54:00
//その2
static void hoge_impl(void *p)
{
  if (A_init() != 0) return A_FAILED;
  if (B_init() != 0) return B_FAILED;
  if (C_init() != 0) return C_FAILED;
  if (D_init() != 0) return D_FAILED;

  return 0;
}

void hoge() //外部に公開される関数
{
switch (hoge_impl(p)) {
case D_FAILED:
D_finish();
case C_FAILED:
C_finish();
case B_FAILED:
B_finish();
case A_FAILED:
A_finish();
return -1;
default:
return 0;
}

で何か?


268 :デフォルトの名無しさん:2008/02/10(日) 20:57:00
もうこねーよ、ウワーン

269 :デフォルトの名無しさん:2008/02/10(日) 20:58:18
そんなコード見たことねぇw
goto避ける為にがんばりすぎだなw
大体ローカル変数にアクセスできねぇし
いちいち引数で渡しますか。

C++厨のtry/finallyなんていらねぇ!
がんばればclassのコンストラクタ、デストラクタで何とかなる!みたいだなw

270 :デフォルトの名無しさん:2008/02/10(日) 21:01:22
>>269 御託はいいから、>>226が筋違いだということは理解できたか?

271 :デフォルトの名無しさん:2008/02/10(日) 21:02:23
>>269
回復に4つも別々の関数呼ばにゃならんコードな時点で糞ケテーイ

272 :デフォルトの名無しさん:2008/02/10(日) 21:06:09
みんな、今271が良い事を言ったぞ!

273 :デフォルトの名無しさん:2008/02/10(日) 21:09:51
がんばることある?
大抵のものは誰かがラッパー作っているし、
ないものは確かに作ることもあるけど、面倒ならboost::shared_ptrに任せられるし。

274 :デフォルトの名無しさん:2008/02/10(日) 21:09:56
>>269 後出しイクナイ!
ローカル変数うんぬんを言うのなら、A_finishとかが無引数なのはおかしいだろ。

275 :デフォルトの名無しさん:2008/02/10(日) 21:12:22
>>273
禿同。こんな事にgotoとか使ってる奴はboost時代に乗り遅れてる。

276 :デフォルトの名無しさん:2008/02/10(日) 21:18:15
でも削除子指定できるscoped_ptrほしい。
と思ったらunique_ptrは削除子していできるのか?

277 :デフォルトの名無しさん:2008/02/10(日) 21:50:35
>>267
それってさ、一連の処理を分割してしまってるわけだけど、initしてからfinishする
までの処理を。逆にメンテナンスせいが落ちそうじゃない。goto使うよりも。

278 :デフォルトの名無しさん:2008/02/10(日) 21:52:09
アホが見ても分かるような用途にしかgotoは使わない。

279 :デフォルトの名無しさん:2008/02/10(日) 21:55:02
>>278
アフォが見てもわかる用途って具体的には?

280 :デフォルトの名無しさん:2008/02/10(日) 21:57:24
>>277
A_initって名前が悪いんじゃねーかな。
たぶん>>263はA_init()は何か実際に処理をさせたいから"巻き戻し"なんて言ってるんじゃ。
だとするとA_init()はA_proc()と読みかえたほうがいいだろ。
そうすれば>>267>>208が言うように処理とリソース管理の分離というデザインになる。

281 :デフォルトの名無しさん:2008/02/10(日) 21:59:20
>>279
278じゃないけど多重breakとかかな?
多重breakできる言語が少しうらやましい。

282 :デフォルトの名無しさん:2008/02/10(日) 22:01:20
それを言うとA_finishも変なネーミングだ

283 :デフォルトの名無しさん:2008/02/11(月) 00:59:43
ファンクショントレースもgotoの話題にでてたけど、みなどうしてる?
ftraceコマンドとかあるみたいだけど、どうも共有ライブラリとかの
ファンクションコールをうまくトレースしてくんないのよね。

284 :デフォルトの名無しさん:2008/02/11(月) 01:21:39
あぁちょっと調べてみたら、valgrindとか色々ありそうやね。

285 :デフォルトの名無しさん:2008/02/11(月) 02:46:36

bool Init()
{
if (!InitHogeGraphics()) {goto FAILED_INIT_HOGE_GRAPHICS;}
if (!InitHogeAudio()) {goto FAILED_INIT_HOGE_AUDIO;}
if (!InitHogeInput()) {goto FAILED_INIT_HOGE_INPUT;}
return true;

FAILED_INIT_HOGE_INPUT:
UninitHogeAudio();
FAILED_INIT_HOGE_AUDIO:
UninitHogeGraphics();
FAILED_INIT_HOGE_GRAPHICS:
return false;
}

こういう使い方もダメなのか?俺的にはスマートな方法だと思ってる
初期化が重なる場合でgoto文を使わない方法って何があるのよ


286 :デフォルトの名無しさん:2008/02/11(月) 02:57:07
>>285
やりすぎかもしれんが・・・w こういうのも出来なくはないかもしれない、
気もしないでもない。
InitUninitFunc funcs[] = {
  {InitHogeGraphics, UninititHogeGraphics},
  {InitHogeAudio, UninititHogeAudio},
  ...
};

bool Init()
{
  for (int i = 0; i < NELEMS(funcs); i++) {
    if (!funcs[i].init()) {
      for (int j = i; j > 0; j--) {
        funcs[j].uninit();
      }
      return false;
    }
  }
  return true;
}

287 :デフォルトの名無しさん:2008/02/11(月) 03:22:22
>>285
gotoいらないじゃん

288 :デフォルトの名無しさん:2008/02/11(月) 03:25:46
>>287
別にgotoなんて無くてもいいんだが、分かりやすいことが重要じゃない?
極論すればwhile()だけで全ての制御構造は書けるわけだし。非常に面倒くさくなるけど。

>>285で、InitHogeAudioの引数の一つがInitHogeGraphicsの結果だったりするみたいな感じで
からみあってたりすると結構面倒くさいんじゃない?

289 :デフォルトの名無しさん:2008/02/11(月) 03:31:26
ほら、ここでもinit関数と、finish関数のAPI仕様の統一の必要性がでてきた。

「gotoは設計に関係ない」っていったやつでてこい。プログラムのアマチュア
が設計だけして、実装まるなげは本当に排除すべきだ。

290 :デフォルトの名無しさん:2008/02/11(月) 03:41:18
>>287
いやまぁ、さきの例はそれぞれのinitとuninitが関数だからそうだけど、
たとえば単なる値の設定とそれをクリアするのに関数を用意するのはバカらしい。
それならgoto使うとかいう選択は十分にあると俺は思うな。

291 :デフォルトの名無しさん:2008/02/11(月) 07:48:56
>>267で結論が出た話を蒸し返してる香具師がいるぞw

292 :デフォルトの名無しさん:2008/02/11(月) 08:07:30
>290 のように後出しジャンケンばかりやっている奴のコードは仕事に使えん

293 :デフォルトの名無しさん:2008/02/11(月) 08:15:32
>>285=>>263

294 :デフォルトの名無しさん:2008/02/11(月) 08:51:09
半端なinit/finishを繰り返す時点でダメダメ

295 :デフォルトの名無しさん:2008/02/11(月) 10:50:15
>>288
確かにまとめてひとつの関数にすれば数は少なくてすむが、
ラベルの数が多すぎるだろ。

>分かりやすいことが重要じゃない?
分かりにくいんだよ。
制御が入ると、その制御全部チェックしないといけないだろ。
それ、順番間違ったらそれだけでバグになるだろ。


296 :デフォルトの名無しさん:2008/02/11(月) 11:05:02
gotoなしで実現しようとすれば、
ラベルの代わりにフラグ変数を使うことになるだけじゃないか?

--
int ret_code = 0;

ret_code = !(a_init() ? A_FAILED : 0) &&
ret_code = !(b_init() ? B_FAILED : 0) &&
ret_code = !(c_init() ? C_FAILED : 0);

switch(ret_code) {
case C_FAILED: c_rollback();
case B_FAILED: b_rollback();
case A_FAILED: a_rollback();
}

return ret_code;
--

かつ、何らかの事情でinit()やrollback()を同一関数内に
まとめて書く必要がある場合(式でなく文になる場合)
こういうコードは書けないのでgotoするしかない気がする。

297 :296:2008/02/11(月) 11:10:43
見直すと意味不明なコードだが気にするなw

298 :デフォルトの名無しさん:2008/02/11(月) 12:01:53
>>296
> かつ、何らかの事情でinit()やrollback()を同一関数内に
> まとめて書く必要がある場合(式でなく文になる場合)

どんな状況を言いたいのかサパーリわかりません。
ちゃんとした日本語か、仮でいいからCか、どっちかで書いてくれ。

299 :デフォルトの名無しさん:2008/02/11(月) 12:02:31
>>288
これで「わかりやすい」と思うのは書いた本人だけだと思うぞ。

300 :デフォルトの名無しさん:2008/02/11(月) 12:05:02
つーか、UnInitって未初期化のことじゃないか
オマエラ本当にマなのか?w

301 :デフォルトの名無しさん:2008/02/11(月) 12:12:09
>296 たぶん君は10万行以上のコード書いたことないでしょ。
それにチームでコードを書いた経験もほとんど無いように見受けられる。
素人はgoto避けたほうが身のためだよ。

302 :296:2008/02/11(月) 12:16:53
gotoの代替手段があってそれがgotoより優れているならそうするw

でも>>267>>286みたいに、goto回避を目的としたトリッキーなコードを書くくらいなら
イディオムとして理解できるgotoは素直に利用する方がよっぽどわかりやすい

303 :デフォルトの名無しさん:2008/02/11(月) 12:19:41
>267をトリッキーと感じる感性でgotoを濫用されちゃ話になりませんな。

304 :296:2008/02/11(月) 12:21:26
>>298

簡単な例で言えば>>267のコードで
hoge_implおよび*_initをインライン化する必要が出たら
フラグをreturnしてswitchで受けるっていうのは無理だわな、
そんときはどうする?ってこと


305 :デフォルトの名無しさん:2008/02/11(月) 12:21:45
>>267はgoto回避のトリッキーなコードというよりも、
APIから抜ける前にチェックを「確実に」入れるための簡単なtipsなのだが。

306 :デフォルトの名無しさん:2008/02/11(月) 12:23:14
>>300
Get:UnGetと書くマがこの世に実在してだな…

>>302
IDEでデバッグできる環境なら多少強引でもgoto回避したほうが追いやすいよ。

307 :デフォルトの名無しさん:2008/02/11(月) 12:23:27
>>304 具体的に。

308 :296:2008/02/11(月) 12:23:33
>>303
LABELを定義してgoto label するのと
フラグ定数をdefine してreturn -> switch するのと何が違うんだ?



309 :296:2008/02/11(月) 12:29:49
こんな感じかな

for (int i = 0; i < 10; i++) {
 if (x[i] == 0) {
  goto A_FAILED;
 } else {
  a /= x[i];
}

for (int i = 0; i < 10; i++) {
 if (y[i] == 0) {
  goto B_FAILED;
 } else {
  b /= y[i];
}

return 0;

B_FAILED:
 something
A_FAILED:
 something
 return -1;


310 :デフォルトの名無しさん:2008/02/11(月) 12:29:50
意図的に話をループさせて逃げようとしてますな
>>298>>304で答えたことになると思ってんの?

311 :デフォルトの名無しさん:2008/02/11(月) 12:30:23
>>308 >>305

312 :296:2008/02/11(月) 12:32:26
309をgotoを使わずに上手く書くのってどうする?


313 :296:2008/02/11(月) 12:34:10
要望にこたえて>>309に具体的に書いたので、
そちらも具体的なコードでよろしく

関数分割は無しな。
「美しい設計」にしたがって自由にリファクタリングできる業務なら
議論の余地なくgotoなんていらないだろ。ってかそんな環境ならC使わないし。


314 :デフォルトの名無しさん:2008/02/11(月) 12:35:43
>>309 いいかげん同じようなコード書くのに飽きてきたよ。

int foo_impl() {
for (int i = 0; i < 10; i++) {
 if (x[i] == 0) {
  return A_FAILED;
 } else {
  a /= x[i];
}

for (int i = 0; i < 10; i++) {
 if (y[i] == 0) {
  return B_FAILED;
 } else {
  b /= y[i];
}

return SUCCESS;
}

int foo() { //公開されるAPI
switch (foo_impl()) {
case B_FAILED:
 something
case A_FAILED:
 something
 return -1;
default:
return 0;
}

で何がこまる?

315 :デフォルトの名無しさん:2008/02/11(月) 12:38:16
どこまで条件の後付けを続けるのかしら…(´・ω・`)

316 :デフォルトの名無しさん:2008/02/11(月) 12:38:19
>>313
お前な、はっきり言わせてもらうと、馬鹿じゃねーのか?

「goto使わずに、関数分割してリソース管理と処理本体を分離する設計にしろ、
そのほうがgotoでスパゲッティにせずにリソースの解放を確実に実行できる。」
という主張に大して「関数分割はなしな」じゃ議論から逃げているとしか
受け取りようがない。

317 :296:2008/02/11(月) 12:42:30
>>314
そのコードが実質的に>>309と何が違う?

318 :デフォルトの名無しさん:2008/02/11(月) 12:46:08
>>317 過去ログ読んでろ。自分のレスだけでなく、相手のレスも真摯に読め。
話はそれからだ。

319 :296:2008/02/11(月) 12:47:28
過去ログ嫁は逃げるときに便利な言葉だな。


320 :デフォルトの名無しさん:2008/02/11(月) 12:48:32
正直、もう後出しジャンケンのワナビー初心者相手にするのは飽きた。

321 :デフォルトの名無しさん:2008/02/11(月) 12:50:54
>319 条件の後付けで逃げてるのはキミのほうでしょ…(´・ω・`)

322 :320:2008/02/11(月) 12:51:07
飽きたといいつつ、お前は次の奴も相手するよw

323 :デフォルトの名無しさん:2008/02/11(月) 12:52:17
>>317 過去ログと言わず、自分のレスの1つ前のレスを読んでみたらどうだ?

324 :315:2008/02/11(月) 12:54:59
>>321もしかして僕のレス見て言ってる…?
>>296へのレスだかんね(´・ω・`)

325 :321:2008/02/11(月) 12:59:38
>>324
もちろん>>319=>>296へのレスだかんね(´・ω・`)


326 :デフォルトの名無しさん:2008/02/11(月) 13:08:40
296はトンヅラを決め込んだようですwwwwwwwwwwwカコワリwwwwwwwwwwwww

327 :デフォルトの名無しさん:2008/02/11(月) 13:11:22
誰もレスしていないが286が良い設計

328 :デフォルトの名無しさん:2008/02/11(月) 13:33:25
>>267が良いコードとされた時代が懐かしいな

329 :デフォルトの名無しさん:2008/02/11(月) 13:34:46
なんだ時代は後退してるのか

330 :デフォルトの名無しさん:2008/02/11(月) 13:37:10
それを後退だと思うなら後退だ。

331 :デフォルトの名無しさん:2008/02/11(月) 13:41:26
時代の最先端のコードは>>285です。

332 :デフォルトの名無しさん:2008/02/11(月) 13:41:31
A_init()
A_FAILED
case A_FAILED
A_finish()

ソース上ばらばらなのに意味上は相変わらず密結合
メンテナンス性を悪化させる似非リファクタリングの典型

333 :デフォルトの名無しさん:2008/02/11(月) 13:45:55
>>332 よく読むとわかるけど、ソース上の距離は>285も同じなんだよ。
文句があるのなら>285に言ってくれw

334 :デフォルトの名無しさん:2008/02/11(月) 13:48:45
「処理とリソース管理の分離」を掲げた設計に対して
「ソース上ばらばら」は誉め言葉だよwww

335 :デフォルトの名無しさん:2008/02/11(月) 13:53:31
hoge_impl()に処理を分割した分だけ距離が離れている
A_FAILEDを別途#defineしなければならない分だけ管理要素が増えている

>>334意味不明

336 :デフォルトの名無しさん:2008/02/11(月) 13:57:34
>>335
gotoであちこちのブロックから飛びまくるのに比べれば
> hoge_impl()に処理を分割した分だけ距離が離れている
> A_FAILEDを別途#defineしなければならない分だけ管理要素が増えている
なんて取るに足らない瑣末な問題だな

337 :デフォルトの名無しさん:2008/02/11(月) 13:59:07
>>332の日本語訳

意味上の結合を維持したまま、処理本体とリソース管理を分離できている。
メンテナンス性を向上させるリファクタリングの典型

338 :デフォルトの名無しさん:2008/02/11(月) 13:59:47
勘違いしないでほしいがgoto版との比較で>>267が駄目だという事ではなく
goto版も>>267もどちらも駄目だということ

公開関数であるhoge()から内部一式全てを一人で管理するような小さなモジュールなら
goto版でも>>267でもどちらでも問題にならないだろう。
そうでない規模ならgoto版も>>267もどちらも簡単に破綻する

339 :デフォルトの名無しさん:2008/02/11(月) 14:01:14
意味不明なのは>>267のコードの
どの部分が処理本体でどの部分がリソース管理なのかが意味不明ということ

340 :デフォルトの名無しさん:2008/02/11(月) 14:03:33
>>339 それは296にしか答えられない質問では?

341 :デフォルトの名無しさん:2008/02/11(月) 14:07:14
>>338
つまり、巻き戻し処理のためにgotoのほうが遥かに便利という、
大元の>>199の引用元の主張は×ね。

342 :デフォルトの名無しさん:2008/02/11(月) 14:08:15
initしてrollbackするだけという、中身が何もない例題じゃあなあ

343 :デフォルトの名無しさん:2008/02/11(月) 14:12:21
// static void hoge_impl(void *p) {
#define return goto
  if (A_init() != 0) return A_FAILED;
  if (B_init() != 0) return B_FAILED;
  if (C_init() != 0) return C_FAILED;
  if (D_init() != 0) return D_FAILED;
#undef return
  return 0;
// }
// void hoge() {
// switch (hoge_impl(p)) {
#define case label
case D_FAILED:
  D_finish();
case C_FAILED:
  C_finish();
case B_FAILED:
  B_finish();
case A_FAILED:
  A_finish();
  return -1;
#undef case
// default:
//   return 0;
// }

344 :デフォルトの名無しさん:2008/02/11(月) 14:14:32
嫌goto厨は早く>>213の実例を全否定してまわる作業に戻るんだ

345 :デフォルトの名無しさん:2008/02/11(月) 14:17:04
>>336
あちこちのブロックから飛びまくるのはgotoを無秩序に使う結果

>>267で何かgotoの重要な欠点が解決されたと思う人は
343と267で何が違うのか考えてみればよい

346 :デフォルトの名無しさん:2008/02/11(月) 14:21:27
>>345
そうなんだよ。>>343の//で印(w)をつけてくれた部分が重要なんだよ。
あと、#defineの行もミソだね。

こんなつまらんgotoを使わなくても関数で出口を纏めることができるという好例だ。

347 :デフォルトの名無しさん:2008/02/11(月) 14:22:29
>>344
嫌goto厨?濫用を嫌う人は何人かいるみたいだけど、
gotoを全否定してる人はいないんじゃない?俺も含めて。

348 :デフォルトの名無しさん:2008/02/11(月) 14:31:06
そんなつまらん実装上の理由で関数分割をしなくとも
gotoさえ使えば綺麗にまとまる好例とも言えるな


349 :デフォルトの名無しさん:2008/02/11(月) 14:39:18
最近関数内関数なるものの存在を知ったんだけど、
それがあれば「関数を勝手に作れないからgoto使う」って人も、gotoなしでいけるんじゃないかな。


350 :デフォルトの名無しさん:2008/02/11(月) 14:44:26
>>347
定石的な使い方すら絶対に許さないと必死になっているように見受けられるがw

351 :デフォルトの名無しさん:2008/02/11(月) 14:52:36
個人的にはgotoが全面禁止でない限り>>267のようなコードは絶対書かないけどな


352 :デフォルトの名無しさん:2008/02/11(月) 15:09:11
適当に書いた。
関数化したくなければブロックで書けば。
処理続行可能フラグとか変かもしれないけど、
戻り値に成功と失敗を返すなら、それをそのままこのブロックの制御に使える。

>>351で参照

// 前処理
flg = true
while(flg){
if error{
flg = false;
break;
}
break;
}

// 主処理
while(flg){
if error{
flg = false;
break;
}
break;
}

// 後処理
return flg;


353 :デフォルトの名無しさん:2008/02/11(月) 15:10:22
みす
>>352で参照。

まあ、専用ブラウザならレス番選択して右クリしたら見れる。


354 :デフォルトの名無しさん:2008/02/11(月) 16:02:48
なんか必死なgoto厨房ががんばってるな。
実装上の都合と設計上の都合の区別もつかないとは。

まあ俺も>>267みたいなコードはまず書かないけどなw

355 :デフォルトの名無しさん:2008/02/11(月) 16:11:33
>>352
breakの数が多いのはなんでなんだぜ

356 :デフォルトの名無しさん:2008/02/11(月) 16:13:43
必死な嫌goto厨オツw

357 :デフォルトの名無しさん:2008/02/11(月) 16:29:18
設計云々なら、俺ならgotoを使わないなら最低限こう書く。
hoge_impl()だけ切り出して巻き戻しがベタ書きというのは本能的に気持ちが悪い。

int hoge_init(); // 略
void hoge_process(); // 略
void hoge_rollback(int r) {
 switch(r) { // 略
 }
}

void hoge() {
 int ret = hoge_init();
 if (!ret) {
  hoge_process();
 } else {
  hoge_rollback(ret);
 }
}

でも実際goto使うよ。イディオムだろこんなの。


358 :デフォルトの名無しさん:2008/02/11(月) 17:02:46
>>357
>hoge_impl()だけ切り出して巻き戻しがベタ書きというのは本能的に気持ちが悪い。

まぁハゲドウw

359 :デフォルトの名無しさん:2008/02/11(月) 17:05:54
>>357
俺も
> hoge_impl()だけ切り出して巻き戻しがベタ書きというのは本能的に気持ちが悪い。
に禿同。

こんなつまらんことにgotoを使ったりはせんが。
2重breakには使うけどな。

360 :デフォルトの名無しさん:2008/02/11(月) 17:31:18
>>355
whileを、breakで好きな段階で抜けられるブロックとして使うため、2度目の実行をしないためにループの最後にbreakを入れる。
これはgotoの代替として普通使ってると思うけど。
まあ、ループしないのにwhile使うのはおかしいって言う人もいるけど。

んで、while 1として無限ループにしたほうが、breakで抜けますよってのを明示できるけど、
flgを入れてみたのは、全体の流れを制御するflgだと明示しつつ、
最後にbreak入れ忘れた場合でも途中でリソース不足とか2度実行のエラーになれば抜けれて安全かなと。


361 :デフォルトの名無しさん:2008/02/11(月) 17:38:15
エラー終了と正常終了を分ける場合は、主処理のブロックの最後で、breakじゃなくreturnするかな。
配列から探して何番目かを返すようなのは、エラーとNULLが逆になる。
基本だよね。

参照は
>>361

// 主処理
while(flg){
if error{
flg = false;
break;
}
return flg; // 常にtrueが返される。
}

// エラー処理
return flg; // エラーなのでfalseが返される。


362 :デフォルトの名無しさん:2008/02/11(月) 17:46:24
粘着同士のレベルの低い言い争い、おわった?

363 :デフォルトの名無しさん:2008/02/11(月) 17:57:38
>>360
なんで do { ... } while (false) にしないんだぜ?


364 :デフォルトの名無しさん:2008/02/11(月) 18:00:24
>>237
> CPUが java のバイトコードを直接実行していると勘違いしている人が多いですね。
> javac ⇒ バイトコード ⇒ インタプリタが実行

バイトコードを実行するのはインタプリタではなくてVM(仮想計算機)だ。
つまり、インタプリタじゃなくてエミュレータな。

365 :デフォルトの名無しさん:2008/02/11(月) 18:01:48
バカ亀乙

366 :デフォルトの名無しさん:2008/02/11(月) 18:07:01
大域脱出に限りgotoを使うという人はgotoの宛先は常にループ直後?

367 :デフォルトの名無しさん:2008/02/11(月) 18:19:53
while (condition)
 while (condition)
  if (something_wrong)
   goto A_FAILURE;
  else something;

while (condition)
 while (condition)
  if (something_wrong)
   goto B_FAILURE;
  else something;

return 0;

B_FAILURE: something;
A_FAILURE: something; return -1;

368 :デフォルトの名無しさん:2008/02/11(月) 18:23:45
大域脱出のときだけgoto使うよ派が書くとこうなる?

result = 0;
while (condition)
 while (condition)
  if (something_wrong)
   result = A_FAILURE; goto END_OF_A;
  else something;
END_OF_A:

if (result == 0)
 while (condition)
  while (condition)
   if (something_wrong)
    result = B_FAILURE; goto END_OF_B;
   else something;
END_OF_B:

switch (result)
case B_FAILURE: something;
case A_FAILURE: something; return -1;
default: return 0;

369 :デフォルトの名無しさん:2008/02/11(月) 18:32:13
またコイツか・・・いいかげんウザ

370 :デフォルトの名無しさん:2008/02/11(月) 18:43:16
コミュニケーション能力より技術力の方が大切だと思うので
こういう議論で野次馬からウザいと思われるかどうかは気にしませんw

371 :デフォルトの名無しさん:2008/02/11(月) 18:56:38
>>363
ああそんなのもあったっけ。
doではじめるとwhileに書き換えられたことがあった。

それはともかく、
前処理に失敗したら主処理を飛び越して後処理ってするとき、
処理する前に判断しないとだめだろ。

それに、break忘れのリスクもあるが、戻り値の初期化忘れっていうミスを防ぐ効果もある。
どちらかというと正常か異常かを錯誤するほうが重大なミスだから
whileよりdoがよいということはないと思う。

あと、エラーなら抜けるっていうまったく同じ目的のためのブロックだから、
前処理も主処理も同じ構文使ったほうがわかりやすいしミスしにくい。

とにかく頭使わずにミスなく書くのが目的だから。


372 :デフォルトの名無しさん:2008/02/11(月) 19:00:40
>>371
>とにかく頭使わずにミスなく書くのが目的だから。

そか。俺は頭使わずにミスなく読めるコードを書くのが目的だから
gotoで書く方が読み易い場面ではgotoを使うんだぜ

373 :デフォルトの名無しさん:2008/02/11(月) 19:11:03
大域脱出の場合、pythonなら、breakでの脱出とfor文の判断での終了かが
はっきり分けられてるから簡単だよ。

UWSCってマクロならbreak 2っていう、2重ループ脱出命令がある。

結局自分で工夫しないといけない言語と、想定された言語があるんだよね。
そもそも、breakは内部はjmpつまりgotoなんだから受け側をswitchみたいに
自動で分けてくれてれば余計なif文でスペック落としたり、
スペックあげるためにアセンブラ使ったりしなくてすむのにな。

結局、どの言語でも共通の設計でいけるように最小限の文法にしてしまったから使いにくいんだよな。

>>372
それはいいけど>>285みたいなことされても困るんだよ。
あれは関数内でどうせリソースが有効かどうか判断する必要あるだろ。
if hoge { free(hoge); hoge = NULL }
とかな
だったらとび先は
FAILED_INIT_HOGE_INPUT:
FAILED_INIT_HOGE_AUDIO:
FAILED_INIT_HOGE_GRAPHICS:
とか全部いらなくて
FAILED: 一つで足りるんだよ。

飛び先が一つなのは分かりやすいだろ。
そもそも、gotoが分かりにくくなる理由は、飛び元と飛び先に同じラベル名が出てきてどっちからどっちに飛んでるかいちいち確認が必要だからだよ。


374 :デフォルトの名無しさん:2008/02/11(月) 19:17:57
>>364
少なくともGNUはインタプリタと呼んでいるようだ。

http://gcc.gnu.org/onlinedocs/gcj/Invoking-gij.html
>gij is a Java bytecode interpreter included with libgcj.

375 :デフォルトの名無しさん:2008/02/11(月) 19:18:04
>そもそも、gotoが分かりにくくなる理由は、飛び元と飛び先に同じラベル名が出てきてどっちからどっちに飛んでるかいちいち確認が必要だからだよ。

これは凄い

376 :デフォルトの名無しさん:2008/02/11(月) 19:20:54
>>361
こんなコード書くやつがいたら、殴ってしまうかもしれない。ペシペシ

377 :デフォルトの名無しさん:2008/02/11(月) 19:22:58
このスレってFizzBuzzすらパスしない奴がごろごろいそう・・・

378 :デフォルトの名無しさん:2008/02/11(月) 19:25:23
中身のないコードで空虚な議論
お前らヒマだな

379 :デフォルトの名無しさん:2008/02/11(月) 19:27:03
>>263をちょっと書き換え

  if (A_init() != 0) goto A_FAILED;
  if (B_init() != 0) 80+0; B_FAILED:
  if (C_init() != 0) goto C_FAILED;
  if (D_init() != 0) goto B_FAILED;

こっそりこういういたずらをしていく人がいるんだ。世の中には。
そういうやつと一緒に仕事しなかった人は幸せもん。

携帯開発の軍曹の話は有名らしいが、
あの戦場を生み出すのがこういうことをする人間なんだ。
本当に単なるミスであの地獄が生まれるとか思ってないよな?
ああいうのをやるやつっていうのは、
周りを引きずりおろすことで自分を立派に見せてのし上がろうとする暴力主義のやつら。特に福岡県出身のやつら。


380 :デフォルトの名無しさん:2008/02/11(月) 19:30:26
goto肯定論者の俺でもこのスレのgoto厨には賛成できない

381 :デフォルトの名無しさん:2008/02/11(月) 19:31:09
流れを読まずに横レス。

GOTO 使わず関数使えというのは、太古の昔、非構造化プログラミングから
構造化プログラミングへのパラダイムシフトが現在進行形だった時代の
いわば「スローガン」だと思います。

時代は移り、今は構造化プログラミングが当たり前の時代です。
そのような現在のプログラマが、私たちの先祖が使っていた GOTO 730 と
関数内部での goto FAILED; を同列に論じてしまうことに
私はいささかの疑問を感じるのです。


382 :デフォルトの名無しさん:2008/02/11(月) 19:33:42
> 周りを引きずりおろすことで自分を立派に見せてのし上がろうとする暴力主義のやつら。特に福岡県出身のやつら。

なんだそのビ妙〜な私怨はw

383 :デフォルトの名無しさん:2008/02/11(月) 19:35:12
こっそりって。コミットログすら書かないのか携帯の開発は。

384 :デフォルトの名無しさん:2008/02/11(月) 19:38:12
>>381
小さい関数ならいいが、ブクブク太った巨大関数の中でホイホイと飛ばれると
読むほうは疲れるんだよ。多重breakとか限定された状況ならまだ許せるけどな。
特に考えもせずにgoto多様する馬鹿にかぎって巨大な神関数をつくりたがる。

385 :デフォルトの名無しさん:2008/02/11(月) 19:38:40
>>379
そういうやつと仕事したことないけど、そのコードだとコンパイラ警告
でるんじゃないか?B_FAILEDの行が意味を成していないとか何とか。
擬似コードにつっこむのもあれだが。

386 :デフォルトの名無しさん:2008/02/11(月) 19:39:47
>>381
飛び先が一箇所ならいいと思うよ。
>>379みたいないたずらされても、ループするか飛ばすかのどっちかしかないから。
goto FAILED;とかは関数につき1回だし普通は最後に飛ぶだけだし問題になることはないからね。

>>383
証拠が残せるようなシステム使ってないから。

>>382
福岡はそういう地域なんだよ。
完成品チェックって横槍いれて完成してたら強奪。奪ったらパソコン初期化して証拠隠滅。
毎度毎度そればっかり。

完成してたら強奪→正社員
奪われるばっかりの人→派遣社員

いや、別に比喩してるわけじゃなくてね。
社員同士でもそうなんだよ。


387 :デフォルトの名無しさん:2008/02/11(月) 19:41:27
それはgoto以前の問題だし因果関係が明らかに逆。

適切に関数分割できない馬鹿だから
巨大関数の中をgotoで飛び回るコードになる。

そういう馬鹿に言うべきは「処理のまとまりごとに関数に分けろ」であって
そいつに「gotoを使うな」と言ったところで
今度は巨大なネストをフラグで引き回すコードを書くだけ。

388 :デフォルトの名無しさん:2008/02/11(月) 19:42:12
>>385
B_FAILED の後ろがセミコロンからコロンになっているのに注意。
君はだまされる方だな。

389 :デフォルトの名無しさん:2008/02/11(月) 19:45:08
馬鹿?

390 :デフォルトの名無しさん:2008/02/11(月) 19:52:16
>>388
きづかなかった・・・w

もしかしてあなたは、そういういたずらをチョコチョコやっているのではな
いかと、疑いたくなってきたなw

391 :デフォルトの名無しさん:2008/02/11(月) 19:52:52
朱に交われば、なんとやら・・w

392 :デフォルトの名無しさん:2008/02/11(月) 19:55:23
>>387
でもこのスレで出てきてるコード読むと、
神関数つくりそうな勢いのコードが目につくんだけど。

393 :デフォルトの名無しさん:2008/02/11(月) 19:56:28
昔一緒に仕事したひとで、
「1関数にreturnは1つしか書かない」
という信念を曲げない人がいた。
その人の書いた関数は、最後にラベルがたくさんあってgotoの山盛りだった・・・

ってあれ?デスマーチスレじゃないのか、ここ。

394 :デフォルトの名無しさん:2008/02/11(月) 20:02:25
>>393
そいつってオレジャネ?

395 :デフォルトの名無しさん:2008/02/11(月) 20:12:00
まさかの運命の再会

396 :デフォルトの名無しさん:2008/02/11(月) 20:29:31
でもさ、数行の排他を必要とする関数で

  lock();
  if (arg == NULL) {
    unlock();
    return E_PARAM;
  }
...
  unlock();

よりも下のほうが好みだなぁ。lock()とunlock()内を関数に分離するのも馬鹿馬鹿しい
ほどの小ささだと

  lock();
  if (arg == NULL) {
    result = E_PARAM;
    goto END_FUNC;;
  }
...
END_FUNC:
  unlock();
  return result;


397 :デフォルトの名無しさん:2008/02/11(月) 20:38:38
一方、俺はfinallyを使った。

398 :デフォルトの名無しさん:2008/02/11(月) 20:45:37
>>397
Cなんだよ、バーヤバーヤ

399 :デフォルトの名無しさん:2008/02/11(月) 21:48:02
某スレより

569 名前:デフォルトの名無しさん [sage]: 2008/02/09(土) 16:46:29
>>566
try finallyは例外を捕まえるための機構であって、ファンクション
トレースのための機構ではない。

デストラクタでロギングするほうがよっぽどスマート。try finally
に依存したロギングよりも。そしてアスペクト指向のほうが
デストラクタロギングよりももっとスマートだといっているのだよ。


400 :デフォルトの名無しさん:2008/02/11(月) 21:53:30
finallyって例外つかまえるための機構?
例外以外にもreturnとかでも呼ばれるんじゃないの?

401 :デフォルトの名無しさん:2008/02/11(月) 21:57:43
C++厨かよ

402 :デフォルトの名無しさん:2008/02/11(月) 21:59:16
gotoはダメだって言っているやつって、
ループ内break、continue、関数の途中のreturnとかもダメだと思ってるの?

403 :デフォルトの名無しさん:2008/02/11(月) 22:01:34
>>402
少なくともこのスレではそんな主張をしているレスは見あたらないね。
で、それがどうしたの?

404 :デフォルトの名無しさん:2008/02/11(月) 22:02:58
そもそもgotoはダメだという主張自体が見当たらないのだが。
できるだけ避けろ、とか、濫用するな、ってのはあるようだがな。

405 :デフォルトの名無しさん:2008/02/11(月) 22:10:13
>402は脳内敵をプロファイリング中でーす

406 :デフォルトの名無しさん:2008/02/11(月) 22:14:51
gotoを書く奴はスパゲティコードを書くという前時代の妄想で脳内敵を作り上げているのはどっちだか

407 :デフォルトの名無しさん:2008/02/11(月) 22:15:56
重要なのはgotoを使うか使わないかじゃなくて
ちゃんとコードレビューしろよってことだ

408 :デフォルトの名無しさん:2008/02/11(月) 22:21:14
>>400
> 例外以外にもreturnとかでも呼ばれるんじゃないの?

正確には、フレームが巻き戻されるのをトラップする機能。
それを利用して、例外のハンドリング(catch)や、後始末の処理(finally)の機構が
実装されている、という表現が正確。

409 :デフォルトの名無しさん:2008/02/11(月) 22:24:36
その「できるだけ」とはどこまでなのかという議論をしていたんじゃ?



410 :デフォルトの名無しさん:2008/02/11(月) 22:24:46
>>407
修正箇所だけのコードレビューとかなら確かにうまくいくけどさ、
何万行のソースコードをレビューで全部網羅するって、
全然うまくいったことがないな。みんなどうしてるのだろ。
ペアプロとかのがよさそうだけど、やったことないや。

411 :デフォルトの名無しさん:2008/02/11(月) 22:28:34
ルール:gotoを使っている関数はコードレビューの対象とする


412 :デフォルトの名無しさん:2008/02/11(月) 22:31:56
>>411
ごめん、俺「関数のreturnは必ず一箇所でやる」ポリシーもってるから、
全部レビュー対象となる^^

413 :デフォルトの名無しさん:2008/02/11(月) 22:33:39
>>412
^^と書いているが俺が去年やってたプロジェクトだと笑い事じゃなくて実際そうなる。

414 :デフォルトの名無しさん:2008/02/11(月) 22:36:42
具体的に言うと、gotoを使っている関数は
フローチャートおよび詳細な動作説明をドキュメントとして準備してコードレビュー。
もちろんそういうドキュメントを用意してレビュー会で説明するのは実装者。
承認となった場合もドキュメントは保管。

なので濫用する奴なんか自然といなくなる。
誰も濫用しないから何万行のレビューなんてのも実際は発生しない。
無問題。

415 :デフォルトの名無しさん:2008/02/11(月) 22:41:30
goto使ってる関数だけって、、、
あほらし。

416 :デフォルトの名無しさん:2008/02/11(月) 22:45:08
if と if and only if の区別も付かない奴か。

417 :デフォルトの名無しさん:2008/02/11(月) 22:49:57
>>414
それだけだとgoto濫用防止だけだけど、ホカにはどんなルールをきめてるん?

418 :デフォルトの名無しさん:2008/02/11(月) 22:52:23
>>414
それとさ、組み込み系だとファンクショントレース機能があるICEとか
結構効果なのだけどさ、それも全開発者に配布?

419 :デフォルトの名無しさん:2008/02/11(月) 22:52:57
結構効果なのだけどさ→結構高価なのだけどさ

420 :デフォルトの名無しさん:2008/02/11(月) 22:55:55
>>417
あれこれ言ったら個人特定されるでしょ

単純なのは、一関数が一定の行数を超えたらとか
for文で()の中に書く内容が「普通じゃない」とか

ちなみに>>412の理由だけでgotoを使った場合はレビューで却下だよ。


421 :デフォルトの名無しさん:2008/02/11(月) 22:58:23
>>420
世の中にドレダケぷろじぇくとまねーじゃが存在しているのか考えれば、
あなたがやっていることと同じようなことをやっている人は無数にいるから、
特定なんてされないと思うぞw

422 :デフォルトの名無しさん:2008/02/11(月) 22:59:17
>>421
じゃあ先に君の関わったプロジェクトで採用されていたルールを教えてくれ

423 :デフォルトの名無しさん:2008/02/11(月) 22:59:32
>>420
「普通じゃない」とかの基準で、資料作成させられて説明させられる
プログラマかわいそすwww

もうちょいまともな基準作ったほうがイインジャナイ?

424 :デフォルトの名無しさん:2008/02/11(月) 23:00:47
んーとね。いちいち説明しないとわからんかな。

何が「普通」かは実際には定義されているの。ここでは書かないけど。
簡単に言えばループ変数の初期化、終了条件、増分を普通に書くのが普通

425 :デフォルトの名無しさん:2008/02/11(月) 23:01:39
>>423
説明するのが手間になるようなコードを書くほうが悪いと思うが。

426 :デフォルトの名無しさん:2008/02/11(月) 23:01:56
>>424
「なにが普通か」の基準をきめるための努力は世の中に一杯あって、
基準めいたものもあるんじゃない?

427 :デフォルトの名無しさん:2008/02/11(月) 23:02:46
>>425
え〜だって、俺様基準で「普通じゃないから」っていわれて、「フローチャート」
まで用意させられるのだぜw

428 :デフォルトの名無しさん:2008/02/11(月) 23:06:57
>>427
フローチャートはgotoの場合じゃないの?
forの場合には何かトリッキーな式を書いた場合に
そのトリッキーな式がなぜ必要なのかを説明する
ドキュメント+プレゼンとかそんな感じだと思うが。

429 :デフォルトの名無しさん:2008/02/11(月) 23:07:59
>>427
俺様標準じゃなくて、一応条件が示されてるらしいぞ。
まあ俺には関係ない話だからどうでもいいと言えばどうでもいいが。

430 :デフォルトの名無しさん:2008/02/11(月) 23:08:47
gotoに拘る人間に100k行以上の開発蓄積のある人間はいない。

431 :デフォルトの名無しさん:2008/02/11(月) 23:10:11
1m行ならわからんでもないがさすがに100k行くらいは新人以外誰でも書いてるだろ

432 :デフォルトの名無しさん:2008/02/11(月) 23:10:18
好意のは時代を超えて無内容さが変わらないものだな

433 :デフォルトの名無しさん:2008/02/11(月) 23:10:29
>>430
goto厨のコードを読めば、それは明らかだな。

434 :デフォルトの名無しさん:2008/02/11(月) 23:12:43
>>431
1本の開発で一人100k行、の間違いじゃねーの?

435 :デフォルトの名無しさん:2008/02/11(月) 23:13:56
そかも

436 :デフォルトの名無しさん:2008/02/11(月) 23:16:18
goto使ったら詳細資料を用意しなければならないって、
使いたいとこでも使えないじゃねぇか。開発効率悪そう。

437 :デフォルトの名無しさん:2008/02/11(月) 23:18:36
>>436
goto使うだけの理由があればそれを書けばいいんじゃないの?
処理の流れをちゃんと把握できていればフローチャートだって
簡単に書けるし。

それとも実装ドキュメントの類いを一切書かない人?

438 :デフォルトの名無しさん:2008/02/11(月) 23:19:10
>>429
いやさ、その根拠が多くの開発者が納得いくものであればいいが、
「goto使ったら、フローチャート描かせて、説明させる。」っていってる
ようなやつが、まともな基準を示せるとは到底思えないのよね。

439 :デフォルトの名無しさん:2008/02/11(月) 23:20:17
フローチャート書ける程度のショボイ処理ならgotoいらないだろ

440 :デフォルトの名無しさん:2008/02/11(月) 23:22:47
>>436
わかって使っている人にとってはその通り。
ただし、こういうレビューの目的の半分は、
将来そのコードの面倒を見る他社のために実装資料を残すこと。
それが、大人のマナー

441 :デフォルトの名無しさん:2008/02/11(月) 23:24:07
>>437
だからさ、goto使うだけでフローチャート書けっていってるのは、
基準が曖昧すぎるといってるのよ。別にgotoが適切な場合もあるし、
そうでない場合もある。whileが適切でない場合もあるし、そうで
ない場合もある。

そんなこといってたら、すべてのプログラムにたいして全部
フローチャート書けという事になるわけで。

442 :デフォルトの名無しさん:2008/02/11(月) 23:24:44
フローチャート(笑)

443 :デフォルトの名無しさん:2008/02/11(月) 23:26:59
他社とは限らないな。自社の別チームでも何でも。
要するに、今の実装チームが未来永劫メンテするわけじゃないということ

444 :デフォルトの名無しさん:2008/02/11(月) 23:29:30
>>443
せめてさ、世の中に「メンテナンス性が高いプログラム」を判別しようとする
努力があって、そのための基準が研究されている事実くらい勉強した上で
そういうこといったほうがいいんじゃない?

goto使ったらコードレビューだ!とかじゃなくてさ。

445 :デフォルトの名無しさん:2008/02/11(月) 23:30:09
可読性の定量化なぞ不可能さ。
管理面でどうしても何かしたいならば。
goto使用許可を出せる権限を
誰かに付与すればイイんじゃね?

446 :デフォルトの名無しさん:2008/02/11(月) 23:34:14
>>441
gotoは他の構文要素と比較して、適切に使われない場合が多いという
共通認識があるからこそ、このスレも成立していると思うんだが。

適切なgotoもそうでないgotoもあり、適切なwhileもそうでないwhileもある。
だから全部やるか何もやらないかどちらかにしろ・・・では物は作れない。
現実的な判断として、かけるコストを回収できる効果があるかどうか。

というのが常識として書いていたが、考えてみればここはマ板でなく
ム板だから学生や研究者も当然いるのか。


447 :デフォルトの名無しさん:2008/02/11(月) 23:38:10
>>446
いや、あなたがいままで言ったような判断基準より、ましな判定基準を
提供するツールはあるし(商用、フリーかかわらず)、そのことすら
知らないまま、ぷろじぇくとまねぇじゃぁをやるのは周囲を不幸にするよ、
といってるだけだけど。

448 :デフォルトの名無しさん:2008/02/11(月) 23:38:10
>>444
浅学にして知らなかった。ポインタを示してもらえるかな。
研究者ではないので、俺はそういう勉強は足りないと自分でも思う。


449 :デフォルトの名無しさん:2008/02/11(月) 23:40:22
ところで、俺はそういうプロジェクトに開発者として関わっていたのだが
どこからプロジェクトマネージャという誤解が発生しているのかな

450 :デフォルトの名無しさん:2008/02/11(月) 23:40:51
コードレビューするのは結構なことだが、
くだらない決まり作って、くだらない作業させるようなプロジェクトは、
メンバのモチベーションも低いだろ。

451 :デフォルトの名無しさん:2008/02/11(月) 23:50:07
>>448
とりあえず「複雑度」でぐぐってこいw

452 :デフォルトの名無しさん:2008/02/11(月) 23:51:32
人の意見に文句だけいって自分は何も提供しない人って周囲のモチベーションさげるよねw
他の人、自分のかかわってたプロジェクトではどうだったのさ。
最低限そのくらい言ったら?

453 :デフォルトの名無しさん:2008/02/11(月) 23:55:58
>>452
お前は、ナニサマナンダ

454 :デフォルトの名無しさん:2008/02/12(火) 00:01:22
>>451
情報感謝。そういえば、そういうのも何か使ったことはあった。
ただ、そのプロジェクトだと単にビルド時に出していただけで、
それがどう使われていたのか知らない。値が高くても低くても特に何もなかった。

その値に適当な閾値を決めてレビューとかやればいいのか?
実際にプロジェクトでどういう運用がされていて、効果がどうだったのかとか、
そういう感想もあれば是非

455 :デフォルトの名無しさん:2008/02/12(火) 00:05:25
これ以上ないくらいスレ違いだな

456 :デフォルトの名無しさん:2008/02/12(火) 00:07:52
>>454
閾値はあるていどキビシ目にきめたほうがいいが、実際にレビューするか
どうかは、閾値が異常な値を示しているコードがバグを良く出すとか、
新規作成のものであるかとかいう事情を加味して考慮したほうがいい。

安定して動作しているモジュールを閾値より外れているから、といって
リファクタリングしたところで新たな不具合を生み出すだけ。
目的を見失わないようにしながら、やればいい。

しかし複雑度の計測もマダマダであって、あくまで一つの参考にしか
ならないが。

457 :デフォルトの名無しさん:2008/02/12(火) 00:45:08
こないだ、goto文が使われているコードを
昔作ったものから持ってった。 キー入力の評価だから
これ以上重たくしたくもない・・・というところ。

select 文二重+if文の底から出るのに breakを掛けるのは・・・

458 :デフォルトの名無しさん:2008/02/12(火) 00:48:03
世の中のプロジェクトは、まだまだ、リーダーとかマネージャとか上司とかの
「コーディング規約」(訳:俺の理解できない しんきのう は使うな)
が支配的なのな。

459 :デフォルトの名無しさん:2008/02/12(火) 00:53:03
分野によるが、多人数が関る(新人やアホが混じりやすい)プロジェクトでは必須
MISRA-Cとか

460 :デフォルトの名無しさん:2008/02/12(火) 00:59:27
MISRA-Cってどの程度使われてるのかね

それはさておき、MISRA-Cを適用するような分野に
新人やアホが混じってるというのはガクブルだな

461 :デフォルトの名無しさん:2008/02/12(火) 01:18:15
MISRA-Cは、新人やアホがまじらないための基準という意味では
まぁ有効だが、そういうやつがいない現場にとっては、無駄な
足かせにしかなっていないという矛盾がある。そして、そういうやつ
が混じらないようにする努力というのは経営陣の仕事であって、現場の
規約を固めるのはあまり意味がない。

ミスを防ぐための基準が、よけいに複雑なコードを生み出して、
逆にミスを生み出してしまうような矛盾が今のMISRA-Cにはある。

462 :デフォルトの名無しさん:2008/02/12(火) 01:56:39
そういうやつがいない現場の数のほうが少ない

463 :デフォルトの名無しさん:2008/02/12(火) 07:33:58
結局、まじめに処理構造を見直すのがマンドクセからgoto使うんでしょ。
gotoマンセ君は多人数での開発経験がないんじゃねーの?

464 :デフォルトの名無しさん:2008/02/12(火) 08:11:19
C覚えて2-3年程度のアマチュアが「goto、ヤベーw」とはしゃいでるだけ。

465 :デフォルトの名無しさん:2008/02/12(火) 11:30:23
>>463
gotoを使ったほうが可読性が高い場合に遭遇したことが無いね?

466 :デフォルトの名無しさん:2008/02/12(火) 12:30:26
基本文献はクヌースのStructured Programming with go to Statementsですかね。
あと、このへんで、
ttp://www.cmagazine.jp/src/kinjite/c/coding.html#index32
gotoと同じくらいダメとされている手を、gotoを避けるためだけに
使ってないか? というのは良い指標かと思う。

467 :463じゃないが:2008/02/12(火) 17:17:23
>>465
もちろんあるけど、しっかり考えれば考えるほど少なくなっていくよ。

468 :デフォルトの名無しさん:2008/02/12(火) 17:37:19
>>466
break, continueがだめって書いてあるやつ、
使わなかったとしたらどう書く?
ちょっと想像つかない。


469 :デフォルトの名無しさん:2008/02/12(火) 17:41:08
ちなみにこういうやつ書いたんです。
エラーはエラーなんだけどエラーの種類によって動作を変えるってやつ。
コードの参照は>>469


for i = 0 to 2
IE.navigate(str)
REPEAT; sleep(0.1); UNTIL !IE.busy AND IE.readystate = 4

// エラーページチェック
errortitles[4] = Status(ID, ST_TITLE)
for e = 0 to 4
ifb 1 <= Pos(errortitles[e], errortitles[4]) Then
select e
case 4 // エラーがなければ続行する。
break 2
case 0 // 接続エラーなら規定回数試行する。
sleep(2)
continue 2
default // その他エラーならエラー終了する。
SendSTR( メモ帳, errortitles[e] + "<#CR>", 1, false, false )
IE.navigate("about:blank")
result = false
exit
selend
endif
next
// ここには来ないはず
msgbox("エラー判定ミス")
exitexit
next

470 :デフォルトの名無しさん:2008/02/12(火) 17:43:44
ちなみに>>469のエラーチェックを関数化したやつもあるけど、
エラーの種類ごとに動作を変えるとしたら、
結局呼び出し元でswitchでそれぞれの動作をしないといけない。


471 :デフォルトの名無しさん:2008/02/12(火) 17:50:14
>>468
breakやcontinueの乱用がだめという話で、
きちんと制御構造がわけるような書き方なら問題ないのでは。
実際List37の例はひどいものだし。

472 :デフォルトの名無しさん:2008/02/12(火) 19:13:37
>>461
ベテランプログラマだけのユートピアを作るのが経営陣の仕事だぁ?

アホか。

473 :デフォルトの名無しさん:2008/02/12(火) 21:57:54
アセンブラ上がりのPGだが、JMP系述語+スタック使わないで
処理できて速い方法とか、日々そんなことばかり考えてる。
メンテナンス性以前に、論理的整合性が失われて美しくないから
なんて話は、俺の頭には何のことかさっぱりわからない。

474 :デフォルトの名無しさん:2008/02/12(火) 22:26:11
ルール:ソースは美しくなければならない

475 :デフォルトの名無しさん:2008/02/12(火) 22:35:59
美しくなくとも。簡潔で軽妙ならば

476 :デフォルトの名無しさん:2008/02/12(火) 23:14:11
>>472
新人は情報学科出身で、かつ優秀じゃなきゃイラネ

477 :デフォルトの名無しさん:2008/02/12(火) 23:38:18
>>469
何段抜けるかを数字で書く多段breakって糞じゃね?

478 :デフォルトの名無しさん:2008/02/12(火) 23:46:47
>>469
こんなソースを新人が書いたら、確実に書き直させるな。

479 :デフォルトの名無しさん:2008/02/12(火) 23:55:08
まずもって文法が意味不明なのでとりあえず C 風に書き下してみた。

for (int i = 0; i < 2) {
 IE.navigate(str);
 do {
  sleep(0.1);
 } while (IE.busy || IE.readystate != 4);
 errortitles[4] = Status(ID, ST_TITLE);
 for (int e = 0; e < 4; e++) {
  if (1 <= Pos(errortitles[e], errortitles[4])) {
   switch (e) {
   case 4:
    goto BREAK;
   case 0:
    sleep(2);
    goto CONTINUE;
   default:
    SendSTR(メモ帳, errortitles[4] + "<#CR>", 1, false, false);
    IE.navigate("about:blank");
    result = false;
    exit;
   }
  }
 }
 msgbox("エラー判定ミス");
 exitexit;
CONTINUE:
}
BREAK:


480 :デフォルトの名無しさん:2008/02/13(水) 00:01:50
>>479
途中で、読む気がうせた

481 :デフォルトの名無しさん:2008/02/13(水) 00:03:19
VBでもないし何かと思ったらUWSCって何だ
厨房スクリプト言語?

482 :デフォルトの名無しさん:2008/02/13(水) 00:19:17
ひとまずコード*だけ*読んで、前提条件あんま読んでないけど

>for (int i = 0; i < 2) {
「2回」ループする意図が良くワカラン。下のコード読めばわかるかと思って、
読もうとしたが、途中で挫折。

> IE.navigate(str);
> do {
>  sleep(0.1);
> } while (IE.busy || IE.readystate != 4);
IE.readystate==4だけじゃだめなのかな。IE.busyじゃないときだけ、readystate
が有効になるのか。ならIE.readystateが-1ならbusyとかしたほうが、
"while(IE.readystate!=4)"だけですむしわかりやすい。

> errortitles[4] = Status(ID, ST_TITLE);
errortitles配列の、5番目にいきなり代入してるのが、なんじゃらほい。0〜4番目は、
どうなったのだろう?

> for (int e = 0; e < 4; e++) {
>  if (1 <= Pos(errortitles[e], errortitles[4])) {
このへんと、下をちょっと見た段階でギブアップ

483 :デフォルトの名無しさん:2008/02/13(水) 00:22:21
余計なものを全部省いて構造だけ残すと、たぶんこう。

void f() {
 while (some_condition()) {
  something();
  for (int e = 0; e <= 4; e++) {
   if (some_condition(e)) {
    switch (e) {
    case 4:
     goto BREAK;
    case 0:
     goto CONTINUE;
    default:
     return;
    }
   }
  }
  exit(-1);
CONTINUE:
 }
BREAK:
 something();
}

484 :デフォルトの名無しさん:2008/02/13(水) 00:30:02
>>483
やっぱりだめだ・・・こういう感覚を説明して理解してもらえるかわからないが、
そのコードは「普通」じゃない。読むのがすごいシンドイ。

485 :483:2008/02/13(水) 00:32:42
で、俺ならこう書く。
頭の中でしか動かしていないので合ってるかどうかは自信ないが。

void f() {
 int state = 0;
 while (state == 0 && some_condition()) {
  something();
  state = check_state();
 }
 if (state == 4) {
  something();
 }
}

int check_state() {
 for (int e = 0; e <= 4; e++) {
  if (some_condition(e)) {
   return e;
  }
 }
 exit(-1); // not reached
}

486 :デフォルトの名無しさん:2008/02/13(水) 00:35:50
まだ、java はインタプリタじゃ無い、って言ってるヤツがいるみたいだけど。
中には、インタプリタじゃ無い、ヴァーチャルマシンだ、とか
もっとひどいのになると、エミュレータだ、とか、もうメチャクチャ言いたい放題・・・
ちょっと呆れたな。
これって、「モモヒキじゃ無い、スパッツだよ!」って言ってるオバサンと同じじゃん。

487 :デフォルトの名無しさん:2008/02/13(水) 00:38:14
>>485
あぁなんとか理解できる。サンクスw

488 :483:2008/02/13(水) 00:52:25
せっかくだから俺からも一つネタ投下。
>>485 のf()と下のコードはどっちが良いと思う?

void f() {
 while (some_condition()) {
  something();
  switch (check_state()) {
  case 0:
   break;
  case 4:
   goto END_WHILE;
  default:
   return;
  }
 }
END_WHILE:
 something();
}

489 :デフォルトの名無しさん:2008/02/13(水) 00:57:07
>>488
俺は>>488のほうがわかりやすいw

490 :デフォルトの名無しさん:2008/02/13(水) 01:40:46
>>488
case 4:でsomething呼び出して
returnしてしまえばもっと見やすいと思うが。

491 :デフォルトの名無しさん:2008/02/13(水) 01:44:51
(ノ∀`) アチャー

977 デフォルトの名無しさん[sage] 2008/02/13(水) 00:31:00
forループのネスト構造(2重)から一気に脱出したい時に、breakだと1重しか脱出できないので困ってます。
PHPではbreak 2;みたいに書くと2重のループから脱出できるみたいなんですが、C++で同じことができる方法はありますか?
goto文はなるべく使いたくないので……。

980 デフォルトの名無しさん[sage] 2008/02/13(水) 00:50:26
>>978
ググった時に「大域脱出するとき例外処理で〜」とか書いてあるのを見たのですが、それでしょうか。

>>979
表を描くために座標をネスト構造で回しているのですが、
描画する要素がなくなったら外に出すっていうようにしたいんです。
大人しくflagにしたほうが良いですね……。ありがとうございました。

492 :デフォルトの名無しさん:2008/02/13(水) 01:50:32
>>491
コピペもウザイが、意図もよくわからんぞw

493 :デフォルトの名無しさん:2008/02/13(水) 02:05:31
(ノ∀`) アチャー

984 名前:デフォルトの名無しさん[sage] 投稿日:2008/02/13(水) 01:55:45
>>981
後で困りそうですがもっと単純に解決させました。
ループ部分だけクラス内で別のメンバ関数にして飛ばして、抜けたい所でreturnさせました……。

494 :デフォルトの名無しさん:2008/02/13(水) 02:36:14
>>479
× for (int e = 0; e < 4; e++) {
○ for (int e = 0; e < 5; e++) {

>>482
> 「2回」ループする意図
ADSLで瞬間的に切断される場合、数秒後に再度アクセスしたら接続される場合があるので。

>IE.readystate==4だけじゃだめなのかな。
やり方をググってまねしただけなんで。

>5番目にいきなり代入してるのが、なんじゃらほい。
終了フラグです。
まあいいやり方じゃないけどエラーを拾う判定がちゃんと働くかテストにもなるしと入れてみた。
代入してるのはウィンドウタイトル。
あと、ループはループだけ、判断は一箇所にすると、制御が単純でわかりやすいなと思ったんだけど、
forを抜けて「ここには来ないはず」と書いた場所でbreakすればいいだけだった。

もともとが長いスクリプトだったからdefaultをexitで抜けてなかったんで
そんときのループ構造が頭にあって。
やっとすっきりしたと思ったんだけど見直せばもっとシンプルになるもんだね。


495 :デフォルトの名無しさん:2008/02/13(水) 06:20:53
>>486
釣りいいかげんうざい。
あのね、じゃあ具体的にあんたが主張するBASICのようなコードを
JavaVMのバイトコードで示してみやがれっての。できなきゃ去れ。
二度と来るな。

496 :デフォルトの名無しさん:2008/02/13(水) 07:13:52
>>486
せめてJavaVM実装の書籍を1冊でいいから読破してから言え、マヌケ。

497 :デフォルトの名無しさん:2008/02/13(水) 07:30:44
まあ多重break/continueは可読性を落とすね。gotoのほうがナンボかマシ。
多重break/continueもgotoも無いのがベストつーか常識だけどw

498 :デフォルトの名無しさん:2008/02/13(水) 07:53:56
>>494
> やり方をググってまねしただけなんで。

やっぱりね…
そういう姿勢だからbreakでもgotoでも汚ないコードになるんだよ。

499 :デフォルトの名無しさん:2008/02/13(水) 07:55:56
JavaVMのハードウェア実装を知らないんだろうな、>486は。

500 :デフォルトの名無しさん:2008/02/13(水) 08:11:16
JVMについて盛り上がっている人がいるようだが、
どのJVMのことだ?sunか?

501 :デフォルトの名無しさん:2008/02/13(水) 08:12:39
>>500
特定の実装の話じゃないと思うが。つーか、吊りか?

502 :デフォルトの名無しさん:2008/02/13(水) 08:30:34
ハードウェア実装?

503 :デフォルトの名無しさん:2008/02/13(水) 08:43:59
荒らしはスルーで > 兵共

504 :デフォルトの名無しさん:2008/02/13(水) 08:53:16
picoJava のことじゃまいか<ハードウェア実装

505 :デフォルトの名無しさん:2008/02/13(水) 08:58:45
Jazelleとか。
一部ソフトウエアで実行するけど。

506 :デフォルトの名無しさん:2008/02/13(水) 09:05:28
いずれにせよBASICインタプリタとは大分違う罠

507 :デフォルトの名無しさん:2008/02/13(水) 09:16:38
>>498
勝手な思い込みで変更する馬鹿よりましだよ。

ぐぐったら出てくるけど、作業をしているか通信をしているかをチェックするんだって。
通信が完了してから作業をするだろうけど、作業が新しい通信を要求するかもしれないだろ。
どんな流れになるかはWebサイトの作り次第だし、テストするには通信帯域を制限したり・・・

コードの流用するならそれが確かに動くかテストするべきだが、
自分でテストできないなら基本的には信用することが必要だ。


508 :デフォルトの名無しさん:2008/02/13(水) 09:25:01
busyだけだとフレームのページで途中で抜けちゃうって話がどっかにあった。
まあレイアウトが自由にできる今はフレームなんか使ってないだろうけど。
ReadyStateだけの場合は↓。
つまり両方のチェックが必要。

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


509 :デフォルトの名無しさん:2008/02/13(水) 10:21:31
>>507
> コードの流用するならそれが確かに動くかテストするべきだが、
> 自分でテストできないなら基本的には信用することが必要だ。

唖然・・・
おまえみたいのはgotoを絶対に使うべきじゃないし、
そもそもプログラミングをするべきじゃない。

510 :デフォルトの名無しさん:2008/02/13(水) 10:24:35
同意

511 :デフォルトの名無しさん:2008/02/13(水) 10:25:49
>>509
なに俺様は完璧とか言ってんの?

512 :デフォルトの名無しさん:2008/02/13(水) 10:58:49
そもそもコードは、誰が書いたものでも信用できない。

513 :デフォルトの名無しさん:2008/02/13(水) 11:10:41
自分自身が書いたコードすら信用できないorz


514 :デフォルトの名無しさん:2008/02/13(水) 14:29:42
「try 〜 catch」 を使おうが、「for/while 〜 break ラベル」 を使おうが、
汚いスパゲッティ・コードはいくらでも書ける。
たとえば、フラグ変数作って、break break break break 連発するヤツがいい例。
goto 使うやつに比べれば、「do 〜 while (false)」 や 「switch 〜 break」 を使うなど、
トリッキーなコード書いて得意満面になってるキチガイよりよっぽどマシだ。

要するに、「コードの美しさ・汚さ」と、「goto 使うな」 論は無関係。プログラミングの芸術的センスの問題だよ。
java、php、ruby そのた、言語によって大域脱出の仕方が違うのは
どの方法が正しい・優れているという基準が無いからで、どの言語作者も頭を悩ませている問題なんだろう。

goto の何が問題なのかと言えば、インタプリタやコンパイラの内部処理の都合上、
パフォーマンスを低下させる要因になっているから。
特に while(・・・) {・・・} みたいに { } ブロックを多用する言語は、goto で ”あらぬ方向” へ脱出される事を極端に嫌う。
これは { } によって確保したスタックの管理がくずれるから。
ここらへんは実際に目には見えない部分なので、なかなか理解が難しいと思う。
自分でインタプリタやコンパイラを作ってみれば経験できる事なのだが、いまどき、そこまでするヤツはおっとまた
字数制限がうざいなもっと長文書ければいくらでも語れるんだが続きはまた暇なときにでも。うんこちんちん!

515 :デフォルトの名無しさん:2008/02/13(水) 14:33:20
長文とかどうでもいいからベンチの結果ひとつでも(張|貼)ってくれ

516 :デフォルトの名無しさん:2008/02/13(水) 14:39:27
無茶言うなよ。java と basic と php とベンチで比べて何の意味がある?

517 :デフォルトの名無しさん:2008/02/13(水) 14:43:13
>>514
> これは { } によって確保したスタックの管理がくずれるから。

今時、そんなソースコードにべたべたのインタプリタなんて珍しいわ。

コンパイラや、ソースコードを一回全部なめて、内部構造に
するようなインタプリタなら、ローカル変数のアクセスのために、
処理系はスタックの現在のオフセットを常にわかっている必要がある。

だから、ジャンプ元とジャンプ先でスタックのオフセットがずれるなら、
そのぶんをジャンプの直前か直後に調整して終わり。難しい話じゃない。

Javaのバイトコードを示していただきたいなぁあなたにも。

(あ、Rubyのブロックはクロージャだから別物ね)

518 :デフォルトの名無しさん:2008/02/13(水) 14:47:17
gotoでforループの中に飛び込もうとするコードを
はじめて見たときはびっくりしたわ

519 :デフォルトの名無しさん:2008/02/13(水) 14:51:06
というかスタックの奴等こっちでやれ。goto関係ないし。
http://pc11.2ch.net/test/read.cgi/tech/1188688416/l50

520 :デフォルトの名無しさん:2008/02/13(水) 15:05:50
>>514はN88BASICでブイブイ言わせているビルゲイツ

521 :デフォルトの名無しさん:2008/02/13(水) 15:10:52
MS-DOS版N88日本語BASIC(86)コンパイラー

ナゲー

522 :デフォルトの名無しさん:2008/02/13(水) 17:02:48
このすれは「どうして1たす1は2なの?どうして?どうして?」って言いそうな連中ばかりだな。

523 :デフォルトの名無しさん:2008/02/13(水) 17:07:13
コンピュータの気持ちになってみると 1 + 1 は 10 です

524 :デフォルトの名無しさん:2008/02/13(水) 17:15:51
>>523

ここでコンピューターの気持ちで会話してきてください。
できれば↓のスレの書き込みの翻訳してくれるとありがたい。

1101011 1100001 1101001 1110111 1100001
http://pc11.2ch.net/test/read.cgi/prog/1201423463/


525 :デフォルトの名無しさん:2008/02/13(水) 17:56:17
goto師はどこいった

526 :デフォルトの名無しさん:2008/02/13(水) 18:30:05
回線の問題というか、pingでtimeoutでまくり

527 :デフォルトの名無しさん:2008/02/13(水) 19:08:23
>>518
コーヒーふいたじゃねーかw

どんなコードかちょっと気になるw

528 :デフォルトの名無しさん:2008/02/13(水) 19:25:24
直接gotoを使ってはいないが、
ループの中にswitch-caseで飛び込むコードって奴があるな。
Duff's device でググると出てくる。
(CGの人ならPorter-Duff operatorのDuff氏とか言うと、へーとか思うはず)

529 :デフォルトの名無しさん:2008/02/13(水) 19:40:41
do {             /* count > 0 と仮定 */
 *to = *from++;       /* to がインクリメントされていないことに注意 */
} while (--count > 0);

これを、下のようにして最適化か。こう書いてコンパイル通る
ことすら知らなかったわw

しかし昔memcpy実装させられたとき、条件判定へらす努力したり
ワード単位でコピーしたりしたんだが、標準で用意されて
いたARMのlibcに速度が遠くおよばなくて愕然とした記憶があるなw

switch (count % 8)  /* count > 0 とする */
{
 case 0:     do { *to = *from++;
 case 7:        *to = *from++;
 case 6:        *to = *from++;
 case 5:        *to = *from++;
 case 4:        *to = *from++;
 case 3:        *to = *from++;
 case 2:        *to = *from++;
 case 1:        *to = *from++;
         } while ((count -= 8) > 0);
}

530 :デフォルトの名無しさん:2008/02/13(水) 20:15:51
どのみち、天才の考えることは凡人には理解できないのでメンテ不可ですわ。

531 :デフォルトの名無しさん:2008/02/13(水) 20:21:51
>>514
いいからJavaVMの実装本を読めって。
自分がどんなに時代遅れな発言をしているか
よーくわかるから。

532 :デフォルトの名無しさん:2008/02/13(水) 20:34:59
>>514
> goto 使うやつに比べれば、「do 〜 while (false)」 や 「switch 〜 break」 を使うなど、
> トリッキーなコード書いて得意満面になってるキチガイよりよっぽどマシだ。

日本語に訳すと、
1+1を3と言うやつに比べれば、2+3を6と言う奴や3+1を2と言って得意満面に
なっているキチガイよりよっぽどマシだ。

といったところか。そんな>>514に良い言葉を教えてあげよう。
目糞鼻糞、どっちも糞。

533 :デフォルトの名無しさん:2008/02/13(水) 20:50:16
今老舗特集やってるけど、昔からの技術をそのまま受け継いで応用することで普通の工業機械では作れないものを作れてるってさ。
確かに技術は進歩してるし、クソなコードは多いが、よい結果を出しているものはよい方法かもしれない。

紙すきのでやってたけど、手作業を機械でやることで品質の安定したものを大量に低コストにやってるが、
技術の開発は道具こそ工夫するものの人間が手でやっている。

プログラミングで自動化機械といえば、ソースコードのコンパイルとかスクリプトでの作業。
機械設備はコーディングをサポートしてくれる開発環境とかライブラリ。
そういうのを駆使して効率よく新しいものを作るのがプログラマの仕事。

決まりきったやり方が正しいのか最適なのかたまには見直してみるのもいいが、
基本はそれをまねしてやることだ。

何もかも完璧に分かってないといけないとか言ってたら時代の波に飲まれておしまいだ。


534 :デフォルトの名無しさん:2008/02/13(水) 20:59:14
>>533
先人のコードをまねることは大切だ。
だが、自分のプログラムに応用する時には
そのコードをしっかり読んで動作を理解してから。
これができない奴はプログラムを書くべきではない。

535 :デフォルトの名無しさん:2008/02/13(水) 21:00:03
つーか、>>494、かなり必死だなw

536 :デフォルトの名無しさん:2008/02/13(水) 21:04:10
>>534
習うより慣れろだ。
正しいか間違ってるかは、うまくいくかいかないかで判断しろ。


537 :デフォルトの名無しさん:2008/02/13(水) 21:08:24
ひょっとして、>>469がうまくいってる例だと思ってる? まさかな。

まあ、少なくとも元のコードの動作を理解できるまでは、
それを使ったコードを人様に見せるのは止めたほうがいい。

538 :デフォルトの名無しさん:2008/02/13(水) 21:09:18
>>536
> 習うより慣れろだ。
> 正しいか間違ってるかは、うまくいくかいかないかで判断しろ。

仕様に照らして、な。
「実は実装依存」なコードを量産されるよ?

539 :デフォルトの名無しさん:2008/02/13(水) 21:09:43
>>529
そりゃmemcpyがコンパイラに組み込まれてたんじゃね?
そういう場合、libcのmemcpyは関数ポインタ取るためだけに用意されている。

540 :デフォルトの名無しさん:2008/02/13(水) 21:18:43
>>537
しっかり動いてますが何か。
テスト済みですが何か。

541 :デフォルトの名無しさん:2008/02/13(水) 21:29:23
論破されて窮地に追い込まれると、
「関係ない話は別のスレでやれ」 とか
「〜の本を読め」 とか言って相手を囲いの外に追いやろうとする
典型的な厨房の集うスレはここですか?

542 :デフォルトの名無しさん:2008/02/13(水) 21:46:36
>>539
コピーするサイズに応じて、最適なコードをそれ専用に生成するってこと?

543 :デフォルトの名無しさん:2008/02/13(水) 21:56:02
>>540
動けばいいと公言する奴のコードに限って実は動かないんだよ。
どうせ自分で何回か使ってみただけなんでしょ?
これだから、ゆとり世代は・・・

544 :デフォルトの名無しさん:2008/02/13(水) 21:58:53
>>540
まさかとは思ったが、本気で>>469がうまくいってる例だと思ってるのか。
このスレのgotoを恐れずに使う兵共にとっても>>469は糞コードだぞ。

545 :デフォルトの名無しさん:2008/02/13(水) 22:00:21
>>543
「動く」と胸を張っていえるからリリースするもんだろ。
それが動かなくなるのがバグだろ。
バグに遭遇したことないやつが存在するんなら確かにそういえるかも知れんな。

546 :デフォルトの名無しさん:2008/02/13(水) 22:05:31
gotoの弊害はむしろ保守性の低さだろ

自分だけが使う書き捨てのプログラムなら別に>>469の糞コードでも良し

547 :デフォルトの名無しさん:2008/02/13(水) 22:07:59
>>545
それがさあ、「動けばいい」って奴はロクなテストやってないのが相場なの。
大抵、自分の手元の環境で数回から数十回動かしてエラーが出なきゃOKって程度のテスト。

特に最近のゆとり君は適当にググってきたコードをコピペするからひどい。
何故動くのか理解しないまま数回動かしただけで「動きました」とか言い出す。
もうアフォかと。

548 :デフォルトの名無しさん:2008/02/13(水) 22:30:31
>>547
テストしてないのを問題視するのはいいとして、テストもせずに駄目出しするのもどうかと思うが。

549 :デフォルトの名無しさん:2008/02/13(水) 22:32:06
>>547
テストしてないのを問題視するのはいいとして、テストもせずに駄目出しするのもどうかと思うが。

550 :デフォルトの名無しさん:2008/02/13(水) 22:35:55
>>548 テストしていないものは駄目出しされて当然だろう

551 :デフォルトの名無しさん:2008/02/13(水) 22:38:01
>>550
テスト済みと書いてる字が読めないならプログラム組むな

552 :デフォルトの名無しさん:2008/02/13(水) 22:42:02
>>551
へー、どんなテストしたの?
ちゃんと異常系までテストした?

553 :デフォルトの名無しさん:2008/02/13(水) 22:44:15
>>552
どんな異常だよ

554 :デフォルトの名無しさん:2008/02/13(水) 22:47:37
例えば
>>494
> > 「2回」ループする意図
> ADSLで瞬間的に切断される場合、数秒後に再度アクセスしたら接続される場合があるので。

のあたり、実際に切断された場合の回復処理で正常にアクセスできたことを
切断時間などを変えながら複数の状況でテストしたのかい?
切断された後、一旦回復してすぐまた切断される状況は?

555 :デフォルトの名無しさん:2008/02/13(水) 22:51:54
>>469って、「多重continue、ヤベッーw」なワナビー風味だね

556 :デフォルトの名無しさん:2008/02/13(水) 22:58:51
>>554
再表示で接続できることは経験的に知っているし、
規定回数全部で接続できなかった場合でもエラーで中断するし、
中断した場合も呼び出し元からやり直すだけだし。

回復して切断したらって話だが、
REPEAT; sleep(0.1); UNTIL !IE.busy AND IE.readystate = 4
これを実行した後には、接続できたかできなかったかのどちらかしかない。
もちろん不完全な取得を完了とした場合、その先で実行できないってだけだが、
実行できなかった場合も呼び出し元で再チャレンジするし。


557 :デフォルトの名無しさん:2008/02/13(水) 23:00:25
>>556
つまりテストしてないわけね。よくわかった。

558 :デフォルトの名無しさん:2008/02/13(水) 23:07:59
>>557
自分で切断はしてないけど切断があったことはログでチェックしてるよ。
 

559 :デフォルトの名無しさん:2008/02/13(水) 23:09:48
>>558 切断時間はちゃんとカバーされてるのか?

560 :デフォルトの名無しさん:2008/02/13(水) 23:12:55
おまえら、テストしたかどうか以前に>>469は一見して糞。以上おわり。

561 :デフォルトの名無しさん:2008/02/13(水) 23:14:31
>>559
2回続けて失敗する現象はなかった。
昨日だったか2ch鯖にアクセスできなくなってたが、その場合そもそもここまで処理が回ってこないし。

>>560が手本を見せてくれるそうです。


562 :デフォルトの名無しさん:2008/02/13(水) 23:18:13
>>556
結局わけわからん部分は「呼び出し元で再チャレンジするから」なわけね。
だったら2回ループ回さなきゃいいのに。中途半端なことするから可読性が落ちる。

563 :デフォルトの名無しさん:2008/02/13(水) 23:24:55
>>562
前の処理がせっかくうまくいってるのにそれを無駄にすることはないだろ。
接続エラーになったからって前の処理をやり直したら、そっちまで接続エラーになるかもしれないだろ。
これは普通にブラウザ使ってたら分かる話だ。
試行回数とインターバルは経験的に、感覚的にだ。


564 :デフォルトの名無しさん:2008/02/13(水) 23:27:09
>>563
つまり自分が使っていた環境のことしか考えていないし、
テストも自分の普段の環境から出ていないってことね。
なるほどね。

565 :デフォルトの名無しさん:2008/02/13(水) 23:30:13
>>542
・インライン化の恩恵を受けられる。
・人手で最適化されたコードを吐いてくれる可能性がある。
・ポインタの型によって(intptr_t)pの値が最初から
ワードの倍数になっていることを保証できる場合がある。

566 :デフォルトの名無しさん:2008/02/13(水) 23:44:24
>>564
待ち時間は秒数で指定してあるし。
IE使ってる時点で使用環境は固定されてるし。


567 :デフォルトの名無しさん:2008/02/13(水) 23:45:36
しかしつまらんスレだな

568 :デフォルトの名無しさん:2008/02/13(水) 23:46:10
もういいから
gotoの話じゃないならよそでやれ

569 :デフォルトの名無しさん:2008/02/14(木) 00:10:38
direct threaded code


570 :デフォルトの名無しさん:2008/02/14(木) 01:24:26
gotoを一行足りと書かなくても、
容易にクラッシュしてデバッグすらできない環境があって・・・。
助けてくれ orz.

571 :デフォルトの名無しさん:2008/02/14(木) 01:25:27
>>570
それははたして環境のせいなのか?

572 :デフォルトの名無しさん:2008/02/14(木) 02:50:12
異常系のテストは、まずは、そういう状況をわざわざ作り出して確認するもんだ。


573 :デフォルトの名無しさん:2008/02/14(木) 06:49:41
>>566
> IE使ってる時点で使用環境は固定されてるし。

回線まで固定されるわけじゃなかろう

574 :デフォルトの名無しさん:2008/02/14(木) 07:27:53
>>568
このスレはgotoを語るスレではなくて
finallyや多重breakを語るスレなのでは。

575 :デフォルトの名無しさん:2008/02/14(木) 07:31:57
>>563
> 試行回数とインターバルは経験的に、感覚的にだ。

ひでえ根拠だなwww
うちに配属になった新人がこんなコード書いたら
即刻今のコードを完デリさせて最初から書きなおしだ。

576 :デフォルトの名無しさん:2008/02/14(木) 08:23:43
インマルサット・インテルサットに積む電話交換機屋からブラウザアプリ屋まで
入り乱れての乱戦になっておりますw

577 :デフォルトの名無しさん:2008/02/14(木) 09:01:44
キャプテンも忘れないであげてください

578 :デフォルトの名無しさん:2008/02/14(木) 16:13:06
「テスト済み」なんて堂々と言うからだ。
テストっていうのがどんな物かわかってたら簡単に言えないもんだ。
そういう意味では「ポインタは理解してる」に似てるな。

と、釣りっぽくまとめてみる也。

579 :デフォルトの名無しさん:2008/02/14(木) 18:26:21
ポインタのややこしいのは、ポインタじゃなくて宣言の方だからな。

580 :デフォルトの名無しさん:2008/02/14(木) 18:41:46
一応鯖に負荷のかかる土日流しっぱなしにして想定した全部のパターンでうまくいくのは確認してるし
自動でかかる連続投稿規制とアクセス規制と、さらに管理者からのアクセス規制を受けるまでやって、
そーゆー規制食らった場合にも適切に処理できるのは確認済み。

んでえらそうに語ってくれる人がどういう方法でどこまでのテストを要求してるのか知らんが、
サーバーまで自分で作ってるわけじゃないって事を分かっているのかいないのか・・・。
自分でできる範囲ってのは回線を切断したり接続したりだ。

ちなみに、ほとんどの場合は回線の異常じゃなくて、2ch鯖がただシカトしてただけだった。
自分のプロバイダまでのpingは30msで失敗しないけど2ch鯖は120msくらいかかってそのうち1回くらい失敗しまくり。

あと、エラー判定が実は正常なのを異常と判断する場合があるのは最初から分かってる。
完璧に自動で判断することができないんだからしょーがない。


581 :デフォルトの名無しさん:2008/02/14(木) 18:57:51
>>565
あぁ・・・そりゃ勝てなくて当たり前かw
トンクスw

582 :デフォルトの名無しさん:2008/02/14(木) 19:58:15
後出しの多いやつだな・・・

583 :デフォルトの名無しさん:2008/02/14(木) 20:02:05
単体テストと運用時のつなぐ相手のテストとの違いを
子供に理解させるのは無理だろう。

584 :デフォルトの名無しさん:2008/02/14(木) 20:27:38
ほうほう。
単体テストってのは1行1行テストすることを言うんですかそうですか。

585 :デフォルトの名無しさん:2008/02/14(木) 20:28:28
な。
無理だろw

586 :デフォルトの名無しさん:2008/02/14(木) 20:30:44
あんな短いコードをあれ以上どう分割しろと

587 :デフォルトの名無しさん:2008/02/14(木) 20:37:15
「単体テスト」でググレカス

588 :デフォルトの名無しさん:2008/02/14(木) 20:40:00
>>580
結局は自分の環境でしかテストしてないと。
しかも普通に使っていただけで積極的に
様々な状況を設定したわけでもなし。

そういうのはテストとは言わないんだよ。

589 :デフォルトの名無しさん:2008/02/14(木) 20:52:16
自分で設定しなくても実際にすべての場合で実行して結果を出してるんだからテストされてるだろ。

単体テストしろとかすべての環境でテストしろとかお前ら馬鹿かと。
たかだか数行のコードテストするために何十個もパソコン用意しろって?


590 :デフォルトの名無しさん:2008/02/14(木) 20:53:36
>>584
ワロタ

591 :デフォルトの名無しさん:2008/02/14(木) 21:04:11
だから一度「単体テスト」でググってから物言えカス

592 :デフォルトの名無しさん:2008/02/14(木) 21:19:19
単体テストもせずに「テスト済み」かよ…こりゃダメだ。

593 :デフォルトの名無しさん:2008/02/14(木) 21:21:29
新たな爆弾発言が出ました。
>>589
> 実際にすべての場合で実行して結果を出してるんだから

すべての場合だってさ・・・意味わかって言ってんのかね。んなわきゃないか。

594 :デフォルトの名無しさん:2008/02/14(木) 21:22:28
レオン最高
マチルダかわいい

595 :デフォルトの名無しさん:2008/02/14(木) 21:23:49
>>586>>587が自分に言ってる事もわかってないに100ガパス。

596 :デフォルトの名無しさん:2008/02/14(木) 21:37:26
IEを単体でテストできると思ってる馬鹿が多いな

597 :デフォルトの名無しさん:2008/02/14(木) 21:40:16
ちなみに
+offsetが抜けてデータ構造が変わっていたやつは単体テストで出てきそうなもんだが、
実際には総合テストしないと出てこなかったな。
http://pc11.2ch.net/test/read.cgi/prog/1192192069/

598 :デフォルトの名無しさん:2008/02/14(木) 21:44:38
>>596
単体テスト用のサーバ立ち上げて、
サーバ側でわざと切断したりレスポンスを変えたり、
外部仕様のカバレッジや実行パスのカバレッジが得られるような
パターンでレスポンスさせるもんじゃないの?

599 :デフォルトの名無しさん:2008/02/14(木) 21:44:40
単体テストにIEは関係ないだろ・・・

600 :デフォルトの名無しさん:2008/02/14(木) 21:48:41
>>596
テストする対象はIEじゃなくて糞スクリプトなんですが。

601 :デフォルトの名無しさん:2008/02/14(木) 21:50:36
つまりIEと同じメソッドを持つダミーのオブジェクトでテストしろってことね。


602 :デフォルトの名無しさん:2008/02/14(木) 21:51:05
>>598
そのテスト環境は既に結合テストの範疇だな。
サーバーつないだら単体テストにならないだろ?

結論:「テスト済み」なんて簡単に言うなってこった。

603 :デフォルトの名無しさん:2008/02/14(木) 21:53:00
>>602
いや、結合テストは実稼働のサーバとの接続でやるものでしょ。
実サービスではなく糞スクリプトのテストのためのレスポンスをする
サーバにつなげるのなら単体テストの範疇と思われ。
まあ、スタブを使うようなもんだ。

604 :デフォルトの名無しさん:2008/02/14(木) 21:53:51
>>602
> 結論:「テスト済み」なんて簡単に言うなってこった。

同意。

605 :デフォルトの名無しさん:2008/02/14(木) 21:54:48
それにしてもマチルダかわいい。

昔、うちに監禁してた少女は死んじゃったから代わりが欲しいな・・・(冗談)

それはそうと、ぼろいビルの屋上でスナイプの練習してるけど、
周りはもっと高層なビルがたくさん・・・
ライフルが丸見えです。
僕も屋上セックスしてたら隣のビルの専門学校から丸見えでばればれだった。


606 :デフォルトの名無しさん:2008/02/14(木) 21:56:55
>>603
ああ、そういう意味なら納得。
つまりそのサーバーはテスト用に設定した動作をするってことね。

607 :デフォルトの名無しさん:2008/02/14(木) 22:23:14
49日連続稼動しないとバグが発覚しない某アレの例もあるからねぇ・・・

608 :デフォルトの名無しさん:2008/02/14(木) 22:32:18
>>400付近の遠いレスだけど、おまえらそもそもデストラクタロギングが
どんなのかしってるのか。

class TRACE {
  TRACE(char *funcnamne, ...) { cout << log... <<endl; }
  ~TRACE() { cout << log.. <<endl; }
}

とかよういしといて、関数に下のように書くだけだぞ。tryもfinallyも
いらない。スコープぬけるときにデストラクタが呼ばれて、
かってにロギングしてくれるから。

void func {
  TRACE trace("func", ...);
  ...実体...
}

609 :デフォルトの名無しさん:2008/02/14(木) 22:36:14
>>608
クロージャがエスケープした時にはどうすんの?
finallyならクロージャがエスケープしようが例外が発生しようが
ちゃんとロギングできるわけだが。

610 :デフォルトの名無しさん:2008/02/14(木) 22:39:45
>>608
それは言語依存でしょ。
フルGCな言語や処理系だとスコープ抜けた直後にデストラクタが叩かれる保証はない。

611 :デフォルトの名無しさん:2008/02/14(木) 22:43:45
>>609
てか、そもそもC++にクロージャなんてものあったけか

612 :デフォルトの名無しさん:2008/02/14(木) 22:45:06
>>611
ないけど、このスレはC++限定じゃないでしょ?

613 :デフォルトの名無しさん:2008/02/14(木) 22:47:06
じゃぁtryもfinallyも前提に出来ないだろ、すべてコード上にログを
書くしかない。ならgotoまんせーだな、ファンクショントレースには。

614 :デフォルトの名無しさん:2008/02/14(木) 22:49:20
>>613
C++限定じゃないがC限定でもない。
JavaでもPythonでもJavaScriptでもModule-3でもアリじゃないの?

615 :デフォルトの名無しさん:2008/02/14(木) 22:50:15
CとC++のみが漢の言語

616 :デフォルトの名無しさん:2008/02/14(木) 22:55:27
>>614
わかった。じゃぁまずは、「デストラクタロギングさん、馬鹿にしてすいません。
tryとfinallyを使ったロギングなんてクソです」といえwww

617 :デフォルトの名無しさん:2008/02/14(木) 22:56:32
そういえばC言語のswitchはbreakで抜けるブロックだったな。
他の言語ではifの拡張だから普通にbreakでループが抜けれるから
>>469みたいなselect breakはおかしく見えちゃうんだな。


618 :デフォルトの名無しさん:2008/02/14(木) 22:56:33
デストラクタでロギングできる言語よりも
finallyでロギングできる言語のほうが多いだろうな

そもそもfinallyに比べてデストラクタでロギングする
メリットが見えないのだが

619 :デフォルトの名無しさん:2008/02/14(木) 23:00:09
>>616 ワケワカランwww

620 :デフォルトの名無しさん:2008/02/14(木) 23:34:48
C++厨がファビョりました

621 :デフォルトの名無しさん:2008/02/15(金) 00:55:51
>>618
>そもそもfinallyに比べてデストラクタでロギングする
>メリットが見えないのだが

おまえバカだろ?

622 :デフォルトの名無しさん:2008/02/15(金) 01:16:59
C++にfinallyが無い理由を考えろ

623 :デフォルトの名無しさん:2008/02/15(金) 01:18:43
finallyロギングは使うたびにfinallyブロックごとコピペする必要がある。
デストラクタロギングなら変数宣言だけコピペすればよいので、
finallyロギングよりコピペ量が少なくて済む。
その点ではC#/VB.NETのusingも次点でまあ使えると俺は思う。

ロギング以外にも言えることだけど。



624 :デフォルトの名無しさん:2008/02/15(金) 01:40:34
aspect 最強説

625 :デフォルトの名無しさん:2008/02/15(金) 01:41:27
粘着アスペルガー最狂

626 :デフォルトの名無しさん:2008/02/15(金) 04:38:51
うちのご近所さんたちが次から次にご近所さんを殺しまくったのは、
多分年金を全部懐に入れてて、いざ受け取ろうとしたら一円も受け取れなかったから、
「ばれたら仕方がない」って殺しまくったんだろうな。


627 :デフォルトの名無しさん:2008/02/15(金) 06:41:34
>>623
その程度の利点かよ・・・
finallyだってマクロ一発じゃん・・・アフォらし・・・

628 :デフォルトの名無しさん:2008/02/15(金) 07:23:28
>>613
なんだそりゃギャハwwwwwwww
オマエ、もうちょっと色々な言語、できれば現代的な言語を勉強しろよwww

629 :デフォルトの名無しさん:2008/02/15(金) 08:31:18
Aspect指向なんてどうでもいい。
CLOSのbefore-afterさえあれば十分。

630 :デフォルトの名無しさん:2008/02/15(金) 08:50:21
おまえら朝っぱらから元気だな。
で、俺も>>623以外のデストラクタロギングのメリットを知りたい。

デストラクタロギングはどうも間接的すぎて気持ち悪い。
つーか、そのうちオブジェクト解放のタイミングが変わったら
とたんに使えなくなるような。
トリッキーではないが正道でもない方法に見える。

631 :デフォルトの名無しさん:2008/02/15(金) 13:28:19
スクリプト厨の次はデストラクタ厨かよ
勘弁してくれ

632 :デフォルトの名無しさん:2008/02/15(金) 15:51:00
急激に誰もいなくなった。
決算期前の需要で皆忙しいのかな。

633 :デフォルトの名無しさん:2008/02/15(金) 16:56:03
>>627
マクロが使えるなんていい環境ですね。

634 :デフォルトの名無しさん:2008/02/15(金) 17:36:29
とりあえず、仕様の表明の不十分なコード片を書くのはやめてもらいたい。
読まされるほうはたまったものではない。

635 :デフォルトの名無しさん:2008/02/15(金) 17:49:12
>>634
読まなければ、いいじゃねーかw

636 :デフォルトの名無しさん:2008/02/15(金) 17:59:15
たしかにw

637 :デフォルトの名無しさん:2008/02/15(金) 18:02:53
>>529
このコーディングがC言語が生まれて10年後くらいに発見されたとかwikiに書いてあるけど、
C言語作るときにこの書き方を想定して作ったからC言語ではswitchをbreakで抜ける仕様になってるって分かる人いるかな。


638 :デフォルトの名無しさん:2008/02/15(金) 18:05:50
>>637
全く意味がわからないな。
switch を break で抜けられる全部の言語で >>529 が書けるなら信じてあげるよ。

639 :デフォルトの名無しさん:2008/02/15(金) 18:16:29
>>638

>>637の言う
> switchをbreakで抜ける仕様
って、fall throughのことで、
ttp://www.catb.org/jargon//html/F/fall-through.html

breakが無いと、次のcaseが現れても抜けない仕様、という
ほうが正確かな。

複数のcaseをうまく利用することができる、という特性を生かす趣旨が
ある仕様ということはわかるけど、ループと組み合わせるという技は
発見された、としてもいいんじゃないかと思うけど。

640 :デフォルトの名無しさん:2008/02/15(金) 19:00:57
>>633
君のところじゃboostも使えないのかい?そりゃ可哀想に。

641 :デフォルトの名無しさん:2008/02/15(金) 19:46:19
むしろ開発者の一存で、boostが使えることが少ない

642 :デフォルトの名無しさん:2008/02/15(金) 19:49:36
デストラクタでログ取ると、ローカル変数のトレースを取れないんだよね。

643 :デフォルトの名無しさん:2008/02/15(金) 20:23:45
>>642
トレースしたいローカル変数より後にロギング用の変数を宣言するのはダメ?
リリース版でログを取るのでなければ、boost::formatとか使わなくても
printfベースの実装で十分だと思うし。

644 :デフォルトの名無しさん:2008/02/15(金) 20:41:48
>>643
トレースの対象がオブジェクト(またはその属性)の場合は?

645 :デフォルトの名無しさん:2008/02/15(金) 20:45:03
昔、
goto aho:
...
{
int baka;
...
aho:
...(bakaを使う)
}

ってやったら、bakaを確保せずにいきなりahoに飛ぶコードを吐かれた(MS-Cかな?)。
それ以来gotoは完全封印


646 :638:2008/02/15(金) 21:24:01
>>639
fall through だけじゃダメだと思う。
「case は switch 直下に無くても文法的に正しい」 って仕様が含まれている必要がある。

C は case 〜 をそれ以外の単なるラベルと同列に扱うという仕様になっているから、
>>529 のように switch 直下ではなく while の中に case を書いても正しく動く」
ということが後になって発見(正確には”確認”)されたんじゃないかと。


ところで、ふと java の仕様見たら
http://www.y-adagio.com/public/standards/tr_javalang/14.doc.htm#35518
思いっきり >>529 が書いてあるし。

647 :デフォルトの名無しさん:2008/02/15(金) 21:35:04
>>640
え、C++だったの?
627でfinallyって言っているからC++はないと思っていたんだけど。

648 :デフォルトの名無しさん:2008/02/15(金) 21:52:40
>>644
テンプレートで超がんがる。
DebugLogger d("%d %d\n", &var, std::make_pair(obj, &A::func));

649 :デフォルトの名無しさん:2008/02/16(土) 10:08:37
>>645
そんな入れ子の外から飛び込むのは、どんな言語の場合でも
自殺行為に近いだろ。 入れ子の外で定義が終わってれば
別だがね。

650 :デフォルトの名無しさん:2008/02/16(土) 12:03:37
Doで始まるループなんだけど最初の1回だけ途中までは飛ばしたいときってあるよね。
多分そういうときに使ってるんだと思うけど、
普通はなんとかする。


651 :デフォルトの名無しさん:2008/02/16(土) 12:29:19
goto使いたがる厨房は局所的な制御ばかり見て全体的な構造の見直しをしない、と、燃料注入w

652 :デフォルトの名無しさん:2008/02/16(土) 12:31:14
C言語の仕様としては>>645みたいなのはどうなってるのか、詳しい人教えてよ

653 :デフォルトの名無しさん:2008/02/16(土) 12:35:43
少なくとも変数の場所は確保されてるべき。
(最適化でレジスタに割り当てられると見た目じゃわかんないけど)

goto foo;
{
 int bar = 44;
foo:
 printf("%d\n", bar);
}

で 44 が表示されるべきだったかどうだったか調べてみる...

654 :デフォルトの名無しさん:2008/02/16(土) 12:49:41
647はfinallyの処理系依存実装を見たことないのかと

655 :デフォルトの名無しさん:2008/02/16(土) 13:40:44
>>652
同じ関数内のループに飛び込んでるだけだろ

656 :デフォルトの名無しさん:2008/02/16(土) 15:39:42
>>652
普通の実装ならブロックローカルな変数も関数呼び出した時点で
スタックに領域確保するんじゃねーの?

657 :デフォルトの名無しさん:2008/02/16(土) 15:51:47
>>651
gotoは「局所的な制御」にしか使わないから。
そして「構造」は「常に全体が対象」だ。

燃料としては不足だ。

658 :デフォルトの名無しさん:2008/02/16(土) 16:03:24
>>657
> gotoは「局所的な制御」にしか使わないから。
> そして「構造」は「常に全体が対象」だ。

もちろん>>651はそれが前提で書いていると思うが?
全体を見ずに局所だけを見ているからgotoを使いたがる
というのが>>651の趣旨だと思うが。

659 :657:2008/02/16(土) 17:02:23
>>658 んじゃ。
全体を見て局所も見ていればgotoを使いたがらない。
という命題は正しいのかい?

660 :デフォルトの名無しさん:2008/02/16(土) 17:15:16
>>659
それは言語の設計思想によるんじゃないかな。
goto前提な言語なら自然とgoto使うことになるし、
goto原則使わないのが前提な言語を使っていて、
かつ、全体の構造を考える習慣がついていれば、
gotoが必要っぽい状況になったら自然と全体の
構造を疑う方向に目が向くと思うよ。


661 :デフォルトの名無しさん:2008/02/16(土) 17:57:34
gotoを使いたくないだけの理由で構造を変えるのは、本末転倒にならないように気をつけないとな。

662 :デフォルトの名無しさん:2008/02/16(土) 18:21:23
gotoが必要になるのは全体の構造がおかしい兆候なのではと疑うのと、
gotoを使わないだけの理由で全体の構造を変えることとでは
天と地ほどの差があるけどな。

663 :デフォルトの名無しさん:2008/02/16(土) 19:07:13
紙一重だろw
構造を見直したい程gotoが気になるなら、まず
設計に対する姿勢から疑わないと。


664 :デフォルトの名無しさん:2008/02/16(土) 19:09:49
かわいそうな>>663には見直すことと疑うことの違いがわからないらしい。

665 :デフォルトの名無しさん:2008/02/16(土) 19:13:47
初心者向けの指標としては有りだろう。

666 :デフォルトの名無しさん:2008/02/16(土) 19:14:42
>>664 無駄だって、相手はgotoを使いたいという結論が先にある人なんだから。

667 :デフォルトの名無しさん:2008/02/16(土) 19:16:31
>>664は見直したら必ず変更しなくちゃ行けないと思ってるらしい。

668 :デフォルトの名無しさん:2008/02/16(土) 19:17:27
わかりやすい自作自演をみた。

669 :デフォルトの名無しさん:2008/02/16(土) 19:32:20
>>665
> 初心者向けの指標としては有りだろう。

gotoを使いたがるのは初心者が多いという意味で賛成だ。

670 :デフォルトの名無しさん:2008/02/16(土) 19:34:40
>>667
そんな君の発言「紙一重」wwwwwwwwwwwww

671 :デフォルトの名無しさん:2008/02/16(土) 19:39:57
疑うことと構造を変えることを紙一重と言っちゃってるからねえ
かなり苦しいんじゃないの?

672 :デフォルトの名無しさん:2008/02/16(土) 19:46:22
燃料に引火しちゃったようで、ナイーブなgoto厨さんwwwwwwwwwwwwwww

673 :665:2008/02/16(土) 19:56:31
>>669
そういう意味での賛成は遠慮させていただく。

「どうしてもgotoが必要な場面になったら、構造を見直してみよう」
のようなアドバイスは、初心者向けにはいいかもしれない。
終端条件やデータ構造を見直したら、もっといい方法がみつかるかもしれない。
けれど、そのgotoが適切だと思うなら、見直す必要もない。
gotoはあくまでもきっかけとして、である。

クロージャとかlambdaが欲しいな、と思いながらgotoを書く事もある。
goto(と飛び先のラベル)の場所が適切なら、問題ない。


674 :665:2008/02/16(土) 19:57:15
自演醜ス・・・

675 :デフォルトの名無しさん:2008/02/16(土) 19:58:19
なんでgotoについて語るのに構造のことまで持ち出すんだかが
全然わかんない。論争根源の論文の
http://www.cs.utexas.edu/users/EWD/ewd02xx/EWD215.PDF
と同様なネガティヴキャンペーンにしか見えないぞ。

676 :デフォルトの名無しさん:2008/02/16(土) 20:00:06
問題ないと言ってgoto乱発する馬鹿は
他人のgotoまみれコードを保守した経験がない
ビギナーさん

677 :デフォルトの名無しさん:2008/02/16(土) 20:06:45
>>676 ぐちならマ板行でな。

678 :デフォルトの名無しさん:2008/02/16(土) 20:12:36
自演認定したがる奴が自演常習者

679 :デフォルトの名無しさん:2008/02/16(土) 20:15:42
↓次はsageで同意、と。

680 :デフォルトの名無しさん:2008/02/16(土) 20:15:59
まさか「gotoを使う人間は使いたいから使う」などと思っている人はいないよね?
gotoつかう人は「goto使ったほうが良い」と判断しているから使うんだけど。
gotoを使わずに簡潔に書けるならば、好き好んで使ったりはしないよ。

681 :デフォルトの名無しさん:2008/02/16(土) 20:16:45
ちぃ、はずしたか。

682 :デフォルトの名無しさん:2008/02/16(土) 20:20:09
>>680
> gotoつかう人は「goto使ったほうが良い」と判断しているから使うんだけど。

その判断が狭すぎるという話じゃなかったのか?

683 :デフォルトの名無しさん:2008/02/16(土) 20:35:45
goto厨は視野狭窄ということがプログラミングだけでなく議論においてもそうだということが証明されましたな

684 :デフォルトの名無しさん:2008/02/16(土) 20:43:02
存在しない相手に対して勝利宣言か・・・

685 :680:2008/02/16(土) 20:48:32
>>680
ああそうさ。必要も無いのにgoto使うというのはたしかに判断が狭いということだ。
これは開発担当のスキルの不足を反映しているのに過ぎない。
この問題の根源は開発担当に対するスキル管理の不足/欠如だよ。
悪いのはgotoやgotoを使ったプログラムやgoto使った人間では無いことを確認したいわけよ。

だけどgotoの使用判断は開発担当の職掌さ。
どのようなロジックにおいてもgotoを使わないほうが優れているという証明が出来ない限り、
goto禁止ルール自体は不当なルールだと言いたいね。

686 :680:2008/02/16(土) 20:49:45
>>682
だた。失礼

687 :デフォルトの名無しさん:2008/02/16(土) 20:51:54
プログラミング言語を作るときには、
徹底的にgotoを使わなくて済むようにしてほしいね。
多重breakをできるようにしたり、try-catch-finallyにデストラクタを用意したり。

688 :デフォルトの名無しさん:2008/02/16(土) 20:53:44
それはJavaだ

689 :デフォルトの名無しさん:2008/02/16(土) 20:54:14
美しいgoto文だって書けるのに。
汚いgoto文を見ただけで、「goto禁止」は、まりにも短絡的すぎ。
for〜continue〜break文にせよ、do〜while文にせよ、if文にせよ、try〜catchにせよ、
ネストしまくりでワケワカラン汚いコードを書くヤツは、そこらへんにウヨウヨいる。
いったいどうやったら、構造化言語をここまで汚く書けるのか、もう信じられんほど。
なのになぜ、goto「だけ」がこれほどまでに差別されなければならないのか。
・・・ま、そこらへを書くと、またキチガイが湧くんでホドホドにしとくが。
美しく書けばgotoは害では無い。これは確か。

690 :デフォルトの名無しさん:2008/02/16(土) 20:56:25
>>685
とりあえず、モチツケ。
無条件goto禁止、については合理的な理由の説明は無かったはずだ。

691 :デフォルトの名無しさん:2008/02/16(土) 20:56:46
それはわかるけど、現実は汚いgotoを書く奴が9割9分。
goto禁止したところで、そのうち9割くらいはフラグ付きwhileとか結局スパゲティを書く気がするけど。

692 :デフォルトの名無しさん:2008/02/16(土) 21:02:41
>>689
gotoには「最後の手段」の側面もあるからね。
gotoとラベルの置き場所の自由さっぷりは両刃の剣なわけで。


693 :デフォルトの名無しさん:2008/02/16(土) 21:04:39
で、自由奔放にgotoを使いまくってるコードを最後にみたのは何時なんだ?
なんかもう脳内事例で語ってるようにしか見えないんだが。

694 :デフォルトの名無しさん:2008/02/16(土) 21:06:34
例えば、Linux kernel ではエラー処理に飛ぶためのgotoをいっぱい使ってるけど
全然読みづらくない。こういうgotoは全く問題にならないし、
Cで綺麗にエラー処理を書こうとしたらああならざるを得ないと思うけどな。

>>691
人格攻撃は生産的じゃない。もっと実になる議論をしようや。

695 :デフォルトの名無しさん:2008/02/16(土) 21:08:16
g○ヒo きたないgoto

696 :デフォルトの名無しさん:2008/02/16(土) 21:14:12
肯定派
多重ループからの抜け出し、エラー処理、リソースの開放で定型的に使うならありだろ。
gotoを避けるというのを関数分割のタイミングにするのは馬鹿らしいし。
大体goto使ったが為のスパゲッティコードなんて大昔の非構造化BASIC以来見たことないぞ。

否定派
goto駄目。絶対。goto使う奴はコードが汚く低能!

697 :デフォルトの名無しさん:2008/02/16(土) 21:24:22
>>696を読んでいるとgoto厨の視野の狭さがよくわかるという罠www

698 :デフォルトの名無しさん:2008/02/16(土) 21:26:41
Linux kernelのソースクオリティを高いなんていう香具師の言うことは、
その程度の扱いを受けて当然だな。

699 :デフォルトの名無しさん:2008/02/16(土) 21:28:11
構造を見直してもっといい設計にすれば使わずにすむgotoがあるという話と
gotoを自由奔放に使いまくるという話の間にはずいぶんと開きがあることに
>>693が気付く時は来るのだろうか。。。(遠い目

700 :デフォルトの名無しさん:2008/02/16(土) 21:34:55
そもそもgoto絶対禁止なんて主張してる香具師、このスレにはいないと思うが(藁

701 :デフォルトの名無しさん:2008/02/16(土) 21:35:50
%sのソースクオリティを高いなんていう香具師の言うことは、
その程度の扱いを受けて当然だな。

702 :デフォルトの名無しさん:2008/02/16(土) 21:37:07
絶対禁止はないよな。
ただ現存する用法すべてに盲目的にケチつける奴がいるだけでw

703 :デフォルトの名無しさん:2008/02/16(土) 21:39:47
>>702 そんな香具師いるか?
つーか、そもそも現存する用法すべてのリスト、このスレに挙がってるのか?

704 :デフォルトの名無しさん:2008/02/16(土) 21:46:24
setjump, longjump だって綺麗に書きさえすればいい。

705 :デフォルトの名無しさん:2008/02/16(土) 21:48:28
poor man's continuationか。
まあ使えばいいんじゃない?

706 :デフォルトの名無しさん:2008/02/16(土) 21:50:22
goto厨は、なんかもう脳内事例で語ってるようにしか見えないんだが。

707 :デフォルトの名無しさん:2008/02/16(土) 21:53:43
>>698
まぁまともな会社で、まともな品質のプログラムがかけるプログラマでも
Linuxのソースクオリティで書けるプログラマなんて少ないけどな。

708 :デフォルトの名無しさん:2008/02/16(土) 21:54:10
>>704
ナイ、ナイ

709 :デフォルトの名無しさん:2008/02/16(土) 21:56:40
時代は変わったな。
Linuxカーネルの可読性の低さはBSDハッカーの格好の標的だったのに。
今じゃLinuxカーネルが高品質と言われるようになったか。。。(遠い目

710 :デフォルトの名無しさん:2008/02/16(土) 21:59:19
具体例には例外なく難癖つけるくせに
そう指摘されるといや、そんなことないよとごまかす嫌goto厨。
もう年相応の趣味を持てずただリアルでの孤独を癒す為に宗教論争スレに常駐してるだけみたいだね。

711 :デフォルトの名無しさん:2008/02/16(土) 22:00:11
>>708
Cのマクロで例外処理を実装するような使い方はきれいなsetjmpの使い方だと思う。

712 :デフォルトの名無しさん:2008/02/16(土) 22:00:19
>>710 goto厨は、なんかもう脳内事例で語ってるようにしか見えないんだが。

713 :デフォルトの名無しさん:2008/02/16(土) 22:01:45
>>705
なるほど、poor man's continuationね。確かにそうかも。

714 :デフォルトの名無しさん:2008/02/16(土) 22:05:48
まぁ継続なんて、使わんよ。

715 :デフォルトの名無しさん:2008/02/16(土) 22:07:12
>>711
Cで例外つっても、単にジャンプすればいいだけじゃなくて、それ以外にも
C++でいうデストラクタの処理とか色々必要になるわけで。setjmpはつかわないわ。

716 :デフォルトの名無しさん:2008/02/16(土) 22:07:50
Linuxカーネルでのgotoの使い方の話なのに、Linuxカーネルのコードの
クオリティの高さに話を逸らしてるお馬鹿さんがいますね


717 :デフォルトの名無しさん:2008/02/16(土) 22:26:19
Linuxカーネルの可読性の低さの話なのに
無関係だということにしたい人がいますね

718 :デフォルトの名無しさん:2008/02/16(土) 22:27:27
>>715
どうせマクロなんだからfinally実装しちゃえばいいじゃない。
NSAutoreleasePoolみたいに「暇なとき始末してね」と予約しておいて、
早めに開放したい資源(ファイルディスクリプタとか)を利用した後や、
イベントループのように定期的に戻ってくる場所で開放する手もある。

719 :デフォルトの名無しさん:2008/02/16(土) 22:33:20
>>718
そんな難しいことできるわけないだろ
お前実装してみろよ

720 :デフォルトの名無しさん:2008/02/16(土) 22:33:49
だいたいgotoダメって行ってるやつは、
3年目くらいで、やっとできるとまわりから認められ、
ちょっと自信が付いてきたやつ。
後輩に教える機会も増えて、得意になって、よく分からんくせに
中途半端な知識でものを語ってるんだろ。
gotoの話なんて、もう十何年も繰り返されてるのに。

721 :デフォルトの名無しさん:2008/02/16(土) 22:35:04
もう十何年も繰り返されていてもまだgotoにしがみついてる厨房がいるねえ

722 :デフォルトの名無しさん:2008/02/16(土) 22:37:11
3年目の先輩に頭ごなしに教えられて反発してるビギナー君の登場です

723 :デフォルトの名無しさん:2008/02/16(土) 22:40:58
これまでの傾向

-嫌goto厨の主張はいつも抽象論の域をでない
-抽象論でgotoを否定するだけで、「おえらいさんが言ってただろ?だから従え」
 という傲慢な主張しかない
-goto肯定派の具体的な例に関しては、「構造的に考えれば、とか、構造を再度
 検討しなおせば」とか、これまた抽象論でしか返さない。

要するに、嫌goto厨の主張なぞその辺の学者のタワゴトにしかすぎず、
なんら実務面の利点を示しているわけではない。

724 :デフォルトの名無しさん:2008/02/16(土) 22:41:48
スパゲッティコードは絶滅したと思っている人必見。>>469
こんなコードを書く香具師がgotoを使ったらどんな恐しいことになることか。

725 :デフォルトの名無しさん:2008/02/16(土) 22:43:00
>>723
goto厨の提示したソース、どうにも実務的なのはないのだが。
あるというのならアンカーで示してくれ。

726 :デフォルトの名無しさん:2008/02/16(土) 22:46:13
これまでの傾向

-goto厨の主張はいつも抽象論の域をでない
-抽象論でgotoを肯定するだけで、「おえらいさんが言ってただろ?だから従え」
 という傲慢な主張しかない
-goto否定派の具体的な例に関しては、「実用的ではない、とか、
gotoでも害がなければ」とか、これまた抽象論でしか返さない。

要するに、goto厨の主張なぞその辺のワナビーのタワゴトにしかすぎず、
なんら実務面の利点を示しているわけではない。

727 :デフォルトの名無しさん:2008/02/16(土) 22:48:49
>>723にも>>726にも禿同
ようするに目糞鼻糞

728 :デフォルトの名無しさん:2008/02/16(土) 22:50:36
GOTO 1

729 :デフォルトの名無しさん:2008/02/16(土) 22:59:31
goto厨ってなんだよ。
goto使ったらダメとにかくダメって言ういかれぽんちに、
んなわけねーだろって言ってるだけだろ。

730 :デフォルトの名無しさん:2008/02/16(土) 23:02:24
>>729
せいかい^^

731 :デフォルトの名無しさん:2008/02/16(土) 23:31:19
ごとーさんがお怒りですよ

732 :デフォルトの名無しさん:2008/02/16(土) 23:35:00
>>731
だれ?

733 :GOTO:2008/02/16(土) 23:56:15


734 :デフォルトの名無しさん:2008/02/17(日) 00:18:43
見やすかったらどっちでもいいよ

735 :デフォルトの名無しさん:2008/02/17(日) 03:32:45
>>719 でけた。TRY〜END_TRYの中からreturn出来ないけど。
typedef struct ex_handler_rec_ ex_handler_rec_;
struct ex_handler_rec_ {
    ex_handler_rec_ *volatile prev_;
    jmp_buf jbuf_;
    const char *volatile ex_type_;
    void *volatile ex_data_;
};
ex_handler_rec_ *volatile current_handler_ = NULL;

#define EX_ABBREV(x) x
#define TRY { \
ex_handler_rec_ EX_ABBREV(ex_handler_); \
int EX_ABBREV(need_rethrow_) = 0; \
if (0) BREAK_TRY; /* mandate finally clause */ \
EX_ABBREV(ex_handler_).prev_ = current_handler_; \
current_handler_ = &EX_ABBREV(ex_handler_); \
if (setjmp(EX_ABBREV(ex_handler_).jbuf_) == 0) {

#define BREAK_TRY goto EX_ABBREV(break_entry_)
#define RETHROW goto EX_ABBREV(rethrow_entry_)

#define CATCH(extype) \
} else if (!extype || !strcmp(extype, EX_ABBREV(ex_handler_).ex_type_)) { \
   void *EX_ABBREV(ex_data) = EX_ABBREV(ex_handler_).ex_data_;
#define CATCH_ALL \
} else if (1) { \
   void *EX_ABBREV(ex_data) = EX_ABBREV(ex_handler_).ex_data_;

736 :デフォルトの名無しさん:2008/02/17(日) 03:33:37
#define FINALLY \
} else { \
   if (0) goto EX_ABBREV(rethrow_entry_); /* supress warning */ \
EX_ABBREV(rethrow_entry_): \
   EX_ABBREV(need_rethrow_) = 1; \
} \
EX_ABBREV(break_entry_):; \
if (current_handler_ == &EX_ABBREV(ex_handler_)) /* no exception */ \
   current_handler_ = EX_ABBREV(ex_handler_).prev_; \
{

#define END_TRY } \
if (EX_ABBREV(need_rethrow_)) \
   throw_exception(EX_ABBREV(ex_handler_).ex_type_, EX_ABBREV(ex_handler_).ex_data_); \
    }

void throw_exception(const char *ex_type, void *ex_data) {
    ex_handler_rec_ *handler = current_handler_;
    current_handler_ = handler->prev_;
    handler->ex_type_ = ex_type;
    handler->ex_data_ = ex_data;
    printf("throw_exception %s\n", ex_type);
    longjmp(handler->jbuf_, 1);
}

737 :デフォルトの名無しさん:2008/02/17(日) 03:40:13
こういう風に使う。EX_ABBREVマクロを再定義することでTRYのネストができる。
TRY {
#undef EX_ABBREV
#define EX_ABBREV(x) a_##x
    TRY {
        if (cond)
            BREAK_TRY;
        throw_exception("hoge", cond2 ? "abc" : NULL);
    } CATCH("fuga") {
        if (a_ex_data) /* throw_exceptionの第二引数はEX_ABBREV(ex_data)に入る */
            printf("%s fuga\n", (char *)a_ex_data);
        else
            RETHROW;
    } FINALLY {
        printf("inner finally\n");
    } END_TRY;
#undef EX_ABBREV
#define EX_ABBREV(x) x
} CATCH("fuga") {
    printf("fuga %s\n", ex_data);
} FINALLY {
    printf("outer finally\n");
} END_TRY;

738 :デフォルトの名無しさん:2008/02/17(日) 03:46:42
きめぇぇぇぇ

739 :デフォルトの名無しさん:2008/02/17(日) 04:21:39
具体例なんて、普及しているオープンソースのコードを引っ張ってきて
grep goto すりゃ見つかるだろ。


740 :デフォルトの名無しさん:2008/02/17(日) 04:25:13
return 時に実行してくれない finallyに何の意味がある?
あと、for,whileなどのループ内では、このマクロは使えないね。
(BREAK_TRY のあと、ループ脱出条件を再度判定してbreak文を実行しなきゃならない:二度手間)

741 :デフォルトの名無しさん:2008/02/17(日) 04:47:21
>>725
2chは行数制限があるから実用されているコードを貼るのは無理だね。
アンカーではなくポインタは示すので、あとは自分で調べて。
# apache が実務的なコードでないという奴はいないよな?

$ grep -r -n goto httpd-2.2.8/server
httpd-2.2.8/server/vhost.c:717: goto bad;
httpd-2.2.8/server/vhost.c:747: goto bad;
httpd-2.2.8/server/vhost.c:754: goto bad;
httpd-2.2.8/server/vhost.c:904: goto found;
httpd-2.2.8/server/vhost.c:916: goto found;
httpd-2.2.8/server/mpm/netware/mpm_netware.c:421: goto got_listener;
httpd-2.2.8/server/mpm/winnt/child.c:954: goto shutdown;
httpd-2.2.8/server/mpm/winnt/mpm_winnt.c:871: goto die_now;
httpd-2.2.8/server/mpm/experimental/event/event.c:1140: goto worker_pop;
httpd-2.2.8/server/mpm/worker/worker.c:882: goto worker_pop;
httpd-2.2.8/server/mpm/prefork/prefork.c:614: goto got_fd;
httpd-2.2.8/server/mpm/beos/beos.c:560: goto got_a_black_spot;
httpd-2.2.8/server/mpm/beos/beos.c:562: goto got_fd;
httpd-2.2.8/server/util_xml.c:58: goto read_error;
httpd-2.2.8/server/util_xml.c:79: goto read_error;
httpd-2.2.8/server/util_xml.c:88: goto read_error;
httpd-2.2.8/server/util_xml.c:93: goto parser_error;


742 :デフォルトの名無しさん:2008/02/17(日) 06:54:58
>>741
おいおい、今さら提示しても遅いって。>>723
> -goto肯定派の具体的な例に関しては、「構造的に考えれば、とか、構造を再度
とか
> なんら実務面の利点を示しているわけではない。
とか書いた時点で、じゃあgotoの実用的かつ正しい使い方というのは
どんな具体例があったんだよって話なんだから。

743 :デフォルトの名無しさん:2008/02/17(日) 06:55:01
goto肯定派曰く「何も考えずにgotoを使う奴などいない」
goto否定派曰く「全てのgotoが駄目だという奴などいない」

であれば、肯定派否定派など互いにレッテルを貼っているだけで不毛な言い合いだな。
「どういう場合にgotoを使うのか、使わないのか」という具体的な議論にこそ意味があると思うが。


744 :デフォルトの名無しさん:2008/02/17(日) 06:59:38
>>742
linuxカーネルの話は723よりも前に出ている。

ま、くだらない貶しあいには興味がないので具体例で。
vhost.cの最初の3つはこういう構造。

static void fix_hostname(request_rec *r) {
 ...
 if (rv != APR_SUCCESS || scope_id) { goto bad; }
 ...
 if (r->hostname[0] != '[') {
  for (dst = host; *dst; dst++) {
   if (apr_islower(*dst)) { ... }
   else if (*dst == '.') { ...; goto bad; }
   else ...
  }
 }
 ...
 return;
bad:
 ...
 return;
}


745 :デフォルトの名無しさん:2008/02/17(日) 07:03:07
自分は>>744のgotoの使い方は特に問題がないと思う。見やすい。

gotoを使わずにより良いコードを書ける人は代案をよろしく。
「744のように端折られると詳細がわからないから書けない」という言い訳はなしな。

「本物」のコードへのポインタは>>741にある。必要なら本物を見てくれ。


746 :デフォルトの名無しさん:2008/02/17(日) 07:05:30
それから、一つだけ。

抽象的な言い合いの間は散々吠えておいて、
こういう流れにされると何もいえなくなる人へ。

「お前はgotoを使うな」

747 :デフォルトの名無しさん:2008/02/17(日) 07:22:04
vhost.cの下2つ(L904, L916)はこの関数。

static void check_hostalias(request_rec *r) {
 処理
 for (ループ条件) {
  処理 // この部分に、条件を満たしたらcontinueというコードがある
  if (判定条件) goto found;
  処理 // この部分に、条件を満たしたらcontinueというコードがある
  if (判定条件) goto found;
 }
 return;
found:
 r->server = s; // この一文のみ
}

これはごく単純なgotoの例。多重ループでも何でもないが、使わない人フラグを立ててbreak?
r->server=s; return;を二箇所に書くという書き方も、二箇所程度ならありかもね。

748 :デフォルトの名無しさん:2008/02/17(日) 07:24:39
>>744
bad:
...
return;
な部分をマクロにしちゃえばgotoなんて使う必要ないんじゃ?

749 :デフォルトの名無しさん:2008/02/17(日) 07:27:08
mpm_netware.cでの使われ方

for (ループ条件) {
処理
do {
処理
if (条件) goto got_listener;
処理
} while (ループ条件);
continue;
got_listener:
処理
}


750 :デフォルトの名無しさん:2008/02/17(日) 07:32:07
>>749
goto got_listenerが一箇所なら
if (条件) {処理; break;}で済む問題だな。
複数箇所なら処理をstatic関数にすればいい。
そもそも「処理」ってくくれるぐらいまとまってるんだろ?

751 :デフォルトの名無しさん:2008/02/17(日) 07:33:27
ちなみにこうやって具体的なコード片で議論しても
全体の構造うんぬんの話の検証にはならない。
というか、むしろ局所的な制御しか考えてないと
goto慎重派に言われても仕方ないことになるが。

752 :デフォルトの名無しさん:2008/02/17(日) 07:37:26
このパターンは条件がどんどん後付けされるのでは?
過去何度かあったろ。いいかげん気付け。

753 :デフォルトの名無しさん:2008/02/17(日) 07:41:45
今度のパターンは条件を後付けする必要ありません。
次から次へのgrep gotoした結果がタレ流されるパターンです。
1つの例にレスがついたらその議論を先にするのが礼儀というものだが
このスレのgoto厨は無視してひたすらgrepを続けます。
それがgotoクオリティ。

754 :デフォルトの名無しさん:2008/02/17(日) 07:41:58
>>750
>そもそも「処理」ってくくれるぐらいまとまってるんだろ?

いや。got_listenerの後の処理は長い。
do whileで条件を満たせなかった場合はcontinueするという意図のコード。

>>751
そうか。

>>752
ならばコードを読め。>>741参照。

755 :デフォルトの名無しさん:2008/02/17(日) 07:49:46
>>748
マクロは意図するところが十分に明確で、かつ処理が短い場合は良いアイデア。
今回の実際のコードではreturnを入れて3文なので悪くはないかも。
(r->statusに代入、ログ吐き、return)

ただしマクロの濫用もコードの可読性を落とすので避けるべき。
vhost.cはマクロについては単純なものしか使っていないので、ポリシーの違いだろうね。

756 :デフォルトの名無しさん:2008/02/17(日) 07:52:51
正解は753でしたw

757 :デフォルトの名無しさん:2008/02/17(日) 07:54:54
バカが浮き彫り

758 :デフォルトの名無しさん:2008/02/17(日) 07:55:28
>>754
いや、俺が言ってる「まとまってる」のは長さじゃなくて、
使う変数の依存関係が閉じた傾向にあるという意味。


759 :デフォルトの名無しさん:2008/02/17(日) 07:58:17
goto肯定派は実用的なコードから
「ここはこうgotoを使えばもっと綺麗になるのに」
という例を出すつもりはないのかね。

いつでもgoto慎重派にコードを書かせるのは
フェアじゃないと思うのだが?

760 :デフォルトの名無しさん:2008/02/17(日) 08:04:27
今、>>759 が良い事を言った!
さあ「gotoを恐れずに使う兵共」の腕の見せ所だ!

761 :デフォルトの名無しさん:2008/02/17(日) 08:23:27
>>758
そうか。閉じた傾向とか何ともいえないのでソースを読んで。

>>759
それこそ全然フェアじゃない。
・「Cで書かれた実用的なプログラムでgotoを一切使っていないもの」が一つも出されていない。
・「ここはこう」の「ここ」を見つけるために、相手にそのプログラム全体を全て読めと?

相手にコードを書かせようと思うなら、題材くらい自分で出せ。


762 :デフォルトの名無しさん:2008/02/17(日) 08:26:54
ていうか、プログラマとして非常にガッカリなのは、

情報として>>741が出されて、それを題材にしているにも関わらず、
実際にhttpdのソースをダウンロードして自分でソースを追ってみた人が、
ここで議論している人の中に誰もいなそうってところだな。

コードリーディングしない人には、コードを語る資格も能力もないよ。

763 :デフォルトの名無しさん:2008/02/17(日) 08:40:57
具体論になると机上の空論と違って盛り上がらないねえ

764 :デフォルトの名無しさん:2008/02/17(日) 08:43:08
>>762>>748>>750は無視ということか。

grep するだけなら楽でいいもんな。プ

765 :デフォルトの名無しさん:2008/02/17(日) 08:46:32
>>764
750は明らかに749しか読んでいないと思われ。

実際のコードに当たったらこんな発言が疑問形で出るわけがない。

>そもそも「処理」ってくくれるぐらいまとまってるんだろ?

そこに気付かない>>764自身も、他人を煽るだけで自分はコードを読んでいない。


766 :デフォルトの名無しさん:2008/02/17(日) 08:47:34
強調するが、ここが重要ね。

  そこに気付かない>>764自身も、他人を煽るだけで自分はコードを読んでいない。


767 :デフォルトの名無しさん:2008/02/17(日) 08:48:47
そういう>>765は手あたり次第grepしただけ。
そうじゃないと言うのなら、
「ここはこうgotoを使えばもっと綺麗になるのに」
という例があるはずだから、それを提示しろ。

できないなら、コード読まない厨認定な。

768 :デフォルトの名無しさん:2008/02/17(日) 08:49:28
煽ったり議論したりする暇はあるんだから、ついでにちょっとコードも読めばいいのにね。

と思うよ俺は。


769 :デフォルトの名無しさん:2008/02/17(日) 08:50:04
>>763
一方的に「コード読め」「改善策を出せ」と言うばかりの香具師がいるからな

770 :デフォルトの名無しさん:2008/02/17(日) 08:50:15
悪魔の証明を知らない人w

771 :デフォルトの名無しさん:2008/02/17(日) 08:50:37
>>768 オマエガナー wwwwwwwwwwwwwwwwwwwwwwwwww

772 :デフォルトの名無しさん:2008/02/17(日) 08:52:10
>>770
そうそう。grep厨はコードの断片を見せるだけで
議論は永遠に続くことになるんだよな。アフォらし。

773 :デフォルトの名無しさん:2008/02/17(日) 09:02:40
強調するが、ここが重要ね。

  そこに気付かない>>766自身も、他人を煽るだけで自分はコードを読んでいない。



774 :デフォルトの名無しさん:2008/02/17(日) 09:08:42
こういうスレを読んでいると感じるけど
2chって「馬鹿しか得るものがない」場所だよね。

何の知識もない教えて君が相手を煽りながらタダで一方的に情報を得る。
教える側は何故か相手に罵倒されながら一方的に情報を提供して自分は何一つ得るものがない。

なので普通の人は嫌になってすぐに去り
2chに残るのは自己犠牲精神に満ち溢れた聖人と馬鹿だけ。

775 :デフォルトの名無しさん:2008/02/17(日) 09:24:50
>>774
> 何の知識もない教えて君が相手を煽りながらタダで一方的に情報を得る。

goto厨のことだね。
goto慎重派はちゃんと改善例を提示しているのに
goto厨は文句を言うばかりで何の改善例も提示しない。

776 :デフォルトの名無しさん:2008/02/17(日) 09:33:40
>>774
たかがgrepしただけでそこまで上から目線で言える根性が気に入った。

>>775
goto肯定派もコード出してるよ。>>469とか。目が腐りそうな糞コードだけど。
ちなみに>>469>>485という形でgotoを使わずに可読性が上がったね。

777 :デフォルトの名無しさん:2008/02/17(日) 09:35:56
485=774=grepした人=744以降でコード断片を出した人=普通の人なので去ります

778 :デフォルトの名無しさん:2008/02/17(日) 09:38:20
と言いつつキリ番ゲットした>>777、オメ。

779 :デフォルトの名無しさん:2008/02/17(日) 09:56:30
777が去った今このスレの運命は776の手腕にかかっている

780 :653:2008/02/17(日) 10:11:45
6.8
自動記憶域期間をもつオブジェクトの初期化子、(略)は、
文の場合と同じく実行中に宣言に到達するたびにこれを評価し、
値をそのオブジェクトに格納する。

とあるので、gotoで宣言(と初期化)をまたぎこしていると、
初期化はされないとすべきのようです。

また、C99では「可変修飾型をもつオブジェクトの宣言を飛び越しては
ならない」という制限が加わってますね。なるほど。

781 :デフォルトの名無しさん:2008/02/17(日) 10:37:43
>>776
goto否定派もコード出してるよ。>>267とか。目が腐りそうな糞コードだけど。
ちなみに>>267>>263という形でgotoを使って可読性が上がったね。


782 :デフォルトの名無しさん:2008/02/17(日) 11:07:56
一人で頑張ってる嫌goto厨。
後輩に得意になって言っちゃったの?
gotoは使うなって。

783 :デフォルトの名無しさん:2008/02/17(日) 11:12:38
異議あり!代案なーし!
異議あり!代案なーし!
異議あり!代案なーし!


784 :デフォルトの名無しさん:2008/02/17(日) 11:16:33
>>263>>379で否定されたがね。

  if (A_init() != 0) goto FAILED;
  if (B_init() != 0) 80+0; FAILED:
  if (C_init() != 0) goto FAILED;
  if (D_init() != 0) goto FAlLED;

FAlLED:

しかしまいったね。
・・


785 :デフォルトの名無しさん:2008/02/17(日) 11:17:33
アホなレス乞食ががんばっていますね

786 :デフォルトの名無しさん:2008/02/17(日) 11:18:12
>>783
代案?
すべての法律がダメだけどそれを国会議員200人ぽっちで作れるわけないだろ。
社会保険庁ですら数万人いるのに。


787 :735:2008/02/17(日) 11:18:51
>>735-736はバグってた。
CATCH節の中でthrow_exceptionするとFINALLYが走らない。
こりゃ結構恥ずかしい。インデントも崩れてるし。

788 :デフォルトの名無しさん:2008/02/17(日) 11:19:23
ほお。

あなたに悪意を持つプログラマが goto を 80+0 と書いて
嫌がらせをするかもしれないから goto を使うべきではない

と。

ヴァァァァァァァァァァァ
ァァァァァァァァァァァ
ァァァァァァァァァァァァァァァァァァァァァァ
ァァァァァァァァァァァカ
じゃねーの?wwwwwwwwwwwwwwwwwwwww

789 :デフォルトの名無しさん:2008/02/17(日) 11:20:41
どうでもいいけどダイクストラが言ってから今年で40周年か

見事な釣り師だな

790 :デフォルトの名無しさん:2008/02/17(日) 11:23:18
>>788
森田さんこんなところにいたんですか。

ちなみに80+0と書き換えた森田さんは日常的に2ch語を上司に向かって話す極めつけの2chネラで、
バカジャネーノってAA使いまくりな人。

生まれは九州は福岡のとある会社の社長の息子。


791 :デフォルトの名無しさん:2008/02/17(日) 11:23:28
「gotoを使うな」の釣り糸一本で
40年間、たぶん何百万人という単位のプログラマを釣りあげてる
恐るべしダイクストラ


792 :デフォルトの名無しさん:2008/02/17(日) 11:25:34
>>791
大工さんはWhileをgotoで書くなと言っただけじゃね?

goto使いだってwhile使えるところでgotoとか使わないだろ。


793 :デフォルトの名無しさん:2008/02/17(日) 11:28:53
sage不可能な良スレ

794 :デフォルトの名無しさん:2008/02/17(日) 11:30:33
>>790
『福岡人はgoto禁止』でいいんじゃね?

795 :デフォルトの名無しさん:2008/02/17(日) 11:31:49
違うか。森田さんは80+0って書いただけでgotoは書いてないもんな。
『福岡人と仕事するときはgoto禁止』?
いや『福岡人は面接で落とせ』?

796 :デフォルトの名無しさん:2008/02/17(日) 11:32:40
福岡禁止

797 :デフォルトの名無しさん:2008/02/17(日) 13:05:02
80+0なんてキーワードハイライトがあれば容易に見抜けないか?
あと、0に斜線が入ったフォント使うとか(0とoのような個別の事例にしか使えないけど)。

798 :デフォルトの名無しさん:2008/02/17(日) 13:26:42
>>797
いやそれがね、うちの会社、ウィルスバスターが更新しないように、インストーラーに手を加えた上でウィルス感染させやがるんですよ。
イントラネット管理者の統括してる本人がやるから信用しちゃうでしょ。
福岡に本社のある東京一部上場企業なんだけど。

だからエディタにキーワード追加くらい簡単にやってのけるよ。


799 :デフォルトの名無しさん:2008/02/17(日) 13:39:04
もはや798が質の悪い吊りだと見抜く方が容易

800 :デフォルトの名無しさん:2008/02/17(日) 13:41:59
>>797
つうか字形が違いすぎてしばらく話の流れが全く理解できなかったよ

801 :デフォルトの名無しさん:2008/02/17(日) 14:10:20
じゃあ次、コンパイラで使われていないラベルに対して警告を出すようにする。

802 :デフォルトの名無しさん:2008/02/17(日) 14:58:28
>>798
電子計算機損壊等業務妨害 で告訴しろ。
(告訴状作って会社の法務部に送りつけるだけでも効果あるぞ)

803 :デフォルトの名無しさん:2008/02/17(日) 15:07:57
>>802
人事部に電話したら、「会社の方針でお前を監視してるんだから逆らうな」って言われたから。
人事部長と直接話したいって言ったけど無視された。
会社クビにされるときに人事部長を名乗る人が来たけど、なんと創価学会の池田先生に瓜二つ。

804 :デフォルトの名無しさん:2008/02/17(日) 15:16:56
>>803
こちらへどうぞ
ttp://pc11.2ch.net/test/read.cgi/prog/1197192900/

805 :デフォルトの名無しさん:2008/02/17(日) 15:26:19
>>803
「他人にいたずらされている」という妄想を抱いて、「なら反撃で、いたずら
し返さなければ」とイタズラして、会社側から疑いをかけられて監視されて、
あげくのはてにイタズラしていたことがバレてクビになった。

としか、文章からは読み取れない。

806 :デフォルトの名無しさん:2008/02/17(日) 15:58:23
むしろメンヘル逝きをお勧めしたい。

807 :デフォルトの名無しさん:2008/02/17(日) 16:30:11
結局大工は釣りだとかいう観念論しかできないんだねw

808 :デフォルトの名無しさん:2008/02/17(日) 17:20:45
いくら上げても技術要素0%のレスで火は起こせないか

809 :645:2008/02/17(日) 20:42:55
気になったので、gccでやってみた

void bar(int);
int func(int arg)
{
if(arg == 0)
goto foo;

{
int i;
i = arg*2;
foo:
bar(i);
}

}


810 :645:2008/02/17(日) 20:43:39
.file "gototest.cpp"
.text
.align 2
.globl __Z4funci
.def __Z4funci; .scl 2; .type 32; .endef
__Z4funci:
pushl %ebp
movl %esp, %ebp
subl $8, %esp
cmpl $0, 8(%ebp)
jne L2
jmp L3
L2:
movl 8(%ebp), %eax
addl %eax, %eax
movl %eax, -4(%ebp)
L3:
movl -4(%ebp), %eax
movl %eax, (%esp)
call __Z3bari
leave
ret
.def __Z3bari; .scl 2; .type 32; .endef

こうなる。
やはりiは確保されません。

811 :デフォルトの名無しさん:2008/02/17(日) 20:48:02
>>810
goto使うなっての以上に、ブロックで変数定義するなってのもある。


しかし、オブジェクトはその場所で作るしかないんだな。


812 :デフォルトの名無しさん:2008/02/17(日) 21:33:13
だからレジスタに割り当てられてるんじゃないの?

813 :デフォルトの名無しさん:2008/02/17(日) 21:44:22
>>812
たった4つの32ビットレジスタで計算しないといけないのにそんな無駄なことできないでしょ。
少なくとも何かをするとしたらレジスタを使う。
やるとしても小さいループのループカウンタくらいか。


814 :デフォルトの名無しさん:2008/02/17(日) 21:47:27
goto fooすりゃi=arg*2が実行されないのは当然ダロ
何を期待してんのかわからn

815 :デフォルトの名無しさん:2008/02/17(日) 21:58:11
>>813
内側のブロックで宣言できないとしたら、
外側のブロックで宣言するだけ。
実態としては何も変わらない。

816 :645:2008/02/17(日) 22:02:54
>>814
ああ、テキトーに作った例だから、実際の動作は気にしないでくれ。
問題は、ブロックの中で定義した変数の領域が確保されていないのに、関数呼び出しに使われてしまうという事実ね。
多分、foo: の後にi = i+argなんてやってもダメだと思う。

817 :デフォルトの名無しさん:2008/02/17(日) 22:03:51
>>816
ヒント: jne L2 が実行された場合は L2 のどこで「領域が確保」されていますか?


818 :645:2008/02/17(日) 22:04:03
809のiの定義の後でiに代入してるのはコンパイラにiの定義をスルーさせないように、それらしい仕事をさせたかったから。

819 :645:2008/02/17(日) 22:04:41
>>817
ああ、別にされてないね。


820 :デフォルトの名無しさん:2008/02/17(日) 22:26:56
データフロー解析ぐらいは最近のコンパイラなら当たり前だよ?
ガチガチにソースコードに対応するようなコードを吐いて欲しいなら
-O0 を付けるとか...してもそこまでガチガチなコードが出るかどうか。

821 :デフォルトの名無しさん:2008/02/17(日) 22:28:40
>>820
そういう問題じゃない。出ているコードは綺麗にソースに対応している

822 :デフォルトの名無しさん:2008/02/17(日) 22:46:57
スタックフレームが
>subl $8, %esp
で8バイト確保されていて
iが
>-4(%ebp)
なら、関数の先頭で「確保」されてるんじゃね?

823 :デフォルトの名無しさん:2008/02/17(日) 22:48:59
>>822
正解

824 :デフォルトの名無しさん:2008/02/18(月) 02:57:19
>>811
>goto使うなっての以上に、ブロックで変数定義するなってのもある。

いやこれはするだろ。
あれ、みんなしない派?

825 :デフォルトの名無しさん:2008/02/18(月) 03:21:11
俺は、近くで定義したい派。
ブロック内で変数定義することはある。
ただ、外の変数と名前がかぶらないほうがいいかなぁ〜、くらいは気を使う。

826 :デフォルトの名無しさん:2008/02/18(月) 08:18:56
普通は最小スコープ(内側のスコープ)で定義するのが常識

827 :デフォルトの名無しさん:2008/02/18(月) 09:06:07
それ厳密に適用するととんでもないことに

828 :デフォルトの名無しさん:2008/02/18(月) 09:25:19
手続き的にやろうとするから、変数を外のスコープにひっぱり出すとかが
必要になる。関数的に、なんでも再帰あちこちでreturnな書き方をすれば
それでうまくいく。

829 :デフォルトの名無しさん:2008/02/18(月) 12:26:48
>なんでも再帰あちこちでreturn
吊り?

830 :デフォルトの名無しさん:2008/02/20(水) 16:00:57
>>813
そんな特定のアーキテクチャに依存した話を突然持ち出されてもねえ、、、

831 :デフォルトの名無しさん:2008/02/20(水) 16:07:36
>>829
> >なんでも再帰あちこちでreturn
> 吊り?

釣りでもなんでもない。ifやswitchが文でなく式なら、

return if (hoge) true else false;

みたいに書けるのに(3項演算子は可読性が低いから却下)、
そうでないから、

if (hoge) return true; else return false;

というように書かざるをえない、ってだけ。

832 :デフォルトの名無しさん:2008/02/20(水) 17:15:50
3項演算子に対する嫌悪感って goto のそれに似たものがあるな

833 :デフォルトの名無しさん:2008/02/20(水) 17:18:18
3項演算子とgotoじゃ全然違うだろ・・・これだからgoto厨は・・・

834 :デフォルトの名無しさん:2008/02/20(水) 18:46:16
3項演算子はネストしない限りif文よりも可読性高い場合もあるだろ
特に>>831のような単純な分岐の場合は。どうせ見た目で毛嫌いして
るだけだろうけど。

835 :デフォルトの名無しさん:2008/02/20(水) 18:48:46
>>834
ネストしたって適切なカッコさえつければ問題ないだろ。
特に>>831の場合には積極的に3項演算子を使うべき箇所と思われ。

836 :デフォルトの名無しさん:2008/02/20(水) 18:56:34
それは再帰とは呼ばない。
ということだけは覚えてほしい

837 :デフォルトの名無しさん:2008/02/20(水) 18:59:35
if 文のみで書こうとすると異常にネスティングが増えるケースについて
3項演算子をif文とともに使って、ネスティングを削減すると、コードがすっきりするので好きだ。

838 :デフォルトの名無しさん:2008/02/20(水) 19:16:21
例えばループで書くと

foo() {
 cond = true
 while (cond) {
  ・・・
   ・・・
    if (...) {
     cond = false
    }
   ・・・
  ・・・
 }
}

みたいな構造で、condのようなスコープの広い変数が
必要になるのが、再帰で処理するように書き直せば、

foo() {
 ・・・
  ・・・
   if (!...) {
    foo()
   }
  ・・・
 ・・・
}

で済む、かもしれない、ってこと。

839 :デフォルトの名無しさん:2008/02/20(水) 19:19:27
>>836
再帰かどうかが、returnがif文の中か3項演算子の外かで左右されるとでも?

840 :デフォルトの名無しさん:2008/02/20(水) 19:33:38
>>838
でっていう

841 :デフォルトの名無しさん:2008/02/20(水) 19:48:45
>>838
いや、皆が問題にしてるのはそういうことではなく
while (cond) {
  int i;
  ....
}
みたいなスタック操作の無駄のことと思われ。

842 :デフォルトの名無しさん:2008/02/20(水) 21:19:37
末尾再帰でもないのに、それは・・・

843 :デフォルトの名無しさん:2008/02/20(水) 22:22:30
>>838
foo() {
 cond = true;
 while (cond) {
  s1;s2;
    if (...) {cond = false}
  s3;s4;
 }
}
これは、condが2回目のループでfalseになるとすると、
s1,s2,s3,s4,s1,s2,s3,s4の順で実行される。
で、
foo() {
 s1;s2;
 if (!...) {foo();}
 s3;s4;
}
これは、2回目のループで(!...)がfalseになるとすると、
s1,s2,s1,s2,s3,s4,s3,s4で実行されるから順番が変わる。そこでs3;s4をifの前に持ってくるわけだ。
すると、
foo() {
_loop:
 s1;s2;s3;s4
 if(...) goto _loop;
}

みんな末尾再帰でgoto使う?


844 :デフォルトの名無しさん:2008/02/20(水) 22:24:12
末尾再帰をgotoにするのはコンパイラのお仕事。

845 :デフォルトの名無しさん:2008/02/21(木) 02:28:28
再帰使うならgotoはいらん。
(再帰を中断するときには使うかもしれん)

846 :デフォルトの名無しさん:2008/02/21(木) 05:40:03
つかそれはdo{}while(..);

847 :デフォルトの名無しさん:2008/02/21(木) 07:36:46
>>843が全然末尾再帰になっていない件について

848 :goto使わなければそれがいい派:2008/02/21(木) 10:34:02
>>751
まあ、そういうコードが含まれているプログラムの中には
脆弱性だのバグだのいっぱい含まれているものだ。

 セキュリティについて、潔癖で有名なDJBですら、結構gotoを
多くつかう。 まったく使わないで終わらせた作品としては
は、比較的私家版パッチの突っ込みが少ない publicfile くらい。
後は山のようにgoto文があってDJBは嫌いだという人間もいる。

849 :デフォルトの名無しさん:2008/02/21(木) 10:37:28
>>841
{} がつくと何でも変数スコープを狭く取りたがるつか、
同じ変数を使いまわしてもバグにならないというか、
単たる手抜きか。

850 :デフォルトの名無しさん:2008/02/21(木) 14:08:08
pascalみたいに手続きの最初で全部まとめて宣言しろ

851 :デフォルトの名無しさん:2008/02/21(木) 15:58:33
>>841
それも違うだろ。それくらい最適化でどうにでもできる。

852 :デフォルトの名無しさん:2008/02/21(木) 20:22:54
>>845
ハァ?再帰からgotoで抜けるだぁ?
これだからgoto厨は…

853 :デフォルトの名無しさん:2008/02/21(木) 21:49:55
再帰からgotoどころかlongjmpだってしちゃうぜ!

854 :デフォルトの名無しさん:2008/02/21(木) 21:59:56
よーし、俺はexitだ。

855 :デフォルトの名無しさん:2008/02/21(木) 22:41:57
いいこと思いついた。
お前ら俺のプログラムのケツにストリームデータ流し込んで実行してみろ。


856 :デフォルトの名無しさん:2008/02/21(木) 22:50:35
>>855
えっ!お前のケツにすとりーむでーtlk;ghklj;

857 :デフォルトの名無しさん:2008/02/22(金) 07:15:04
>>851
そんな最適化をされたらデストラクタロギングが使えなくなるじゃないか!!

858 :デフォルトの名無しさん:2008/02/22(金) 13:10:22
>>857
コンストラクタ・デストラクタが呼ばれなくなるような最適化なんて行われるわけないだろ。
少なくともC++では。

859 :デフォルトの名無しさん:2008/02/22(金) 19:14:27
いずれ呼ばれるにしても、呼ばれるタイミングは変わるかもよ?

860 :デフォルトの名無しさん:2008/02/22(金) 22:05:58
>>859
どこの規格無視コンパイラだ?

861 :デフォルトの名無しさん:2008/02/22(金) 23:47:10
gotoを使う想定でロジックを組むなら、それを分かりやすく図示する方法を発明してから
にしてほしい。そうじゃないとレビューする気にもなれない。
ここで出たようなgotoを使った書き直しの例なら、gotoを使ってないロジックを例えば
NSチャートとかで書いた方が、とてもとても分かりやすくて人にも説明し安いだろう。

チームメイトにロジックを説明するようにお願いてフローチャートをもってこられたら、
とりあえずバケツもって廊下に立っててくれるようにお願いしちゃうな。
システムが使われなくなるまでその人が死なずに内容も忘れずに保守するってのが保証さ
れてたとしても、仕事ではそんなロジックは受け入れ難いな。

だいたい現実的にgotoを使った方が良い場合ってのが、想定しづらい。
リソースだのコードサイズだののためのためにgotoを使うってのは、やらないと用件が
満たせないからって理由で、設計とかコーディングとかのさらに後に最適化フェーズを
設けてそこでやるんなら認めなくもないが、元からgotoを使うのが正しい場合なんての
を考慮しながらロジックを考えるような人とは一緒に仕事はできないなぁと思う。

なんでそんな書き方になってるか説明するための資料も作んないといけないし、仕事が
増えるばっかりだ。段階的抽象化とか物事を整理するとかに興味がないかできない人な
んだなとしか思えない。

誰かが事故にあってもリカバリがきくような状態を維持しようと思ったら、少しくらい
冗長になっても、なるべくわかりやすい設計&実装にしたいって思うのは普通だと思う
んだがなぁ。


862 :デフォルトの名無しさん:2008/02/22(金) 23:56:49
わたしはソース読み力がありません。

まで読んだ。

863 :デフォルトの名無しさん:2008/02/23(土) 06:15:25
>>862>>861を読む力がありません

まで読んだ。

864 :デフォルトの名無しさん:2008/02/23(土) 06:38:46
resource *hoge(int arg) /*失敗でNULL、成功でリソース(p4)を返す*/
{
 resorce *p1 = NULL,*p2 = NULL,*p3 = NULL, *p4 = NULL;

 p1 = GetResource1(arg); /* GetResoruce*は失敗した時にNULLを返す */
 if(!p1) goto failed;
 処理1
 p2 = GetResource2(p1);
 if(!p2) goto failed;
 処理2
 p3 = GetResource3(p1,p2);
 if(!p3) goto failed;
 処理3
 p4 = GetResource4(p3);
 if(!p4) goto failed;
 処理4

 FreeResource(p3);
 FreeResource(p2);
 FreeResource(p1);
 return p4;
failed:
 if(p4) FreeResource4(p4);
 if(p3) FreeResource3(p3);
 if(p2) FreeResource2(p2);
 if(p1) FreeResource1(p1);
 return NULL;
}

これgoto使わないとどう書く?もちろんスマートポインタ、GC、例外は使用不可。

865 :デフォルトの名無しさん:2008/02/23(土) 06:43:29
>>864
もうそれ飽きた。いいかげん空気読め、アフォ。

866 :デフォルトの名無しさん:2008/02/23(土) 06:45:43
各GetResourceの前にifつけてやって、
処理4

867 :デフォルトの名無しさん:2008/02/23(土) 06:52:11
p1 = GetResource1(arg);
if(p1) {
 処理1
 p2 = GetResource2(p1);
 if(p2) {
  処理2
  p3 = GetResource3(p1,p2);
  if(p3) {
   処理3
   p4 = GetResource4(p3);
   if(p4) {
    処理4
   }
  }
 }
}
if (p3) FreeResource(p3);
if (p2) FreeResource(p2);
if (p1) FreeResource(p1);
return p4;


868 :デフォルトの名無しさん:2008/02/23(土) 06:58:18
俺の感覚だと、読んだだけで「ああ失敗なんだな」って分かる>>864のが好きなんだよね。
あとネストが深くならないのが。

869 :デフォルトの名無しさん:2008/02/23(土) 07:02:22
>>868
処理そのものがネスト構造になっているんだから、
コードもネストしたほうが実態がわかっていいんじゃねーの?

870 :デフォルトの名無しさん:2008/02/23(土) 07:03:52
>>863
なにがそんなに悔しいの?

871 :デフォルトの名無しさん:2008/02/23(土) 07:05:33
↓いつものgdgdな展開へ・・・

872 :デフォルトの名無しさん:2008/02/23(土) 07:05:36
>>869
なるほどねー。

>>870
いや別に。リソース確保でネストさせるのが嫌いだってだけで。

873 :デフォルトの名無しさん:2008/02/23(土) 07:07:28
自演シッパイ、オツwwww

874 :デフォルトの名無しさん:2008/02/23(土) 07:08:19
gdgdだな

875 :デフォルトの名無しさん:2008/02/23(土) 07:08:50
>>872
リソース確保の条件がネストしているのだから、
コードもネストしたほうが実態がわかっていいんじゃねーの?

876 :デフォルトの名無しさん:2008/02/23(土) 07:09:53
アンカー打ち間違える奴は、gotoでもラベル打ち間違えるに決まってる件について。

877 :デフォルトの名無しさん:2008/02/23(土) 07:10:19
>>875
なるほどねー。

878 :デフォルトの名無しさん:2008/02/23(土) 07:11:50
>>876
>>870>>863>>869に読み間違えてたわwww

879 :デフォルトの名無しさん:2008/02/23(土) 07:12:06
処理1〜3にもよるだろう。
短いならいいけど、長ければネストしたくないって人もいるだろう。
あと、エラーならその場で関数から抜けたいタイプのひともいるし、
あれだけじゃなんとも。

880 :デフォルトの名無しさん:2008/02/23(土) 07:12:17
あ、上の>>869>>868ねwwwww

881 :デフォルトの名無しさん:2008/02/23(土) 07:13:09
わざとだろwwww

882 :デフォルトの名無しさん:2008/02/23(土) 07:14:03
>>881
>>878>>880はねwwww読み間違えてたのはホント。

883 :デフォルトの名無しさん:2008/02/23(土) 07:14:41
gdgdだーwww

884 :デフォルトの名無しさん:2008/02/23(土) 07:15:37
>>879
ネストしたくなきゃ、
if (p1 && p2 && ...) {
とすればいいだけなんじゃ?

885 :デフォルトの名無しさん:2008/02/23(土) 07:19:58
>>879
たった3つの解放だけなんだから、解放をマクロにしちゃって
goto failedのかわりにFreeAll; return NULL;しちゃってもいいな。

いずれにせよ、このネタはもうイトフユだろ。

886 :デフォルトの名無しさん:2008/02/23(土) 07:47:58
ネストするなとか、あいかわらず後出しジャンケンなんだね、goto厨は…
まあその後出しジャンケンも>>885で残念賞なわけだがw

887 :デフォルトの名無しさん:2008/02/23(土) 07:52:42
↑と、ここまでいつものgdgdな展開ですた。

888 :デフォルトの名無しさん:2008/02/23(土) 08:06:03
嫌goto厨は「異議あり対案なし」であることが証明されました。

889 :デフォルトの名無しさん:2008/02/23(土) 08:25:52
>>882
リアルでアンカー読み違える香具師がgotoを使うのは

キ チ ガ イ に 刃 物

890 :デフォルトの名無しさん:2008/02/23(土) 08:27:06
>>888
gotoを使わない対案ならこの短い間に3つも出ましたが何か?

891 :デフォルトの名無しさん:2008/02/23(土) 08:31:07
「出る」と「出す」の違いくらいわかってもいいとおもうぞ。

892 :デフォルトの名無しさん:2008/02/23(土) 08:47:16
>>891
おいおい、>>888の主語は「嫌goto厨は」なんだから、
gotoを使わない対案が出ていればそれで十分に反証になるだろw

893 :デフォルトの名無しさん:2008/02/23(土) 09:25:38
自分の他人の区別さえつかないのか、かわいそうに。

894 :デフォルトの名無しさん:2008/02/23(土) 09:32:55
他人が書こうが誰が書こうがgotoを使わない対案であることに何の変わりもないが?

895 :デフォルトの名無しさん:2008/02/23(土) 09:37:31
嫌goto厨は「異議あり対案なし」であることが証明されました。

896 :デフォルトの名無しさん:2008/02/23(土) 09:58:53
>>895
gotoを使わない対案ならこの短い間に3つも出ましたが何か?

897 :デフォルトの名無しさん:2008/02/23(土) 10:01:08
それがなにか?

898 :デフォルトの名無しさん:2008/02/23(土) 10:06:18
いいよ〜gdgdいいよ〜

899 :デフォルトの名無しさん:2008/02/23(土) 10:09:56
864のgotoは不要ということで。

900 :デフォルトの名無しさん:2008/02/23(土) 10:39:25
俺の感覚だと、見た瞬間に 864>>>867 なんだがなあ。

えーとさ。FAILEDっていうラベルの存在自体が

「物凄くソースコードの見通しを良くする、これ以上無い最高のコメント」

だと思うんだよ。

901 :デフォルトの名無しさん:2008/02/23(土) 10:51:29
>>900=>>864 オツw

902 :デフォルトの名無しさん:2008/02/23(土) 10:55:29
>>901
goto派が一人しかいないと思ってるなら、
君はたった一人のgoto厨に向かって何を必死に反論しているのかしら?w


903 :デフォルトの名無しさん:2008/02/23(土) 10:59:26
goto派が一人しかいないなんて話、どこの脳内議論から降ってきたのだろうか・・・
脳ミソがスパゲッティになってるんじゃないの?

904 :デフォルトの名無しさん:2008/02/23(土) 11:00:48
ラベルに適切な英語名を振れない低学歴が吠えてるだけ

905 :デフォルトの名無しさん:2008/02/23(土) 11:02:13
1000までgdgd

906 :デフォルトの名無しさん:2008/02/23(土) 11:05:46
>>900
FAILEDなんてラベル、>>864にはないんだけど・・・
ラベルも扱えない香具師がgotoを使うのは

キ チ ガ イ に 刃 物

907 :デフォルトの名無しさん:2008/02/23(土) 11:06:50
すげぇ、TYPOも許容しないほどの厳格な議論なのかと思ったら
ただの罵り合いじゃん。

908 :デフォルトの名無しさん:2008/02/23(土) 11:08:20
gotoを適切に使うことで見通しよく書けているコードなど
オープンソースソフトウェアを少し読めばいくらでも見つかるし
まともなプログラマならばgotoを使うべきコードパターンというのを
イディオムとして持っている



業務の中で頭の固い奴を説き伏せてまで良いコードを書こうとは
思わないので仕事では適当にwhileやifをネストさせてその場限りの
コードをぐちゃぐちゃに書く。保守性など知らない
とりあえず「見た目上構造化」しておけばよいのだからそれ以上
考えても無駄無駄無駄。所詮は仕事

909 :デフォルトの名無しさん:2008/02/23(土) 11:11:14
>>908
ifをネストさせない対案も複数出ているが?

さあ、今度はどんな条件を後出しするのかなwwwwwww

910 :デフォルトの名無しさん:2008/02/23(土) 11:11:36
という思想で書き散らかされたプログラムに
腐れUMLと自動生成された糞doc、スパイスとして捏造されたテスト報告書をくっつければ

ほら高品質ソフトウェアの出来上がりでござい

911 :デフォルトの名無しさん:2008/02/23(土) 11:14:22
if (p1 && p2 && ...) {
馬鹿馬鹿しく肥大化した分岐条件

goto failedのかわりにFreeAll; return NULL;
馬鹿が思いつきで定義する糞マクロ

イイヨイイヨー

912 :デフォルトの名無しさん:2008/02/23(土) 11:26:33
>>861
>誰かが事故にあってもリカバリがきくような状態を維持しようと思ったら、少しくらい
>冗長になっても、なるべくわかりやすい設計&実装にしたいって思うのは普通だと思う
>んだがなぁ。
設計については正しい。
だが
実装については正しくない。

そしてここは実装について話すスレだよ。

913 :デフォルトの名無しさん:2008/02/23(土) 11:30:38
goto厨のオナニースレなんだから、まともな論理は通用しないよ > goto自重派

914 :デフォルトの名無しさん:2008/02/23(土) 11:31:51
>>908
その場かぎりのgotoでグチャグチャになってる>>864にどんな保守性を期待してるのやら。
他人のコードレビュー受けたことないでしょ、君は。

915 :デフォルトの名無しさん:2008/02/23(土) 11:33:01
>>908
> まともなプログラマならばgotoを使うべきコードパターンというのを
> イディオムとして持っている

それが他人に読まれた時にどんな混乱をもたらすか
考えたこともないのがgoto厨クオリティ

916 :デフォルトの名無しさん:2008/02/23(土) 11:36:59
whileやifがネストしただけで混乱するようなプログラミング初心者がgotoを使うのは

キ チ ガ イ に 刃 物

917 :デフォルトの名無しさん:2008/02/23(土) 11:38:50
>>876
> 876 名前:デフォルトの名無しさん [sage]: 2008/02/23(土) 07:09:53
> アンカー打ち間違える奴は、gotoでもラベル打ち間違えるに決まってる件について。

> 900 名前:デフォルトの名無しさん [sage]: 2008/02/23(土) 10:39:25
> えーとさ。FAILEDっていうラベルの存在自体が

まさにご名答。先見の明がありますな。
どこぞの後出しジャンケンと大違い。

918 :デフォルトの名無しさん:2008/02/23(土) 11:49:14
だめだここはれべるがひくい

919 :デフォルトの名無しさん:2008/02/23(土) 11:50:45
864 finally使え

920 :デフォルトの名無しさん:2008/02/23(土) 11:53:47
>>919 正解ですな。
finallyはスマートポインタ、GC、例外ではないからねえw

921 :デフォルトの名無しさん:2008/02/23(土) 12:03:48
大域脱出と例外処理には使うかな。
使わなくても書けるけど、特に宗教が無ければ使うよね普通。

922 :デフォルトの名無しさん:2008/02/23(土) 12:06:04
>>864
p1からp3まで格納するオブジェクトをつくって、
デストラクタでp1からp3を解放しろ。

ところで
> failed:
> if (p4) FreeResource4(p4);
これは何の冗談だ?p4はNULLなはずだが?

923 :デフォルトの名無しさん:2008/02/23(土) 12:07:23
>>921 特に宗教が無ければそういうのを「例外処理」とは呼ばないよね普通。

924 :デフォルトの名無しさん:2008/02/23(土) 12:07:24
あさってのほうこうをむいているぞきみは

925 :デフォルトの名無しさん:2008/02/23(土) 12:11:13
>>283
そうやって評論家ばかり集まって何も生み出さないから日本は駄目なんだよ


926 :デフォルトの名無しさん:2008/02/23(土) 12:11:33
>>922
ほんと、>>867のように書いてみれば、failed:に来た場合p4はNULLだということに気付くはずなのに、
ツギハギだらけの思考で書いたんだろうな、>>864は。

927 :デフォルトの名無しさん:2008/02/23(土) 12:11:39
誤爆

928 :デフォルトの名無しさん:2008/02/23(土) 12:13:43
誤爆だが、このスレの実情を的確に表現した名文だ。

929 :デフォルトの名無しさん:2008/02/23(土) 12:18:21
goto乱用厨が出すコード例はほとんどgoto慎重派によって対案が出されている。
なのにgoto乱用厨は次から次へとほとんど同じようなコードを出してくる。
>>864のパターンはこのスレだけでも何度も出てきている。
いくら対案を出しても、
「オプソ探せばいくらでも例はあるモン、goto使ったほうがいいモン」
と言って駄々をこねる。

結論: goto乱用厨=ゆとり脳。

930 :デフォルトの名無しさん:2008/02/23(土) 12:23:10
その対案は改善でなく改悪だという意見が何度も出ていますが?

931 :デフォルトの名無しさん:2008/02/23(土) 12:26:34
tesu

932 :デフォルトの名無しさん:2008/02/23(土) 12:28:14
>>930
アンカー打ちまちがえたりラベル打ちまちがえたりする
オッチョコチョイさんからねwww

933 :デフォルトの名無しさん:2008/02/23(土) 12:28:46
p4 = GetResource4(p3);
のあとlこ
if (p4) FreeResource(p4);
が書かれていない件


934 :デフォルトの名無しさん:2008/02/23(土) 12:31:05
>>933
へえお前はfreeしたポインタを返すのか。なかなか凄いな

935 :デフォルトの名無しさん:2008/02/23(土) 12:32:28
ここで結局932のような攻撃しかこないのが駄目
内容のある議論の入口にすら立てない

936 :デフォルトの名無しさん:2008/02/23(土) 12:35:20
相手の技量もわからず内容のある議論ができるわけもなし
933みたいな素人が知ったかぶりで自説を語るのが2ch

937 :デフォルトの名無しさん:2008/02/23(土) 12:36:08
ところで
> failed:
> if (p4) FreeResource4(p4);
これは何の冗談だ?p4はNULLなはずだが?


938 :デフォルトの名無しさん:2008/02/23(土) 12:36:27
まぁ、そんなスレもそろそろ終盤。
うめ。

939 :デフォルトの名無しさん:2008/02/23(土) 12:36:52
恥ずかしい間違いを指摘されても別人のふりで再登場だしな
実際このスレもせいぜい4,5人の素人が回してるだけだろ

940 :デフォルトの名無しさん:2008/02/23(土) 12:36:52
>>934
それがgoto厨クオリティ

941 :デフォルトの名無しさん:2008/02/23(土) 12:39:03
goto 禁止 とか適当なキーワードでぐぐれば
このスレを読む1%の労力でこのスレを読む100倍の内容が得られる

942 :デフォルトの名無しさん:2008/02/23(土) 12:39:11
>>930
finallyについては?
デストラクタについては?

さあ、finallyやデストラクタを使った方法が改悪だというレスへのアンカー示してみろよ。

943 :デフォルトの名無しさん:2008/02/23(土) 12:40:19
>>942
例外やスマートポインタやGC禁止って言ってるところで
finallyだのデストラクタだの、なぞなぞはお前のガキ相手にやってろ

944 :デフォルトの名無しさん:2008/02/23(土) 12:41:37
>>930
余計なif (p4) FreeResource(p4);が消えた点だけでも
>>867>>864よりも優れているが?

945 :デフォルトの名無しさん:2008/02/23(土) 12:42:34
>>943
あのー、finallyは例外でもスマートポインタでもGCでもないんですがwww
君、プログラミング言語に関する知識が決定的に不足してるんじゃない?

946 :デフォルトの名無しさん:2008/02/23(土) 12:44:24
>>944
ありうる状態や制御の流れについての理解を促すというのも
構造化プログラミングの利点の1つだな。
簡単にgotoに逃げちまうと>>864のようなお粗末なコードになる。

947 :デフォルトの名無しさん:2008/02/23(土) 12:44:47
>>945
例外処理機構を備えていなくてfinallyだけ持っている言語を挙げよ

948 :デフォルトの名無しさん:2008/02/23(土) 12:46:26
>>943
アンカー示せないわけね。
まあ示してもどうせまた打ち間違えるだろうけど。

949 :デフォルトの名無しさん:2008/02/23(土) 12:46:35
945は947に対して逃げて次は別人のふり

950 :デフォルトの名無しさん:2008/02/23(土) 12:47:20
>>947
単に現代的な言語なら例外もfinallyも持ってるというだけの話だろ。
何をマヌケな事をぬかしているのやら…

951 :デフォルトの名無しさん:2008/02/23(土) 12:48:12
>>949 他人がみな自分と同じ行動を取るとは限らないのだよ、おマヌケさんw

952 :デフォルトの名無しさん:2008/02/23(土) 12:48:53
throwしなければ例外「は」使っていないからfinallyはいいじゃん

とかね。
finallyやデストラクタと言った奴は軽いネタだったと思うんだが
ネタがネタとして扱われない議論厨の厨っぷりに呆然

953 :デフォルトの名無しさん:2008/02/23(土) 12:54:20
>>952
finallyと例外機構は実装としてほとんど独立なんだけど…
実際、finally句が実行されるのは例外の時だけじゃないし。
try…catchとの類似で混同してる人が多いけど。

gotoたまに使う派として恥かしいんでROMやめてレスしてみた。

954 :デフォルトの名無しさん:2008/02/23(土) 12:55:17
>>951
そんなのはどうでもいいよ。
問題なのは945(か他の誰かでもいいけどさ)が
947 に正面から答えられるかどうかだけ。

だいたい、945がちゃんと知識を持って書いてるなら、
そういう言語をすぐに答えれば逆に俺が大恥を書くことになる。

実は何の知識も無いくせに知ったかぶりで煽ってるから
すぐにケツをまくって格好悪く逃るハメになるのさ。

955 :デフォルトの名無しさん:2008/02/23(土) 12:55:59
しかし、マジレスが浮かばれないスレなので、それも燃料にされてしまう悲しさ・・・
↓具体化してください、どーぞ。

956 :デフォルトの名無しさん:2008/02/23(土) 12:58:28
次スレ
http://pc11.2ch.net/test/read.cgi/tech/1203658291/


957 :デフォルトの名無しさん:2008/02/23(土) 12:58:42
↑具が大きい

958 :デフォルトの名無しさん:2008/02/23(土) 13:00:03
>>954
まあ落ち着いて>>950でも読んでみたら?

959 :デフォルトの名無しさん:2008/02/23(土) 13:00:38
もう技術的な話は出尽くしていて後は
2chリロードするしか生きがいのないクズどもが
goto使う・使わない人間の人間性叩きしかやってないし
次はマ板でやれよ。

960 :デフォルトの名無しさん:2008/02/23(土) 13:01:57
いろんな文法の変更を試している人がいるから、その中のひとつとして考えてみる

961 :デフォルトの名無しさん:2008/02/23(土) 13:02:39
tesu

962 :デフォルトの名無しさん:2008/02/23(土) 13:03:11
gotoは何も悪くない。
悪いのはラベルだ。

963 :デフォルトの名無しさん:2008/02/23(土) 13:03:22
>>958
「例外もfinallyも持っている言語で>>864のようなコードを書くこと」

について議論してたの?

964 :デフォルトの名無しさん:2008/02/23(土) 13:03:59
技術的な話はあめぞうが生まれる前から出尽くしているような気が。

965 :デフォルトの名無しさん:2008/02/23(土) 13:04:03
次スレ
http://pc11.2ch.net/test/read.cgi/tech/1123726695/


966 :デフォルトの名無しさん:2008/02/23(土) 13:06:59
>>963
わざわざ具体的な例を挙げて「使用不可」と断りを入れてるぐらいだから、
そこに挙げられていないものはデフォルト使用可なんじゃねーの?

いいかげんにしないとまた「条件後付け」と指摘されるぞw

967 :デフォルトの名無しさん:2008/02/23(土) 13:08:31
まあこのスレの大半の奴はgoto行番号でプログラムを書いた経験なんてないだろ?
構造化以前を実体験として知らない年代の人がgoto議論なんてするもんじゃないよ。
それは別にレベルの高い低いじゃなくて、時代が違うというだけ。

968 :デフォルトの名無しさん:2008/02/23(土) 13:11:34
代入を恐れず使う兵共が継続やモナドを語るスレきぼんぬ

969 :デフォルトの名無しさん:2008/02/23(土) 13:12:46
>>966
わざわざ例外だのGCだのと言うぐらいだから、
少なくともC限定の話だとは思えないよな。

970 :デフォルトの名無しさん:2008/02/23(土) 13:15:05
while文を恐れず使う兵共が再帰やgotoを語るスレきぼんぬ。

971 :デフォルトの名無しさん:2008/02/23(土) 13:15:25
forやwhileも十分見通しが悪い再帰で書け

972 :デフォルトの名無しさん:2008/02/23(土) 13:15:53
安易に破壊的代入を使う奴は素人

973 :デフォルトの名無しさん:2008/02/23(土) 13:16:25
忘れられたデストラクタたん、かわいそス

974 :デフォルトの名無しさん:2008/02/23(土) 13:16:37
ここはひとつmapで。

975 :デフォルトの名無しさん:2008/02/23(土) 13:18:20
急にム板らしくなってきた

976 :デフォルトの名無しさん:2008/02/23(土) 13:25:26
tes

977 :デフォルトの名無しさん:2008/02/23(土) 13:26:34
goto hell;

978 :デフォルトの名無しさん:2008/02/23(土) 13:28:16
hell:
goto heaven;

979 :デフォルトの名無しさん:2008/02/23(土) 13:29:55
>>963
スレタイ読め。
このスレは、finallyや多重breakを語るスレだ。
finallyを対案に使って何が悪い?

980 :デフォルトの名無しさん:2008/02/23(土) 13:32:28
てs

981 :デフォルトの名無しさん:2008/02/23(土) 13:34:50
g-gg-g-gg-g-gg-gg--

982 :デフォルトの名無しさん:2008/02/23(土) 13:40:48
>>979 それは正論だがもう遅い。皆帰ってしまったよ。

983 :デフォルトの名無しさん:2008/02/23(土) 13:42:09
goto jail

984 :デフォルトの名無しさん:2008/02/23(土) 13:44:18
goto mental_hospital;

985 :デフォルトの名無しさん:2008/02/23(土) 13:45:59
それは元ネタがわからん

986 :デフォルトの名無しさん:2008/02/23(土) 14:16:01
ってst

987 :デフォルトの名無しさん:2008/02/23(土) 14:18:12
>>967
あるよ。
でも「構造化以前に開発経験のある者」に限定するなら、レスの98%位が不合格だ。
今現在もコードを書いている人間が語るから面白いのさ。

988 :デフォルトの名無しさん:2008/02/23(土) 14:22:40
俺も行番号でgotoとか書いていたし、現在でもコードを書いているが、
このスレの99%のレスは落第だと思うな。

989 :デフォルトの名無しさん:2008/02/23(土) 14:24:30
生め

990 :デフォルトの名無しさん:2008/02/23(土) 14:25:42
関数って考えがなかったからな
サブルーチンはgotoかgosubでしか実装できなかったろ

991 :デフォルトの名無しさん:2008/02/23(土) 14:31:29
>>990
でもNEXT J, Iとかはあったな。うめ。

992 :デフォルトの名無しさん:2008/02/23(土) 14:34:04
gosubは理解するのに時間かかったな・・・

993 :デフォルトの名無しさん:2008/02/23(土) 14:34:04
test

994 : ◆.CzKQna1OU :2008/02/23(土) 14:34:33
te

995 :デフォルトの名無しさん:2008/02/23(土) 14:34:59
俺は次すれでもthrowしまくるぜ

996 : ◆84g/KG3Nug :2008/02/23(土) 14:35:11
st

997 :デフォルトの名無しさん:2008/02/23(土) 14:35:17
DEF FUNみたいのもあったな。方言か?うめ

998 :デフォルトの名無しさん:2008/02/23(土) 14:35:41
next

999 :デフォルトの名無しさん:2008/02/23(土) 14:36:01
.

1000 :デフォルトの名無しさん:2008/02/23(土) 14:36:20
goto 1

1001 :1001:Over 1000 Thread
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。

244 KB
★スマホ版★ 掲示板に戻る 全部 前100 次100 最新50

read.cgi ver 05.04.02 2018/11/22 Walang Kapalit ★
FOX ★ DSO(Dynamic Shared Object)