Mobile:NEWS 2003年11月14日 08:35 PM 更新

BREW プログラミング入門(4)
BREW の文字列について知ろう(1/2)

前回は画面描画のAPI、インタフェースやアプレット構造体についての理解を深めました。今回は文字列の扱い方について解説します。

 今回は、BREWの文字列の扱い方について解説します。また、文字列を画面に描画する方法や、フォントについても解説します。

C言語の文字列操作のおさらい

 C言語では文字列は文字の配列として扱います。C言語には文字列を扱うための標準関数がいくつかありましたね。例えば、2つの文字列を連結して表示するプログラムは以下のようになります。

char* str1 = "Open ";
char* str2 = "Sesami !";
char* str3;

int len1 = strlen(str1);
int len2 = strlen(str2);

str3 = (char*) malloc(len1 + len2 + 1);
{
    strcpy(str3, str1);
    strcpy(str3 + len1, str2);
    printf("%s", str3);
}
free(str3);

BREWの文字列操作

 BREWの文字列もC言語の文字列と同じです。ただし、BREWではC言語の標準関数を使ってはいけないことになっています。その代わり、C言語の標準関数と同等のことを行う“ヘルパー関数”が用意されています。

 BREWのヘルパー関数は、「BREW APIリファレンス」の「ヘルパー関数」というセクションに記載されています。参考までに、文字列に関するヘルパー関数をいくつか抜き出して表にしてみました。

関数名対応するC関数説明
MALLOCmallocメモリを確保します。
FREEfreeメモリを解放します。
SPRINTFsprintf書式化された文字列を作成します。
STRCMPstrcmp文字列を比較します。
STRCPYstrcpy文字列をコピーします。
STRDUPstrdup文字列を複製します。
STRLENstrlen文字列の長さを取得します。
DBGPRINTFprintfデバッグ出力を行います。

 BREWヘルパー関数にはほかにもいろいろな関数があり、C言語標準関数に対応しない関数も用意されています。リファレンスに一通り目を通しておくことをお奨めします。

 BREWヘルパー関数は、BREW SDKの AEEStdLib.hというヘッダで宣言されていますので、使用する場合はこのファイルをインクルードする必要があります。

 上記のBREWヘルパー関数を使用した文字列操作の例を以下に示します。C言語の文字列操作とほとんど同じですね。

char* str1 = "Open ";
char* str2 = "Sesami !";
char* str3;

int len1 = STRLEN(str1);
int len2 = STRLEN(str2);

str3 = (char*) MALLOC(len1 + len2 + 1);
{
    STRCPY(str3, str1);
    STRCPY(str3 + len1, str2);
    DBGPRINTF("%s", str3);
}
FREE(str3);

デバッグ出力について

 上記のコードでは、C言語のprintf() 関数に対応するヘルパー関数として、DBGPRINTF() を使用しています。この関数の使い方はprintf() とほとんど同じですが、出力はコンソール(BREWにそんなものはない!)に表示されるのではなく、BREWエミュレータの“出力ウィンドウ”に表示されます。

 BREWエミュレータの“出力ウィンドウ”は、メニューの[表示]-[出力ウィンドウ]を選択することで表示されます。

 この関数は、BREWアプリをデバッグするときに非常に便利です。また、携帯電話実機で動作しているBREWアプリからもDBGPRINTF() により表示を行えるので、実機でのデバッグが効率的に行えます。

 実機からのデバッグ出力を表示するには“BREW Logger”というツールを使いますが、これに関しては本連載では触れないことにします。


BREWエミュレータの出力ウィンドウ

 注意していただきたいのは、デバッグ出力は開発者が DBGPRINTF() で出力したもの以外にもいろいろあるということです。上記画面のように、BREWエミュレータを操作しているだけでも、さまざまな情報が出力されていることがわかります。

BREWの2つの文字型

 BREWの文字列がC言語のそれと同じものであることを見てきましたが、実はBREWにはもう一つ、C言語の文字列とは異なる文字列があります。C言語のchar型は1バイトの文字ですが、BREWにはAECHAR型という2バイト文字を格納する型があります。これを“ワイド文字”といいます。

 AECHAR型の文字列を作成するには、STREXPAND() ヘルパー関数を使用します。STREXPAND() 関数は、char文字列をAECHAR文字列に変換します。「BREW APIリファレンス」には以下のように記述されています。

void STREXPAND
(
    const byte * pSrc,  // char文字列
    int nCount,         // char文字列のバイト数
    AECHAR * pDest,     // AECHAR文字列を格納するバッファ
    int nSize           // pDest バッファのバイト数
)

※byte型はBREWで定義されている型で、unsigned charに同じです。

 BREWプログラミングにおいてAECHAR型はいたるところに現れてきますので、STREXPANDを使いこなせるようになっておきましょう。以下にサンプルコードを示します。このサンプルは、本連載第1回で作成したHelloWorldアプリを、日本語を表示するように変更したものです。

//
//  アプレットが開始したときに呼び出される。
//
static void HelloWorld_OnAppStart(AEEApplet* app)
{
    char* str = "ヘロー ワールド";
    int len = STRLEN(str);
    AECHAR* wstr;
    int wstr_bytes;

    wstr_bytes = (len + 1) * sizeof(AECHAR);
    wstr = (AECHAR*) MALLOC(wstr_bytes);

    STREXPAND(str, len, wstr, wstr_bytes);

    // 画面ビットマップに文字列を表示する
    IDISPLAY_DrawText(app->m_pIDisplay,
        AEE_FONT_BOLD,    // 太字のフォント
        wstr,             // 表示する文字列
        -1,               // -1 = 文字列をすべて表示する
        0,                // 無視される
        0,                // 無視される
        NULL,             // クリッピングしない
        IDF_ALIGN_CENTER | IDF_ALIGN_MIDDLE);   // 左右中央揃え、上下中央揃え

    FREE(wstr);

    // 更新された画面ビットマップを表示する
    IDISPLAY_Update (app->m_pIDisplay);
}

 IDISPLAY_DrawText() 関数は、描画するテキストをAECHAR文字列として受け取るため、STREXPAND() 関数を使用してchar文字列からAECHAR文字列を作成しています。

 その際、元のchar文字列の長さと同じ長さのAECHAR文字列バッファを確保しています。描画が終わればAECHAR文字列は不要になりますので、FREE() 関数によりバッファを解放しています。

※C言語だけでchar文字列とAECHAR文字列を相互変換することは、BREWプログラミングにたいへんな苦痛をもたらします。BREWの文字列関数をラップしたC++クラスを用意することで、飛躍的にプログラミングが楽になりますが、本連載ではC++については扱いません。

ワイド文字の操作関数

 BREWヘルパー関数には、ワイド文字を操作するための関数も用意されています。以下の表にいくつか抜き出しました。詳細は「BREW APIリファレンス」を参照してください。

関数名対応するC関数説明
WSPRINTFsprintf書式化された文字列を作成します。
WSTRCMPstrcmp文字列を比較します。
WSTRCPYstrcpy文字列をコピーします。
WSTRDUPstrdup文字列を複製します。
WSTRLENstrlen文字列の長さを取得します。
STREXPANDなしchar文字列をワイド文字列に変換します。
WSTRCOMPRESSなしワイド文字列をchar文字列に変換します。

 STREXPAND() とは逆に、AECHAR文字列をchar文字列に変換するには、WSTRCOMPRESS() 関数を使います。

[倉谷智尋, ITmedia]

Copyright © ITmedia, Inc. All Rights Reserved.

前のページ | 1/2 | 次のページ



モバイルショップ

最新スペック搭載ゲームパソコン
高性能でゲームが快適なのは
ドスパラゲームパソコンガレリア!

最新CPU搭載パソコンはドスパラで!!
第3世代インテルCoreプロセッサー搭載PC ドスパラはスピード出荷でお届けします!!