hinekure.net が http://hspdev-wiki.net/ から自動クローリングした結果を表示しています。画像やリソースなどのリンクが切れています。予めご了承ください。
Module/mod_modval - HSP開発wiki
トップ    編集凍結 差分バックアップ添付複製名前変更リロード   新規一覧単語検索最終更新   最終更新のRSS

Module

hsp3.png

モジュール変数の値取得モジュール

『#module Modulename arg@@0@@, arg@@1@@, arg@@2@@, ... arg@@n@@』で定義されるモジュール変数arg@@i@@(0<=i<=n)の値を#modfuncを呼び出さずに、直接参照・取得するためのモジュールです。代入は出来ません。

モジュール

filemod_modval.as
Everything is expanded.Everything is shortened.
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 
 
 
 
 
-
|
-
|
!
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
-
|
-
|
|
!
 
 
 
 
 
 
#module "mod_modval"
 
; getmodvの成否を取得する関数
#defcfunc resmodv
; return : 0 = failed / 1 = success
    if modverr{
        modverr = 0: return 0
    }else{
        return 1
    }
 
; 任意のモジュール変数の要素を取得する関数
#define global ctype getmodv(%1,%2=0,%3=0) _getmodv(%1,%2,%3)
; p1 : モジュール型変数
; p2 : p1のモジュールの何番目のモジュール変数かを示すインデックス値
; p3 : p2番目のモジュール変数の何番目の要素かを示すインデックス値
#defcfunc _getmodv var p1, int p2, int p3
    if varuse(p1)=0: goto *failed
    dup v1, p1
    if vartype(v1)!vartype("struct"): goto *failed
 
    dupptr flex, varptr(v1), 16
    if (p2<0) | (p2>=flex.2/48): goto *failed
 
    dupptr pval, flex.3 + 48 * p2, 48
    switch( wpeek(pval, 0) )
        case vartype("int")
            if (p3<0) | (p3>=pval.6/4) | (pval.7=0): goto *failed
            dupptr dat, pval.7, pval.6
            return dat.p3
        case vartype("double")
            if (p3<0) | (p3>=pval.6/8) | (pval.7=0): goto *failed
            dupptr dat, pval.7, pval.6, 3
            return dat.p3
        case vartype("str")
            if (p3<0) | (p3>=pval.6/4): goto *failed
            if p3 = 0{
                dupptr dat, pval.7, 1, 2
            }else{
                dupptr master, pval.8, pval.6
                dupptr dat, master.p3, 1, 2
            }
            return dat
    swend
*failed
    modverr = 1
    return 0
#global

サンプル

+  sample1
+  sample2
+  sample3

コメント

  • getmodv()関数で得られる値には数値・文字列両方あります。で、インデックスの範囲外などで取得に失敗した場合に呼び出し側に失敗を通知する手段ですが、結果取得関数を用意しました。整数を返す関数の場合に関数の結果を示すのにstatが使えないからです。 -- kz3
  • 式の中で使った時に一番最後のgetmodv()で成功した場合にそれまでの失敗を考慮していなかったのを、resmodv()を使うまで、それまでの"失敗"を保持するようにしました。一度resmodv()を使うと"失敗"はクリアされます。 -- kz3
  • delmodで削除されることも考慮してvaruse()チェックを追加しました。でサンプル書いてみて思いましたが、取得結果がエラーの場合に、一旦取得を終了してからresmodv()でチェックするという事は、単純に『mes getmodv(m)』というようには書けないですね。これじゃ結局、一旦変数に値を代入してからresmodv()で必ずチェックしなければ取得できた値が有効かどうか分からない、やっぱり取得段階でエラーがあればHSPのエラーを出して実行終了させるべきですね...。 -- kz3
添付ファイル:
filemod_modval.as
403件 [詳細]
トップ    編集凍結 差分バックアップ添付複製名前変更リロード   新規一覧単語検索最終更新   最終更新のRSS
Last-modified: 2007-04-08 (日) 02:31:19 (2436d)