プレイ日記
おちゃめ ochame_nako
VARが左辺値にもなることを利用して現在動作しているプログラムスロットを取得するSLOT関数を作ってみました。
22そうだね
プレイ済み
返信[1]
親投稿
おちゃめ ochame_nako
原理を簡単に説明すると指定したスロットのグローバル変数_SLOTに初期値1を入れてその後に変数_SLOTの値を0にした後に指定したスロット番号の_SLOTが0に変わっていればその指定したスロット番号が現在実行しているスロット番号となるわけです。 例えばスロット2で動作している場合はI=2の段階で_SLOTの値が1から0に変わるためそれを利用して判定しています。 すでに何人かがプログラムスロットを取得する関数を作っていますが、今回の方法ならばBACKTRACEを使った方法のように使用できる場面が限られることもなく他のスロットにグローバル変数_SLOTが実体化した状態で存在していたとしても正しく判定することが可能になります。 公開キー【 AEE3E8NV 】、ファイル名「SLOT」
0そうだね
プレイ済み
返信[2]
親投稿
おちゃめ ochame_nako
知らない人もいると思うのでVARについて少し解説しておきます。 VARは基本的にはDIMと同等であり、変数の宣言に使用します。 しかし、VARはDIMとは異なり関数の側面を持っています。 例えばVAR("A")とすれば変数Aの値を取得できます。 これに何のメリットがあるかとうと参照する変数を動的に変化させることができるということです。 動的に変化というのを初心者でも分かるように言えば配列変数A[]はA[0]。A[1]と添え字内を定数で指定しなくてもA[B]のように変数で指定するのと同じようなことが配列変数ではない普通の変数において行えて添え字が変数名に置き換わったものと考えると分かりやすいと思います。
1そうだね
プレイ済み
返信[3]
親投稿
おちゃめ ochame_nako
プチコン3号は自作関数内でのみ参照可能なローカル変数の他にプログラム全体で参照可能なグローバル変数があります。 実はグローバル変数もスロットごとに異なる存在となっていてVAR("A")では現在動作しているスロットの変数Aが取得できるだけです。 他のスロットを参照しようとするならばVAR("1:A")のようにスロット番号を付ける必要があります。 その際はその変数が存在してなかったり実体化してなかったらエラーとなるため事前にCHKVER("1:A")で取得可能かをチェックしておくと良いでしょう。
0そうだね
プレイ済み
返信[4]
親投稿
おちゃめ ochame_nako
ここまではすべて右辺値の話ですが、VARは左辺値にもなります。 例えばA=B+Cという式があった場合にはB+Cが右辺値でAが左辺値です。 右辺値は自由な式を記述でき左辺値は代入する変数を記述します。 例えばVAR("1:A")=7とするとスロット1のグローバル変数Aに7を代入します。 実行しているのがスロット1以外であればそのスロットのグローバル変数Aの値は変化しません。 今回のSLOT関数はこれを利用しています。
0そうだね
プレイ済み
返信[5]
親投稿
おちゃめ ochame_nako
もう1つ最後に書いておくとスロット番号を省略してVAR("A")と記述した場合には基本的に動作しているスロットのグローバル変数を取得しますが、自作関数内でVARを使用した際にそのグローバル変数と同じ名前のローカル変数があった場合にはローカル変数が取得されます。 しかし、スロット0で動作しているならばVAR("0:A")のようにスロット番号を付けていれば同名のローカル変数があってもちゃんとグローバル変数が取得できます。 スロット0で動作させるとは限らないのでスロット番号が分からなくてはいけません。(そうでないとローカル変数の変数名をグローバル変数と被らない名前にしておく必要がある) そこで今回作った関数が役立つわけです。 また自作関数内では基本的にはローカルラベルのみ対応となるのですが、このSLOT関数を使えばそのプログラムのグローバルラベルを参照することが可能になります。
1そうだね
プレイ済み
返信[6]
親投稿
otta777 otta777a
最初にソースを見た時は、「あれ?スロット4の時は判別できないのかな?」 と思ってしまいましたがスロット0から3が実行スロットで無ければ FOR~NEXTのループを正常終了して変数Iが4となるんですね。 画面を乱すこと無く実行スロットが取得できるのはありがたいですね。
2そうだね
プレイ済み
返信[7]
親投稿
ΖΕΧ ZEX256
勉強になりました
0そうだね
プレイ済み
返信[8]
親投稿
ヨッシー okkun2002
そんな手があったとは...
0そうだね
プレイ済み
返信[9]
親投稿
おちゃめ ochame_nako
otta777さんへ BACKTRACEを使うのが一番分かりやすくて簡単ですが、やはり画面表示を伴うのが難点ですからね。 他にもスロット判別の方法はあると思いますが、VARが左辺値になることを使えば簡単に判定できそうだと思いついたので作ってみました。 ZEXさん、ヨッシーさんへ VARが関数にもなるというのは隠し要素ではなく公式仕様ですがほとんど情報がなく私は自力で解析しました。 解析して分かったことはMiiverseだけでは書ききれないので私のサイトのプチコン3号入門講座で解説しています。
0そうだね
プレイ済み
返信[10]
親投稿
MIKI ifconfig
おかげで - 普通に exec すると ライブラリ - スマイルボタンから起動するとツール というコードが書けました。 ありがとうございます!!
0そうだね
プレイ済み
返信[11]
親投稿
おちゃめ ochame_nako
MIKIさんへ 使っていただきありがとうございます。 お役に立てたようで何よりです。
0そうだね
プレイ済み
返信[12]
親投稿
ナツキ natukin1978
こんな方法があるとは!? 今度、この方法を使わせていただきます。
0そうだね
プレイ済み