Bài 4.1: String sử dụng trong BREW

Cỡ chữ: Decrease font Enlarge font

Trong bài này tôi giải thích về cách xử lý string của BREW. Ngoài ra tôi cũng giải thích về cách vẽ string lên màn hình và giải thích về font.

Khái quát về cách xử lý string của C language

Trong C language, xử lý string là array. Trong C language có 1 số standard function dùng để xử lý string. Ví dụ như có program liên kết 2 string rồi hiển thị giống như dưới đây.

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);

Xử lý string của BREW

String của BREW cũng giống với string của C language. Tuy nhiên, trong BREW, thì lại ko được phép sử dụng standard function của C language. Thay vào đó, trong BREW lại có sẵn “ヘルパー関数” (helper function) thực hiện chức năng giống như standard function của C language.

Helper function của BREW được ghi trong section có tên là 「ヘルパー関数/helper function」 trong 「BREW API リファレンス/BREW API reference」. Để các bạn tham khảo tôi đã lấy ra 1 vài helper funtion liên quan đến string và đưa vào bảng dưới đây.

Function name C language tương ứng Giải thích
MALLOC malloc Cung cấp memory .
FREE free Giải phóng memory.
SPRINTF sprintf Tạo string đã được mã hóa.
STRCMP strcmp Compare string.
STRCPY strcpy Copy string.
STRDUP strdup Duplicate string.
STRLEN strlen Get length of string.
DBGPRINTF printf Thực hiện debug output.

Trong BREW helper function thì cũng có rất nhiều các function khác ngoài các function trên đây, và cũng có những function mà ko tương ứng với standard function của C language. Để tham khảo, tôi khuyên các bạn hãy xem qua trước 1 lượt.

BREW helper function được declare ở header tên là AEEStdLib.h trong BREW SDK . Do đó khi các bạn sử dụng thì cần phải include file này.

Dưới đây là ví dụ về cách xử lý string sử dụng BREW helper function ghi trên đây. Hầu như là giống với cách xử lý string của C language.

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);

About debug output

Trong code trên đây có sử dụng DBGPRINTF() với tư cách là helper function tương ứng với hàm số printf() của C language. Cách sử dụng hàm số này thì hầu như giống với printf() nhưng khi output thì sẽ ko được hiển thị vào console( ở BREW không bao giờ hiển thị vào console!) mà sẽ được hiên thị ở “出力ウィンドウ” (output window) của BREW emulator.

“出力ウィンドウ”(output window) của BREW emulator được hiển thị bằng cách chọn [表示/display] - [出力ウィンドウ/output window] ở menu.

Hàm số này rất thuận lợi khi debug BREW application. Ngoài ra, từ BREW application đang thao tác trên máy bile thật cũng có thể thực hiện việc hiển thị dựa vào hàm DBGPRINTF() cho nên có thể thực hiện debug trên máy thật 1 cách hiệu quả.

Để hiển thị debug output từ máy thật thì sử dụng tool tên là “BREW Logger” nhưng tôi sẽ ko đề cập đến tool này trong các bài viết này.


Điều tôi muốn các bạn chú ý là, việc debug output thì developer có thể sử dụng nhiều hàm số ngoài hàm DBGPRINTF() . Giống như trong màn hình trên đây, có thể thấy là chỉ đang thao tác BREW emulator thì cũng đã có rất nhiều thông tin đang được output ra.

2 loại ký tự trong BREW

Đến đây thì các bạn nhìn thấy là string của BREW giống với string của C language. Nhưng thực ra, trong BREW còn có 1 loại string khác khác với string của C language. char type của C language là ký tự 1 byte còn trong BREW thì là type lưu ký tự 2 byte, đó là AECHAR type. Người ta gọi type đó là “ワイド文字/wide character ” .

Để tạo string dạng AECHAR thì sử dụng helper function STREXPAND(). Hàm STREXPAND() sẽ convert char string thành AECHAR string. Trong 「BREW API リファレンス/BREW API reference」 có ghi như dưới đây.

void STREXPAND
(
    const byte * pSrc,  // char string
    int nCount,         // số byte of char string
    AECHAR * pDest,     //buffer lưu AECHAR string
    int nSize           //số byte của  pDest buffer
)

※Về byte type thì là type được định nghĩa trong BREW và giống như unsigned char.

Khi thực hiện BREW programming thì AECHAR type xuất hiện ở mọi nơi, vì vậy hãy làm sao để quen với việc sử dụng STREXPAND trước. Dưới đây là sample code. Sample này là sample đã update HelloWorld application đã tạo ở Lession 2 để có thể hiển thị tiếng Nhật.

//
//  Được gọi khi start applet.
//
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);
    // Hiển thị string vào screen bitmap 
    IDISPLAY_DrawText(app->m_pIDisplay,
        AEE_FONT_BOLD,    // font chữ đậm
        wstr,             // string sẽ hiển thị
        -1,               // -1 = hiển thị all string
        0,                // ignore
        0,                // ignore
        NULL,             // không thực hiện clipping
        IDF_ALIGN_CENTER | IDF_ALIGN_MIDDLE);   // căn trái phải giữa, căn trên dưới giữa
    FREE(wstr);
    // hiển thị screen bitmap đã update
    IDISPLAY_Update (app->m_pIDisplay);
}

Hàm IDISPLAY_DrawText() sẽ nhận text sẽ vẽ làm AECHAR string cho nên sẽ sử dụng hàm STREXPAND() để tạo AECHAR string từ char string.

Khi đó, sẽ cấp AECHAR string buffer có độ dài bằng độ dài của char string gốc. Khi drawing kết thúc thì AECHAR string sẽ ko cần thiết nữa cho nên sẽ giải phóng bufer bằng hàm FREE().

※Việc convert lẫn nhau giữa char string và AECHAR string chỉ bằng C language gây ra nhiều phiền toái khi thực hiện BREW programming. Bằng cách chuẩn bị sẵn C++ class đã wrap string function của BREW thì việc thực hiện programming sẽ nhanh hơn, nhưng trong các bài viết này thì ko đề cập đến C++.

Hàm số xử lý wide character

Trong BREW helper function thì cũng có hàm số xử lý wide character. Trong table dưới đây có đưa ra 1 vài ví dụ. Về chi tiết, hãy xem 「BREW API リファレンス/BREW API reference」.

Function C function tương ứng
Giải thích
WSPRINTF sprintf Tạo string đã được mã hóa.
WSTRCMP strcmp Compare string.
STREXPAND strcpy Copy string.
WSTRCOMPRESS strdup Duplicate string
WSTRLEN strlen Get length of string.
STREXPAND なし Convert char string into wide string.
WSTRCOMPRESS なし Convert wide string into char string.

Về STREXPAND(), ngược lại khi convert AECHAR string into char string thì sử dụng hàm WSTRCOMPRESS().

Tags:

Add to: Add to your del.icio.us Digg this story Add to your Twitter Add to your Google Bookmark Add to your Facebook Add to your MySpace
Số lượt xem: 2422

[...] Some keyword in BREW [...]

Gửi nhận xét:comment

 *
 *