投稿
Godot orz_127
質問です。 画像にあるようなプログラムを作成し それぞれSLOT0とSLOT1に配置。 SLOT0を実行すると INIT_3がエラーします。 以前からこの様な仕様でしたっけ? 前のバージョンがのこっていないので確認できず^^; 配列の宣言の場合は何か細工がひつよう??
2そうだね
プレイ済み
返信[1]
親投稿
マギー M191246
USE 1をEXEC 1に変えるというのは、 どうでしょう?
0そうだね
プレイ済み
返信[2]
親投稿
マギー M191246
配列宣言そのものが 実行されていないからでは、 ないでしょうか?
0そうだね
プレイ済み
返信[3]
親投稿
omusubi▲ omusubi_p
とりあえず解決法。 何でも良いので初期化関数内で同じ要素数の配列変数を作り、代入することで使えるようになります。 INIT_3:VAR _D[2]:D=_D
0そうだね
プレイ済み
返信[4]
親投稿
Godot orz_127
>マギーさん コメントありがとうございます。 確かにEXECなら動作しますね^^ 配列定義が実行されていない? そうか、SLOT0は「OPTION STRICT」がないから普通の変数は問題なく動作するのか? と思いSLOT0側にも「OPTION STRICT」をつけて見ましたが、同じorz SLOT1 のVAR定義が通っていないならこれで普通の変数でもエラーとなると思うのですが…。 謎が深まりましたw 以前はUSEで問題なかった気がするのですが…。 記憶違いか?
0そうだね
プレイ済み
返信[5]
親投稿
Godot orz_127
>omusubi▲さん コメントしていただいた方法を試してみました。 この方法でもOKですね^^ そういえば以前はINITの内部定義の配列変数にファイルから読み込み、それをRETURNする関数を作っていた気もしてきました。 結果的にこのやり方をしていたのかも^^ それでUSEでも今回のパターンに引っ掛からず、USEでも問題ないと筈と思ってしまったのだろうか? と言うことは、元からこう言う仕様?
0そうだね
プレイ済み
返信[6]
親投稿
smile5884 smile5884
スマイルブーム小林です。 動作を確認してみました。 マギーさんのアドバイスのようにUSE部分をEXECにすることで解決します。 ◎エラーになる原因 USE 1ではSLOT1のプログラムテキストを内部的な実行コードへ変換だけ行います。変換しか行わないのでプログラム先頭にあるOPTION命令もVAR命令も実行されません。 OPTION STRICTが実行されていないので、SLOT1のプログラム内で宣言ナシの変数利用はエラーにならず、INIT_1のS$とINIT_2のVは、その場で生成された変数として実行されます。 INIT_3には宣言のない配列の利用が含まれているためエラーとなっています。 ◎EXECにすると動く理由 EXECは、USE 1を実行後にRUN 1を実行するような動きを行うため、RUNによって、SLOT1内の先頭にある OPTION2つとVAR命令が実行されて、その下のCOMMON DEFは実行されずプログラムの終わりに達してEND扱いとなりSLOT0に処理が戻ります。 ※EXECはENDまで行くとEXEC実行もとに処理が戻ります ちょっと特殊で分かりにくいですが、SLOT 1に置いたプログラムを初期化してから使う感覚でUSEの代わりにEXECを利用すると使いやすいと思います。
3そうだね
プレイ済み
返信[7]
親投稿
Godot orz_127
>小林さん コメントありがとうございます。 確認してみました。確かに、EXECだと変数の領域が確保されていますね。 別スロットに置いた関数、コマンドを使用するにはCOMMON DEFで宣言しておいて、そのスロットをUSEで使用するものと思いこんでいました。 この使い方をするには、EXECでも問題ないということですか? てっきりEXECはただ別のスロットを実行するだけでCOMMON DEFとは無関係だと思っていました^^; こうなるとUSEの位置付けがよくわかりません。 スロット内変数?を含む定義の場合はEXEC、特に共通変数を使用していない場合は、USEと言うことに? ならばUSEは要らず一律EXECでもよいような。 USEの存在意義をもう少しご教示頂けると幸いです。
0そうだね
プレイ済み
返信[8]
親投稿
Godot orz_127
もうひとつ確認してみました。 USEでも画像のようにすると期待する動作となります。 確認したところD[2]はSLOT1側で定義され、SLOT0からは直接参照できないようです。 (これは本来期待している動作なので問題なし) 前のコメントではUSEでは実行されないのでVAR定義が有効にならず、配列宣言されていない、とのことでした。 ならINIT内でD=_Dとすると数値変数が自動的に用意され、配列の代入なので参照渡しとなり、内部でCのポインタ的動作をしているものと考え、最初は「VAR D[0]」なしで試してみました。 実行するとType mismatchとなりました。 結果、現在のようにDを配列として定義すると動作します。 USEでもSLOT1側のVARが有効な様に見えます。 また、ちょっとわからなくなってきました。 ちなみにこの使い方は仕様上あり、でしょうか?
0そうだね
プレイ済み
返信[9]
親投稿
Godot orz_127
あと、関連で。 現在CLEARが使えないと思います。 REDIMもなさそうだし…。 INITとは逆に、ここでファイル等を読み込んでいた場合、その領域を解放したいのですが… TXT は文字列なので、S$=""とかで良さそうですが、DAT の場合どうしたら良いでしょう? SHIFT等でなくなるまで削る?
0そうだね
プレイ済み