コミュニティアイコン プチコン 非公式コミュニティ トピック

アバター
スケさん ◆YJjXHENp4drH
2019/8/12 21:46
情報交換
あり得ないエラー?
X3D37E3V
このプログラムには@M2というラベルサブルーチンがあり、プログラムの最後に書いています。
なのに、819行で呼び出すと何故か「ラベルが存在しない」エラーになります。
もし解決仕方あればお願いします。
(パっと見あり得ないエラーなのでどうしたものかといったところです)
公開キー X3D37E3V

コメント

アバター
スケさん 2019/8/12 21:50 ◆YJjXHENp4drH
もしこっちだけのエラーだったとしても起きているのは事実です。
アバター
高原のな 2019/8/12 21:55 ◆bY8RViwvoODw
ユーザ定義関数内からユーザ定義関数外のラベルにGOSUBすることは不可能なのでエラーとなっています。(SmileBASICは「(関数内に)ラベルが定義されてないよ!」と言いたいと考えればこのエラーメッセージに筋は通る)
@M2を呼び出している関数が一つだけなので、その関数のENDまでの区間に@M2を入れてしまうか、@M2をユーザ定義関数として実装し直すのが良いと思います
アバター
スケさん 2019/8/12 21:58 ◆YJjXHENp4drH
ありがとうございます
取り合えずDEF内に突っ込んでみます
(前も同じこと聞いたような)
アバター
ジプッチャ 2019/8/12 22:00 ◆tkYhkmSxSAam
DEF内からDEF外に飛び出す形でGOTOやGOSUBを使うことはできません。
DEFの中で出てきたラベルはローカル扱いとなるので、
ユーザー定義関数STKANDBTN()の中に@M2というラベルは無いので、「ラベルが存在しない」エラーになります。
アバター
高原のな 2019/8/12 22:04 ◆bY8RViwvoODw
あ、確かめたらGOTOもできませんね。ただ、スロット0でプログラムが実行されているのであればGOSUB"0:@M2"というのは効力を発揮するみたいです。

つまりは、ユーザ定義関数内からその関数外へGOTOやGOSUBができない仕様という説明は半分くらい間違いで、ユーザ定義関数内でラベルを読み出すとき、何もつけていなければユーザ定義関数内にあるラベルのみが効力を発揮するという説明が正しそうです。私が試した限りでは、一定の文字列をラベルの前に付けることでスロット内のグローバルなラベルにはアクセス可能になりました。
(結局、呼び出し側の工夫ができれば@M2を関数内に入れる必要性はなかったというところです)
アバター
Na 2019/8/12 22:44 ◆QoELVrBXBQCI
DEF内にプログラム終了のENDは書けないので@M2をDEF内に突っ込むとエラーになりますね。
かといってGOSUB "0:@M2"と書くとDEF内で使ってる変数MがDEF外で使えないのでやっぱり動きませんね。
アバター
Na 2019/8/12 22:53 ◆QoELVrBXBQCI
一番シンプルな解決策は300行目のBT=STKANDBTN()の後にGOSUB @M2を置くことですかね。
SX,SY,BTNをすべて保存しなくてもBTさえ保存しておけばいいのですから。
MODE==0のときBTの値をMEMORYに入れて、
MODE==1のときBTにMEMORY2の値を戻せばいいのではないでしょうか。
アバター
高原のな 2019/8/12 23:24 ◆bY8RViwvoODw
GOSUB"0:@M2"の方法は、あらかじめ初めのうちにMに初期値を入れてしまえばグローバル扱いになってほぼ手を加えずにそのまま動くので良いと思います。あとSX、SY、BTNもグローバルにする必要があるので最初に0を代入しちゃうと良いでしょう。コードを読む限りはスティックの状態も含めて、タイトルなども含めたゲーム全体の状態を記録したいという意図が感じられたので僕はそういう解釈です。
Naさんの方法をとるとジャンプゲーム本体でのボタン入力データのみ保存したり取り出したりできるようになります。ただしスティック動作は失います。

どんな解釈にせよ、ユーザ定義関数内のローカル・それ以外のグローバルという概念・感覚をなんとなく会得すると、今実行してみて散見する数々のエラーが一気に解消できそうに思います

コメントを書く

  • こちらは「プチコン3号」「プチコンBIG」など、プチコンシリーズに関する話題を扱ったコミュニティです
  • プチコンシリーズにまったく関係ない書き込みはご遠慮下さい。削除の対象となります
  • こちらにはその他のゲームや雑談のコミュニティはなく、作る予定もありません (ひとりで管理できないため)。ごめんなさい
  • ユーザー登録なしで書き込みができます
  • 秘密の合い言葉は成りすましの防止 (トリップ機能)、書き込みの編集時の本人認証に使用します
  • 秘密の合い言葉に他人に推測されやすい言葉、他サービスと同じパスワードは入力しないでください。
  • 書き込むと、投稿時に入力したお名前と秘密の暗号が記憶され、ログイン状態になります

- WEB PATIO -