Symbian系统开发教程2


    
    第二章 :数类型语法
    谢兴 转载需注明出处
    Symbian系统已提供套已定义置数类型保证代码编译器关应面symbian系统提供数类型原生数类型〔native types里指标准C中int char等〕

    1 根类型
    TIntX TUintX (中X 8 16 32) 分表示 8位 16位 32位符号符号整数 般情况TInt TUint非考虑代码优化兼容性时候会TInt8TInt16样类型TInt TUint 类型分应符号符号整数

    Ø TInt64 版80前Symbian系统中支持64位算术运算两32位值实现64位整数80版TInt64TUInt64定义long long类型真正64位置数类型

    Ø TReal32 TReal64 (TReal相TReal64)
    两数类型相单精度双精度浮点数浮点数运算整数慢般应量防止浮点数运算

    Ø TTextX (中X 8 16)
    分应窄宽字符〔注:谓窄字符通常ASCII码字符宽字符指unicode字符集字符 〕

    Ø TAny*
    TAny* 意指意容指针种意义讲TAny相void TAny* 相TAny*某场合void标示空’:
    void hello(void)
    时改写: TAny hello(TAny)

    Ø TBool
    标示布尔类型Symbian系统提供两常量:ETrue (1) EFalse (0)分表示真假




    注意:Symbian系统中TBool定义int ETrueEFalse定义enum果函数返回值TBool代码拟函数返回值:
    TBool isLarger〔TInt a TInt b〕
    {
    return (a>b)ETrueEFalse
    }

    if(isLarger(43)ETrue){} 错误编译
    if(isLarger(43)){} 正确
    2类象
    21 Symbian系统中命名惯:
    Symbian系统中编写代码时应遵守种样规:成员变量命名写字母i开头方法参数写字母a开头例:
    class Pernon
    {
    public
    TInt iAge
    void SetAge(TInt aAge){iAge aAge}
    }
    symbian系统中存种类型类〔class〕类型类特性相
    堆〔heap〕创立栈〔stack〕创立特类实例〔instance〕方式相〔面方便类类称型〕型〔class type〕表达特点型套定义关创立实例规容易区分型Symbian系统简单命名规:类名写字母开头〔TCR M〕作类设计者先考虑类行底种型匹配旦确定类型然专注该类功样类者讲果熟悉类 类命名规帮助弄清意图安方式初始化销毁类象〔object〕
    面讨型特性

    Ø T 类
    T类行类似C++中置类型T作前缀(〞T〞代表〞Type〞)象置类型样没析构方法〔destructor〕导致结果:T类包含具析构方法成员变量般情况T类成员变量置类型数者T类象某情况T类包含象指针引时前〞关系拥〞关系〔说T类象负责成员创立销毁工作〕拥外部数原T类没析构方法正没析构方法T类象栈创立程序流程退出函数产生leave〔种代码异常〕时候系统动T类析构方法发生异常〔Symbian系统中异常称leave〕时Symbian 系统会调leave没模仿标准C++抛出异常做法

    T类象堆创立应调发生异常代码前象放入栈〔cleanupStack〕发生异常时候栈〔cleanupStack〕会释放象




    Ø C 类
    种类CBase派生〔直接间接〕
    h file
    class CStudentpublic CBase
    {
    public
    CStudent(){
    RDebugPrint(_L(i am a student))
    }
    ~CStudent()
    {
    RDebugPrint(_L(please don't kill me))
    }
    void SampleFunction(){}
    private
    TInt iCode
    TInt iScore
    }



    CBase两特点:首先虚析构方法样通CBase指针删子类代码示:
    CBase *pStu new CStudent()
    delete pStu
    结果: i am a student
    please don't kill me
    次CBase类子类重载new操作符堆创立时候动初始化0说开始创立出时候成员变量初始化0您必构造方法中做件事情栈创立象时情况非样 时没new操作潜导致堆创立象栈创立象行致C类象定堆创立
    明显堆C类象需时需消耗 C类象两种方式存:类指针成员变量局部针指变量前种情况类析构方法中调delete删种情况复杂调潜异常〔leave〕代码前指针放栈〔cleanup stack〕中否发生存泄露CBase 类声明私拷贝构造方法赋值操作〔〕策略防止客户代码心浅拷贝赋值方法基类拷贝构造赋值私果您希您类够拷贝构造方法您必须显式声明定义拷贝构造方法赋值操作考虑C类特性深拷贝造成发生异常〔leave〕隐患您绝类构造方法〔析构方法〕发生异常〔教程面解释原〕果您确实需拷贝方法您类添加会发生异常方法完成样务例:CloneL()CopyL()果您提供类CBase派生您必防止客户代码潜安问题浅〞拷贝代码中方法声明私

    Ø R 类
    前缀R〞 里代表资源〔Resource〕 通常外部资源例:文件句柄〔handle〕
    C类Symbian系统中存应RBase类R类应构造方法资源句柄置0说明没资源新建象关联起构造方法中初始化资源句柄样构造方法产生异常R类中常常类Open() Create() Initialize()样方法分配资源设置句柄成员变量值返回错误代码产生异常 R类通常应Close〔〕Reset()类释放资源重置句柄值说明没资源该象关联R类时常见错误忘记调Close()方法〔然该方法名字常命名Close〔〕〕析构方法释放资源会引起资源泄露
    R类通常资源句柄没成员变量需通常没析构方法资源释放Close()方法中进行数情况R类作类成员变量局部变量存少数情况堆创立
    您必须确保程序发异常时候资源正确释放通常资源栈果R类堆动变量〔相成员变量〕您保证资源释放变量身释放
    typically by using two push calls CleanupClosePushL() or asimilar functionto ensure that the resource is cleaned up and a standard CleanupStackPushL(TAny*) which simply calls UserFree() on the heap cell
    R类成员变量通常简单般需深拷贝〔bitwise copy〕R类拷贝会引起混乱〔想象:果两象时资源句柄调Close()方法两象没释放资源会发生什情况?〕果您想阻止R类拷贝您应声明〔定义〕私构造方法赋值操作

    Ø M 类
    提继承时候意味着类派生时混杂基类功前缀M单词Mixin首字母Symbian系统赞成继承做法引入额外复杂性M类抽象类作相java中接口〔interface〕Symbian系统中M 类常定义回调接口者观察者〔observer〕类M类类继承面出两例子

    class MAnimal
    {
    public
    virtual void EatL() 0
    }
    class MDomesticAnimal public MAnimal
    {
    public
    virtual void NameL() 0
    }
    class CCat public CBase public MDomesticAnimal
    {
    public
    virtual void EatL(){} MAnimal MDomesticAnimal继承
    virtual void NameL(){} MDomesticAnimal继承
    Other functions omitted for clarity
    }
    面例子演示CBase类M类派生具体类类MDomesticAnimalMAnimal派生象接口样实例化M类虚〔virtual〕函数成员变量构造方法析构方法 条件实现具体类必须CBase派生定义完类然代码:
    CCat *cat1 new CCat
    delete cat1 正确

    然面代码错误
    MAnimal *cat2 new CCat
    delete cat1 错误
    M类指针引象时候果delete删指针M类必须提供虚拟析构方法否会出现系统异常〔panic code 42〕MAnimal代码改写面代码没问题
    class MAnimal
    {
    public
    virtual void EatL() 0
    virtual ~MAnimal() 增加虚析构方法
    }



    3描述符〔descriptor〕
    Symbian 系统中字符串称描述符〞〔descriptor〕描述描述符中保存表示字符串长度底层存布局信息描述符标准C中字符数组字符指针复杂您需花时间学掌握法关键特殊设计少量存设备非常效率仅非常少存保存长度存布局信息现深入解描述符设计思想
    Symbian系统中描述符相迷惑种类繁种类描述符具特性法常相互转换标准C++中stringjava语言中string类MFC中CString程序员必须理底层存分配工作具防治存溢出机制赖NULL终结符号决定字符串长度方讲C语言中字符串
    现讨:什描述符?工作?探讨描述符前先需弄清楚根概念:什字符串数宽度〞长度指单字符8bit16bit宽度早期版中字符宽度8bit支持Unicode字符集第5版起Symbian系统16bit 字符作标 准Symbian系统现支持两种字符长度描述符Copy()Size()两方法外两种宽度描述符行完全致两方法面介绍外套中立描述符类型定义窄描述符类型定义宽描述符类型取决编译时宽度您名字容易出类型表示宽度假设8结尾〔例:TPtr8意味着表示8bit窄字符16结尾描述符类〔例:TPtr16〕操作16bit宽字符 中立〔neutral〕类型讲没数字结尾〔例:TPtr〕Symbian系统第5版默认情况表示宽度16bit字符串间关系拟类似TIntTInt16TInt32 间关系点应拟易理解
    般情况您没必指明字符串宽度中立类型样代码易宽字符版窄字符版间转换〔编程验朋友应该样印象常写代码情况仅仅UINT类型较少考虑UINT16UINT32类型〕
    外问题:描述符字面量〔literal〕区谓字面量指编码时候已确定量例标准C中
    char* p Hello world
    中Hello world字面量Symbian系统中处理样点面介绍
    样认识 现描述符类型Symbian系统中描述符类型两种类:修改〔nonmodifiable〕描述符修改(modifiable)描述符
    31修改〔nonmodifiable〕描述符

    Symbian系统中描述符继承TDesC前面已讨类名前缀T代表意义里更关心类名缀C代表意义C单词Constant首字符表示类更改类提供返回字符串长度操作数方法Length〔〕方法返回描述符长度描述符象存中布局样4字节表示包含数长度〔实际32bit中28bit剩余4bit留作描述符表示长度228 字节256 MB已足够〕Length〔〕方法没子类重写子类效根实现子类方法子类访问数方式样Symbian系统求子类通虚函数方式实现访问数方法 虚函数重写原虚函数会派生描述符象增加4节字额外负担c++4字节存放指虚函数表指针前面说设计描述符时候高效额外字节开销认理想存放长度4字节中28bit表示长度剩4bit表示描述符类型目前symbian系统中5种派生描述符类型4bit限制描述符种类16种已足够子类通调基类TDesCPtr〔〕方法访问描述符数Ptr()方法检查4bit确定描述符类型返回数存中址然求TDesC基类清楚子类存布局Ptr〔〕方法中硬编码方法面表述方便种修改描述符称常量描述符〔constant descriptor〕

    总结:修改描述符类TDesC非字面量描述符基类提供确定描述符长度访问数方法外实现您想处理常量字符串操作


    32修改〔modifiable〕描述符
    修改描述符TDes基类派生TDes身TDesC派生TDes额外成员变量存放该描述符分配数长度MaxLength()方法返回长度TDesC中Length〔〕方法样MaxLength()方法TDes子类继承 TDes类提供系列方法 修改字符串数操作包括字符串附加填充格式化操作方法派生类继承派生类实现特定构造方法复制赋值方法方法负责分配存假设超描述符数长度例Append〔〕方法某字符串面附加字符串时调该方法前您必须确保足够存空间然超描述符存储容量描述符长度伸缩描述符长度长度短时候描述符面局部余未方法断言〔assertion〕确保描述符长度会超出果发生存溢出会产生panic〔关panic面章节介绍〕样方便您检查修正程序错误
    事实描述符溢出点保证您代码强壮性易产生难踪存陷阱



    需注意基类构造方法proteced类型您法直接实例化TDesCTDes类实例现描述符派生类您实例化派生类象正前面说方拟迷惑描述符存量派生类 前面已解释什类会三版例:TDes8 TDes16 TDes分应窄字符宽字符中立类现描述符类型深入讨种类型细节前先考察般情况存布局描述符两种根存布局:指针描述符缓存区描述符处指针描述符持指字符串指针字符串存储存中基位置指针描述符缓存区描述符身持字符数说字符数身构成描述符局部

    总结:TDes 修改描述符基类 TDesC派生返回存容量方法系列修改字符串数方法



    33 指针描述符〔pointer descriptor〕

    指针描述符分两种:TPtrC TPtr〔前面说种类型描述符字符宽度分三版例:窄字符版TPtrC8宽字窄版TPtrC16中立版TPtrC严格讲六种指针描述符〕指针描述符持字符串描述符身分开存放存储ROM中堆中栈中保存数存描述符拥通理果该描述符堆分配应通堆描述符〔HBufC面讲解〕操作存分配销毁果指针描述符指字符串栈分配存必须已栈分配通常情况指针描述符基栈时候堆例:作CBase派生类成员变量时候修改描述符〔TPtrC〕中指数指针存放长度面指针描述符总长度2字〔word〕修改指针描述符中存放长度面总长度3字列图拟TPtrTPtrC存布局
    iLength(12)
    iMaxLength
    iPtr
    Hello world
    iLength(12)
    iPtr
    TPtrC
    TPtr









    Ø TPtrC
    TPtrC相C语言中const char*指数访问修改:说描述符中数常量基类TDesC中继承操作访问TPtrC定义系列构造方法描述符指存指针0结尾C语言字符串构造

    字面量描述符面介绍
    _LIT(KLiteralDes Sixty zippers were quickly picked from the woven
    jute bag)
    TPtrC pangramPtr(KLiteralDes) 字面量描述符构造
    TPtrC copyPtr(pangramPtr) 描述符构造
    TBufC<100> constBuffer(KLiteralDes) 常量缓存区描述符面介绍
    TPtrC ptr(constBuffer) Constructed from a TBufC
    TText8 is a single (8bit) character equivalent to unsigned char
    const TText8* cString (TText8*)Waltz bad nymph for quick jigs
    vex
    0结尾字符串构造
    TPtrC8 anotherPtr(cString)

    TUint8* memoryLocation Pointer into memory initialized elsewhere
    TInt length Length of memory to be represented

    TPtrC8 memPtr(memoryLocationlength) 指针构造

    指针身改变成指字符串数(通Set〔〕方法)果您想指明改变您TPtrC指数您TPtrC声明const样您试图Set〔〕方法更改TPtrC指数时编译器会产生警告

    字面量描述符
    _LIT(KLiteralDes1 Sixty zippers were quickly picked from the woven jute
    bag)

    _LIT(KLiteralDes2 Waltz bad nymph for quick jigs vex)

    TPtrC alpha(KLiteralDes1)
    TPtrC beta(KLiteralDes2)
    alphaSet(KLiteralDes2) alpha points to the data in KLiteralDes2
    betaSet(KLiteralDes1) beta points to the data in KLiteralDes1
    const TPtrC gamma(beta) Points to the data in beta KLiteralDes1
    gammaSet(alpha) Generates a warning but points to alpha
    里应加示范代码

    Ø TPtr
    TPtr 修改指针描述符访问修改字符串二进制数TDesC TDes提供操作适TPtr类定义构造方法指存指针构造设置适长度值长度值
    编译器会产生隐式构造方法拷贝构造方法没声明保护私TPtr象修改描述符构造例:通修改描述符调Des〔〕方法方法返回示TPtr象:
    _LIT(KLiteralDes1 Jackdaws love my big sphinx of quartz)
    TBufC<60> buf(KLiteralDes1) TBufC are described later
    TPtr ptr(bufDes()) Copy construction can modify the data in buf
    TInt length ptrLength() Length 37
    TInt maxLength ptrMaxLength() Maximum length 60 as for buf


    TUint8* memoryLocation Valid pointer into memory

    TInt len 12 Length of data to be represented
    TInt maxLen 32 Maximum length to be represented
    Construct a pointer descriptor from a pointer into memory
    TPtr8 memPtr(memoryLocation maxLen) length 0 max length 32
    TPtr8 memPtr2(memoryLocation len maxLen) length 12 max 32



    外TPtr提供赋值运算符()拷贝数指针指存〔数源修改修改指针描述符0结尾字符串〕果拷贝数长度超描述符长度会引发系统异常TPtrC样TPtr定义Set〔〕方法改变描述符指数

    _LIT(KLiteralDes1 Jackdaws love my big sphinx of quartz)
    TBufC<60> buf(KLiteralDes1) TBufC are described later
    TPtr ptr(bufDes()) Points to the contents of buf

    TUint16* memoryLocation Valid pointer into memory

    TInt maxLen 40 Maximum length to be represented
    TPtr memPtr(memoryLocation maxLen) length 12 max length 40

    Copy and replace
    memPtr ptr memPtr data is KLiteralDes1 (37 bytes) maxLength 40

    _LIT(KLiteralDes2 The quick brown fox jumps over the lazy dog)
    TBufC<100> buf2(KLiteralDes2) TBufC are described later
    TPtr ptr2(buf2Des()) Points to the data in buf

    Replace what ptr points to
    ptrSet(ptr2) ptr points to contents of buf2 max length 100
    memPtr ptr2 Attempt to update memPtr which panics because the
    contents of ptr2 (43 bytes) exceeds max length of memPtr (40 bytes)

    您定混淆Set〔〕方法()赋值操作前者描述符指针重置指新数区域者数拷贝描述符中般说会更改描述符长度会更改长度值

    35 基栈〔stackbased〕缓区描述符
    基缓区描述符分修改TBuf修改TBufC两种类型种描述符讲字符串数身描述符局部列图出描述符存布局:

    iLength 12
    iMaxLength
    Hello World
    TBuf<15>
    iLength 12
    Hello World
    TBufC<12>










    两种描述符通常存储定长相较字符串常存放长度256字符文件名类似C语言中char[]具检查存溢出功



    Ø TBufC
    TBufC修改缓区类型存放字符串常量二进制数该类TBufCBase类派生尖括号<>数字表示分配该描述符数区定义构造方法允许描述符0结尾字符串构造允许创立空描述符然填充
    该描述符数修改整容置换〔通该类定义赋值操作〕置换数修改描述符0结尾字符串种情况新数长度超长度n〔创立该类时候指定模板参数〕

    _LIT(KPalindrome Satan oscillate my metallic sonatas)
    TBufC<50> buf1(KPalindrome) Constructed from literal descriptor
    TBufC<50> buf2(buf1) Constructed from buf1
    Constructed from a NULLterminated C string
    TBufC<30> buf3((TText*)Never odd or even)
    TBufC<50> buf4 Constructed empty length 0

    Copy and replace
    buf4 buf1 buf4 contains data copied from buf1 length modified
    buf1 buf3 buf1 contains data copied from buf3 length modified
    buf3 buf2 Panic Max length of buf3 is insufficient for buf2 data

    该描述符中数整体置换直接修改时候确实需修改缓存区中数该办呢?系统提供种途径修改数该类定义Des〔〕方法缓存区中数返回修改指针描述符〔TPtr〕通指针描述符间接修改缓区中数数通指针描述符修改指针描述符缓区描述符中iLength值会着改变记住缓存区描述符长度值减增描述符类提供存理理功



    _LIT8(KPalindrome Satan oscillate my metallic sonatas)
    TBufC8<40> buf(KPalindrome) Constructed from literal descriptor
    TPtr8 ptr(bufDes()) data is the string in buf max length 40
    Illustrates the use of ptr to copy and replace contents of buf
    ptr (TText8*)Do Geese see God
    ASSERT(ptrLength()bufLength())
    _LIT8(KPalindrome2 Are we not drawn onward we few drawn onward to
    new era)
    ptr KPalindrome2 Panic KPalindrome2 exceeds max length of ptr(40)

    Ø TBuf
    模板类修改缓区描述符类面表示缓区TBufTBufBase类派生TBufBaseTDes派生继承TDesTDesC类方法TBufC样TBuf定义系列构造方法赋值操作描述符类型讲存理您责缓区中数修改长度超构造方法中定值〔n〕假设缓区容需扩展您必须决定编译时候定足够值运行时候动态分配存种情况确保数长度超缓存区长度
    果需动态分配存您基堆描述符面讲您觉理存分配务太繁重您选择动态数组您应记住动态数组额外开销高

    _LIT(KPalindrome Satan oscillate my metallic sonatas)
    TBuf<40> buf1(KPalindrome) Constructed from literal descriptor
    TBuf<40> buf2(buf1) Constructed from constant buffer descriptor
    TBuf8<40> buf3((TText8*)Do Geese see God) from C string
    TBuf<40> buf4 Constructed empty length 0 maximum length 40
    Illustrate copy and replace
    buf4 buf2 buf2 copied into buf4 updating length and max length
    buf3 (TText8*)Murder for a jar of red rum updated from C string

    36 基堆〔HeapBased〕缓区描述符
    您非常长字符串时外种选择:基堆描述符拥创立者更长生存期您编译时候确定缓区长度时候堆描述符时作相C语言中malloc

    Ø HBufC
    许您已发现HBufC类名H〞开头符合Symbian系统中惯命名惯确实特例H〞表示类般堆〔Heap〕分配HBufC定义静态NewL〔〕方法堆创立缓存区正您见HBufC中字母C〞表示表述符修改该类操作TBufC样:该类提供套赋值操作允许整缓区中容换掉样新容长度超缓存区否会引起系统异常通调Des()方法返回修改指针描述符〔TPtr〕通指针描述符更改缓区中容

    _LIT(KPalindrome Do Geese see God)
    TBufC<20> stackBuf(KPalindrome)
    Allocates an empty heap descriptor of max length 20
    HBufC* heapBuf HBufCNewLC(20)
    TInt length heapBuf>Length() Current length 0
    TPtr ptr(heapBuf>Des()) Modification of the heap descriptor
    ptr stackBuf Copies stackBuf contents into heapBuf
    length heapBuf>Length() length 17
    HBufC* heapBuf2 stackBufAllocLC() From stack buffer
    length heapBuf2>Length() length 17
    _LIT(KPalindrome2 Palindrome)
    *heapBuf2 KPalindrome2 Copy and replace data in heapBuf2
    length heapBuf2>Length() length 10
    CleanupStackPopAndDestroy(2 heapBuf)

    记住堆描述符您求尺寸动态分配存会动您期更改缓区修改缓存区 容前您确保缓存区存足够帮您简化操作HBufC提供套ReAllocL()方法扩展堆缓存区〔操作会缓区存区域搬区域〕
    If the HBufC* is stored on the cleanup stack moving the pointer as a result of memory reallocation can cause signicant problems either in the event of a leave or if the cleanup stack’s PopAndDestroy() function is used to destroy
    the memory
    果您HBufC调Des()方法获取TPtr 重新分配存TPtr中成员变量iPtr变成效确保安重新分配存应该次调Des〔〕创立新TPtr象


    注:出性考虑Symbian系统没提供修改堆描述符HBuf


    总结:Symbian系统中总5种类型描述符TPtrCPTtrTBufCTBufHBufC面图示说明继承关系








    37字面量描述符〔Literal Descriptors〕

    面字面量描述符相C语言中static char[]字面量描述符通系列宏创立宏头文件e32defH中找
    #define _L8(a) (TPtrC8((const TText8 *)(a)))
    #define _S8(a) ((const TText8 *)a)
    #define _LIT8(names) const static TLitC8
    name {sizeof(s)1s}
    #define _L16(a) (TPtrC16((const TText16 *)L ## a))
    #define _S16(a) ((const TText16 *)L ## a)
    #define _LIT16(names) const static TLitC16
    name {sizeof(L##s)21L##s}

    首先_LIT效率宏法:
    _LIT(KMyLiteralDescriptor The quick brown fox jumps over the lazy dog)

    面KMyLiteralDescriptor作常量例写文件显示户_LIT 宏构建名KMyLiteralDescriptorTLitC16象中保存字符串值〔例子中The quick brown fox jumps over the lazy dog〕二进制程序中找值写文件中您料_LIT8_LIT16法相似描述符宽度16bitC字节类型字符串转换描述符数时宏字符串长度2

    作参考面出类TLitC16定义中__TText定义宽16bit字符TLitC8
    类似定义
    template
    class TLitC16
    {
    public
    inline const TDesC16* operator&() const
    inline operator const TDesC16&() const
    inline const TDesC16& operator()() const
    Omitted for clarity




    public
    TUint iTypeLength
    __TText iBuf[__Align16(S)]
    }
    template
    inline const TDesC16* TLitC16operator&() const
    {return REINTERPRET_CAST(const TDesC16*this)}

    template
    inline const TDesC16& TLitC16operator()() const
    {return *operator&()}

    template
    inline TLitC16operator const TDesC16&() const
    {return *operator&()}

    面定义中 TLitC16 (TLitC8) TDesC8 TDesC16派生TBufC8 TBufC16具相存布局TLitC16 (TLitC8)TDesC方您方法字面量构造指针描述符:

    TPtrC8 thePtr(KMyLiteralDescriptor)

    字面量构造缓区描述符需点技巧果您size〔〕获_LIT常量会返回相应TLitC象尺寸尺寸相描述符容尺寸加额外8byte〔存放长度值4字节表示结束符NULL〕果您想构造基堆描述符必须额外8字节考虑进
    定义包含44字符字面量
    _LIT8(KExampleLit8 The quick brown fox jumped over the lazy dog)
    TInt size sizeof(KExampleLit8) 52 bytes (contents + 8 bytes)
    TBufC8<(sizeof(KExampleLit8)8)> theStackBuffer(KExampleLit8)

    基堆描述符您描述符实际容长度分配缓区然容拷贝描述符中正确长度您公〔public〕成员变量iTypeLength者更简单方法〔〕操作符字面量转换成描述符然描述符容长度简单方法〔〕操作符象转换成描述符直接调TDesAllocL()方法返回HBufC*代码:

    TInt descriptorLength KExampleLit8iTypeLength 44 bytes
    Form a stack buffer descriptor around the literal
    Create a heap buffer copying the contents of the literal
    HBufC8* theHeapBuffer KExampleLit8()AllocL()

    宽字符字面量操作类似
    _LIT16(KExampleLit16 The quick brown fox jumped over the lazy dog)
    size sizeof(KExampleLit16) 96 bytes (contents in bytes + 8 bytes)
    descriptorLength KExampleLit16iTypeLength 44 bytes (contents)

    _L _LIT生成字面量存布局差异列图示:




    现简单 _L _S 宏 两宏已时 测试代码中常
    RDebugPrint(_L(Hello world))
    代码作相:
    _LIT(KLitHello world)
    RDebugPrint(KLit)
    面代码_L处您直接需前方声明字符串(〞Hello world〞)作根0结尾字符串写二进制文件中前面没长度值(_LIT产生字符串)没长度值字面量存布局描述符代码运行时候_L第实例会产生时TPtrCTPtrC指针指字面量第字节ROM中存储位置创立该字面量生存期中时描述符安然创立时变量求设置指针长度描述符类型联构造方法说负担果代码中样字面量会二进制程序体积增果仅存储方式_S 宏_L相 点产生时TPtrC描述符果您仅作0结尾描述符_S宏

    目前止已讨关描述符根知识包括实例化种具体描述符访问修改描述符数置换描述符容现关注操作数方法描述符时常见问题

    38描述符作参数返回类型
    编写代码时候您想限制TBuf原仅仅某特定库函数求样道理作函数提供者您调者传递进参数类型感兴趣事实您应该求调者传递特定类型参数您面修改函数实现您改变描述符类型果您样函数作编程接口您您客户改变代码样改动非常理想破坏代码兼容性
    非您掌描述符〔负责描述符创立销毁工作〕您甚知道描述符基堆基栈事实标准类型描述符〔前面提5种描述符类型〕面调适方法客户代码完全忽略描述符存布局存中位置基原您定义函数时候应量抽象基类作函数参数返回值效率描述符参数应引传递方式const TDesC&者TDes&

    例类RFile定义read〔〕write〔〕方法
    IMPORT_C TInt Write(const TDesC8& aDes)
    IMPORT_C TInt Read(TDes8& aDes) const

    两方法中输入描述符显式声明8bit宽度样写入字符串写入二进制数写入文件中参数修改描述符引读文件时候修改描述符引修改描述符长度决定文件中读入少数需文件效劳器传递表示长度参数文件效劳器会填充满描述符文件中数够描述符长度时文件效劳器会数写入描述符调函数描述符长度反映写入数长度样调者需外传递参数表示返回数长度

    写函数时候 果参数修改描述符实际您必考虑否足够空间存放数描述符身边界检查机制果出现存溢出现象会产生系统异常
    然您希描述符数区短情况描述符方法会发生系统异常时您应文档中说明果描述符长度够会处理时候拟方法调者返回长度值样调者采适步骤分配正确长度描述符

    HBufC* CPoemDoGetLineL(TInt aLineNumber)
    { Code omitted for clarity Allocates and returns a heap buffer
    containing the text of aLineNumber (leaves if aLineNumber is
    out of range)
    }
    void CPoemGetLineL(TInt aLineNumber TDes& aDes)
    {
    HBufC* line DoGetLineL(aLineNumber)
    CleanupStackPushL(line)
    Is the descriptor large enough (4 bytes or more) to return an
    integer representing the length of data required
    if (aDesMaxLength() < line>Length())
    {
    if (aDesMaxLength() > sizeof(TInt))
    { Writes the length required (TPckg is described later)
    TPckg length(line>Length())
    aDesCopy(length)
    }
    Leave & indicate that the current length is too short
    UserLeave(KErrOverflow) Leaves are described in Chapter 2
    }
    else
    {
    aDesCopy(*line)
    CleanupStackPopAndDestroy(line)
    }
    }
    方案函数中分配堆缓区返调者调者负责销毁
    39常方法
    Ø Ptr()

    基类TDesC 实现Ptr()方法访问描述符数该方法返回指字符数组首址指针您通指针直接操作字符串数 代码示:

    Ø Size() Length()
    TDesC 实现 Size() and Length() 方法 前者返回描述符占字节数者返回描述符字符长度8bit描述符讲相等16bit描述说Size() 返回数值 Length() 两倍

    Ø MaxLength()
    修改描述符TDes实现方法返回描述符长度

    Ø SetLength()SetMax()
    前者设置描述符长度长度值必须描述符长度否会引起系统异常者描述符前长度设置成值注意扩展描述符数区长度

    Ø Zero()FillZ()
    前者描述符长度设置0者0填充描述符容置果您字符填充描述符容Fill()方法方案类似C语言中memset〔〕函数

    Ø Copy()
    TDes 实现系列重Copy() 方法 面中两:
    IMPORT_C void Copy(const TDesC8 &aDes)
    IMPORT_C void Copy(const TDesC16 &aDes)
    方法参数描述符中数拷贝目标描述符中时目标描述符设置新长度源描述符长度超目标描述符长度会引发系统异常
    310 HBufC 堆描述符
    已讨描述符特性现关注描述符时常容易范错误
    首先创立堆描述符HBufC前面提已描述符调Alloc〔〕AllocL〔〕方法产生新HBufC里例子:
    void CSampleClassUnnecessaryCodeL(const TDesC& aDes)
    {
    iHeapBuffer HBufCNewL(aDesLength())
    TPtr ptr(iHeapBuffer>Des())
    ptrCopy(aDes)

    代码完全面代面代码更效率
    iHeapBuffer aDesAllocL()
    }

    Another common way to introduce complexity occurs in the opposite
    direction that is the generation of TDesC& from a heap descriptor
    堆描述符产生TDesC&时候容易范错误错误样代码增加复杂性代码示:
    const TDesC& CSampleClassMoreAccidentalComplexity()
    {
    return (iHeapBuffer>Des())
    代码完全写成
    return (*iHeapBuffer) 样更简洁高效
    }

    外拟微妙问题您分配HBufC然面调Des〔〕返回TPtr象
    HBufC* buf = HBufCNewL(9)
    TPtr p buf>Des()
    假设您回忆知道HBufC中没字〔word〕保存长度信息HBufC修改(nonmodifiable)需长度信息然TPtr需长度信息时问题您里长度呢?答案:您调Des()时候系统HBufC长度设置TPtr长度〔iMaxLength〕
    例子中buf长度少呢?9?答案定堆描述符长度您期值〔例子中9〕您没指定字齐〔wordaligned〕长度实际长度您指定长度(确定值底少)

    _LIT(KPanic TestPointer)
    const TInt KBufferLength 9
    void TestPointer()
    { Create a buffer with length KBufferLength 9 bytes
    HBufC8* myBuffer HBufC8NewMaxL(KBufferLength)
    TPtr8 myPtr(myBuffer>Des())
    TInt len myPtrLength() len值0
    TInt maxLen myPtrMaxLength() KBufferLength稍数固定
    myPtrSetLength(KBufferLength) myPtrSetMax()否面语句起作

    myPtrFill(’’) ’’填充描述符
    char* ptr 〔char*)myPtrPtr()确保已调SetLength()SetMax()方法
    ptr[0] 'x'


    HBufC8* buf HBufC8NewLC(9)
    TPtr8 ptr(buf>Des())
    TInt maxLength ptrMaxLength() maxLength9定等12〔字边界〕

    311 TFileName滥
    TFileName 象滥潜危险TFileName文件 e32stdH中定义
    const TInt KMaxFileName0x100 256 (decimal)
    typedef TBuf TFileName
    宽字符相两字节〔前面说默认情况TBuf16bit宽度〕 文件名长度少次您栈创立TFileName 象时候消耗524 字节 (2 × 256 描述符数字节 + 描述符身12字节)Symbian OS系统中标准栈空间8K字节必限资源非常浪费量基栈TFileName 象值传递方式应引传递方式您堆方您作C类〔CBase派生类〕成员变量果您需完整路径HBufC存放文件名量少资源总
    您TParse 类(f32fileH中定义)类保存描述符拷贝拷贝中包含解析文件名拷贝会掉珍贵栈空间您应考虑TParsePtr TParsePtrC 类提供样功拷贝文件名仅仅保存文件名引
    4辅助类
    讨普遍问题章结尾两常辅助类
    41 TLex〔TLex8TLex16〕类
    描述符样TLex8bit16bit两种版分TLex8 and TLex16般情况应TLex需指定特定版该类实现般目词法分析语法成分解析字符串数字转换功面该类提供方法:




    42 Pckg类
    外套辅助类分:TPckgBufTPckgTPckgC分派生TBuf TPtr TPtrC模板类文件e32stdH中找定义
    包类〔package class〕方便扁〔flat〕数象存储描述符中跨线程跨进程数享时候 实际T类象完整包描述符中样容易种类型安方式线程间享
    两种Package指针类:TPckgTPckgC分应修改修改类型持指包装象指针
    class TSample
    {
    public
    void SampleFunction()
    void ConstantSampleFunction() const
    private
    TInt iSampleData
    }

    TSample theSample
    TPckg packagePtr(theSample)
    TPckgC packagePtrC(theSample)

    例子中TPckg表示模板类模板参数TSamplepackagePtr(theSample)定义象持指theSample针指
    包象调〔〕方法返回包装象引代码:

    packagePtr()SampleFunction() 合法
    packagePtrC()SampleFunction()编译错误调const方法
    packagePtrC()ConstantSampleFunction()合法

    TPckgBuf类创立存储新包装类型实例〔注意窗建新实例保存指针〕 TPckgBuf理拷贝象TPckgBuf象调〔〕方法返回拷贝引然引调方法TPckgBuf象拥拷贝修改代码:

    TPckgBuf packageBuf(theSample)
    packageBuf()SampleFunction()
    TPckgBuf拥原始数拷贝果面调修改成员变量方法修改拷贝数原数受影响〔类似函数调时值传递方式〕
    面图示说明存布局:

    文档香网(httpswwwxiangdangnet)户传

    《香当网》用户分享的内容,不代表《香当网》观点或立场,请自行判断内容的真实性和可靠性!
    该内容是文档的文本内容,更好的格式请下载文档

    下载文档到电脑,查找使用更方便

    文档的实际排版效果,会与网站的显示效果略有不同!!

    需要 10 香币 [ 分享文档获得香币 ]

    下载文档

    相关文档

    人力资源总监教程2

     第四节关于处理问题的综述根据荣格的观点,个体可以通过感觉或直觉取得数据,即认识世界,但是不能同时使用这二者。每一种模式有一个不同的倾向,因此个体试图对一种输入模式发展不同于另一种模式的...

    10年前   
    677    0

    Photoshop-6.0入门教程2

    Photoshop中的工具非常多,使用它们不仅会涉及工具栏,同时还涉及了控制面板、图层等一系列知识。在本单元中,我们将通过制作例图来学习这些工具的用法以及相应的控制面板和菜单的应用。

    4年前   
    647    0

    系统开发合同

    系统开发合同  甲方:  联系人:  电话: 邮 编:  乙方: 上海应龙网络技术有限公司  联系人:  电话: 邮 编:  鉴于甲方委托乙方开发系统,帮助甲方企业信息化,,拓宽销售渠道,为明...

    9年前   
    536    0

    完整的市场营销教程2-122页

     第十一章 市场营销成功案例 案例一:“万宝路”的市场定位 20世纪20年代的美国,被称为“迷惘的时代”。经过第一次世界大战的冲击,许多青年都自认为受到了战争的创伤,并...

    8年前   
    27117    0

    信息系统开发的格言

    信息系统开发的格言 如果信息服务人员和用户人员将下述格言牢记在心,那么,将得到更好的信息系统,而且整个公司的生意将更加兴隆。 □ 不要无限期地推迟自动化 对于一个面向事务...

    12年前   
    700    0

    软件系统开发合同

    根据《中华人民共和国合同法》及相关法律、法规的规定,甲、乙双方本着自愿、公平、合法、诚信的原则, 就甲方委托乙方对长春市民政救助平台、医疗救助系统、信息核对系统软件进行升级改造的相关事宜,签订本...

    5年前   
    3000    0

    系统开发方法学

    系统开发方法学 系统开发方法学的目标 开发一个计算机信息系统,不管它是联机航空公司订票系统。还是库存控制系统,其过程基本上是相同的。每一过程都由一些基本的活动组成。这些活动是每一个...

    11年前   
    621    0

    系统开发过程

    系统开发过程 □ 五个阶段 各种系统开发方法学在范围、复杂性、完善程度以及方法上有很大的不同。尽管有的方法学分三个阶段,有的分15个阶段,但是每个方法学所描述的要完成的活动基本上...

    8年前   
    532    0

    教程导读

      作为全美最享有盛名的口才和演讲学家,多罗茜·利兹先后为多家《财富》500强企业做过专业培训和指导。其中包括辉瑞、Verizon、IBM和Conde Nast等等。她被评选为全美十大演讲家之...

    14年前   
    8762    0

    Symbian-同花顺手机炒股说明书

    Symbian同花顺 炒股说明书登陆同花顺 1. 选择连接方式翻开同花顺 炒股软件,会显示联网方式选择页面,1. 连接互联网:使用GPRS CMNET方式连接,相对速度最快。 点击确定...

    4周前   
    72    0

    新视野大学英语视听说教程第2册答案(全)

    UNIT1II. Listening Skills1. M: Why don’t we go to the concert today?W: I’ll go get the keys.Q: Wh...

    4年前   
    2730    0

    《销售激励例会速训教程》-2

    市场的概念市 场市场的概念  市场这个名词大家都很熟悉,但很多人对于市场的认识或认知都是来自于经济学,而营销学对市场的认识和经济学并不完全相同。  经济学站在一个宏观的视角上,看到的是市场的全...

    11年前   
    476    0

    新视野大学英语视听说教程第三版第2册

    新视野大学英语视听说教程第三版第2册UNIT 1Short conversations1. Q: What can we learn from the conversation?B The w...

    2年前   
    594    0

    集成电子技术基础教程课后习题 二篇 4章2

    题2.4.18 试用负边沿JK触发器和“与-或-非”门构成一个四位数码并行寄存和一个四位数码串行输入右移移位寄存器。1JC11K组合逻辑电路1JC11K组合逻辑电路1JC11K组合逻辑电路1...

    4年前   
    1196    0

    电子商务教程

    电子商务教程第一章 电子商务概述1.1什么是电子商务1.2电子商务有哪些特性1.3电子商务是如何产生和发展的1.4电子商务对社会经济会产生哪些影响 1.1 什么是电子商务 电子商务源于英文EL...

    9年前   
    697    0

    14000內審教程

     ISO14000环境管理体系 内 部 审 核 员 教 程 第一章 环境、环境问题与环境保护 第二章 I...

    8年前   
    17407    0

    目标管理教程

    目标管理教程  第一章:目标管理概述   第二章:目标设立     第一节:目标设立内容     第二节:目标设立方法   第三章:目标展开     第一节:目标分解     第二节:目标协调...

    2年前   
    854    0

    全站仪教程

    **KTS-440全站仪,除具备丰富的测量程序外,还同时具有参数设置、数据存储等功能,适用于进行各种专业测量和工程测量。

    5年前   
    1349    0

    PowerPoint 2003教程

    PowerPoint 2003教程 PowerPoint2003的使用        在教学演示、商业会议、科学技术交流等领域中,如何将需要交流传播的信息以更生动、更吸引人的方式展示出...

    5年前   
    1317    0

    Web系统开发课程设计报告

    录入学生基本信息的功能学生基本信息主要包括:学号、姓名、年龄、出生地、专业、班级总学分,在插入时,如果数据库已经存在该学号,则不能再插入该学号。1.2、修改学生基本信息的功能

    4年前   
    1232    0

    文档贡献者

    天***猩

    贡献于2024-04-01

    下载需要 10 香币 [香币充值 ]
    亲,您也可以通过 分享原创文档 来获得香币奖励!