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

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

BREWで画面間メモリ一括管理(その1-概要とサンプルソース)

2006-10-10 13:56:53 | ケータイ

シリーズ「BREWで複数画面を(分割して開発可能な)開発する場合の方法論」(ただし、追加書きで 先ほどのBREWで分散環境のまとめの話の追加、があります)のつづき、かつ
 BREWにおける、カオル姫方式の話の実体です。




■概要

 いままで、画面間にまたがる変数は、そのたびに、アプリ共通領域に足していました。
 しかし、この方法では、変数が増えるたびに、アプリ共通領域に修正が入ってしまい、安定しません。そこで、アプリ共通領域に1つのハッシュマップもどきを作成し、そのハッシュマップに、変数をputしたり、getしたりすることで、画面間にまたがる変数を設定・獲得するようにします。

 そうすれば、アプリ共通領域には、このハッシュマップのポインタをもっておいて、
  アプリ起動時(アプリ_initAppData)にこのハッシュマップを生成し、
  アプリ終了時(アプリ_freeAppData)にこのハッシュマップと要素全部を解放
 すればいいことになります。

 この方式を、カオル姫方式となずけます。
 なぜかというと、昔JTの宣伝で、1つのボール(これがハッシュマップ)をいろんな人々(これが画面とか、関数とか)が打っていって(値を出し入れして)、最後にアタックする(表示する)というものがあったのですが、それと、処理イメージが同じ(カッコの中が、処理イメージ)だからです。
 で、このCMのはじめにレシーブしたのが、カオル姫なので、カオル姫方式

 となずけたのがはじめなのですが、カオル姫方式2ndでは、もう一つの理由が出てきます。

 なお、BREW版カオル姫方式には、2つあります

  1つは、上記のとおり、画面間にまたがるデータを文字列にして受け渡すもの
   →文字列だけが対象です
  もうひとつは、画面の情報全体を受け渡し、自分が定義した構造体でも、
   メモリ取得、一括解放などができるようにしたものです。

 後者をとくに、カオル姫方式2ndとよびます。
 今回は前者のほうの対応をします(ただし、ソース中には、後者の内容も若干入ってしまっています)
 ちなみに、BREW版としたのは、PHP版というのが既にあって、このあとJava版もでてきます。




■仕様
「BREWで複数画面を(分割して開発可能な)開発する場合の方法論」その9で示したものと、まったく同じ、外部仕様とします。

 つまり、外見は同じで、中身だけ、カオル姫方式を使って、共通領域のところを変えます。





■ソース

 今回は、先にソースを示してしまいます。
 以下のリンク先に、ソースがあります。
   version.h
   fukusu1.c ★
   fukusu1.h ★
   gamen1.c ★
   gamen1.h ★
   gamen1.htm
   gamen2.c ★
   gamen2.h ★
   gamen2.htm
   gamen10.c ★
   gamen10.h ★
   IHtmlCtl.c
   IHtmlCtl.h
   IKHMap.c ●
   IKHMap.h ●

なお、fukusu1.mif,fukusu1.bidは、MIFエディタで作成したものを使います。
ソース名の後ろに、●があるのが、追加、★があるのが、修正したものです
(逆にいうと、無印だと、変更無しという意味です)




■今回追加されたソースの概要説明

 今回追加されたIKHMapは、カオル姫方式のハッシュマップもどき(連想配列を実現したもの)になります。なお、IKHMapっていう名前は、本当は、

    IKaoruHimeMap

にしようとおもったのですが、余りに名前が長いので、IKHMapにしました。

それぞれのファイルは、以下のとおりです。

●IKHMap.h
 これが、そのカオル姫方式のハッシュマップもどき(連想配列を実現したもの)の構造体です。
 今回重要なのは、 IKHMapの
    int  itemsu;
    char  **key;
    int  *kind;
    void  **val;
 です。
  keyは、キーの文字列配列、
  valは値(現在は文字列なのでchar *だが、将来的なことを考え、
    char*以外でもOKなようにvoid*にしている)の配列、
  kindは、値の型がなんであるかをいれておく配列
   (今回はすべて、IKHMAP_KIND_STR)
  itemsuは、配列の要素数
 です。

 上の定数宣言は、kindに入るもの(つまり、値の型)の宣言です。


●IKHMap.c
 ここに、カオル姫方式で使う関数が記述されています。
 今回重要なのは、以下の関数です。

IKHMAP_Create
 この構造体を生成し、初期化します

IKHMAP_Release
 この構造体の領域を開放します。要素も全て解放します
 要素は、キーを解放し、値を、kindに入っている値の型に応じて解放します
 (ただし、今回は文字列のみなのでFREEIFするだけですけど)

IKHMAP_StrPut
 文字列を、この構造体に追加します。連想配列の形なので、キーと値を設定します

IKHMAP_Get
 文字列を、この構造体から取得します。連想配列のキーを指定すると、
 該当キーの要素があれば、それに対応する値を返します
  (void *で返すので、キャストしてください)。
 該当キーの要素がなければ、NULLを返します

IKHMAP_Remove
 指定されたキーの要素があれば、そのキーと値の組をメモリ解放し、
 要素から除きます。
 指定されたキーの要素が無ければ-1を返してなにもしません。




 では、このシリーズの次回より、内容について説明していきます。
 まずは、アプリ全体から。
この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« ソフトウエアの改造には、も... | トップ | auで動くJava,オープンアプリ... »
最新の画像もっと見る

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