ウィリアムのいたずらの、まちあるき、たべあるき

ウィリアムのいたずらが、街歩き、食べ物、音楽等の個人的見解を主に書くブログです(たま~にコンピューター関係も)

BREWで画面間メモリ一括管理(その4-IKHMap(共通領域)本体)

2006-10-13 12:59:50 | ケータイ

  シリーズ「BREWで画面間メモリ一括管理」(いわゆるBREW版カオル姫方式)の第4回目、今日は、いよいよ、その共通領域、連想配列を実現しているIKHMap本体です。




■ヘッダー(IKHMap.h)
こんな構造になっています。
typedef struct _IKHMap
{
	IShell			*pIShell;
	IDisplay		*pIDisplay;
	PFNNOTIFY		pUserFree;
	PFNNOTIFY		pUserInit;
	int			itemsu;
	char			**key;
	int			*kind;
	void			**val;
} IKHMap;

連想配列を実現しているのが、**keyと**valです。
 keyは、キーワードとなる言葉(文字列、char *)を保持している配列、
 valは、値となる領域(なんでもOKなようにvoid *)を保持している配列、
です。

おなじ、添え字番号のものが、対応することになります。
 たとえば、キー"name"に、"ウィリアムのいたずら"という値ガ対応しているとして、
 キーkey[1]="name"だったら、その値はval[1]="ウィリアムのいたずら"となってます。
 配列の要素数は、itemsuに入っています。
 kindは、valの型なのですが、今回は、文字列だけなので、IKHMAP_KIND_STRが入っています。
 他の項目は、今回は使いません(今後拡張するカオル姫方式2ndで利用)




■生成(IKHMAP_Create)

 この領域の生成を行う関数、IKHMAP_Createは、IKHMap.cに記述されています。ここでは、領域をとって、初期化するだけです。




■値の設定(IKHMAP_StrPut、IKHMAP_Make、IKHMAP_SetPtr)
 この領域に、キーと値の組を設定する関数、IKHMAP_StrPut、IKHMAP_Make、IKHMAP_SetPtrは、IKHMap.cに記述されています。

それぞれの関数の内容は以下のとおり
IKHMAP_StrPut 値が文字列用:文字列の指定でIKHMAP_Makeを呼び、共通領域に設定する
IKHMAP_Make  値の領域をとった後、IKHMAP_SetPtrを呼び出し、共通領域に設定する 
IKHMAP_SetPtr 値の領域がとられているものに対して、共通領域に設定する


これを、IKHMAP_StrPutから、一連の動作を書くと、以下のとおり

(1)文字列の指定、大きさは文字の長さにして、IKHMAP_Makeを呼び出す

   ----------以降 IKHMAP_Make-----------

(2)IKHMAP_MakeAreaを呼び出し、値の領域を確保する
   →IKHMAP_MakeAreaでは、種類に応じて、メモリをとる
    カオル姫2ndでは、ユーザーが指定した種類の場合、pUserInit関数を呼び出し、確保

(3)IKHMAP_SetPtrを呼び出し、共通領域に、(2)の値の領域とキーを設定する

   ----------以降 IKHMAP_SetPtr-----------

(4)すでに、キーと同じ項目が登録されていたら、IKHMAP_Removeで削除する

(5)新しい共通領域の配列分を確保する(keyとkind,val分)

(6)すでに、データが入っている場合、そのポインタを(5)で取得した領域に
   コピーして、今まで使ってた領域を開放する

(7)新しいキーワードを領域をとって設定し、
   新しい値のポインタを引数から設定し
   新しい種類の値を引数から設定し
   要素数を上げる

   ----------以降 IKHMAP_Make戻り-----------

   ----------以降 IKHMAP_StrPut戻り-----------
(8)引数の文字列を、新しく取った値の領域にコピーする




■取得(IKHMAP_Get)
 この領域から、キーワードを渡したら、値を返す関数、IKHMAP_Getは、IKHMap.cに記述されています。ここでは、IKHMAP_GetPosでキーワードが、引数と同じ物の、添え字番号を取得し、それがあれば、その添え字番号の値を返すだけです。




■取得(IKHMAP_Release)

 この領域を解放する、IKHMAP_Releaseは、IKHMap.cに記述されています。ここでは、領域の要素のキー、値、種類を解放し、それらの配列領域を開放しています。
 その際、値を解放するときに、IKHMAP_FreeAreaを使っています。
  →IKHMAP_FreeAreaでは、種類に応じて、メモリを解放します
  カオル姫2ndでは、ユーザーが指定した種類の場合、pUserFree関数を呼び出し、解放





■要素の組の削除(IKHMAP_Remove)
 この領域の要素の1つの組(のみ)を解放する、IKHMAP_Removeは、IKHMap.cに記述されています。
 ここでは、まず、削除指定されたキーが、存在するかどうか、IKHMAP_GetPosで確認し、存在しない(-1)のときは、何もしないで返します。
 その後、指定された値のキーと値の領域を開放し(値は上記IKHMAP_FreeAreaで解放し)、配列を、その削除をしたところから、一番最後まで、1つ分上げ、その後、要素数を1つ減らします。

 要素が0になったら、配列はいらないので、解放してNULLをセットします
(0以外のときは、元の配列領域は、そのまま利用し、要素を、削除した要素から最後までを1つ分、前にずらしています)




と、こんなかんじでやっています。
これで、カオル姫方式BREW版の説明は完了です
(まだ、2ndのほうは、のこっていますが、文字列のみのものについての説明はおしまい)


この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« ケータイも、キラーコンテン... | トップ | 農業用ロボットをケータイや... »
最新の画像もっと見る

ケータイ」カテゴリの最新記事