Symbian程式設計 基礎篇 描述符簡介

2021-08-23 11:22:53 字數 3047 閱讀 5662

一、強化印象

在學習描述符之前,首先要理解symbian中描述符的作用。在symbian中,沒有提供專門用來處理字串的類,它把字串和二進位制緩衝區看成是同一類資料,有一套專門的類去管理,這一套類的類關係圖層次結構如下圖所示:

圖一. 描述符類的層次關係

上圖所示的類統稱為「描述符」,symbian用「描述符」來管理字串,其中,tdesc、tdes、tbufcbase為抽象類。

我們首先來舉乙個簡單的例子,來強化我們對描述符的理解。如果我們由乙個字串「newlc」,我們想使用變數存放,在c語言中,我們可以使用如下**編寫:

char c = 「newlc」;

const char* c = 「newlc」;

而在symbian c++中,我們應該使用以上那個描述符存放呢?

圖二. 描述符物件與資料在記憶體中的位置

二、理解概念

1、根據描述符資料存放位置進行分類(如圖二):

棧描述符tbuf和tbufc:資料做為描述符物件的組成部分而存在,描述符物件存放在程式的棧中,就像c語言中的字元陣列(char)。

堆描述符hbufc:資料做為描述符物件的組成部分而存在,描述符物件存放在堆中,就像c語言中的(char*)malloc( length+1 )一樣通常用於預先不能確定長度的情況。因為是在堆上分配的,它總是通過hbufc*使用而不是直接定義hbufc物件。

指標描述符tptr和tptrc:描述符物件和它所表示的實際資料是分開存放的,描述符物件存放在棧中,正如「指標」的含義,指標描述符所指向的資料可以為棧中的資料,也可為堆中的資料。tptrc和tptr與c語言中的char*有點兒類似,但因為描述符自己包含了長度資訊,所以不再需要掃瞄結尾的空字元(『』)或為它分配空間。

2、可修改的描述符與不可修改的描述符:

大家可以看到,在描述符類中,有些類結尾帶「c」,這些類表示「唯讀的描述符」,即:描述符在定義時擁有的資料或指向的資料,描述符不提供修改的方法。所以,推薦使用以下方法宣告可修改的描述符和不可修改的描述符:

const tdesc& str;

tdesc& str;

可以從圖一看到,基類tdesc沒有提供對內容修改的函式,而繼承自tdesc的類tdes提供了對內容修改的函式。

3、描述符的寬度

所有這些描述符都可以指定資料尺度:tdes8、tdes16、tdesc8、tdesc16、tbuf8、tbuf16等

這裡8表示描述符處理的資料是8bit的,而16表示是16bit資料。一般來說,你只要使用通用形式(tdes, tdesc,…)來表示文字資料而使用8bit版本(tdesc8等)來表示二進位制的內容。

三、描述符的使用

1、使用巨集_lit(_lit16,_lit8)和_l定義字串常量

neikonenvironment::messagebox(_l(「error: init file not found!」));

_lit()可以生成個常量名,以便以後重複使用:

_lit()巨集的結果(就是上面的kmyfile)實際上是個文字描述符(literal descriptor)tlitc,它可以在任何使用tdesc&的地方使用。

2、系統定義的描述符

knulldesc(knulldesc16, knulldesc8)

_lit16(knulldesc, "");

表示空或者無文字的16位(8位)格式描述符。

3、構造描述符

tbufc(不可修改的棧描述符)

_lit(khelloworld, "hello world");

const tint maxbuf = 32;

tbufcbuf;

tint currentlen = buf.length(); // == 0

buf = khelloworld;

currentlen = buf.length(); // == 11

ttext ch = buf[2]; // == ''l''

tbuf(可修改的棧描述符)

tptrc(不可修改的指標描述符)

const unsigned char kbuffer = ;

tptrc8 bufferptr( kbuffer, sizeof(kbuffer));

isocket.write(bufferptr, istatus);

tptr(可修改的指標描述符)

_lit(khelloworld, "hello world");

const tint maxbuf = 32;

tbufcbuf;

buf = khelloworld;

tptr ptr = buf.des();

ptr[7] = ''a''; ptr[8] = ''l''; ptr[9] = ''e''; ptr[10] = ''s'';

ceikonenv::static()->infomsg(ptr); // "hello wales"

hbufc(堆描述符)

hbufc* heapbuf = hbufc::newl(khelloworld().length());

*heapbuf = khelloworld();

delete heapbuf;

4、使用描述符

ptr(),用來獲得描述符資料中的指標。

length(),用來獲得描述符資料中的字元數。

size(),用來獲得描述符資料中的位元組數目。

cpmpare()或操作符==、!=、<=和》=等專為比較描述符資料用的。

操作符,可以被當作c/c++中一樣,用來獲得描述符字串中的單個字元。

compare()有2個變體:comparec()和comparef(),以及copy(),find(),locate()和match(),這些函式都有c/f的字尾形式,c代表collated而f代表folded。folding是個比較格式化文字的簡單方法,主要用在對比較不是太要求精確的場合。collation是個更好的也更有效的比較字串的方法,可以生成類似字典的順序。

Symbian中的字串 描述符

在傳統的c c 程式設計中,字串通常都是以char陣列的形式來實現,這樣的實現簡單靈活,但是同時也埋下了不小的隱患 操作的時候必須特別小心,否則很容易出現記憶體越界。為了解決這個問題,在symbian中,存在著一組特殊的類來處理字串,這就是描述符類。根據資料的儲存和訪問方式,描述符類可以分成三種 棧...

mysql 檔案描述符 檔案描述符

toc 首先,linux的世界裡一切皆為檔案,無論是裝置還是乙個socket連線。檔案又可分為 普通檔案 目錄檔案 鏈結檔案和裝置檔案。檔案描述符 file descriptor 是核心為了高效管理已被開啟的檔案所建立的索引,其是乙個非負整數 通常是小整數 用於指代被開啟的檔案,所有執行i o操作的...

檔案描述符

檔案描述符 是個很小的正整數,它是乙個索引值,指向核心為每乙個程序所維護的該程序開啟檔案的記錄表。檔案描述符的優點 相容posix標準,許多 linux 和unix 系統呼叫都依賴於它。檔案描述符的缺點 不能移植到unix以外的系統上去,也不直觀。基於檔案描述符的輸入輸出函式 open 開啟乙個檔案...