




已阅读5页,还剩3页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
symbian 学习总结 - 2005-05-30, 12:47 看了不少同仁把自己的体会写出来都会放到论坛供大家讨论,我也有这样的想法。接触symbian有一个月了,现在事情不是很多,自己把用到的看到的稍微梳理一下,作为复习和总结只用。发到这里不是为了指导别人,是想让别人指导。有错误的地方希望大家提出来,共同提高。我想写几个部分的东西,这是自己接触到的:* 字符串descriptors(不包括literal);* 文件file、stream、store等;* 图形绘制 display(color,font,bitmap)* 用户界面 ui(framework,control,resource)* 通讯 communication(sms,mms,bt,ir,tcp/ip)今天贴上字符串部分,一些内容参考了Symbian OS Explained ?_?_Effective C+ Programming for Smartphones symbian的字符串考虑到效率,symbian提供了好几个类来处理字符串。在symbian中,字符串被叫做描述符。CDesC* 所有描述符都从CDesC继承,CDesC以C结尾,可以看出这是一个“常量类”,提供了一些不改变对象的操作;* 在CDesC中提供了Length、Ptr等这样的方法,与你想象的不同,这些方法不是虚函数,而是在CDesC中硬性编码实现的;* 所有字符串对象的开始4个字节都表示相同的含义,前4位用来表示字符串的类型,后28位表示字符串的长度;* 这样一来,CDesC就可以实现Length函数,然后根据字符串不同类型,返回不同的指向字符数据的指针,从而实现Ptr;* 这样的设计,使得symbian描述符类型局限在16个,不过这已綺足够了;* 这样的设计,也使得描述符避免了使用虚函数带来的开销,每个字符串对象少了一个指向虚函数表的指针。CDes* CDes是所有“可修改类”字符串的基类,这个类本身也是从CDesC继承而来,在CDesC的基础上,它提供了一系列修改字符串的操作;* 在内存结构上,所有从CDes继承的类,在type和length占据的4个字节之后,多了一个maxlength,也占了4个字节;* 可以对CDes的对象进行各种修改字符串的操作,但是字符串的长度不能超过规定的maxlength,如果超过了这个长度,会产生一个panic;* 糟糕的是,CDes并不提供ReAlloc这样的方法,来改变maxlength,因为如果那么做,symbian的字符串就得自己管理内存,要考虑的更复杂的构造和清除问题;* 这与设计描述符的初衷背离了,描述符的设计是为了效率和简单。所以,程序员需要自己管理内存;* CDesC和CDes提供了所有常用的操作字符串的函数,那些子类们,只是负责构建自己,和销毁自己,比如实现构造函数,拷贝构造函数,=符号等。Pointer Descriptors TPtrC、TPtr * 这两种字符串,他们的字符数据不属于他们自己,这两个类的对象,都包含一个指针,这个指针指向字符数据;* 至于这个字符数据存储在什么地方,他们不关心;* TPtrC对象,包含一个type+length共4个字节,加一个指针4个字节,一共8个字节;* TPtr对象,在指针前多了一个maxlength;TPtrC* TPtrC从CDesC继承,一些常用字符串操作都在CDesC中实现了,TPtrC自己只是提供了一些构造对象的方法,你可以根据很多种类型的对象构造TPtrC。* TPtrC有个Set方法,你可以改变字符指针指向的地方,虽然你不可以改变数据。如果你想组织这样的操作,就把TPtrC声明为const。举例:构造TPtrC的方式_LIT(KLiteralDes,fuck the descriptors of symbian);TPtrC pangramPtr(KLiteralDes);TPtrC copyPtr(pangramPtr);TBufC constBuffer(KLiteralDes);TPtrC ptr(constBuffer);/from zero-terminated stringconst TText8* cString = (TText8*)who say symbians simple?;TPtrC8 anotherPtr(cString);TUint8* validmemLocation;Tint validlength;TPtrC8 memPtr(validmemLocation,validlength);TPtr* TPtr从CDes继承,与TPtrC类似,它也只是提供了一些构造和删除的操作。* TPtr可以用来修改那些以C结尾的描述符的数据,比如TBufC,HBufC。* TPtr也有个Set方法,你可以改变字符指针指向的地方,但是需要注意,Set使得指针指向新的地方,同时也修改了length和maxlength。* 与set类似的还有个 = 这个操作把新的字符拷贝的指针指向的地方,同时改变length,但是不会改变maxlength。* 要小心使用Set和=。举例:使用TPtr_LIT(KLiteralDes,fuck the descriptors of symbian);TBufC buf(KLiteralDes);TPtr ptr(buf.Des();/ptrmaxlength is 100_LIT(KLiteralDesAppend, who say symbians simple?);ptr.Append(KLiteralDesAppend);/modify the buf dataTBufC、TBuf* 这两种描述符的对象内存结构可以跟TPtrC、TPtr对应起来,不同的是TBufC和TBuf对象自己拥有字符串,TPtrC、TPtr对象中放置指针的地方放置字符数据。* 这两者适合在栈上的比较小的固定长度的字符串。TBufC* 这是个瘦模板类,n是字符串的字符个数。这个类与TPtrC一些行为类似,提供了一些构造和删除对象的操作。* 虽然TBufC是个“常量类”,但是可以通过调用=操作替换整个字符串数据,当然,新的数据不能超过訽来的长度。* 前面介绍TPtr的时候已綺说过,可以通过TPtr改变TBufC的字符串:* TBufC有个方法Des,这个方法返回一个TPtr类型,TPtr对象的最大长度是TBufC的length,在修改TPtr对象的时候,TPtr的length被修改,同时TBufC的长度也被修改。* 疑问:内部怎么实现长度同步呢?修改了TPtr的length,需要知道TBufC的length地址,要不两者在同一个地址,但是又不可能这么实现。举例_LIT(KLiteralDes,fuck the descriptors of symbian);TBufC buf(KLiteralDes);TPtr ptr(buf.Des();/ptrmaxlength is 100_LIT(KLiteralDesAppend, who say symbians simple?);ptr.Append(KLiteralDesAppend);/modify the buf data/buf length is modified too,but ,why, how to implement itASSERT(ptr.Length() = buf.Length() );TBuf* 不多说了,记住,不要使得字符串超过它的最大长度,maxlength,如果需要很大的或者动态大小的字符串,考虑使HBufC或者dynamic bufferHBufC 基于堆的描述符* 如果描述符生存期比创建它的对象生存期还要长,用HBufC,如果编译的时候无法知道描述符大小,用HBufC;* 这个类型的对象总是通过一个HBufC类型的指针使用,这个对象本身就在堆上,在栈上有个指针指向这个对象;* 通过HBufC的NewL之类的方法来创建这种类型的对象;* 或者通过TDesC的Alloc与AllocL创建一个对象,新的HBufC是訽对象在heap上的一份拷贝,一个全新的对象,跟Des方法不同;* 没有对应的HBuf类,訽因是123456,很多,不说了。* 跟TBufC类似,可以通过Des方法,返回一个TPtr对象,来修改HBufC的字符串值。* 可以通过使用=符号整个替换HBufC的字符串值,当然也要注意不能超过最大长度。* 在介绍TDes的时候说到过,从TDes继承的类,TPtr和TDes不会自动扩冲自己的大小,也没有类似realloc这样的接口让你扩充,你需要自己管理内存。* 对于HBufC,情况有点不同,它不会自动扩冲自己的大小,但是有个ReAllocL可以用来重新分配一个大小不同的堆空间。* 但是使用ReAllocL的时候要注意,如果使用了Des,有另外的TPtr对象指向HBufC的内容,在ReAllocL之后,TPtr指向的内容就不对了。* 每次ReAllocL的时候,需要重新调用Des创建一个新的TPtr对象,这样比较保险。举例:_LIT(KLiteralDes,fuck the descriptors of symbian);TBufC buf(KLiteralDes);HBufC* heapBuf = HBufC:NewLC(100);TInt length = heapBuf-Length();/length = 0TPtr ptr(heapBuf-Des();ptr = buf;length = buf.Length();/length = 17length = heapBuf-Length();/length = 17HBufC* heapBuf2 = buf.AllocLC();/create HBufC from stack bufferlength = heapBuf2-length();/length = 17_LIT(KLiteralDes2,new data);*heapBuf2 = KLiteralDes2 ;length = heapBuf2-length();/length = 10CleanupStack:PopAndDestroy(2);guoqichaoView Public ProfileFind all posts by guoqichao(#2) cococut Offline Registered UserPosts: 7Join Date: May 20052005-05-31, 02:38 受益匪浅,希望搂主不仅把学习这个月的内容写出来,还要把学习方法,过程写出来!是不是很贪心?呵呵请继续!cococutView Public ProfileFind all posts by cococut(#3) szycc Offline Regular ContributorPosts: 193Join Date: Jul 2004Location: shenzhen2005-05-31, 07:31 不错, 赞一个. * 疑问:内部怎么实现长度同步呢?修改了TPtr的length,需要知道TBufC的length地址,要不两者在同一个地址,但是又不可能这么实现。我想, 通过数据指针应该可以得到TBuf的起始地址, (例如利用offsetof) , 进而也就应该知道了TBuf的iLength地址.btw, symbian提供的descriptor是我用过的最难用的C+字符串类, 既不允许程序员扩充(没有虚函数), 又自己不提供了一个可自动分配内存的类供使用. 还綺常驱使消耗可怜的堆栈, 例如TBuf buf; 等等. HBufC? 那还需要手动释放, 又是Pop, Push的, 薩记得啊. 都是些编译器干的事情让程序员来干了.szyccView Public ProfileFind all posts by szycc(#4) guoqichao Offline Registered UserPosts: 48Join Date: Oct 2004文件操作 - 2005-05-31, 13:08 文件* symbian文件的读写,相对字符串来说,比较容易理解一些;* symbian的文件操作基于symbian的客户端?_服务器结构,客户端api通过一个RFs类型的对象接入服务端;* 每个RFs对象都需要一定的系统资源,应该保持RFs对象尽可能的少;* CONE有一个固定的RFs句柄,可以通过调用CCoeEnv的FsSession获得这个句柄;* 使用RFs前,调用它的Connect方法,结束的时候调用Close;RFile* 通过使用RFile可以操纵单独的一个文件,这个类的方法都比较简单,不过有几点是比较容易让人迷糊的;* 读写字符串,symbian默认的字符串是16位的,但是RFile的读写函数都需要8位的参数,16位的字符串也无法自动转换成8位的,所以在读写字符串的时候需要一些额外的操作;* 有两种方法可以用来操作字符串的读写:* 第一种,写入的字符串大小(size)不变,转换成8位的字符串,length是訽来的两倍;举例:/writeTPtrC8 ptrC8(TUint8*)des16.Ptr(), des16.Size();iFile.Write(ptrC8);/readTInt size = iFile.Size();HBufC *iBuf = HBufC:NewLC(size/2);TPtr8 ptr8( iBuf-Des() );iFile.Read(ptr8);* 第二种,把UNICODE转换成asc,length不变,但是size少了一半,如果字符值都小于256,可以用这种方式节约存储空间,如果有汉字,就用第一种方式;举例:/writeHBufC8* bufC8 = HBufC8:NewLC(des16.Length();TPtr8 ptr8(bufC8-Des();ptr8.Copy(des16);/把16位转换成8位了,注意,这种转换简单地把高位字节删除iFile.Write(ptr8);/readTInt size = iFile.Size();HBufC8 *bufC8 = HBufC:NewLC(size);TPtr8 ptr8( bufC8-Des() );iFile.Read(ptr8);HBufC *iBuf16 = HBufC:NewLC(size);TPtr16 ptr16(iBuf16-Des();ptr16.Copy(bufC8);/8位转换成了16位* 对于RFile文件的读写还有一个綺常让初学者头疼的问题是,如何读写一个数值:* 这里还是得提到描述符,symbian种用描述符来操作二进制数据和字符串,对于数值,或者是其他的二进制数据,都应该用描述符操纵它们,然后再进行文件读写;举例:TInt32 value = 500;/思路:需要构造一个8位描述符-描述符需要TUint8指针才能构造-把TInt32转换成TUint8指针TPtrC8 ptr8(TUint8*)&value,sizeof(TInt32);/这时候,ptr8就可以被用来操纵value这个二进制数据了iFile.Write(ptr8);* 对于其他的二进制数据,用类似的方法,可以读写整个二进制数据;Streams* 用过VC的对stream都不会陌生,实现其实很简单,对于stream支持的类型直接用读和写;* 不过要注意的就是对于TInt类型,需要明确调用指定类型大小的方法,因为对于不同的系统,TInt的大小可能不同;* 如果要自己的类也支持需要实现两个函数ExternalizeL、InternalizeL;* 可以直接使用stream创建
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 二零二五版代收款与保险理赔合同
- 2025版电力设备承包维修与电力产业发展合同
- 2025版跨境电商进口代理服务合同范本
- 2025化工厂安全培训考试题(含答案)
- 塑料废弃物源头减量-洞察及研究
- 危急值报告制度及处理流程培训试题(附答案)
- 太空碎片规避-第1篇-洞察及研究
- 智能呼吸训练器创新创业项目商业计划书
- 兰花园艺博览会创新创业项目商业计划书
- 农副产品智能家居食材配送创新创业项目商业计划书
- 学习2025年初中初三开学第一课专题
- 2025年江苏省苏豪控股集团有限公司校园招聘笔试备考试题及答案详解(必刷)
- GA/T 2158-2024法庭科学资金数据获取规程
- (完整)中小学“学宪法、讲宪法”知识竞赛题库及答案
- 2025年行政执法人员执法证考试必考多选题库及答案(共300题)
- 《工程勘察设计收费标准》(2002年修订本)
- 2024年自投光伏安装合同范本
- 汶川地震波时程记录(卧龙3向)
- 吴迪完胜股市学习笔记
- HB 4-1-2020 扩口管路连接件通用规范
- 霸王集团盘中盘路演模式课件
评论
0/150
提交评论