PUBLIC宣言でのグローバル変数の初期値は実行時、他の処理に先駆けて代入される

UWSCのこと。
少し考えればわかりそうなことだと思うんですが…目からウロコだったので一応書いてみる。

PUBLIC宣言でグローバル変数を作る時の初期値ですが、
まあ大抵の場合は

PUBLIC hoge = 1
PUBLIC hage = "unnko"

とか書きますね。

例えばユーザーの入力した日付を使おうとした場合、

GETTIME()
hoge = INPUT("【日時設定】 例:100120)", "" + G_TIME_YY2+G_TIME_MM2+G_TIME_DD2)

とか書けば、入力ボックスの初期値が今日の日付になったりしますよね。
GETTIME()が実行される時点で今日の日付が特殊変数「G_TIME_**」に代入されます。


実はこの場合のhogeグローバル変数として扱いたい場合、

GETTIME()
PUBLIC hoge = INPUT("【日時設定】 例:100120)", "" + G_TIME_YY2+G_TIME_MM2+G_TIME_DD2)

こうやってしまうと、正しい日付がとれません。

なぜか?

PUBLIC宣言された変数の初期化処理が、他の処理に先駆けて実行されるから(っぽい)です。
つまり上記の例では、グローバル変数hogeを初期化する処理が先に実行されてしまうせいで、GETTIME()が実行されずにG_TIME_**を参照しようとするので、正しい日付がとれないのです。

PUBLIC宣言行の前にFUKIDASI()やSLEEP()を書いても全部無視されて、INPUT()が先に実行されました。
Cでいうところのプリプロセッサ的な動きなんでしょうか。



入力ボックスの初期値に正しく本日の日付を入れておきたい場合は、以下のように書くと期待通りの結果を得られます。

GETTIME()
//宣言と入力値の代入は別にする
PUBLIC hoge
hoge = INPUT("【日時設定】 例:100120)", "" + G_TIME_YY2+G_TIME_MM2+G_TIME_DD2)

ヘルプにも※ローカル変数は初期値に変数値を利用できるが、グローバル変数の初期値はリテラル値のみとありますが、これに早く気づくべきだったのかなと思いました。
実行順序がこう決まっているのなら、確かに変数は使えないな、と。


CALL()のファイル名に変数が使えないというのも
http://www3.bigcosmic.com/board/s/board.cgi?id=umiumi&mode=all&no=500&log=ON&cnt=5
こういう仕様なんですね。
http://www3.bigcosmic.com/board/s/board.cgi?id=umiumi&mode=all&no=680&log=ON&cnt=6


こういうのってプログラムとしては常識的なことだったり基礎的なことなのかも知れませんね。独学は怖いなあ。