08/02/09 17:55:48
>>199
リソース解放のためにgotoって、、、不必要に汚ないコードができるだけだろ
201:デフォルトの名無しさん
08/02/09 17:59:11
>>200
goto使わないともっと汚くなるんじゃない。
202:デフォルトの名無しさん
08/02/09 18:00:29
まぁgoto禁止の会社で、あらゆるコードが以下のように
なってるのを見たとき、「素直にgoto使え」とオモタ。
do {
if (hoge) {
break;
}
} while (0);
203:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/02/09 18:07:55
continueもある場合は、gotoよりも明確になるように思う。
breakで外側のループを脱出するために、switchで書いたほうが良さげな
内側の多分岐がif/else if/else ifになってたりするとgoto使え、だな。
205:デフォルトの名無しさん
08/02/09 18:12:33
>>203
関数がエラーで返った場合、オブジェクトに変更が加えられていないことが
保証されるとする場合、それじゃだめやね。エラーが発生したら、まき戻す
処理が必要になる。
206:デフォルトの名無しさん
08/02/09 18:15:49
>>205
エラーの発生箇所によって巻き戻し方が違うんなら、どのみちgotoでは処理できん。
巻き戻し方が同じなら、goto先で巻き戻すのもreturn先で巻き戻すのも同じ。
と思うのだが。
207:デフォルトの名無しさん
08/02/09 18:19:37
>>206
>エラーの発生箇所によって巻き戻し方が違うんなら、どのみちgotoでは処理できん。
でもgoto使ったほうがスッキリかけるでしょ。
>巻き戻し方が同じなら、goto先で巻き戻すのもreturn先で巻き戻すのも同じ。
APIの使い勝手が大きく違うじゃない。
208:デフォルトの名無しさん
08/02/09 18:57:34
>>207
いや、だからさ、APIとしては呼び出す側は何もしなくていいの。
処理とリソース管理を分離して実装しましょう、ってだけの話。
なんで無理にgotoなんて使いたがるのか、ワケワカラン。
209:デフォルトの名無しさん
08/02/09 19:02:43
>>208
抽象論が多くてわかりにくい。具体的なコード書いて改善してみてくれ。
210:デフォルトの名無しさん
08/02/09 19:12:49
>>203でコピペされてるコードも全然具体的じゃないけどな。
211:デフォルトの名無しさん
08/02/09 19:30:27
巻き戻し処理って、本当に巻き戻すのか単にコピーをしておくのかどっちが多いの?
transactional memoryって効率を求めるとすると、なにかしら約束事があったほうがよいんだろうけど。
完全に透過に見える実装にしたいならos側からアプローチしたほうが楽な気もする。
212:デフォルトの名無しさん
08/02/09 20:28:38
>>210
結局「gotoはダメ!って教えられたからダメダ!」で、思考停止したダケの人なのね。
>>211
>巻き戻し処理って、本当に巻き戻すのか単にコピーをしておくのかどっちが多いの?
場合による。例えば、ある処理が1,2,3,4の順番で実行することがきめられてる場合
(1を実行しないと、2が実行できない場合)、実際に実行して3でエラーが発生したら、
1,2を巻き戻す処理が必要だし。
OS側からのアプローチってどんなアプローチ?
213:デフォルトの名無しさん
08/02/09 20:34:39
gotoなんて設計に何の影響もない
同一関数内でしか影響のないものによくもまあそんなに熱くなれるなw
これ眺める限りさほど奇天烈な使い方があるようにも思えないが。
URLリンク(www.google.com)
214:デフォルトの名無しさん
08/02/09 20:43:49
>>213
>gotoなんて設計に何の影響もない
gotoは設計に影響ないとしても、APIが保障するリソース管理の方針は
大いに影響がある。
下位のモジュールがエラーを返した場合、それ以下のリソースには影響
がなかったことが保障されるのであれば、モジュールは自身の管理する
モジュールを開放すればよいことが保証される。
例外とデストラクタの伝播のようなもの。
215:デフォルトの名無しさん
08/02/09 20:44:26
んで、Cでそれを実装するには、gotoがいいよといってるわけで。
216:デフォルトの名無しさん
08/02/09 20:44:43
GCC の labels as value と computed goto を使うと結構豪快に遊べるけどなw
217:デフォルトの名無しさん
08/02/09 20:47:44
嫌goto厨ってもしかして元N88ベーシッカーが多いのかねw
218:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/02/09 20:57:27
うんこちんちん!
まで読んだ。
221:デフォルトの名無しさん
08/02/09 20:58:35
>>212 ポカーン 自分では全然的確な例も出さずに認定かい
222:デフォルトの名無しさん
08/02/09 20:59:29
>>218
まだJavaをインタプリタ言語と呼んでる人がいるんだね。
正直驚いた。
223:デフォルトの名無しさん
08/02/09 21:06:34
実際にバイトコードインタプリタだったとしても
機械語に翻訳されりゃasmリストのjmpと一緒じゃん。
jmp命令を使えないcpuって不便そう。
224:デフォルトの名無しさん
08/02/09 21:07:45
結論
goto議論に熱中する奴は生産性が低い
goto :eof
225:デフォルトの名無しさん
08/02/09 21:13:36
つーか、BASICのインタプリタと、
Javaのインタプリタのレベルを混同してるヴァカが現存してることに驚いた。
Javaのforでスタックなんか使ってねーっての。
226:デフォルトの名無しさん
08/02/09 21:24:38
>>219
その2のほうさ、管理するリソースが1つだけならまだマシだが、4つも5つも
管理している場合、そのためのサブ関数が4つも5つもできることに
なるわけだが・・・。まぁgoto毛嫌いしている人には、そっちのほうが
ウレピイのかもしれんが。
227:デフォルトの名無しさん
08/02/09 21:28:22
リソース管理なんてif文一発だろ。
お前らもっとでかいモニタ使えよ。
int ret = 0;
if(init1())
{
if(init2())
{
if(init3())
{
ret = execute();
fin3();
}
fin2()
}
fin1();
}
return ret;
228:デフォルトの名無しさん
08/02/09 21:45:05
>>227
そのコードは、俺の頭ではツライ。
229:デフォルトの名無しさん
08/02/09 21:54:45
意外にも java がインタプリタだという事を知らない人が複数いて驚いた。
「JIT」 について、もうすこし学びましょうね。
230:デフォルトの名無しさん
08/02/09 22:01:57
ほぉ。
Javaのバイトコードで、どういう風にforとスタックが関係するのか、
説明していただけますかね?
231:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/02/09 22:31:52
インタプリタなのはJVMの方でJavaはコンパイラだろ。
233:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/02/09 22:40:13
で、どのように、
BASICインタプリタで起きるようなFOR-NEXTの対応のズレの
ようなことと、関係してくるんですか、と。
(BASICのFOR-NEXTは、FORを実行する時、NEXTにぶち当たったら
戻るためのポインタをスタックに積んでいるわけですが、それに
相当するコードはどこ?)
それに、
あるインストラクションを実行する時点での、スタックトップは
コンパイル時に確定できますよね?
仮にgotoで気ままに飛んだとしても、飛ぶ時に適宜調整すれば
問題ないわけで。
235:デフォルトの名無しさん
08/02/09 22:41:34
java byte code書いた人とスタック云々の人は別だよw
236:デフォルトの名無しさん
08/02/09 22:50:35
こりゃ失礼しました m(__
237:デフォルトの名無しさん
08/02/09 23:26:01
CPUが java のバイトコードを直接実行していると勘違いしている人が多いですね。
javac ⇒ バイトコード ⇒ インタプリタが実行
238:デフォルトの名無しさん
08/02/09 23:36:27
よくもまあこんな前世紀的話題を得々と・・・
239:デフォルトの名無しさん
08/02/09 23:37:55
今のSunのJVMってJITコンパイルしてないの?
240:デフォルトの名無しさん
08/02/09 23:40:09
>>238
まぁ、新しくプログラミングの世界に入ってくる人たちが、そういう疑問を持つことは
当然というか、ソウであって欲しいものナわけで。「先人達が行ってたから」といって
自分の思考を停止して妄信するよりははるかに良い。
241:デフォルトの名無しさん
08/02/09 23:40:59
ていうか、釣りだろw
釣りとしか思えないよこのインタプリタ厨。
242:デフォルトの名無しさん
08/02/10 12:29:30
釣りだ。
gotoのスレでパフォーマンスの話をして、釣れると思っているね
243:デフォルトの名無しさん
08/02/10 14:58:54
そもそも、大域変数しか使えない言語で「変数をスタックに積むって」ありえるのか?
変数宣言なし&局所変数なしの言語の場合、変数管理表と戻り先(jump先)管理表を使うのが普通だろ?
244:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/02/10 18:53:17
じゃあgotoを使うなって言われるのは、
単純にスパゲッティ化するのを防ぐだけじゃなく、
スタックを開放する作業を確実にやるためだったってことだな。
246:デフォルトの名無しさん
08/02/10 18:55:43
つか今時どうやったら制御構文完備な言語で
goto使ってスパゲッチなコードを書けるんだよw
247:デフォルトの名無しさん
08/02/10 19:02:49
完備ってほどでもないと思うけど。
248:デフォルトの名無しさん
08/02/10 19:04:48
gotoは悪だ!という宣伝がコレまで続けられてきて、普通のプログラマ
はgotoを使ったスパゲティコードに関して十分知っているわけでしょ。
そういう意味では、goto邪悪論の目標は達していると思う。
それなのに会社のコーディング規約でgotoを禁止するのは、どうみても
自社のプログラマを信用していないとしか思えない。
goto禁止したところで、do { if (hoge) break; } while(0)で、gotoに近いことを
やろうと思えば出来てしまうわけだぜ。そういう会社がやるべきは、社員の
教育であってgoto撲滅では決してない。
249:デフォルトの名無しさん
08/02/10 19:29:20
条件分岐とループで複雑に作ってもわけ分からんしな。
250:デフォルトの名無しさん
08/02/10 19:30:07
ゴトーさんが泣いているぞ
251:デフォルトの名無しさん
08/02/10 19:35:51
おまえは、BLASの後藤か、CINTの後藤か、パラメトロンの後藤か、
なんちゃって。
252:デフォルトの名無しさん
08/02/10 19:49:17
>>226
その2のほうさ、管理するリソースが1つだけならまだマシだが、4つも5つも
> 管理している場合、そのためのサブ関数が4つも5つもできることに
> なるわけだが・・・。
>>219の2のどこをどう考えればリソース毎にサブ関数が必要になると思えるのやら。
hoge()の中身が増えるだけだろ。
まさかhoge_implのほうがリソース管理してるとでも読んだのか?
253:デフォルトの名無しさん
08/02/10 19:51:00
>>248
goto邪悪論も有害だが、goto気軽に利用論はもっと有害だな。
あくまで汚ないことをやっているという自覚を持って使うべきだ。
254:デフォルトの名無しさん
08/02/10 20:06:09
相変わらず曖昧論ばっかりだな
255:デフォルトの名無しさん
08/02/10 20:16:53
>>252
いや、そうだな。だがしかし4つも5つもリソースがあるばあいはどうすんの。
そもそもその手法じゃダメやん。
256:デフォルトの名無しさん
08/02/10 20:25:56
つまり>>227のようになってしまうわけだし。依存関係あると。
そうじゃないなら、やっぱりサブ関数をわけて依存関係を
チェインさせる?正気の沙汰じゃないな。
257:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/02/10 20:34:55
>>257
mallocならいいが、
>例えば、ある処理が1,2,3,4の順番で実行することがきめられてる場合
>(1を実行しないと、2が実行できない場合)、実際に実行して3でエラーが発生したら、
>1,2を巻き戻す処理が必要だし。
この場合はどうする
259:デフォルトの名無しさん
08/02/10 20:38:03
hoge()の最後でretの中身に応じて必要な回復処理すればいいだけじゃねーの?
260:デフォルトの名無しさん
08/02/10 20:39:28
>>259
書いてミレヨ
261:デフォルトの名無しさん
08/02/10 20:41:43
>>260
おいおい、どんな巻き戻しが必要なのか具体的なコードを出すのが先だろw
262:デフォルトの名無しさん
08/02/10 20:45:17
hoge_impl()の返り値にどこまで進んだかの情報を入れ込んでおけばOK
263:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/02/10 20:49:18
>>263
それのどこが巻き戻しのコード?
265:デフォルトの名無しさん
08/02/10 20:53:08
盛り上がってまいりました
266:デフォルトの名無しさん
08/02/10 20:53:26
>>263
initが失敗したら、finishでまき戻せると思ってくれ。
267:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/02/10 20:57:00
もうこねーよ、ウワーン
269:デフォルトの名無しさん
08/02/10 20:58:18
そんなコード見たことねぇw
goto避ける為にがんばりすぎだなw
大体ローカル変数にアクセスできねぇし
いちいち引数で渡しますか。
C++厨のtry/finallyなんていらねぇ!
がんばればclassのコンストラクタ、デストラクタで何とかなる!みたいだなw
270:デフォルトの名無しさん
08/02/10 21:01:22
>>269 御託はいいから、>>226が筋違いだということは理解できたか?
271:デフォルトの名無しさん
08/02/10 21:02:23
>>269
回復に4つも別々の関数呼ばにゃならんコードな時点で糞ケテーイ
272:デフォルトの名無しさん
08/02/10 21:06:09
みんな、今271が良い事を言ったぞ!
273:デフォルトの名無しさん
08/02/10 21:09:51
がんばることある?
大抵のものは誰かがラッパー作っているし、
ないものは確かに作ることもあるけど、面倒ならboost::shared_ptrに任せられるし。
274:デフォルトの名無しさん
08/02/10 21:09:56
>>269 後出しイクナイ!
ローカル変数うんぬんを言うのなら、A_finishとかが無引数なのはおかしいだろ。
275:デフォルトの名無しさん
08/02/10 21:12:22
>>273
禿同。こんな事にgotoとか使ってる奴はboost時代に乗り遅れてる。
276:デフォルトの名無しさん
08/02/10 21:18:15
でも削除子指定できるscoped_ptrほしい。
と思ったらunique_ptrは削除子していできるのか?
277:デフォルトの名無しさん
08/02/10 21:50:35
>>267
それってさ、一連の処理を分割してしまってるわけだけど、initしてからfinishする
までの処理を。逆にメンテナンスせいが落ちそうじゃない。goto使うよりも。
278:デフォルトの名無しさん
08/02/10 21:52:09
アホが見ても分かるような用途にしかgotoは使わない。
279:デフォルトの名無しさん
08/02/10 21:55:02
>>278
アフォが見てもわかる用途って具体的には?
280:デフォルトの名無しさん
08/02/10 21:57:24
>>277
A_initって名前が悪いんじゃねーかな。
たぶん>>263はA_init()は何か実際に処理をさせたいから"巻き戻し"なんて言ってるんじゃ。
だとするとA_init()はA_proc()と読みかえたほうがいいだろ。
そうすれば>>267は>>208が言うように処理とリソース管理の分離というデザインになる。
281:デフォルトの名無しさん
08/02/10 21:59:20
>>279
278じゃないけど多重breakとかかな?
多重breakできる言語が少しうらやましい。
282:デフォルトの名無しさん
08/02/10 22:01:20
それを言うとA_finishも変なネーミングだ
283:デフォルトの名無しさん
08/02/11 00:59:43
ファンクショントレースもgotoの話題にでてたけど、みなどうしてる?
ftraceコマンドとかあるみたいだけど、どうも共有ライブラリとかの
ファンクションコールをうまくトレースしてくんないのよね。
284:デフォルトの名無しさん
08/02/11 01:21:39
あぁちょっと調べてみたら、valgrindとか色々ありそうやね。
285:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/02/11 03:22:22
>>285
gotoいらないじゃん
288:デフォルトの名無しさん
08/02/11 03:25:46
>>287
別にgotoなんて無くてもいいんだが、分かりやすいことが重要じゃない?
極論すればwhile()だけで全ての制御構造は書けるわけだし。非常に面倒くさくなるけど。
>>285で、InitHogeAudioの引数の一つがInitHogeGraphicsの結果だったりするみたいな感じで
からみあってたりすると結構面倒くさいんじゃない?
289:デフォルトの名無しさん
08/02/11 03:31:26
ほら、ここでもinit関数と、finish関数のAPI仕様の統一の必要性がでてきた。
「gotoは設計に関係ない」っていったやつでてこい。プログラムのアマチュア
が設計だけして、実装まるなげは本当に排除すべきだ。
290:デフォルトの名無しさん
08/02/11 03:41:18
>>287
いやまぁ、さきの例はそれぞれのinitとuninitが関数だからそうだけど、
たとえば単なる値の設定とそれをクリアするのに関数を用意するのはバカらしい。
それならgoto使うとかいう選択は十分にあると俺は思うな。
291:デフォルトの名無しさん
08/02/11 07:48:56
>>267で結論が出た話を蒸し返してる香具師がいるぞw
292:デフォルトの名無しさん
08/02/11 08:07:30
>290 のように後出しジャンケンばかりやっている奴のコードは仕事に使えん
293:デフォルトの名無しさん
08/02/11 08:15:32
>>285=>>263
294:デフォルトの名無しさん
08/02/11 08:51:09
半端なinit/finishを繰り返す時点でダメダメ
295:デフォルトの名無しさん
08/02/11 10:50:15
>>288
確かにまとめてひとつの関数にすれば数は少なくてすむが、
ラベルの数が多すぎるだろ。
>分かりやすいことが重要じゃない?
分かりにくいんだよ。
制御が入ると、その制御全部チェックしないといけないだろ。
それ、順番間違ったらそれだけでバグになるだろ。
296:デフォルトの名無しさん
08/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
08/02/11 11:10:43
見直すと意味不明なコードだが気にするなw
298:デフォルトの名無しさん
08/02/11 12:01:53
>>296
> かつ、何らかの事情でinit()やrollback()を同一関数内に
> まとめて書く必要がある場合(式でなく文になる場合)
どんな状況を言いたいのかサパーリわかりません。
ちゃんとした日本語か、仮でいいからCか、どっちかで書いてくれ。
299:デフォルトの名無しさん
08/02/11 12:02:31
>>288
これで「わかりやすい」と思うのは書いた本人だけだと思うぞ。
300:デフォルトの名無しさん
08/02/11 12:05:02
つーか、UnInitって未初期化のことじゃないか
オマエラ本当にマなのか?w
301:デフォルトの名無しさん
08/02/11 12:12:09
>296 たぶん君は10万行以上のコード書いたことないでしょ。
それにチームでコードを書いた経験もほとんど無いように見受けられる。
素人はgoto避けたほうが身のためだよ。
302:296
08/02/11 12:16:53
gotoの代替手段があってそれがgotoより優れているならそうするw
でも>>267や>>286みたいに、goto回避を目的としたトリッキーなコードを書くくらいなら
イディオムとして理解できるgotoは素直に利用する方がよっぽどわかりやすい
303:デフォルトの名無しさん
08/02/11 12:19:41
>267をトリッキーと感じる感性でgotoを濫用されちゃ話になりませんな。
304:296
08/02/11 12:21:26
>>298
簡単な例で言えば>>267のコードで
hoge_implおよび*_initをインライン化する必要が出たら
フラグをreturnしてswitchで受けるっていうのは無理だわな、
そんときはどうする?ってこと
305:デフォルトの名無しさん
08/02/11 12:21:45
>>267はgoto回避のトリッキーなコードというよりも、
APIから抜ける前にチェックを「確実に」入れるための簡単なtipsなのだが。
306:デフォルトの名無しさん
08/02/11 12:23:14
>>300
Get:UnGetと書くマがこの世に実在してだな…
>>302
IDEでデバッグできる環境なら多少強引でもgoto回避したほうが追いやすいよ。
307:デフォルトの名無しさん
08/02/11 12:23:27
>>304 具体的に。
308:296
08/02/11 12:23:33
>>303
LABELを定義してgoto label するのと
フラグ定数をdefine してreturn -> switch するのと何が違うんだ?
309:296
08/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:デフォルトの名無しさん
08/02/11 12:29:50
意図的に話をループさせて逃げようとしてますな
>>298に>>304で答えたことになると思ってんの?
311:デフォルトの名無しさん
08/02/11 12:30:23
>>308 >>305
312:296
08/02/11 12:32:26
309をgotoを使わずに上手く書くのってどうする?
313:296
08/02/11 12:34:10
要望にこたえて>>309に具体的に書いたので、
そちらも具体的なコードでよろしく
関数分割は無しな。
「美しい設計」にしたがって自由にリファクタリングできる業務なら
議論の余地なくgotoなんていらないだろ。ってかそんな環境ならC使わないし。
314:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/02/11 12:38:16
どこまで条件の後付けを続けるのかしら…(´・ω・`)
316:デフォルトの名無しさん
08/02/11 12:38:19
>>313
お前な、はっきり言わせてもらうと、馬鹿じゃねーのか?
「goto使わずに、関数分割してリソース管理と処理本体を分離する設計にしろ、
そのほうがgotoでスパゲッティにせずにリソースの解放を確実に実行できる。」
という主張に大して「関数分割はなしな」じゃ議論から逃げているとしか
受け取りようがない。
317:296
08/02/11 12:42:30
>>314
そのコードが実質的に>>309と何が違う?
318:デフォルトの名無しさん
08/02/11 12:46:08
>>317 過去ログ読んでろ。自分のレスだけでなく、相手のレスも真摯に読め。
話はそれからだ。
319:296
08/02/11 12:47:28
過去ログ嫁は逃げるときに便利な言葉だな。
320:デフォルトの名無しさん
08/02/11 12:48:32
正直、もう後出しジャンケンのワナビー初心者相手にするのは飽きた。
321:デフォルトの名無しさん
08/02/11 12:50:54
>319 条件の後付けで逃げてるのはキミのほうでしょ…(´・ω・`)
322:320
08/02/11 12:51:07
飽きたといいつつ、お前は次の奴も相手するよw
323:デフォルトの名無しさん
08/02/11 12:52:17
>>317 過去ログと言わず、自分のレスの1つ前のレスを読んでみたらどうだ?
324:315
08/02/11 12:54:59
>>321もしかして僕のレス見て言ってる…?
>>296へのレスだかんね(´・ω・`)
325:321
08/02/11 12:59:38
>>324
もちろん>>319=>>296へのレスだかんね(´・ω・`)
326:デフォルトの名無しさん
08/02/11 13:08:40
296はトンヅラを決め込んだようですwwwwwwwwwwwカコワリwwwwwwwwwwwww
327:デフォルトの名無しさん
08/02/11 13:11:22
誰もレスしていないが286が良い設計
328:デフォルトの名無しさん
08/02/11 13:33:25
>>267が良いコードとされた時代が懐かしいな
329:デフォルトの名無しさん
08/02/11 13:34:46
なんだ時代は後退してるのか
330:デフォルトの名無しさん
08/02/11 13:37:10
それを後退だと思うなら後退だ。
331:デフォルトの名無しさん
08/02/11 13:41:26
時代の最先端のコードは>>285です。
332:デフォルトの名無しさん
08/02/11 13:41:31
A_init()
A_FAILED
case A_FAILED
A_finish()
ソース上ばらばらなのに意味上は相変わらず密結合
メンテナンス性を悪化させる似非リファクタリングの典型
333:デフォルトの名無しさん
08/02/11 13:45:55
>>332 よく読むとわかるけど、ソース上の距離は>285も同じなんだよ。
文句があるのなら>285に言ってくれw
334:デフォルトの名無しさん
08/02/11 13:48:45
「処理とリソース管理の分離」を掲げた設計に対して
「ソース上ばらばら」は誉め言葉だよwww
335:デフォルトの名無しさん
08/02/11 13:53:31
hoge_impl()に処理を分割した分だけ距離が離れている
A_FAILEDを別途#defineしなければならない分だけ管理要素が増えている
>>334意味不明
336:デフォルトの名無しさん
08/02/11 13:57:34
>>335
gotoであちこちのブロックから飛びまくるのに比べれば
> hoge_impl()に処理を分割した分だけ距離が離れている
> A_FAILEDを別途#defineしなければならない分だけ管理要素が増えている
なんて取るに足らない瑣末な問題だな
337:デフォルトの名無しさん
08/02/11 13:59:07
>>332の日本語訳
意味上の結合を維持したまま、処理本体とリソース管理を分離できている。
メンテナンス性を向上させるリファクタリングの典型
338:デフォルトの名無しさん
08/02/11 13:59:47
勘違いしないでほしいがgoto版との比較で>>267が駄目だという事ではなく
goto版も>>267もどちらも駄目だということ
公開関数であるhoge()から内部一式全てを一人で管理するような小さなモジュールなら
goto版でも>>267でもどちらでも問題にならないだろう。
そうでない規模ならgoto版も>>267もどちらも簡単に破綻する
339:デフォルトの名無しさん
08/02/11 14:01:14
意味不明なのは>>267のコードの
どの部分が処理本体でどの部分がリソース管理なのかが意味不明ということ
340:デフォルトの名無しさん
08/02/11 14:03:33
>>339 それは296にしか答えられない質問では?
341:デフォルトの名無しさん
08/02/11 14:07:14
>>338
つまり、巻き戻し処理のためにgotoのほうが遥かに便利という、
大元の>>199の引用元の主張は×ね。
342:デフォルトの名無しさん
08/02/11 14:08:15
initしてrollbackするだけという、中身が何もない例題じゃあなあ
343:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/02/11 14:14:32
嫌goto厨は早く>>213の実例を全否定してまわる作業に戻るんだ
345:デフォルトの名無しさん
08/02/11 14:17:04
>>336
あちこちのブロックから飛びまくるのはgotoを無秩序に使う結果
>>267で何かgotoの重要な欠点が解決されたと思う人は
343と267で何が違うのか考えてみればよい
346:デフォルトの名無しさん
08/02/11 14:21:27
>>345
そうなんだよ。>>343の//で印(w)をつけてくれた部分が重要なんだよ。
あと、#defineの行もミソだね。
こんなつまらんgotoを使わなくても関数で出口を纏めることができるという好例だ。
347:デフォルトの名無しさん
08/02/11 14:22:29
>>344
嫌goto厨?濫用を嫌う人は何人かいるみたいだけど、
gotoを全否定してる人はいないんじゃない?俺も含めて。
348:デフォルトの名無しさん
08/02/11 14:31:06
そんなつまらん実装上の理由で関数分割をしなくとも
gotoさえ使えば綺麗にまとまる好例とも言えるな
349:デフォルトの名無しさん
08/02/11 14:39:18
最近関数内関数なるものの存在を知ったんだけど、
それがあれば「関数を勝手に作れないからgoto使う」って人も、gotoなしでいけるんじゃないかな。
350:デフォルトの名無しさん
08/02/11 14:44:26
>>347
定石的な使い方すら絶対に許さないと必死になっているように見受けられるがw
351:デフォルトの名無しさん
08/02/11 14:52:36
個人的にはgotoが全面禁止でない限り>>267のようなコードは絶対書かないけどな
352:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/02/11 15:10:22
みす
>>352で参照。
まあ、専用ブラウザならレス番選択して右クリしたら見れる。
354:デフォルトの名無しさん
08/02/11 16:02:48
なんか必死なgoto厨房ががんばってるな。
実装上の都合と設計上の都合の区別もつかないとは。
まあ俺も>>267みたいなコードはまず書かないけどなw
355:デフォルトの名無しさん
08/02/11 16:11:33
>>352
breakの数が多いのはなんでなんだぜ
356:デフォルトの名無しさん
08/02/11 16:13:43
必死な嫌goto厨オツw
357:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/02/11 17:02:46
>>357
>hoge_impl()だけ切り出して巻き戻しがベタ書きというのは本能的に気持ちが悪い。
まぁハゲドウw
359:デフォルトの名無しさん
08/02/11 17:05:54
>>357
俺も
> hoge_impl()だけ切り出して巻き戻しがベタ書きというのは本能的に気持ちが悪い。
に禿同。
こんなつまらんことにgotoを使ったりはせんが。
2重breakには使うけどな。
360:デフォルトの名無しさん
08/02/11 17:31:18
>>355
whileを、breakで好きな段階で抜けられるブロックとして使うため、2度目の実行をしないためにループの最後にbreakを入れる。
これはgotoの代替として普通使ってると思うけど。
まあ、ループしないのにwhile使うのはおかしいって言う人もいるけど。
んで、while 1として無限ループにしたほうが、breakで抜けますよってのを明示できるけど、
flgを入れてみたのは、全体の流れを制御するflgだと明示しつつ、
最後にbreak入れ忘れた場合でも途中でリソース不足とか2度実行のエラーになれば抜けれて安全かなと。
361:デフォルトの名無しさん
08/02/11 17:38:15
エラー終了と正常終了を分ける場合は、主処理のブロックの最後で、breakじゃなくreturnするかな。
配列から探して何番目かを返すようなのは、エラーとNULLが逆になる。
基本だよね。
参照は
>>361
// 主処理
while(flg){
if error{
flg = false;
break;
}
return flg; // 常にtrueが返される。
}
// エラー処理
return flg; // エラーなのでfalseが返される。
362:デフォルトの名無しさん
08/02/11 17:46:24
粘着同士のレベルの低い言い争い、おわった?
363:デフォルトの名無しさん
08/02/11 17:57:38
>>360
なんで do { ... } while (false) にしないんだぜ?
364:デフォルトの名無しさん
08/02/11 18:00:24
>>237
> CPUが java のバイトコードを直接実行していると勘違いしている人が多いですね。
> javac ⇒ バイトコード ⇒ インタプリタが実行
バイトコードを実行するのはインタプリタではなくてVM(仮想計算機)だ。
つまり、インタプリタじゃなくてエミュレータな。
365:デフォルトの名無しさん
08/02/11 18:01:48
バカ亀乙
366:デフォルトの名無しさん
08/02/11 18:07:01
大域脱出に限りgotoを使うという人はgotoの宛先は常にループ直後?
367:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/02/11 18:32:13
またコイツか・・・いいかげんウザ
370:デフォルトの名無しさん
08/02/11 18:43:16
コミュニケーション能力より技術力の方が大切だと思うので
こういう議論で野次馬からウザいと思われるかどうかは気にしませんw
371:デフォルトの名無しさん
08/02/11 18:56:38
>>363
ああそんなのもあったっけ。
doではじめるとwhileに書き換えられたことがあった。
それはともかく、
前処理に失敗したら主処理を飛び越して後処理ってするとき、
処理する前に判断しないとだめだろ。
それに、break忘れのリスクもあるが、戻り値の初期化忘れっていうミスを防ぐ効果もある。
どちらかというと正常か異常かを錯誤するほうが重大なミスだから
whileよりdoがよいということはないと思う。
あと、エラーなら抜けるっていうまったく同じ目的のためのブロックだから、
前処理も主処理も同じ構文使ったほうがわかりやすいしミスしにくい。
とにかく頭使わずにミスなく書くのが目的だから。
372:デフォルトの名無しさん
08/02/11 19:00:40
>>371
>とにかく頭使わずにミスなく書くのが目的だから。
そか。俺は頭使わずにミスなく読めるコードを書くのが目的だから
gotoで書く方が読み易い場面ではgotoを使うんだぜ
373:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/02/11 19:17:57
>>364
少なくともGNUはインタプリタと呼んでいるようだ。
URLリンク(gcc.gnu.org)
>gij is a Java bytecode interpreter included with libgcj.
375:デフォルトの名無しさん
08/02/11 19:18:04
>そもそも、gotoが分かりにくくなる理由は、飛び元と飛び先に同じラベル名が出てきてどっちからどっちに飛んでるかいちいち確認が必要だからだよ。
これは凄い
376:デフォルトの名無しさん
08/02/11 19:20:54
>>361
こんなコード書くやつがいたら、殴ってしまうかもしれない。ペシペシ
377:デフォルトの名無しさん
08/02/11 19:22:58
このスレってFizzBuzzすらパスしない奴がごろごろいそう・・・
378:デフォルトの名無しさん
08/02/11 19:25:23
中身のないコードで空虚な議論
お前らヒマだな
379:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/02/11 19:30:26
goto肯定論者の俺でもこのスレのgoto厨には賛成できない
381:デフォルトの名無しさん
08/02/11 19:31:09
流れを読まずに横レス。
GOTO 使わず関数使えというのは、太古の昔、非構造化プログラミングから
構造化プログラミングへのパラダイムシフトが現在進行形だった時代の
いわば「スローガン」だと思います。
時代は移り、今は構造化プログラミングが当たり前の時代です。
そのような現在のプログラマが、私たちの先祖が使っていた GOTO 730 と
関数内部での goto FAILED; を同列に論じてしまうことに
私はいささかの疑問を感じるのです。
382:デフォルトの名無しさん
08/02/11 19:33:42
> 周りを引きずりおろすことで自分を立派に見せてのし上がろうとする暴力主義のやつら。特に福岡県出身のやつら。
なんだそのビ妙~な私怨はw
383:デフォルトの名無しさん
08/02/11 19:35:12
こっそりって。コミットログすら書かないのか携帯の開発は。
384:デフォルトの名無しさん
08/02/11 19:38:12
>>381
小さい関数ならいいが、ブクブク太った巨大関数の中でホイホイと飛ばれると
読むほうは疲れるんだよ。多重breakとか限定された状況ならまだ許せるけどな。
特に考えもせずにgoto多様する馬鹿にかぎって巨大な神関数をつくりたがる。
385:デフォルトの名無しさん
08/02/11 19:38:40
>>379
そういうやつと仕事したことないけど、そのコードだとコンパイラ警告
でるんじゃないか?B_FAILEDの行が意味を成していないとか何とか。
擬似コードにつっこむのもあれだが。
386:デフォルトの名無しさん
08/02/11 19:39:47
>>381
飛び先が一箇所ならいいと思うよ。
>>379みたいないたずらされても、ループするか飛ばすかのどっちかしかないから。
goto FAILED;とかは関数につき1回だし普通は最後に飛ぶだけだし問題になることはないからね。
>>383
証拠が残せるようなシステム使ってないから。
>>382
福岡はそういう地域なんだよ。
完成品チェックって横槍いれて完成してたら強奪。奪ったらパソコン初期化して証拠隠滅。
毎度毎度そればっかり。
完成してたら強奪→正社員
奪われるばっかりの人→派遣社員
いや、別に比喩してるわけじゃなくてね。
社員同士でもそうなんだよ。
387:デフォルトの名無しさん
08/02/11 19:41:27
それはgoto以前の問題だし因果関係が明らかに逆。
適切に関数分割できない馬鹿だから
巨大関数の中をgotoで飛び回るコードになる。
そういう馬鹿に言うべきは「処理のまとまりごとに関数に分けろ」であって
そいつに「gotoを使うな」と言ったところで
今度は巨大なネストをフラグで引き回すコードを書くだけ。
388:デフォルトの名無しさん
08/02/11 19:42:12
>>385
B_FAILED の後ろがセミコロンからコロンになっているのに注意。
君はだまされる方だな。
389:デフォルトの名無しさん
08/02/11 19:45:08
馬鹿?
390:デフォルトの名無しさん
08/02/11 19:52:16
>>388
きづかなかった・・・w
もしかしてあなたは、そういういたずらをチョコチョコやっているのではな
いかと、疑いたくなってきたなw
391:デフォルトの名無しさん
08/02/11 19:52:52
朱に交われば、なんとやら・・w
392:デフォルトの名無しさん
08/02/11 19:55:23
>>387
でもこのスレで出てきてるコード読むと、
神関数つくりそうな勢いのコードが目につくんだけど。
393:デフォルトの名無しさん
08/02/11 19:56:28
昔一緒に仕事したひとで、
「1関数にreturnは1つしか書かない」
という信念を曲げない人がいた。
その人の書いた関数は、最後にラベルがたくさんあってgotoの山盛りだった・・・
ってあれ?デスマーチスレじゃないのか、ここ。
394:デフォルトの名無しさん
08/02/11 20:02:25
>>393
そいつってオレジャネ?
395:デフォルトの名無しさん
08/02/11 20:12:00
まさかの運命の再会
396:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/02/11 20:38:38
一方、俺はfinallyを使った。
398:デフォルトの名無しさん
08/02/11 20:45:37
>>397
Cなんだよ、バーヤバーヤ
399:デフォルトの名無しさん
08/02/11 21:48:02
某スレより
569 名前:デフォルトの名無しさん [sage]: 2008/02/09(土) 16:46:29
>>566
try finallyは例外を捕まえるための機構であって、ファンクション
トレースのための機構ではない。
デストラクタでロギングするほうがよっぽどスマート。try finally
に依存したロギングよりも。そしてアスペクト指向のほうが
デストラクタロギングよりももっとスマートだといっているのだよ。
400:デフォルトの名無しさん
08/02/11 21:53:30
finallyって例外つかまえるための機構?
例外以外にもreturnとかでも呼ばれるんじゃないの?
401:デフォルトの名無しさん
08/02/11 21:57:43
C++厨かよ
402:デフォルトの名無しさん
08/02/11 21:59:16
gotoはダメだって言っているやつって、
ループ内break、continue、関数の途中のreturnとかもダメだと思ってるの?
403:デフォルトの名無しさん
08/02/11 22:01:34
>>402
少なくともこのスレではそんな主張をしているレスは見あたらないね。
で、それがどうしたの?
404:デフォルトの名無しさん
08/02/11 22:02:58
そもそもgotoはダメだという主張自体が見当たらないのだが。
できるだけ避けろ、とか、濫用するな、ってのはあるようだがな。
405:デフォルトの名無しさん
08/02/11 22:10:13
>402は脳内敵をプロファイリング中でーす
406:デフォルトの名無しさん
08/02/11 22:14:51
gotoを書く奴はスパゲティコードを書くという前時代の妄想で脳内敵を作り上げているのはどっちだか
407:デフォルトの名無しさん
08/02/11 22:15:56
重要なのはgotoを使うか使わないかじゃなくて
ちゃんとコードレビューしろよってことだ
408:デフォルトの名無しさん
08/02/11 22:21:14
>>400
> 例外以外にもreturnとかでも呼ばれるんじゃないの?
正確には、フレームが巻き戻されるのをトラップする機能。
それを利用して、例外のハンドリング(catch)や、後始末の処理(finally)の機構が
実装されている、という表現が正確。
409:デフォルトの名無しさん
08/02/11 22:24:36
その「できるだけ」とはどこまでなのかという議論をしていたんじゃ?
410:デフォルトの名無しさん
08/02/11 22:24:46
>>407
修正箇所だけのコードレビューとかなら確かにうまくいくけどさ、
何万行のソースコードをレビューで全部網羅するって、
全然うまくいったことがないな。みんなどうしてるのだろ。
ペアプロとかのがよさそうだけど、やったことないや。
411:デフォルトの名無しさん
08/02/11 22:28:34
ルール:gotoを使っている関数はコードレビューの対象とする
412:デフォルトの名無しさん
08/02/11 22:31:56
>>411
ごめん、俺「関数のreturnは必ず一箇所でやる」ポリシーもってるから、
全部レビュー対象となる^^
413:デフォルトの名無しさん
08/02/11 22:33:39
>>412
^^と書いているが俺が去年やってたプロジェクトだと笑い事じゃなくて実際そうなる。
414:デフォルトの名無しさん
08/02/11 22:36:42
具体的に言うと、gotoを使っている関数は
フローチャートおよび詳細な動作説明をドキュメントとして準備してコードレビュー。
もちろんそういうドキュメントを用意してレビュー会で説明するのは実装者。
承認となった場合もドキュメントは保管。
なので濫用する奴なんか自然といなくなる。
誰も濫用しないから何万行のレビューなんてのも実際は発生しない。
無問題。
415:デフォルトの名無しさん
08/02/11 22:41:30
goto使ってる関数だけって、、、
あほらし。
416:デフォルトの名無しさん
08/02/11 22:45:08
if と if and only if の区別も付かない奴か。
417:デフォルトの名無しさん
08/02/11 22:49:57
>>414
それだけだとgoto濫用防止だけだけど、ホカにはどんなルールをきめてるん?
418:デフォルトの名無しさん
08/02/11 22:52:23
>>414
それとさ、組み込み系だとファンクショントレース機能があるICEとか
結構効果なのだけどさ、それも全開発者に配布?
419:デフォルトの名無しさん
08/02/11 22:52:57
結構効果なのだけどさ→結構高価なのだけどさ
420:デフォルトの名無しさん
08/02/11 22:55:55
>>417
あれこれ言ったら個人特定されるでしょ
単純なのは、一関数が一定の行数を超えたらとか
for文で()の中に書く内容が「普通じゃない」とか
ちなみに>>412の理由だけでgotoを使った場合はレビューで却下だよ。
421:デフォルトの名無しさん
08/02/11 22:58:23
>>420
世の中にドレダケぷろじぇくとまねーじゃが存在しているのか考えれば、
あなたがやっていることと同じようなことをやっている人は無数にいるから、
特定なんてされないと思うぞw
422:デフォルトの名無しさん
08/02/11 22:59:17
>>421
じゃあ先に君の関わったプロジェクトで採用されていたルールを教えてくれ
423:デフォルトの名無しさん
08/02/11 22:59:32
>>420
「普通じゃない」とかの基準で、資料作成させられて説明させられる
プログラマかわいそすwww
もうちょいまともな基準作ったほうがイインジャナイ?
424:デフォルトの名無しさん
08/02/11 23:00:47
んーとね。いちいち説明しないとわからんかな。
何が「普通」かは実際には定義されているの。ここでは書かないけど。
簡単に言えばループ変数の初期化、終了条件、増分を普通に書くのが普通
425:デフォルトの名無しさん
08/02/11 23:01:39
>>423
説明するのが手間になるようなコードを書くほうが悪いと思うが。
426:デフォルトの名無しさん
08/02/11 23:01:56
>>424
「なにが普通か」の基準をきめるための努力は世の中に一杯あって、
基準めいたものもあるんじゃない?
427:デフォルトの名無しさん
08/02/11 23:02:46
>>425
え~だって、俺様基準で「普通じゃないから」っていわれて、「フローチャート」
まで用意させられるのだぜw
428:デフォルトの名無しさん
08/02/11 23:06:57
>>427
フローチャートはgotoの場合じゃないの?
forの場合には何かトリッキーな式を書いた場合に
そのトリッキーな式がなぜ必要なのかを説明する
ドキュメント+プレゼンとかそんな感じだと思うが。
429:デフォルトの名無しさん
08/02/11 23:07:59
>>427
俺様標準じゃなくて、一応条件が示されてるらしいぞ。
まあ俺には関係ない話だからどうでもいいと言えばどうでもいいが。
430:デフォルトの名無しさん
08/02/11 23:08:47
gotoに拘る人間に100k行以上の開発蓄積のある人間はいない。
431:デフォルトの名無しさん
08/02/11 23:10:11
1m行ならわからんでもないがさすがに100k行くらいは新人以外誰でも書いてるだろ
432:デフォルトの名無しさん
08/02/11 23:10:18
好意のは時代を超えて無内容さが変わらないものだな
433:デフォルトの名無しさん
08/02/11 23:10:29
>>430
goto厨のコードを読めば、それは明らかだな。
434:デフォルトの名無しさん
08/02/11 23:12:43
>>431
1本の開発で一人100k行、の間違いじゃねーの?
435:デフォルトの名無しさん
08/02/11 23:13:56
そかも
436:デフォルトの名無しさん
08/02/11 23:16:18
goto使ったら詳細資料を用意しなければならないって、
使いたいとこでも使えないじゃねぇか。開発効率悪そう。
437:デフォルトの名無しさん
08/02/11 23:18:36
>>436
goto使うだけの理由があればそれを書けばいいんじゃないの?
処理の流れをちゃんと把握できていればフローチャートだって
簡単に書けるし。
それとも実装ドキュメントの類いを一切書かない人?
438:デフォルトの名無しさん
08/02/11 23:19:10
>>429
いやさ、その根拠が多くの開発者が納得いくものであればいいが、
「goto使ったら、フローチャート描かせて、説明させる。」っていってる
ようなやつが、まともな基準を示せるとは到底思えないのよね。
439:デフォルトの名無しさん
08/02/11 23:20:17
フローチャート書ける程度のショボイ処理ならgotoいらないだろ
440:デフォルトの名無しさん
08/02/11 23:22:47
>>436
わかって使っている人にとってはその通り。
ただし、こういうレビューの目的の半分は、
将来そのコードの面倒を見る他社のために実装資料を残すこと。
それが、大人のマナー
441:デフォルトの名無しさん
08/02/11 23:24:07
>>437
だからさ、goto使うだけでフローチャート書けっていってるのは、
基準が曖昧すぎるといってるのよ。別にgotoが適切な場合もあるし、
そうでない場合もある。whileが適切でない場合もあるし、そうで
ない場合もある。
そんなこといってたら、すべてのプログラムにたいして全部
フローチャート書けという事になるわけで。
442:デフォルトの名無しさん
08/02/11 23:24:44
フローチャート(笑)
443:デフォルトの名無しさん
08/02/11 23:26:59
他社とは限らないな。自社の別チームでも何でも。
要するに、今の実装チームが未来永劫メンテするわけじゃないということ
444:デフォルトの名無しさん
08/02/11 23:29:30
>>443
せめてさ、世の中に「メンテナンス性が高いプログラム」を判別しようとする
努力があって、そのための基準が研究されている事実くらい勉強した上で
そういうこといったほうがいいんじゃない?
goto使ったらコードレビューだ!とかじゃなくてさ。
445:デフォルトの名無しさん
08/02/11 23:30:09
可読性の定量化なぞ不可能さ。
管理面でどうしても何かしたいならば。
goto使用許可を出せる権限を
誰かに付与すればイイんじゃね?
446:デフォルトの名無しさん
08/02/11 23:34:14
>>441
gotoは他の構文要素と比較して、適切に使われない場合が多いという
共通認識があるからこそ、このスレも成立していると思うんだが。
適切なgotoもそうでないgotoもあり、適切なwhileもそうでないwhileもある。
だから全部やるか何もやらないかどちらかにしろ・・・では物は作れない。
現実的な判断として、かけるコストを回収できる効果があるかどうか。
というのが常識として書いていたが、考えてみればここはマ板でなく
ム板だから学生や研究者も当然いるのか。
447:デフォルトの名無しさん
08/02/11 23:38:10
>>446
いや、あなたがいままで言ったような判断基準より、ましな判定基準を
提供するツールはあるし(商用、フリーかかわらず)、そのことすら
知らないまま、ぷろじぇくとまねぇじゃぁをやるのは周囲を不幸にするよ、
といってるだけだけど。
448:デフォルトの名無しさん
08/02/11 23:38:10
>>444
浅学にして知らなかった。ポインタを示してもらえるかな。
研究者ではないので、俺はそういう勉強は足りないと自分でも思う。
449:デフォルトの名無しさん
08/02/11 23:40:22
ところで、俺はそういうプロジェクトに開発者として関わっていたのだが
どこからプロジェクトマネージャという誤解が発生しているのかな
450:デフォルトの名無しさん
08/02/11 23:40:51
コードレビューするのは結構なことだが、
くだらない決まり作って、くだらない作業させるようなプロジェクトは、
メンバのモチベーションも低いだろ。
451:デフォルトの名無しさん
08/02/11 23:50:07
>>448
とりあえず「複雑度」でぐぐってこいw
452:デフォルトの名無しさん
08/02/11 23:51:32
人の意見に文句だけいって自分は何も提供しない人って周囲のモチベーションさげるよねw
他の人、自分のかかわってたプロジェクトではどうだったのさ。
最低限そのくらい言ったら?
453:デフォルトの名無しさん
08/02/11 23:55:58
>>452
お前は、ナニサマナンダ
454:デフォルトの名無しさん
08/02/12 00:01:22
>>451
情報感謝。そういえば、そういうのも何か使ったことはあった。
ただ、そのプロジェクトだと単にビルド時に出していただけで、
それがどう使われていたのか知らない。値が高くても低くても特に何もなかった。
その値に適当な閾値を決めてレビューとかやればいいのか?
実際にプロジェクトでどういう運用がされていて、効果がどうだったのかとか、
そういう感想もあれば是非
455:デフォルトの名無しさん
08/02/12 00:05:25
これ以上ないくらいスレ違いだな
456:デフォルトの名無しさん
08/02/12 00:07:52
>>454
閾値はあるていどキビシ目にきめたほうがいいが、実際にレビューするか
どうかは、閾値が異常な値を示しているコードがバグを良く出すとか、
新規作成のものであるかとかいう事情を加味して考慮したほうがいい。
安定して動作しているモジュールを閾値より外れているから、といって
リファクタリングしたところで新たな不具合を生み出すだけ。
目的を見失わないようにしながら、やればいい。
しかし複雑度の計測もマダマダであって、あくまで一つの参考にしか
ならないが。
457:デフォルトの名無しさん
08/02/12 00:45:08
こないだ、goto文が使われているコードを
昔作ったものから持ってった。 キー入力の評価だから
これ以上重たくしたくもない・・・というところ。
select 文二重+if文の底から出るのに breakを掛けるのは・・・
458:デフォルトの名無しさん
08/02/12 00:48:03
世の中のプロジェクトは、まだまだ、リーダーとかマネージャとか上司とかの
「コーディング規約」(訳:俺の理解できない しんきのう は使うな)
が支配的なのな。
459:デフォルトの名無しさん
08/02/12 00:53:03
分野によるが、多人数が関る(新人やアホが混じりやすい)プロジェクトでは必須
MISRA-Cとか
460:デフォルトの名無しさん
08/02/12 00:59:27
MISRA-Cってどの程度使われてるのかね
それはさておき、MISRA-Cを適用するような分野に
新人やアホが混じってるというのはガクブルだな
461:デフォルトの名無しさん
08/02/12 01:18:15
MISRA-Cは、新人やアホがまじらないための基準という意味では
まぁ有効だが、そういうやつがいない現場にとっては、無駄な
足かせにしかなっていないという矛盾がある。そして、そういうやつ
が混じらないようにする努力というのは経営陣の仕事であって、現場の
規約を固めるのはあまり意味がない。
ミスを防ぐための基準が、よけいに複雑なコードを生み出して、
逆にミスを生み出してしまうような矛盾が今のMISRA-Cにはある。
462:デフォルトの名無しさん
08/02/12 01:56:39
そういうやつがいない現場の数のほうが少ない
463:デフォルトの名無しさん
08/02/12 07:33:58
結局、まじめに処理構造を見直すのがマンドクセからgoto使うんでしょ。
gotoマンセ君は多人数での開発経験がないんじゃねーの?
464:デフォルトの名無しさん
08/02/12 08:11:19
C覚えて2-3年程度のアマチュアが「goto、ヤベーw」とはしゃいでるだけ。
465:デフォルトの名無しさん
08/02/12 11:30:23
>>463
gotoを使ったほうが可読性が高い場合に遭遇したことが無いね?
466:デフォルトの名無しさん
08/02/12 12:30:26
基本文献はクヌースのStructured Programming with go to Statementsですかね。
あと、このへんで、
URLリンク(www.cmagazine.jp)
gotoと同じくらいダメとされている手を、gotoを避けるためだけに
使ってないか? というのは良い指標かと思う。
467:463じゃないが
08/02/12 17:17:23
>>465
もちろんあるけど、しっかり考えれば考えるほど少なくなっていくよ。
468:デフォルトの名無しさん
08/02/12 17:37:19
>>466
break, continueがだめって書いてあるやつ、
使わなかったとしたらどう書く?
ちょっと想像つかない。
469:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/02/12 17:43:44
ちなみに>>469のエラーチェックを関数化したやつもあるけど、
エラーの種類ごとに動作を変えるとしたら、
結局呼び出し元でswitchでそれぞれの動作をしないといけない。
471:デフォルトの名無しさん
08/02/12 17:50:14
>>468
breakやcontinueの乱用がだめという話で、
きちんと制御構造がわけるような書き方なら問題ないのでは。
実際List37の例はひどいものだし。
472:デフォルトの名無しさん
08/02/12 19:13:37
>>461
ベテランプログラマだけのユートピアを作るのが経営陣の仕事だぁ?
アホか。
473:デフォルトの名無しさん
08/02/12 21:57:54
アセンブラ上がりのPGだが、JMP系述語+スタック使わないで
処理できて速い方法とか、日々そんなことばかり考えてる。
メンテナンス性以前に、論理的整合性が失われて美しくないから
なんて話は、俺の頭には何のことかさっぱりわからない。
474:デフォルトの名無しさん
08/02/12 22:26:11
ルール:ソースは美しくなければならない
475:デフォルトの名無しさん
08/02/12 22:35:59
美しくなくとも。簡潔で軽妙ならば
476:デフォルトの名無しさん
08/02/12 23:14:11
>>472
新人は情報学科出身で、かつ優秀じゃなきゃイラネ
477:デフォルトの名無しさん
08/02/12 23:38:18
>>469
何段抜けるかを数字で書く多段breakって糞じゃね?
478:デフォルトの名無しさん
08/02/12 23:46:47
>>469
こんなソースを新人が書いたら、確実に書き直させるな。
479:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/02/13 00:01:50
>>479
途中で、読む気がうせた
481:デフォルトの名無しさん
08/02/13 00:03:19
VBでもないし何かと思ったらUWSCって何だ
厨房スクリプト言語?
482:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/02/13 00:30:02
>>483
やっぱりだめだ・・・こういう感覚を説明して理解してもらえるかわからないが、
そのコードは「普通」じゃない。読むのがすごいシンドイ。
485:483
08/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:デフォルトの名無しさん
08/02/13 00:35:50
まだ、java はインタプリタじゃ無い、って言ってるヤツがいるみたいだけど。
中には、インタプリタじゃ無い、ヴァーチャルマシンだ、とか
もっとひどいのになると、エミュレータだ、とか、もうメチャクチャ言いたい放題・・・
ちょっと呆れたな。
これって、「モモヒキじゃ無い、スパッツだよ!」って言ってるオバサンと同じじゃん。
487:デフォルトの名無しさん
08/02/13 00:38:14
>>485
あぁなんとか理解できる。サンクスw
488:483
08/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:デフォルトの名無しさん
08/02/13 00:57:07
>>488
俺は>>488のほうがわかりやすいw
490:デフォルトの名無しさん
08/02/13 01:40:46
>>488
case 4:でsomething呼び出して
returnしてしまえばもっと見やすいと思うが。
491:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/02/13 01:50:32
>>491
コピペもウザイが、意図もよくわからんぞw
493:デフォルトの名無しさん
08/02/13 02:05:31
(ノ∀`) アチャー
984 名前:デフォルトの名無しさん[sage] 投稿日:2008/02/13(水) 01:55:45
>>981
後で困りそうですがもっと単純に解決させました。
ループ部分だけクラス内で別のメンバ関数にして飛ばして、抜けたい所でreturnさせました……。
494:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/02/13 06:20:53
>>486
釣りいいかげんうざい。
あのね、じゃあ具体的にあんたが主張するBASICのようなコードを
JavaVMのバイトコードで示してみやがれっての。できなきゃ去れ。
二度と来るな。
496:デフォルトの名無しさん
08/02/13 07:13:52
>>486
せめてJavaVM実装の書籍を1冊でいいから読破してから言え、マヌケ。
497:デフォルトの名無しさん
08/02/13 07:30:44
まあ多重break/continueは可読性を落とすね。gotoのほうがナンボかマシ。
多重break/continueもgotoも無いのがベストつーか常識だけどw
498:デフォルトの名無しさん
08/02/13 07:53:56
>>494
> やり方をググってまねしただけなんで。
やっぱりね…
そういう姿勢だからbreakでもgotoでも汚ないコードになるんだよ。
499:デフォルトの名無しさん
08/02/13 07:55:56
JavaVMのハードウェア実装を知らないんだろうな、>486は。
500:デフォルトの名無しさん
08/02/13 08:11:16
JVMについて盛り上がっている人がいるようだが、
どのJVMのことだ?sunか?
501:デフォルトの名無しさん
08/02/13 08:12:39
>>500
特定の実装の話じゃないと思うが。つーか、吊りか?
502:デフォルトの名無しさん
08/02/13 08:30:34
ハードウェア実装?
503:デフォルトの名無しさん
08/02/13 08:43:59
荒らしはスルーで > 兵共
504:デフォルトの名無しさん
08/02/13 08:53:16
picoJava のことじゃまいか<ハードウェア実装
505:デフォルトの名無しさん
08/02/13 08:58:45
Jazelleとか。
一部ソフトウエアで実行するけど。
506:デフォルトの名無しさん
08/02/13 09:05:28
いずれにせよBASICインタプリタとは大分違う罠
507:デフォルトの名無しさん
08/02/13 09:16:38
>>498
勝手な思い込みで変更する馬鹿よりましだよ。
ぐぐったら出てくるけど、作業をしているか通信をしているかをチェックするんだって。
通信が完了してから作業をするだろうけど、作業が新しい通信を要求するかもしれないだろ。
どんな流れになるかはWebサイトの作り次第だし、テストするには通信帯域を制限したり・・・
コードの流用するならそれが確かに動くかテストするべきだが、
自分でテストできないなら基本的には信用することが必要だ。
508:デフォルトの名無しさん
08/02/13 09:25:01
busyだけだとフレームのページで途中で抜けちゃうって話がどっかにあった。
まあレイアウトが自由にできる今はフレームなんか使ってないだろうけど。
ReadyStateだけの場合は↓。
つまり両方のチェックが必要。
URLリンク(hpcgi1.nifty.com)
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:デフォルトの名無しさん
08/02/13 10:21:31
>>507
> コードの流用するならそれが確かに動くかテストするべきだが、
> 自分でテストできないなら基本的には信用することが必要だ。
唖然・・・
おまえみたいのはgotoを絶対に使うべきじゃないし、
そもそもプログラミングをするべきじゃない。
510:デフォルトの名無しさん
08/02/13 10:24:35
同意
511:デフォルトの名無しさん
08/02/13 10:25:49
>>509
なに俺様は完璧とか言ってんの?
512:デフォルトの名無しさん
08/02/13 10:58:49
そもそもコードは、誰が書いたものでも信用できない。
513:デフォルトの名無しさん
08/02/13 11:10:41
自分自身が書いたコードすら信用できないorz
514:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/02/13 14:33:20
長文とかどうでもいいからベンチの結果ひとつでも(張|貼)ってくれ
516:デフォルトの名無しさん
08/02/13 14:39:27
無茶言うなよ。java と basic と php とベンチで比べて何の意味がある?
517:デフォルトの名無しさん
08/02/13 14:43:13
>>514
> これは { } によって確保したスタックの管理がくずれるから。
今時、そんなソースコードにべたべたのインタプリタなんて珍しいわ。
コンパイラや、ソースコードを一回全部なめて、内部構造に
するようなインタプリタなら、ローカル変数のアクセスのために、
処理系はスタックの現在のオフセットを常にわかっている必要がある。
だから、ジャンプ元とジャンプ先でスタックのオフセットがずれるなら、
そのぶんをジャンプの直前か直後に調整して終わり。難しい話じゃない。
Javaのバイトコードを示していただきたいなぁあなたにも。
(あ、Rubyのブロックはクロージャだから別物ね)
518:デフォルトの名無しさん
08/02/13 14:47:17
gotoでforループの中に飛び込もうとするコードを
はじめて見たときはびっくりしたわ
519:デフォルトの名無しさん
08/02/13 14:51:06
というかスタックの奴等こっちでやれ。goto関係ないし。
スレリンク(tech板)l50
520:デフォルトの名無しさん
08/02/13 15:05:50
>>514はN88BASICでブイブイ言わせているビルゲイツ
521:デフォルトの名無しさん
08/02/13 15:10:52
MS-DOS版N88日本語BASIC(86)コンパイラー
ナゲー
522:デフォルトの名無しさん
08/02/13 17:02:48
このすれは「どうして1たす1は2なの?どうして?どうして?」って言いそうな連中ばかりだな。
523:デフォルトの名無しさん
08/02/13 17:07:13
コンピュータの気持ちになってみると 1 + 1 は 10 です
524:デフォルトの名無しさん
08/02/13 17:15:51
>>523
ここでコンピューターの気持ちで会話してきてください。
できれば↓のスレの書き込みの翻訳してくれるとありがたい。
1101011 1100001 1101001 1110111 1100001
スレリンク(prog板)
525:デフォルトの名無しさん
08/02/13 17:56:17
goto師はどこいった
526:デフォルトの名無しさん
08/02/13 18:30:05
回線の問題というか、pingでtimeoutでまくり
527:デフォルトの名無しさん
08/02/13 19:08:23
>>518
コーヒーふいたじゃねーかw
どんなコードかちょっと気になるw
528:デフォルトの名無しさん
08/02/13 19:25:24
直接gotoを使ってはいないが、
ループの中にswitch-caseで飛び込むコードって奴があるな。
Duff's device でググると出てくる。
(CGの人ならPorter-Duff operatorのDuff氏とか言うと、へーとか思うはず)
529:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/02/13 20:15:51
どのみち、天才の考えることは凡人には理解できないのでメンテ不可ですわ。
531:デフォルトの名無しさん
08/02/13 20:21:51
>>514
いいからJavaVMの実装本を読めって。
自分がどんなに時代遅れな発言をしているか
よーくわかるから。
532:デフォルトの名無しさん
08/02/13 20:34:59
>>514
> goto 使うやつに比べれば、「do ~ while (false)」 や 「switch ~ break」 を使うなど、
> トリッキーなコード書いて得意満面になってるキチガイよりよっぽどマシだ。
日本語に訳すと、
1+1を3と言うやつに比べれば、2+3を6と言う奴や3+1を2と言って得意満面に
なっているキチガイよりよっぽどマシだ。
といったところか。そんな>>514に良い言葉を教えてあげよう。
目糞鼻糞、どっちも糞。
533:デフォルトの名無しさん
08/02/13 20:50:16
今老舗特集やってるけど、昔からの技術をそのまま受け継いで応用することで普通の工業機械では作れないものを作れてるってさ。
確かに技術は進歩してるし、クソなコードは多いが、よい結果を出しているものはよい方法かもしれない。
紙すきのでやってたけど、手作業を機械でやることで品質の安定したものを大量に低コストにやってるが、
技術の開発は道具こそ工夫するものの人間が手でやっている。
プログラミングで自動化機械といえば、ソースコードのコンパイルとかスクリプトでの作業。
機械設備はコーディングをサポートしてくれる開発環境とかライブラリ。
そういうのを駆使して効率よく新しいものを作るのがプログラマの仕事。
決まりきったやり方が正しいのか最適なのかたまには見直してみるのもいいが、
基本はそれをまねしてやることだ。
何もかも完璧に分かってないといけないとか言ってたら時代の波に飲まれておしまいだ。
534:デフォルトの名無しさん
08/02/13 20:59:14
>>533
先人のコードをまねることは大切だ。
だが、自分のプログラムに応用する時には
そのコードをしっかり読んで動作を理解してから。
これができない奴はプログラムを書くべきではない。
535:デフォルトの名無しさん
08/02/13 21:00:03
つーか、>>494、かなり必死だなw
536:デフォルトの名無しさん
08/02/13 21:04:10
>>534
習うより慣れろだ。
正しいか間違ってるかは、うまくいくかいかないかで判断しろ。
537:デフォルトの名無しさん
08/02/13 21:08:24
ひょっとして、>>469がうまくいってる例だと思ってる? まさかな。
まあ、少なくとも元のコードの動作を理解できるまでは、
それを使ったコードを人様に見せるのは止めたほうがいい。
538:デフォルトの名無しさん
08/02/13 21:09:18
>>536
> 習うより慣れろだ。
> 正しいか間違ってるかは、うまくいくかいかないかで判断しろ。
仕様に照らして、な。
「実は実装依存」なコードを量産されるよ?
539:デフォルトの名無しさん
08/02/13 21:09:43
>>529
そりゃmemcpyがコンパイラに組み込まれてたんじゃね?
そういう場合、libcのmemcpyは関数ポインタ取るためだけに用意されている。
540:デフォルトの名無しさん
08/02/13 21:18:43
>>537
しっかり動いてますが何か。
テスト済みですが何か。
541:デフォルトの名無しさん
08/02/13 21:29:23
論破されて窮地に追い込まれると、
「関係ない話は別のスレでやれ」 とか
「~の本を読め」 とか言って相手を囲いの外に追いやろうとする
典型的な厨房の集うスレはここですか?
542:デフォルトの名無しさん
08/02/13 21:46:36
>>539
コピーするサイズに応じて、最適なコードをそれ専用に生成するってこと?
543:デフォルトの名無しさん
08/02/13 21:56:02
>>540
動けばいいと公言する奴のコードに限って実は動かないんだよ。
どうせ自分で何回か使ってみただけなんでしょ?
これだから、ゆとり世代は・・・
544:デフォルトの名無しさん
08/02/13 21:58:53
>>540
まさかとは思ったが、本気で>>469がうまくいってる例だと思ってるのか。
このスレのgotoを恐れずに使う兵共にとっても>>469は糞コードだぞ。
545:デフォルトの名無しさん
08/02/13 22:00:21
>>543
「動く」と胸を張っていえるからリリースするもんだろ。
それが動かなくなるのがバグだろ。
バグに遭遇したことないやつが存在するんなら確かにそういえるかも知れんな。
546:デフォルトの名無しさん
08/02/13 22:05:31
gotoの弊害はむしろ保守性の低さだろ
自分だけが使う書き捨てのプログラムなら別に>>469の糞コードでも良し
547:デフォルトの名無しさん
08/02/13 22:07:59
>>545
それがさあ、「動けばいい」って奴はロクなテストやってないのが相場なの。
大抵、自分の手元の環境で数回から数十回動かしてエラーが出なきゃOKって程度のテスト。
特に最近のゆとり君は適当にググってきたコードをコピペするからひどい。
何故動くのか理解しないまま数回動かしただけで「動きました」とか言い出す。
もうアフォかと。
548:デフォルトの名無しさん
08/02/13 22:30:31
>>547
テストしてないのを問題視するのはいいとして、テストもせずに駄目出しするのもどうかと思うが。
549:デフォルトの名無しさん
08/02/13 22:32:06
>>547
テストしてないのを問題視するのはいいとして、テストもせずに駄目出しするのもどうかと思うが。
550:デフォルトの名無しさん
08/02/13 22:35:55
>>548 テストしていないものは駄目出しされて当然だろう
551:デフォルトの名無しさん
08/02/13 22:38:01
>>550
テスト済みと書いてる字が読めないならプログラム組むな
552:デフォルトの名無しさん
08/02/13 22:42:02
>>551
へー、どんなテストしたの?
ちゃんと異常系までテストした?
553:デフォルトの名無しさん
08/02/13 22:44:15
>>552
どんな異常だよ
554:デフォルトの名無しさん
08/02/13 22:47:37
例えば
>>494
> > 「2回」ループする意図
> ADSLで瞬間的に切断される場合、数秒後に再度アクセスしたら接続される場合があるので。
のあたり、実際に切断された場合の回復処理で正常にアクセスできたことを
切断時間などを変えながら複数の状況でテストしたのかい?
切断された後、一旦回復してすぐまた切断される状況は?
555:デフォルトの名無しさん
08/02/13 22:51:54
>>469って、「多重continue、ヤベッーw」なワナビー風味だね
556:デフォルトの名無しさん
08/02/13 22:58:51
>>554
再表示で接続できることは経験的に知っているし、
規定回数全部で接続できなかった場合でもエラーで中断するし、
中断した場合も呼び出し元からやり直すだけだし。
回復して切断したらって話だが、
REPEAT; sleep(0.1); UNTIL !IE.busy AND IE.readystate = 4
これを実行した後には、接続できたかできなかったかのどちらかしかない。
もちろん不完全な取得を完了とした場合、その先で実行できないってだけだが、
実行できなかった場合も呼び出し元で再チャレンジするし。
557:デフォルトの名無しさん
08/02/13 23:00:25
>>556
つまりテストしてないわけね。よくわかった。
558:デフォルトの名無しさん
08/02/13 23:07:59
>>557
自分で切断はしてないけど切断があったことはログでチェックしてるよ。