シリーズ「BREWで画面間メモリ一括管理」(いわゆるBREW版カオル姫方式)の第三回目、今日は、各画面における、共通領域への値設定と取得の方法です。
■前回のまとめ
その前に前回の内容をまとめておくと、
・共通領域の連想配列を保持しておくところ
IKHMap *pMap
を、アプリの構造体に用意する
・アプリ_initAppData(はじめに来るところ)で、
上記共通領域の連想配列pMapを、
IKHMAP_Create(pMe->pIShell,pMe->pIDisplay);
で作成する
・アプリ_freeAppData(最後に来るところ)で、
上記共通領域の連想配列pMapを、
IKHMAP_Release
で開放する。そうすると、連想配列の各要素も、
解放される
*連想配列:あるキーを入れたら、それに対する値が帰ってくる配列
perlでは、配列として存在するが、Javaでは、同じことをハッシュマップ
(またはハッシュテーブル)で行う。Cではないので、IKHMapとして、
今回、作っている。
■各画面での値の設定
今回、gamen1でやっているので、そこで説明します。
●各画面の構造体(gamen1.h)
これは、どっちでもいいんですけど、画面の構造体に、
// 共通領域
IKHMap *pMap;
というかたちで、全体アプリの構造体の値を置いとけるところを
作っておきます。
●画面の初期化(gamen1_InitAppData)
上記領域をとった場合、
// 共通領域を設定
pMe->pMap = poya->pMap;
っていうかたちで、アプリ全体領域の共通領域
(ここではpoya->pMap)の”ポインタを”pMe->pMapに
セットします(つまり、実体は、アプリ全体領域の共通領域が
さしているところと同じです)
●値のセット
今回は、gamen1_doJob2でやっています。
IKHMAP_StrPut(pMe->pMap,"sei_ritu",sei_ritu);
のように、IKHMAP_StrPutという関数を使います。
引数は
第一引数=共通領域のポインタ
第二引数=キーワード
第三引数=値の文字列
です(この関数は、値が文字列のケースしか使えません)
おなじキーワードがすでにあれば、そいつは削除して、
新規に、この値を設定します。
なお、値の領域は、関数内で取得し、その後、引数の
「値の文字列」の内容をコピーします。
つまり、引数の値の文字列に対しては、なにもしないので、
この引数のメモリー解放は、ユーザー側でやってください。
●注意
pMe->pMapは、領域を取っているわけでないので、
gamen1_FreeAppDataで領域を開放「しない」でください。
なお、上記例のgamen1.cは、ここにあります。
■値の受け取り
gamen2.cのgamen2_InitAppDataでやっています。
username = (char *)IKHMAP_Get(poya->pMap,"username");
のように、値をIKHMAP_Get(で取得します。
引数は
第一引数=共通領域のポインタ
第二引数=キーワード
です。返り値が結果になります(NULLは”設定されていない”の意味)
なお、返り値は、配列の値のポインタそのものを返します。
なので、勝手に解放(FREEIF)とか、しないでください。
また、値を書き換えると、それ以降、ずっと、そのキーワードの値は、
代わってしまうので、書き換えないでください。
(キーワードの値を変えたい場合は、IKHMAP_StrPutしてください)
なお、このように、初期化でしか使わない場合は、画面の構造体に
共通領域のポインタを取らなくてもいいです(統一させるのであれば、
とってもいい)。
また、要素がいらなくなったら、IKHMap_Removeをすれば、解放
されます。勝手にFREEIFしないでください。
ただし、もし、解放しなくても、プログラムが終了するとき、
または、同じキーワードで新しい値が設定される(=更新する)ときに、
値は解放されます。
と、こんな感じです。
これで、利用できるはずです。
次回は、具体的にIKHMapの中身について書きます
(なので、ただ、この関数を使う分には、今日までの範囲でできるはず)