HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2019
0310
とあるプログラマモジュール内で最初に変数を初期化したい7解決


とあるプログラマ

リンク

2019/3/10(Sun) 18:37:09|NO.86857

題名の通りなんですが、モジュール内で一番初めに変数を初期化する方法ってありますでしょうか。
具体的にはその命令が最初に実行されたときのみに変数を初期化したく、2回目以降の呼び出し時には初期化しないというものです。例えば初回時にのみ配列変数作成・初期化するといった感じです。
思い当たる方法では初期化用の命令を用意するか、内容が0以外と分かっていればif var.0=0{〜}で確認する といった2つなんですが、もっと効率のいい方法などありますでしょうか。



この記事に返信する


あり

リンク

2019/3/10(Sun) 20:20:46|NO.86859

こういう事ですか?

#module #deffunc test switch x case 0 ; 初回時の動作 mes "初期化しました" swbreak case 1 ; 二回目以降の動作 mes "既に初期化しています" swbreak swend x = 1 ;初期化確認用変数 return #global repeat 5 test loop



とあるプログラマ

リンク

2019/3/10(Sun) 22:05:16|NO.86864

>>ありさん
やっぱり初回のみの動作にはフラグ変数使って初回以降の判定をするしかないんですかね…
一応イメージしてるのは

#module dim A sdim B,1024 #deffunc test ~~ return #global
のように関数内じゃなくてモジュールが最初に読まれたときにだけ変数初期化みたいな感じなんですが、無理そうですね… (上のスクリプトは正しくない)



Y_repeat

リンク

2019/3/12(Tue) 05:21:03|NO.86880

確かRubyとかだとor演算で
左項がtrueだと右項を評価しない処理を
利用してそういうことをやってる気がします

or演算 と マクロを上手に使って 出来たらいいですよね

他の案だと
配列を利用して
tmp.1が0だと初期化処理っぽくして
tmp.1に1を代入し

tmp.1が1だと初期化っぽいことしない

利用する値はtmp.0
みたいな

値とフラグを一緒にしちゃえ的な

でも、普通初期化命令を用意するんじゃないっすかね
それか グローバル変数になってるのを モジュールの上の方で定義するか
モジュールに属する変数にしたいならinit setter getterを用意するか

#moduleの上から
モジュール内の変数にアクセス出来ましたっけ?
出来たらinit setter getterはなくてもいいし
モジュール内の命令は#moduleの上から利用出来たはずなので
init setter getterを用意すればアクセス出来るはずです



とあるプログラマ

リンク

2019/3/12(Tue) 21:34:44|NO.86882

>>Y_repeatさん
やっぱりモジュールのプリロード時に実行される仕様みたいなのは用意されていないようですね…
一応今回は、内部に初期化用命令を定義→初期化作業をしたらフラグ用変数でそれを保存→グローバル用命令の最初でフラグ変数参照、初期化されていなければ初期化命令にジャンプ
という方法で初期化作業を実装しました。お二人ともありがとうございました。



GENKI

リンク

2019/3/12(Tue) 22:15:36|NO.86886

もう解決しているようですが、私の場合を書いてみる。

#module #deffunc 初期化命令 … return … #global 初期化命令

ここまでをモジュールにする。
このファイルをincludeすると、includeした行で「初期化命令」が実行される。
大変便利なのでよくやってます。


もう一つ例を。
モジュール変数を使用する場合、newmodでモジュール型変数を作ると#modinitで定義した初期化処理が実行されます。
初期化用の命令みたいなもので、使われているかどうかは自分で管理しないといけないから今回の質問にはあわないか…。



YOS G-spec

リンク

2019/3/12(Tue) 22:18:04|NO.86887

下記のいずれかでいかがですか?


;A dim A@testm sdim B@testm,1024 #module testm #deffunc test mes varsize(A) mes varsize(B) return #global test
HSPはローカルな変数を通常持たないのでどこからでも
対象モジュールを指定すれば変数を書き換えることができます。


;B #module testm *init dim A sdim B,1024 return #deffunc test mes varsize(A) mes varsize(B) return #global gosub*init@testm test ;C #module testm #deffunc local init dim A sdim B,1024 return #deffunc test mes varsize(A) mes varsize(B) return #global init@testm test
モジュール定義の真後ろに自動起動する命令を置いておけば
それっぽい動作を実現できます。



Y_repeat

リンク

2019/3/13(Wed) 21:57:58|NO.86891

ちょっとめんどくさいですが

#ifndef init_str #define init_str sdim my_str,256 mes "init" #endif #ifndef init_str #define init_str sdim my_str,256 mes "init" #endif #ifndef init_str #define init_str sdim my_str,256 mes "init" #endif
のように#ifndefを使用すると
何回使用しても一回しか動きません



ONION software Copyright 1997-2023(c) All rights reserved.