投稿
ねこはち neko80001
ちょっと疑問なのですが、whileやuntil等の繰り返し系の制御の中からGOTOで抜けた場合、それらの状態を保っている内部処理ってプログラム終了まで生きたままなのでしょうか? 今のところ使ってる分には挙動に影響がないのですが、なんとなく気持ち悪い感じがしますよね?
6そうだね
プレイ済み
返信[1]
親投稿
ASA fusuian
そこ、僕も気になってWHILE文からGOTOで抜けるテストプログラムを走らせてみましたが、数分ほっとくくらいでは落ちませんでした。 普通に使う分には問題ないようです。 サブルーチンのFOR〜NEXTからRETURNで抜ける書き方は、昔のBASICでは禁じ手でしたがmk2ではオーケーなので、そのあたりは対応がされているのだと思います。
2そうだね
プレイ済み
返信[2]
親投稿
誤動作防止の為にちゃんとWHILEとWEND、FORとNEXTなどは完結させた方がいいかと。 洗面所の蛇口の水を止めないまま出て行ってしまう気分です。
1そうだね
プレイ済み
返信[3]
親投稿
ねこはち neko80001
>>ASAさん なるほど、数分回しても影響がないって事は、何かを保っている感じの処理ではないって事ですかね 単純にラベル+IFで回しているのと同じ処理をしているのかな? >>みけらんジェロさん そうですね。BREAKでも説明文に”強制的に”って一語があるだけで使うのを嫌ってしまいます 一本の流れの上の処理ってのは、リストを眺めていると気持ちいいですからね
0そうだね
プレイ済み
返信[4]
親投稿
1段だけなら、BREAKで抜けられますが、ネストが深い場合は、GOTOを使った方がすっきりするような気がします。
1そうだね
プレイ済み
返信[5]
親投稿
ASA fusuian
蛇口はSmileBASICが締めてくれているのだ、と考えていますが、他の処理系で困る可能性はありますね^^; 僕のミニゲーム程度なら、ゲームのメインループを抜けること即ゲームオーバーなので、WHILE 1ループからBREAKで書いちゃいます。
1そうだね
プレイ済み
返信[6]
親投稿
ねこはち neko80001
>>コータさん 抜けた瞬間に状態を開放してくれているのが明確に解っていればそれもアリだと思いますが、見えてない部分で何をしているのかを考えるとなんだかモヤモヤした気分になります
0そうだね
プレイ済み
返信[7]
親投稿
通常は大丈夫なはずです。(バグでないかぎり) ただFORやWHILEとかのループからは出来るだけBREAKで抜ける方がいいですね。でもRETURNも別に普通ですよ。 GOTOに関してはコータさんの言うような限定されたパターンで使用するのがベストですが、ケースバイケースなのとBASICなので個人的にはソースがわかりにくくならない範囲であれば許容範囲かなと思ってます。
1そうだね
プレイ済み
返信[8]
親投稿
ねこはち neko80001
>>ASAさん 高級言語のモヤモヤ感は親切設計から生まれるってやっと気付いたよ!
0そうだね
プレイ済み
返信[9]
親投稿
6段のFORループを作って、最深部から10000000回脱出を試みましたが、特に問題は発生しませんでした。ちなみに、これらの外側はREPEAT/UNTILでループさせました。
1そうだね
プレイ済み
返信[10]
親投稿
ASA fusuian
ループをGOTOで抜けると、やっぱり蛇口はちゃんと締めてくれるようです。 (サンプルは二つめのWENDでエラーになる)
1そうだね
プレイ済み
返信[11]
親投稿
ちなみに多重ループからGOTOで一気に抜けるのは、GOTOが極端に嫌われているC言語などでも唯一の例外としてアリとするという考え方もあるようですよ。
1そうだね
プレイ済み
返信[12]
親投稿
ねこはち neko80001
ふーむ。どうしてもコードが思いつかない場合にはGOTOで抜けるのもsmileBASICだからと割り切れればオッケーみたいですね
1そうだね
プレイ済み
返信[13]
親投稿
bigslope bigslope
「WHILE~WENDの中に入った時点で、自分がループの中にいるってフラグを立てているのかな?」と思って、ちょっとこんな実験を。 GOTOでループを抜けた場合、フラグが解消されないのだとしたら、下のBREAKの所に来た時点で、WENDの直後まで逆戻りする(そして2回目のBREAKでエラーになる)はず。 実際は、BREAKがSyntax Errorになるので、最初に構造のチェックを行い、それで問題が無ければ実行するという事を行っているだけで、フラグ立てはやっていないみたいですね。
1そうだね
プレイ済み
返信[14]
親投稿
おかっぺ Japanese_WASABI
とても勉強になりました。 そして、このあとも話題が続くなら読みたいので、コメントさせて頂きました。
1そうだね
プレイ済み
返信[15]
親投稿
けい kei0baisoku
mk2の初心者講座で「FOR文からGOTOで抜けるとメモリリークを起こす」とはっきり書かれていたのでこの組み合わせだけは避けていましたが、コータさんの検証結果を見ますと3号では解消されたようですね。 Cでも、多重ループから抜ける目的の時だけはGOTOの方がスッキリしますね。そのような状況が意外と滅多に無いですが。
1そうだね
プレイ済み
返信[16]
親投稿
ASA fusuian
昔のBASICのGOTOがマズかったのは、行番号全部が飛び先になる仕様のせいだったと思うのです。 行番号が廃され、飛び先としてラベルのみを指定するプチコンでは、昔ほどのスパゲッティにはならないはずなんですよ。 mk2時代はENDIFがないせいでねじれたコードを書く場面もままありましたが^^;
1そうだね
プレイ済み
返信[17]
親投稿
ねこはち neko80001
>>bigslopeさん 単純にコンパイル時にWENDやBREAKを見つけたら直前のWHILEを探して、分岐処理を置く、みたいな事なのかもしれませんね これだとフラグいらないですし
0そうだね
プレイ済み
返信[18]
親投稿
ねこはち neko80001
もしかしたら、昔からの刷り込みで自分に縛りをかけているってだけの事なのかもしれませんね エラーが出なけりゃそれでいいじゃん!って考えられるくらい大物になりたいです…
1そうだね
プレイ済み
返信[19]
親投稿
べー mmmggg
こんな風にFORに行かないでのNEXTも動くので、只のSTEP+GOTOと同じ処理なんでしょう
1そうだね
プレイ済み
返信[20]
親投稿
てらこや actorbug
ループ内にGOTOで飛び込んでもエラーにならないことから推測すると、最初にプログラムを読み込んだ時点でFOR-NEXTなどの対応を取った上で、内部的にIFとGOTOに書き換えているのだと思われます。
2そうだね
プレイ済み
返信[21]
親投稿
ゆうたん yu-tan-sama
ループなら特別なことはやってないと思うなぁ 内部的にはgotoと同じでいいはずだし、何かフラグ的なものが必要でもグローバル変数みたいに静的に持つだけでいい プチコンで危険なgotoの使い方ってなると… gosubで飛んでからreturnを使わずgotoで戻るとか?(できるのかな?)
1そうだね
プレイ済み
返信[22]
親投稿
ねこはち neko80001
ループに限らず、プチコン3号の処理がどうなっているのかを推測しあうだけでも、下手なADVゲームより面白いですね これで1000円って安すぎ!
1そうだね
プレイ済み
返信[23]
親投稿
最近ちょっと思うんですが、内容の割には1000円って破格ですよね。でもこういう系のソフトは万人に受けるわけではないので、そんなに売れてないかもしれないので、そうなるとスマイルブームさんは大丈夫かと少し心配になったりもします(^^;
2そうだね
プレイ済み
返信[24]
親投稿
けい kei0baisoku
割りと真面目に、経産省から補助金とか出てもいいんじゃないかと思うんですよねー(´з`)
2そうだね
プレイ済み
返信[25]
親投稿
おちゃめ ochame_nako
スタック用のメモリが減っていくのでそのうちStack overflowになりますが、同じFORやREPEATやWHILEを何度実行してもスタック用のメモリは消費されないためGOTOで抜けても問題はないと思います。 大量のFORやREPEATやWHILEを実際に記述しない限りは大丈夫でしょう。
1そうだね
プレイ済み
返信[26]
親投稿
UDADTO udamasahisa
僕はそもそも、FOR~NEXT文にも限らず、WHILE~WEND文・REPEAT~UNTIL文でGOTOを使いませんね。そういえば、あまり気にしてなかったな…。
1そうだね
未プレイ