『Cプログラミング診断室』目次次(第13章 計算は自分で ウィンドウ設計)

第13章 計算は自分で

配列初期化


リスト13−1の32行目の変数info_patternの初期化を見てください。

    0xFFFF,0xFFFF,0xFFFF,0xFFFF,
が延々と64行も並んでいます。

配列のサイズを直接数値で指定せず、[]としているため、サイズは4×64=256になります。デー タ数が増減しても、0xFFFFの行を増減すれば良いだけだから完璧で、何も問題ないと思ってはいけ ません。

■可変長引数■

もうちょっと詳しく見てみましょう。まず、この配列は、どこで、何のために使われているので しょうか。

リスト13−1の171行のみで参照しています。それを含む関数は、

    rgb_info_image = (Server_image)
        xv_create(NULL,SERVER_IMAGE,
            XV_WIDTH,IMAGE_WIDTH,
            XV_HEIGHT,IMAGE_HEIGHT,
            SERVER_IMAGE_BITS,info_pattern,
            NULL);
となっています。関数xv_createは、xv_で始まっていますが、これはXViewのライブラリ関数であ ることを示しています。関数名の先頭数文字で関数の分類することは重要ですよ。

ここでは、その中の xv_create という、ウィンドウ、パネル、ボタンなど、XViewでは「オブジェ クト」と呼ぶものを作る関数をいっぱい使用しています。引数は、

        xv_create( owner, object,
                attrib-name, attrib-value,
                ........................
                NULL )        
の形に並べます。最初はオーナー、つまり親です。ウィンドウ上にパネルを配置し、パネル上にボ タンを配置するという感じで、各々の所属を指定します。ボタンなど、通常のものを作るときには、 それらは何かの上に配置するので、ownerは自然に決まります。しかし、作る物によっては親が無 いものもあります。この場合がそういう例外で、NULLを指定します。

2番目の引数が、作りたい物(オブジェクト)の種類を指定します。作ることのできる物はあら かじめ決まっていて、その中から選びます。ここではXウィンドウをちゃんと理解しないと意味不 明なSERVER_IMAGEを指定しています。ふつうは、CANVAS,PANEL,MENUなどという、もっとイメージ のつかみ易いものになります。

3番目以降は、1行に属性名と属性値を組で書くのが「作法」になっています。属性名に許され るものもあらかじめ決まっていますが、こちらは相当の数があり、いまだ私も見たことも聞いたこ ともないものが多数あるはずです。属性名はオブジェクトと同様、英大文字だけでできたXViewの マクロ名です。

この属性指定は、属性名でNULLを指定することで終了します。可変長引数のとき、引数の最後を 示すために、最後の引数はNULL(0)にしてしまうことは常套手段です。ということで、関数 xv_createの引数の個数は可変です。

ここで「問題」です。このxv_createという関数も当然C言語で書かれた関数でメーカーから提 供されているのですが、いったいどうやったらこのような関数を作れるでしょうか。答は参考文献 [13-1]「C言語のバイブル」にありますので探してください。さらに、自分でこのような関数をぜ ひ作って確認してみてください。

■初期化■

さて、最初注目していた変数info_patternは、属性値SERVER_IMAGE_BITSに対する属性値でした。 サーバーという言葉はよく聞くでしょう。Xはサーバークライアント方式で動いているとかいう、 あのサーバーのことです。この属性名をもっと分かりやすくいうと、画面(本当は画面に限る必要 はない)に表示するビットデータです。属性名にBITSが含まれていることから推察できるように、 2値データで白黒の絵を指定します。

イメージのサイズは、64×64です。ソースの1行が画面上の小さなイメージの1行に対応するよ うに書かれています。各ビットは、1のとき前景色(foreground)、 0のとき背景色(background) になります。直前の2行で、

            XV_WIDTH,IMAGE_WIDTH,
            XV_HEIGHT,IMAGE_HEIGHT,
とあり、これでイメージの幅、高さを指定しています。当然、この値と配列のサイズは対応しなけ ればいけません。

今は64×64でプログラムが組まれています。さて、80×80になったら、どうするのでしょう。さ らに、マウスでウィンドウサイズを実行中に変更したとき、その場で適当なサイズを自動計算し、 適当なイメージサイズにすることになったら、もうソースプログラム中に直接サイズを数字で書く ことは不可能です。

そうなんです。ウィンドウ対応になると、今までのように、すべてのサイズを「固定的」に扱う ことが不可能になります。色々なサイズや位置を、実行時にウィンドウシステムに問い合わせなが ら決めなければならなくなります。技術的にはどうということはないのですが、「発想の切り替え」 が必要になります。この辺りが難しいと思われる人が多い理由なのでしょうか。

したがって、ソース中にだらだらと初期値、それも全部0xFFFFを並べるなんてことはダメなので す。まあ、64行にもわたって0xFFFFを書き並べるなんてのは、ウィンドウシステム以前の問題です。

普通の作法は、ウィンドウのサイズが決まってから、サーバーイメージは

  1. 縦横サイズを決める。
  2. 必用なバイト数を決める。
  3. mallocで領域を確保する。
  4. memsetで領域を初期化する。
という手順で十分でしょう。もし、実行中に変更可能ならば、3.で以前にあったサーバーイメージ をfreeしてからmallocすることになります。


Copyright1996 Hirofumi Fujiwara. No reproduction or republication without written permission
『Cプログラミング診断室』目次次(第13章 計算は自分で ウィンドウ設計)