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


HSPTV!掲示板


未解決 解決 停止 削除要請

2010
0707
info#deffunc #modfunc などの引数の初期値10解決


info

リンク

2010/7/7(Wed) 09:29:41|NO.33566

#deffunc
#modfunc
 等のユーザー定義命令の引数の初期値を設定できる機能がほしいです。

 現在自分 #define と local 指定のユーザー定義関数で 初期値を設定しているのですが。
 それでは、スクリプトの可読性がかなり悪くなります。
 #deffunc 等のユーザー定義命令は、自由に引数の位置を変えることが出来ますが。
 #define では、それは難しいので、変更するたびに、窮屈で面倒な目に逢うことになります。

贅沢かも知れませんが、下の様な記述が出来るようなれば。
かなり、可読性が向上するような気がします。


// このスクリプトは一例です。実行するとErrorに成ります ; デフォルトの変数名を初期化 dim defaultvar@test , 5 defaultvar@test = 10,20,30,40,50 #module test #include "user32.as" #deffunc func int hwnd_ , int wid_ , str string_ , int x_ , int y_ , var buff_ #funcprm imposs hwnd_ // [ Impossible ] 省略不可能にする 省略された場合、引数は省略できません のエラーが起こる。 #funcprm imposs wid_ // [ Impossible ] 省略不可能にする 省略された場合、引数は省略できません のエラーが起こる。 #funcprm poss string_ = "hspwnd" // [ Possible ] 省略可能にする 文字列型のばあいdefault値を指定しないと必ずエラー #funcprm x_ = ginfo_winx // もし省略された場合 ginfo_winx が引数に渡された事に成る #funcprm y_ = ginfo_winy // もし省略された場合 ginfo_winy が引数に渡された事に成る #funcprm poss buff_ = defaultvar // [ Possible ] 省略可能にする 変数型のばあい default値を指定しないと必ずエラー // 何も指定しない場合defaultに成る。x_の場合は 0 よって、以前の記述も可能 dim m_status , length(buff_) memcpy m_status , buff_ , 4*length(buff_) m_size = x_ , y_ gsel wid_ : title string_ SetParent hwnd_ , hwnd return #global
 



この記事に返信する


info

リンク

2010/7/7(Wed) 09:37:21|NO.33567

修正します

>>// 何も指定しない場合defaultに成る。x_の場合は 0 よって、以前の記述も可能

// 何も指定しない場合は 今まで通りの通常の処理を行う



birdrefsda

リンク

2010/7/7(Wed) 12:44:40|NO.33568

>それでは、スクリプトの可読性がかなり悪くなります。
かなり悪くなる例を見せて。

>自由に引数の位置を変えることが出来ますが。
#defineだと出来ないの?出来るよね。
#deffuncの引数の並びを変えたら#defineも一緒に変えればいい。
それが面倒?気持ちの問題じゃないの?

>下の様な記述が出来るようなれば。
>かなり、可読性が向上するような気がします。
そう?


#module test // すべての引数が省略不可な例 #define global func(%1,%2,%3) func_ %1,%2,%3 // 第2引数以降が省略不可な例 #define global func2(%1,%2=10,%3="hsp") func_ %1,%2,%3 // 第2引数以降が省略不可な例で可読性を考慮した例(コメントを入れられない) #define global func3\ (\ %1,\ %2 = 100,\ %3 = "hsp3"\ )\ func_ %1,%2,%3 #deffunc func_ int p1, int p2, str p3 mes strf("%d %d %s", p1, p2, p3) return #global func_ func 1,2,"hello" func2 1 func3 10
要するにプリプロセッサ中にコメントを埋め込めれば万事解決。
反映させるのは簡単なハズだよ。
プリプロセッサ解析にコメント処理をまんま持ってくればいいだけでしょ?

>[ Possible ] 省略可能にする 変数型のばあい default値を指定しないと必ずエラー
「possキーワードを指定しても変数型の場合、デフォルトを省略できない」
つまりキーワードはただの飾りで実際は省略する型によって省略可不可が決まってくるわけで
とーっても仕様が複雑。

上のスクリプト例で示したとおり省略可能かどうかは、
デフォルト値が設定されているかどうかでいいわけ。
結局数値以外はデフォルト値を設定せざるを得ないわけだから、
imposs/possなどのキーワードは不要。
そんなところをチェックし、省略可不可フラグをONにしたところで
データ型のチェックは必要不可欠なわけだからね。

どんな風にプリプロセッサ中にコメントを埋めこめられるか、が大事?
簡単で仕様も複雑ではないのは、ブロックコメントかな。

; インラインコメント(連結処理に変更有り) #define global func3\ (\ %1,\ ; 省略不可 %2 = 100,\ ; 省略時は100 %3 = "hsp3"\ ; 省略時は"hsp3" )\ func_ %1,%2,%3 ; インラインコメント(コメント処理に変更あり) #define global func3\ (\ %1, ; 省略不可\ %2 = 100, ; 省略時は100\ %3 = "hsp3" ; 省略時は"hsp3"\ )\ func_ %1,%2,%3 ; ブロックコメント(連結処理、コメント処理に変更なく導入できる) #define global func3\ (\ %1, /* 省略不可 */\ %2 = 100, /* 省略時は100 */\ %3 = "hsp3" /* 省略時は"hsp3" */\ )\ func_ %1,%2,%3



info

リンク

2010/7/7(Wed) 15:15:13|NO.33570

ごめんなさい
 なんだか解りませんが、怒らせてしまったような気がするので最初に謝っておきます。
m(__)m

失礼かもしれませんが、自分は面倒なこと = 作業的に効率の悪いこと、作業的改善の余地がある事
  だと考えています。

#define を使った初期値の設定の際の、引数の並び替えに必要な時間と
初期値の設定をしていない場合での 引数並び替えに必要な時間は
 引数の数に依存します。少なくとも三倍程度の差が有ります。
 面倒に感じるのは当然の様な気がします。

 他に方法がなければその方法で続けるしかないですが、
 面倒で無い方法が有ればうれしいということです。

 何よりも、自分は、作ってくれた人の苦労を失念していたようです。
 以後気をつけます。



木村

リンク

2010/7/8(Thu) 01:23:24|NO.33584

>birdrefsdrさん
>>かなり悪くなる例を見せて。

#module test #include "user32.as" #deffunc set_defaultvar array date_of_set dim defaultvar,length(date_of_set) repeat length(date_of_set) defaultvar.cnt = date_of_set.cnt loop return #define global func(%1 , %2 , %3 , %4 = ginfo_winx , %5 = ginfo_winy , %6 = defaultvar) \ _func_ %1 , %2 , %3 , %4 , %5 , %6 #deffunc _func_ int hwnd_ , int wid_ , str string_ , int x_ , int y_ , var buff_ ;―――――――――――――――――――――――――――――――――――――――― ; func hwnd_, wid_, string_, x_, y_, buff_ ; .Εンドウwid_のタイトルバーをstring_に変更して ;◆.魯鵐疋詒峭hwnd_のオブジェクトを麾下に編入する命令? ;―――――――――――――――――――――――――――――――――――――――― if string_ ! "hspwnd" : dialog "第3引数は必ず\"hspwnd\"にしてください" : end dim m_status , length(buff_) memcpy m_status , buff_ , 4 * length(buff_) m_size = x_ , y_ gsel wid_ : title string_ SetParent hwnd_ , hwnd return #global dim date , 5 date = 10 , 20 , 30 , 40 , 50 set_defaultvar date func 0 , 0 , "hspwnd" , , ,
 こんな感じでしょうか。#define〜#deffunc構文が確かに、言語仕様次第では省略できそうな
気はしますね。


 後infoさん、個人的にはモジュール内部の変数に直にアクセスする用法

dim defaultvar@test , 5 defaultvar@test = 10,20,30,40,50
は避けられた方がよろしいかと思います。掲示板上で無駄な文面が増えないよう、この形に
されているのだとは思いますが、念の為に書かせていただきました。御無礼をば。



774

リンク

2010/7/9(Fri) 21:19:39|NO.33601

ちょっと関連質問なんですが
#deffunc内で一般命令を使うとき末に@をつけるルールがあるみたいですけど
これはマニュアルのどこに書かれていますか?
必死で探しましたが見当たりませんでした。



あまま

リンク

2010/7/9(Fri) 22:59:26|NO.33602

> 774さん
@は#deffuncで調べるよりもモジュールに関して調べてみてください。



info

リンク

2010/7/9(Fri) 23:24:53|NO.33603

こういう事ですか?


#module module_test #deffunc Test color 255 mes@ "「@付きのmes命令」が実行されました。" GlobalSpaceUserFunc@ return #global // 以下グローバル空間 Test // module_testの Test命令を実行 stop #deffunc GlobalSpaceUserFunc color 0,0,255 mes "「グローバル空間のユーザー定義命令」 が実行されました。" return

多分それがグローバル空間の命令で有る事の明示だと思います。

システム的には必要ないですが、
例えば、色分けされないエディタを使ってscriptを書く際には、
この明示が有った方が解りやすく成ると思います。

暇なときに、携帯電話でポチポチ打つのも楽しそうです。

(自分はやった事ないですが)



テック

リンク

2010/7/9(Fri) 23:35:40|NO.33604

>774さん
>ちょっと関連質問なんですが
>#deffunc内で一般命令を使うとき末に@をつけるルールがあるみたいですけど
>これはマニュアルのどこに書かれていますか?
@モジュール名の使い方は、
HSP Document Libraryの
#deffuncや#defcfuncの説明で記述されているので、
分かるかもしれませんが、
ただ@を付けるだけのは、記載されていないので分からないかも知れません。

わたしは、工学社 I/O BOOKSの「HSP3 リファレンスブック」で
使用方法を知りました。
上記の書籍では、以下の記述がされています。

モジュール外部から、モジュール内部の変数を参照したい場合には、
「変数名@モジュール名」という書式を使うことができます。
逆にモジュール内部からモジュール外部(グローバル部分)を
参照する場合には、「変数名@」という書式で参照できます。

補足として記載しておきますと、
モジュール内部から標準命令を参照する場合には、
「命令名@hsp」という書式みたいですね。

もし774さんが、C/C++を理解できるのであれば、
@は、スコープ演算子のことだと思えば、
理解しやすいと思います。
結論をいうと@の後ろには、どこの範囲(スコープ)かを指定することです。
省略すれば、グローバルのという意味になります。

↓にサンプルスクリプトを記載しておきます。

#module test // モジュール変数宣言 nSample = 0 #deffunc def_test1 // グローバル変数のnSampleに値を代入する // @は、"の"に置き換えれば、意味がわかりやすい nSample@ = 10 return #deffunc def_test2 // グローバル変数のnSampleの内容を表示する mes@hsp nSample@ return #global // グローバル変数宣言 nSample = 0 def_test1 def_test2 // モジュール名「test」のnSampleに値を代入する nSample@test = 20 // モジュール名「test」のnSampleの内容を表示する mes@hsp nSample@test // グローバル変数のnSampleの内容を表示する mes@hsp nSample@ stop



ANTARES

リンク

2010/7/10(Sat) 00:36:15|NO.33605

>#deffunc内で一般命令を使うとき末に@をつけるルールがあるみたいですけど
 「モジュール内で、他のモジュールで定義された命令を使うとき
命令語末に@をつけなければならない」の誤りでは?

>これはマニュアルのどこに書かれていますか?
 上記の意味と仮定します。
最近、精読してないんで間違っているかもしれませんが、書かれてない気がします。
 ただ、本来は「@hogehoge」(「hogehoge」はその命令が定義されている
モジュール名)と書くべきなのかもしれません(それにしても命令を
モジュール名で修飾しなければならないという記述は見た記憶がありませんが)。
モジュール名なしの「@」はグローバル名前空間を表すので、
それでもよいというだけかもしれません。



774

リンク

2010/7/10(Sat) 11:22:23|NO.33607

どうもありがとうございます。
工学社 I/O BOOKSの「HSP3 リファレンスブックなどの有料本でしか書かれてないんですね。
私も確認したのですが、Easy3DforHSPの格ゲー作成解説のマニュアルでも書かれています。



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