PHP でちょっとだけオブジェクト指向勉強したおかげなのか、やっとモジュール変数の使い方が分かってきたような気がします。
#module mdl_memo memoContent
#modinit str _memoContent
memoContent = _memoContent
return
#modfunc _getMemoContent
return memoContent
#defcfunc getMemoContent var mdlvar_memo
_getMemoContent mdlvar_memo
return refstr
#modfunc setMemoContent str _memoContent
memoContent = _memoContent
return
#deffunc newMemo var mdlvar_memo, str _memoContent
newmod mdlvar_memo, mdl_memo, _memoContent
return
#deffunc deleteMemo var mdlvar_memo
delmod mdlvar_memo
return
#global
newMemo memoA, "NewMemo"
setMemoContent memoA, "こんにちは!メモAです!!"
newMemo memoB, "NewMemo"
mes "メモAの内容:"+getMemoContent( memoA )
setMemoContent memoB, "こんばんは!メモBです!!"
deleteMemo memoA
mes "メモBの内容:"+getMemoContent( memoB )
deleteMemo memoB
これと同じことをモジュール変数なしではしんどいよね。(ただし、メモの中身はモジュール内で管理して、一度に複数のメモを使える仕様、という条件で)
ためしにモジュール変数を使わない版を作ってみました。以下のような感じになります。
#const global TRUE 1
#const global FALSE 0
#module mdl_memo
#const MAX_MEMO 16 // 一度に使用できるメモの数
#const MAX_MEMO_CONTENT_SIZE 64 // メモ内容の文字列長(バイト単位)
#const NOT_EXIST_SERNO -1 // 存在しないメモ番号
#const USEFLAG_NOT_USING FALSE // 使用していないことを表す ( 変数を初期化したときの値でなければならない )
#const USEFLAG_USING TRUE // 使用中であることを表す
//
// モジュールの初期化
#deffunc init@mdl_memo
sdim memoContentTbl, MAX_MEMO_CONTENT_SIZE, MAX_MEMO // メモの内容のテーブル
dim memoUseFlagTbl, MAX_MEMO // メモが使用中かどうかのテーブル
return
//
// 新しいメモの作成
#deffunc newMemo var memoSerno, str memoContent
// 使用できるメモ番号を線形探索して探す
memoSerno = NOT_EXIST_SERNO
repeat MAX_MEMO
if memoUseFlagTbl( cnt ) == USEFLAG_NOT_USING {
memoSerno = cnt
break
}
loop
if memoSerno == NOT_EXIST_SERNO : return // 使用できるメモ番号がなかった
memoContentTbl( memoSerno ) = memoContent
memoUseFlagTbl( memoSerno ) = USEFLAG_USING
return
//
// 無効な使用中メモ番号か
#defcfunc IsEnabledUsingMemo@mdl_memo int memoSerno
if ( memoSerno < 0 ) || ( memoSerno >= MAX_MEMO ) {
return TRUE
} else {
return ( memoUseFlagTbl( memoSerno ) == USEFLAG_NOT_USING )
}
//
// メモの内容の取得
#defcfunc getMemoContent int memoSerno
if IsEnabledUsingMemo( memoSerno ) : return ""
return memoContentTbl( memoSerno )
//
// メモの内容を設定(関数が失敗したかを返す)
#deffunc setMemoContent int memoSerno, str memoContent
if IsEnabledUsingMemo( memoSerno ) : return TRUE
memoContentTbl( memoSerno ) = memoContent
return FALSE
//
// メモを削除(関数が失敗したかを返す)
#deffunc deleteMemo int memoSerno
if IsEnabledUsingMemo( memoSerno ) : return TRUE
memoUseFlagTbl( memoSerno ) = USEFLAG_NOT_USING
return FALSE
#global
init@mdl_memo
このようにすごく長くなってしまいます。やってられませんね。しかも、使用できる数を決められているので、それ以上使うことが出来ないし、そんなに使わない場合はメモリの無駄使いになっちゃいます。それに、配列のインデックスをハンドル代わりにしているので色々と危険性も出るような気がします。
でも、これと似たようなスクリを以前に何個か作った記憶が...。
てか、ローワーキャメルケースとアンダースコア区切りが混ざっててきたないなぁ。どっちかに統一しないと。