簡単な事でトピックを立てて申し訳ないです。
Dxライブラリでゲームを作っています。
ゲームプログラム内の処理で、switch文を使っているのですが、終了処理でメイン関数ソースコードの最後に記述した
DxLib_End関数を通らせたい場合、goto文でswitch文外のDxLib_End関数直前にジャンプしてもいいものでしょうか?
goto文はできるだけ使わないほうがいいと聞いたのですが。
switch文内のgoto文について
Re: switch文内のgoto文について
いいですよ。ふぅ さんが書きました:ゲームプログラム内の処理で、switch文を使っているのですが、終了処理でメイン関数ソースコードの最後に記述した
DxLib_End関数を通らせたい場合、goto文でswitch文外のDxLib_End関数直前にジャンプしてもいいものでしょうか?。
自分のプログラムですから、自由気ままに書けばいいんです。
「できるだけ使わない方がいい」と、「使ってはならない」は別物です。ふぅ さんが書きました:goto文はできるだけ使わないほうがいいと聞いたのですが。
goto 文が嫌悪される1番の理由は、処理がぶつ切りになってしまう事です。
特に、前方・後方両方への goto 文が混在する場合、処理を追うのも一苦労です。
また、ローカル変数の内容の遷移を追いかけるのにも、大変な思いをします。
こういった理由により、バグを埋め込みやすくなる、プログラムの堅牢性にダメージを与えやすい、可読性の低下を招く。
といった事が起こりえます。
だからと言って、使ってはならないというのは、少々乱暴な物言いだと思います。
用途を限定して注意深く使えば、非常に便利ですし、goto 文を使わずに書くよりも、スマートに書けることもあります。
例えば、エラー処理などで、それまでの処理を破棄して、一気に関数の最後までジャンプする。 等ですね。
今回の例は、その典型例だと思いますよ。
goto 文が本当に必要な局面というのは、そうそうありませんが、それが良いと思うのであれば、好きにしたらいいと思いますよ。
Re: switch文内のgoto文について
breakでswitchブロックから飛び出せるわけで、DxLib_Endを呼び出すまでのあいだに何があるのか、というのが気にはなりますけど。
わたしの感覚ではそこには何も無いはずなので。
実のところgotoを使って良いかどうかじゃなくて、メインループを抜ける方法が分からないということなのかな、と。
わたしの感覚ではそこには何も無いはずなので。
実のところgotoを使って良いかどうかじゃなくて、メインループを抜ける方法が分からないということなのかな、と。
Re: switch文内のgoto文について
へろりーなさんありがとうございます!
ひとまずgoto文を使ってみようと思います。
ひとまずgoto文を使ってみようと思います。
メインループの中でswitch文を使っている場合、breakだとswitch文のcaseの最後に記述するbreak文とかぶってしまい、swicthから抜けられないのですが何かgoto文の他にswicth文から抜ける方法はありますか?ISLe さんが書きました:breakでswitchブロックから飛び出せるわけで、DxLib_Endを呼び出すまでのあいだに何があるのか、というのが気にはなりますけど。
わたしの感覚ではそこには何も無いはずなので。
実のところgotoを使って良いかどうかじゃなくて、メインループを抜ける方法が分からないということなのかな、と。
Re: switch文内のgoto文について
一例ですが、こんなコードでどうでしょう。ふぅ さんが書きました: メインループの中でswitch文を使っている場合、breakだとswitch文のcaseの最後に記述するbreak文とかぶってしまい、swicthから抜けられないのですが何かgoto文の他にswicth文から抜ける方法はありますか?
enum STATE {TITLE, STAGE, END};
STATE state = TITLE;
bool running = true;
while (running) {
switch (state) {
case TITLE:
// タイトル処理
if (ステージが選択された) {
state = STAGE;
} else if (終了が選択された) {
state = END;
}
break;
case STAGE:
// ステージ処理
state = TITLE;
break;
case END:
// 終了処理
running = false;
break;
}
}
Re: switch文内のgoto文について
a5uaさん
なるほど、whileの判定式を偽にしてやればよかったんですね。
ありがとうございました!
なるほど、whileの判定式を偽にしてやればよかったんですね。
ありがとうございました!