つ、つい Goto文を
■ このスレッドは過去ログ倉庫に格納されています
0001下っ端PG
NGNG楽な時あるしね。
0002デフォルトの名無しさん
NGNGgoto C;B:
goto D:C:
goto B:D:
goto A:C:
書いてて自分でわからなくなった。
0003デフォルトの名無しさん
NGNG「だからさあ、Cにタグ付きブロックとunwind-protectがないのが
いけねえわけよ。言語仕様に不備があるんだからしょうがないでしょ」
使ってどうなるかは責任持ちません。
0004デフォルトの名無しさん
NGNGなんかよくわからないですけど
goto label;
...
{
label:
...
...
}
こんなの?
0005デフォルトの名無しさん
NGNG(block tag
(foo)
(return-from tag)
(bar))
ってな感じ(用語とかは間違ってるかも)で指定したブロックから抜けられるの。
Cのbreakと違ってtagを指定できるから、
ブロックが入れ子になってても抜けたいブロックから抜けられる。
unwind-protectは__try/__finallyといっしょ。
0006デフォルトの名無しさん
NGNGfuncA()
{
infunc(){・・・};
・・・
infunc();
}
0007デフォルトの名無しさん
NGNGfuncA()
{
struct in{
static void func(){・・・};
};
・・・
in::func();
}
00084
NGNGなるほど。
じゃあ逆にブロックへ入っていくことは出来るんですか?
(goto-block tag)
(hoge)
(block tag (foo) (bar))
とか。。。。。よく考えれば、この機能はいらないですね。。。
0009デフォルトの名無しさん
NGNG0010デフォルトの名無しさん
NGNG0011デフォルトの名無しさん
NGNG「goto 札? 幻のニセ札といわれたアレか」
0012デフォルトの名無しさん
NGNG0013デフォルトの名無しさん
NGNG0014デフォルトの名無しさん
NGNG0015デフォルトの名無しさん
NGNGreturn;使えないから、最後に、End:とかいうラベル作るしか方法なくない?
それとも例外を投げるべきでしょうか?
0016>15
NGNG0017>15
NGNG0018デフォルトの名無しさん
NGNGこれ、なんか目ウロコな感じなんだけど、どう?
0019デフォルトの名無しさん
NGNG002018
NGNGこの場合だと関数内関数から外側の関数の変数は見えないんだよね。
目ウロコでも無かったか。
0021デフォルトの名無しさん
NGNG0022デフォルトの名無しさん
NGNG0023デフォルトの名無しさん
NGNG0024デフォルトの名無しさん
NGNG0025デフォルトの名無しさん
NGNG0026震度3
NGNG0027デフォルトの名無しさん
NGNG0028デフォルトの名無しさん
NGNGちなみにBASIC以外では使ったことがありません
あっそういえば何かの間違いでCに紛れ込ませたことがあったような気も…
0029デフォルトの名無しさん
NGNG0030goto 禁止令!
NGNG0031デフォルトの名無しさん
NGNG0032デフォルトの名無しさん
NGNG0033デフォルトの名無しさん
NGNG0034デフォルトの名無しさん
NGNG(例外は便利だな)
0035デフォルトの名無しさん
NGNG0036デフォルトの名無しさん
NGNG0037デフォルトの名無しさん
NGNGバカだね
簡単にgotoなしで書けるのに、わざわざgotoを書く馬鹿をどうかしてくれ
ま そいつはgotoつかわないとプログラムかけないみたいだけど
はやく辞めてほしいね
0038デフォルトの名無しさん
NGNG{ block top;
while () {
if ()
break; // 普通のbreak
while () {
if ()
break top; //nest break
if ()
break; // 普通のbreak
}
}
}
この例はあんまり良くないけど。
0039デフォルトの名無しさん
NGNGTOP:{
while () {
if ()
last; // 普通のbreak
while () {
if ()
last top; //nest break
if ()
last; // 普通のbreak
}
}
}
0040デフォルトの名無しさん
NGNG0041デフォルトの名無しさん
NGNGA->B->C->・・・
って言うパターンでおのおのの状態で「戻る」をサポートしたいとき
goto使うのが最も簡潔にかけるし、バグも少ないと思う。
0042デフォルトの名無しさん
NGNGそれはモジュールの分割がきちんとできていないだけ
0043デフォルトの名無しさん
NGNG0044デフォルトの名無しさん
NGNGモジュールがどうして関係あるのだ?
004542
NGNGん?A,B,C…をそれぞれのモジュールに分割しておき
あとは、それを状態遷移の形に書けば最も簡潔かと思いますが…
もしかして、私が何か勘違いしている?
0046デフォルトの名無しさん
NGNGおれもGOTOより 7の方がきになる。
004741
NGNG多いはずです。Aでディレクトリ指定してBでなんとかとか。
完全にABCを分割してしまうとこの情報のやり取りが大変になります。
次に上から下に流れ1つ戻るをサポートするだけの簡潔なものになぜ
状態遷移を使ってわかりずらくしなくてはならないのか。というのが
第2点。
それに付随して私は状態遷移を簡潔に表現できるプログラミングテク
ニックを知りません。(GOTOを使うのに比べて)
A:
if (showDialogA() == CANCEL){
return;
}
B:
if (showDialogB() == BACK){
goto A;
}
C:
if (showDialogC() == BACK){
goto B;
}
これより簡潔に書く方法があるのですか?
0048>47
NGNGstate = A;
for (;state != END;) {
switch (state) {
case A:
if (showDialogA() == CANCEL) state = END;
break;
case B:
if (showDialogB() == BACK) state = A;
break;
case C:
if (showDialogC() == BACK) state = B;
break;
}
}
return;
004947
NGNG俺はそっちのほうがメンテしたくない。
47なら A->B->C と流れることは自明だが(言語が上から下に流れ
ることを保証してくれているので)
48はその情報が失われている。
なんで47をメンテしたくないのか理由があるのなら聞かせて欲しい。
005047
NGNGこういうバグが生まれやすいって言う非常にわかりやすい例をありがとう
0051デフォルトの名無しさん
NGNG一本道のウィザードで、各ダイアログの処理が単純ならともかく、ちょっと
複雑になると破綻するのが目に見えてる。それだと分岐が発生した時点で、
見通しが極度に悪くなるし、変数スコープが必然的に広くなってしまうのも
バグの温床になる。
0052デフォルトの名無しさん
NGNGで、そういう場合の話なのだが。
それにダイアログの処理がどんなに複雑でも関係ないと思うぞ。
それこそ適切にモジュールを分ければすむ話だ。
変数スコープはよくわからん。なぜ必然的に広くなるんだ?
005342
NGNG共有する必要がある変数は構造体1つにまとめ、
そのポインタを受け渡しする手段をとります。
あと、状態遷移で処理させるときには>>48のような方法ではなく
関数へのポインタの配列の方が幸せになれるかと。
ただ次状態への移管がそのモジュールに含められるのならばですが。
それと47のコードの場合、たとえば仕様変更でBの入力内容
によってC1,C2、C3の処理に分かれる場合、または、
Cの処理を行わずに次状態のDに行く場合工数が高くつきませんか?
48がメンテしたくない理由ってのはこの辺にあると思いますが…
#最初で手を抜くと、あとあと血を見るのがこの業界ですから…
0054厨房
NGNG少なくとも、Windowsの場合、処理したらメッセージループを
戻さなければならないから。
47>>さんの方は、普通の、 DOS UNIX のプログラムになるのかな。
実質、求めているものが違うと思う。
005547
NGNGさっきも書いたけど、一本道って言うのは前提ね。
CをやらずにDに行くのは問題ない。単にCをやらなければいい。
たとえばBはインストールパスを必要としてCがミニマムインストールか
どうかの情報を必要とするとする。
構造体にパックすると言うのはCにインストールのパスを渡すと言うことで
モジュール化の原則からいえばよろしくないと思うぞ。
>>54
思いっきりWindowsで(少なくともMFCなら)動くぞ。
005648
NGNG直すんなら最初の文を nextstate = state = A;に変更
各state = {END,A,B};の所をnextstate = {END,A,B};に変えて
switch文の次に↓の文でも置いてくれや
if (state == nextstate) { /* 状態変化なし */
switch (state) {
case A:state = B; break;
case B:state = C; break;
case C:state = END; break;
}
nextstate = state;
} else {
state = nextstate;
}
0058厨房
NGNGWM_TIMER とかで、処理の分岐で使う手だと思ったから。
鬱だ死のう。
0059デフォルトの名無しさん
NGNGそれは教えたらだめです
情報系の大学いくか
講習会で高いかね払わないと教えてもらえません
006047
NGNGもちろん状態遷移使ったって実装できる。でも47のほうが簡潔だろ?
0061デフォルトの名無しさん
NGNGプログラムの発想がまったく違ってるだけですよ
while(showDialogA() != CANCEL){
while(showDialogB() != BACK){
while(showDialogC() != BACK){ }
}
}
0062デフォルトの名無しさん
NGNG別にいいんじゃないの?
刑事バーンに貼れるくらいのコード規模ならGOTOのほうが簡潔に見える
だろうしね。
当方ゲームプログラマで遷移は複雑だし、各状態で書く量も多いし、仕様変更も
多いので、gotoだけで押し通すのは難しいです。
GOTOで押し通せる規模より大きくなってきたときは、さっさと状態遷移に書き直す
(リファクタリングする)。それまではGOTOでラクをする、で良いのでは?
0063デフォルトの名無しさん
NGNG1. djb
2. knuth
あとだれかいる?
0064デフォルトの名無しさん
NGNGせめてcallしろっていうか。
>刑事バーンに貼れるくらいのコード規模ならGOTOのほうが簡潔に見える
んだんだ。それだけのことだ。
ウィザードの仕様が変わるのでGOTOの飛び先直してね!なんてな
話になった暁には、俺なら泣くよ。
>流れることは自明
そういう「局所的な自明」に依存するコーディングは
避ける癖つけようね。そういう部分は「簡単に直せる」んだから。
しわよせ(?)は直しにくいところより直しやすいところに置くべし。
HotSpotって奴か。
>47>>さんの方は、普通の、 DOS UNIX のプログラムになるのかな。
俺、UNIXでも書いているが、そんなコード嫌だよ。
うーん。
今回の例だとStateパターンかなんか使うほうが
メンテ性上がるんでねーか?
state=hogehogeって書くやりかたは、
Stateパターンの御先祖様という意味で、賛成。
006547
NGNGウィザードとかインストーラー作ったことある?
基本的に上から下。戻るをサポートとっていうのは変わらんと思うん
だけど。
>ウィザードの仕様が変わるのでGOTOの飛び先直してね!
状態遷移使おうが同じだろ?
「ウィザードの仕様が変わるのでSTATE先直してね!」
状態遷移ってのはGOTOと同じくらいバグの元だぞ。
61みたくするのがGOTO反対派の主流であるべきだ。
で>>61
それが見やすいってなら異論はないが俺は47のほうがわかりやすい。
特にステップが10個くらいになると特にね。
006661
NGNG61では上から下へ流れていくイメージはちょっとでませんね
状態遷移を使うのが基本ですがこれは有料です。
というのは冗談ですが
状態遷移は、きちんと設計しないとバグのもとです。
きちんとした、状態遷移というのがなかなか作れないのですが
できるようになると、かなり修正の楽なプログラムになるです。
今日できることは今日のうちにやれ
帰納できることは帰納でやれ
状態遷移でできることは、状態遷移でやれ
とかいうことわざなかったかな。
0068デフォルトの名無しさん
NGNG0069デフォルトの名無しさん
NGNG0070デフォルトの名無しさん
NGNGfor(j=0;j<N;j++){
for(k=0;k<N;k++){
for(l=0;l<N;l++){
for(m=0;m<N;m++){
if(flag){goto esc;}
...
}
...
}
...
}
...
}
...
}
esc:
...
こういうときいちいちbreakで戻るのって信じられないんですが。
0071デフォルトの名無しさん
NGNG0072デフォルトの名無しさん
NGNG0073名無しの名無しさん
NGNG0074デフォルトの名無しさん
NGNGそれは、設計自体が間違っているかと思われ…
0075デフォルトの名無しさん
NGNG0076デフォルトの名無しさん
NGNGthrowしたまえよ。
(catch 'いやん
[(((((((((((((((((((throw 'いやん 'ばかん))]
)
=>ばかん
0077デフォルトの名無しさん
NGNG0078デフォルトの名無しさん
NGNG0079デフォルトの名無しさん
NGNGやすいからでそ。どんな変な流れでも作れちゃうから。
で、GOTOを使わないと作りにくいような流れは設計が適切でない
可能性がある、とまずは考えるのが普通。
例外時のcleanup処理とか一部確かに有効な時もあるけど。
0080デフォルトの名無しさん
NGNG0081名無しおやぢ
NGNG銀行GOTO
・・・寒過ぎ・・・。 (-_-;
卯津田士農・・・。
0082デフォルトの名無しさん
NGNG0083デフォルトの名無しさん
NGNG0084デフォルトの名無しさん
NGNG0086デフォルトの名無しさん
NGNG寒いのは構わないが、ageるんじゃない。
0087デフォルトの名無しさん
NGNG0088デフォルトの名無しさん
NGNG0089デフォルトの名無しさん
NGNG#あおりじゃなくてほんとに興味あり
0090地盤賃か
NGNG0091デフォルトの名無しさん
NGNGどれが正しいってのはありえないから宗教論争になる。
これ以上議論してても堂々めぐりになるだけだよ。
C言語の括弧の位置はどこにする?って話題みたいに……
0092デフォルトの名無しさん
NGNGcmpとjmp(if文とgoto文)だけに
なってしまうんだよプログラムてのは、
ということを逝っているの?
0093デフォルトの名無しさん
NGNGジャンプできないんだから、そんなに危険はないと思う。
でも世の中にはGOTOアレルギーの人がいて一回でも使うとうるさく騒ぎ立
てるから、実際に使うことはないんだけど。
0094さらし信者
NGNG0095デフォルトの名無しさん
NGNG0096つまんない
NGNG0097デフォルトの名無しさん
NGNG0098デフォルトの名無しさん
NGNG■ このスレッドは過去ログ倉庫に格納されています