今天一个很偶然的机会,需要回答一个将无符号数据存到有符号变量的问题。我编码如下,结果很有意思,我是在VC6里调试的,有高人看到可否帮忙指点下。
int main()
{
unsigned short temp1 = 65535;
short temp2 = temp1;
unsigned short temp3 = (unsigned short)temp2;
unsigned short temp4 = temp2;
int temp5 = temp2;
unsigned int temp6 = temp2;
unsigned long temp7 = temp2;
int temp8 = (unsigned short)temp2;
short temp9 = temp2;
printf("temp1 = %d\n temp2 = %d\n temp3 = %d\n temp4 = %d\n temp5 = %d\n temp6 = %d\n temp7 = %d\n temp8 = %d\n temp9 = %d\n",
temp1,temp2,temp3,temp4, temp5,temp6,temp7,temp8,temp9);
return 0;
}
//改程序的输出结果
//temp1 = 65535
//temp2 = -1
//temp3 = 65535
//temp4 = 65535
//temp5 = -1
//temp6 = -1
//temp7 = -1
//temp8 = 65535
//temp9 = -1;
//根据结果也就是说,无符号符号数据是可以存储在有符号型变量内存中的,
//而且有例子在内存块长度一样时,不用强转,直接赋给无符号变量时也可行
//上述事实可以解释为内存块不变,采用不同的解码方式解出不同的数据
//但是读出来的时候要注意,如果有符号转无符号一定要强转
//之所以上例unsigned int输出-1,我并不是很清楚
posted @
2007-10-17 22:46 frank.sunny 阅读(2964) |
评论 (13) |
编辑 收藏
摘要: 昨天遇到类内静态函数,本想自己整理下,谁知道已经有人整理的很好了,为此就不麻烦了,看了一篇就转贴在自己空间里,以便以后查询。C++的static关键字作者:韩耀旭
C++的static有两种用法:面向过程程序设计中的static和面向对象程序设计中的static。前者应用于普通变量和函数,不涉及类;后者主要说明static在类中的作用。
一、面向过程设计中的static
1、静态全局变量
...
阅读全文
posted @
2007-10-16 21:03 frank.sunny 阅读(1718) |
评论 (2) |
编辑 收藏
本文并非本人原创,文中红色字体为我新加,原文出处http://blog.donews.com/sevenworld/archive/2005/10/17/591911.aspx
如何设置S60模拟器的网络参数
在调试使用Socket进行数据通讯的Symbian S60程序过程中,需要编写客户端与服务器的数据交互代码,如果S60的模拟器可以直接访问网络中的服务器程序,调试就会非常方便。S60的模拟器提供了这些功能,不过需要对网络参数进行一些设置,下面将讨论这一问题。
首先是网络参数的设置,在Symbian安装目录的..\Epoc32\tools目录下有一个网络参数设置程序network_config.bat,对于不同的开发包,这个名字可能会有一些不同(可以选择开始菜单下SDK目录tools下的Ethernet Support Configuration)。执行该程序,将显示参数设置界面。其实参数的设置和对局域网中的PC设置一样,你就把它当成是在设置PC的网络配置就可以了。分配一个没有使用的IP(注意绝对不能与本机IP相同),填写好子网掩码,设置好局域网的网关。唯一的不同是要选择所使用的网卡。当你点OK关闭该设置对话框的时候(或着点那个Adapters按钮),会显示一个命令行界面,列出了当前机器上可以使用的网卡的信息,你需要输入一个数字选择一个网卡,注意,应该选择你的PC所使用的那个真实的网卡,也就是标识你机器在局域网内IP地址的那个网卡。
按照官方文档来说,这样就可以,但实际上不是所有的机器都可以,我没有测试过,不知道别人的机器如何,反正我使用的机器不可以。后来我在一本书里看到,还需要运行另外一个程序,才可以达到我们的目的。这个程序与上面的设置程序在同一个目录下,叫做npacketadmin.exe。执行它,会显示一个程序,并跳出一个设置对话框,首先在下拉列表框里选择你刚才选定的那个网卡,然后点击下面的Start按钮,这样就可以了。这时你就可以使用模拟器调试你的Symbian S60通讯程序了。(我实际测试中发现不用启动npacketadmin.exe也是可以的)
测试是否连通的方法是,执行模拟器中的“网络”应用程序,然后输入一个网址,比如www.sina.com.cn,如果设置正确,将显示该页面,注意也许是乱码,不过不要紧,因为我们只想知道网络是否已经可用了。(强烈建议使用非中文网站做测试,比如www.google.com)
如果以上的过程中,不启动npacketadmin.exe就不能连接的用户,必须注意下面几个问题:
1.在调试期间可以关闭npacketadmin.exe的那个设置对话框,但是不能关闭该程序。如果关闭了,网络将不通。
2.如果不小心关闭了该程序,需要重新启动,并重新做上面的第二步的操作。
3.应该在启动模拟器之前就启动该程序,不然模拟器可能会异常退出。
本人刚开始调试时,犯了以下一些问题:
首先用msconfig工具将S60的Ethernet Packet Service这个服务停掉了,后来每一次模拟器试图用Socket连接时都弹出“Error:1058 无法启动服务……”的报错。该错误在npacketadmin.exe启动时也会出现。
其次没有注意IP的问题,用跟本机同一个IP,结果怎么连都连不上,后来改成我同事的,害得他一个下午都因为网络上有同名IP而半天没得上网。
另注:最近更换环境时发现,假如主机是通过自动获取ip就可以上网的话,不知道模拟器的ip不设,读者能否实现,我本人试过老是出现“网关无响应”提示,所以我觉得原则上还是需要设置ip的,当然前提是主机设了固定IP也能上网,然后模拟器设置一个不同于主机的ip地址 modify 2008.03.17
posted @
2007-09-25 16:21 frank.sunny 阅读(2884) |
评论 (2) |
编辑 收藏
本文档我上传过程中图片没有粘贴上来,为此如果有人感兴趣,请下载word文档,地址是http://www.cppblog.com/Files/franksunny/Symbian应用程序框架浅析.rar,欢迎大家给我指点。
Symbian 应用程序框架浅析
S60应用程序的运行依赖于大量的OS组件,例如屏幕绘图和应用程序数据持久性等,可以直接使用OS的窗口服务器或者文件服务器即可。
应用程序核心框架类
应用程序框架由一套核心类组成,这些类是所有应用程序框架的基础。这些类封装了应用程序和所需OS服务器之间的相互作用。
应用程序核心框架类
第一层:CBase和CActive两个基类,其中CActive也是派生于CBase,而CActive又被第二层的CConEnv派生
第二层:包含两个基本组件:AppArc和CONE。AppArc代表“应用程序架构”,这些类提供了基本的应用程序结构、将系统信息提交到应用程序的机制,以及使用文件服务器持久化数据。其中的类在命名时都带有前缀“*Apa”。CONE是控制环境的缩写,在这个组件中的类提供用于处理用户输入并创建用户界面的机制--这些类主要用于和窗口服务器进行交互,其中的类在命名时都带有前缀“*Coe”。这一层中的许多类都是抽象类,仅仅定义了一个API的接口。
第三层:Uikon组件。这是具有丰富功能、非抽象框架类的一般性设备无关实现,并且提供了一个在所有symbian OS上公用的UI库层。一些具体的UI控件(比如列表框和滚动条等)都可以在该层创建,这些控件有时也被称为Eikon控件。UIkon组件中的类在命名时都带有前缀“*Eik”。添加了一个公共的symbian OS实现,和其他Symbian OS UI平台共享。
第四层:由Avkon类组成,这些类提供了核心的S60 UI功能,例如菜单支持。Avkon控件的类在命名时都带有前缀“*Akn”。在框架上添加S60特有的实现。
第五层:针对应用程序的层,设计自己的应用程序,添加自定义应用程序实现。
以上提到的这些类简单来说就是:视图(View)、文档(Document)、应用程序(Application)、应用程序UI(Application UI)。那么一个S60 UI应用程序是如何用这些类来实现其有机程序呢,这个就涉及到一个应用程序框架的初始化问题。
应用程序框架初始化
必须创建下面的每个方法,才能提供最小的S60应用程序:
a、 框架入口:所有S60 UI都实现一个全局函数E32DLL()(非UI类的全局入口函数为E32Main),当应用程序启动时,框架将首先调用该函数,该函数也称为DLL入口点,应用程序必须存在该函数。每个S60 UI 应用程序都是一个多态DLL。
b、新建应用程序实例:让框架调用NewApplication(),该函数是由DLL导出的唯一函数,负责创建应用程序类的一个实例,并返回它的指针,以后框架使用该指针完成应用程序的创建。这里在堆上创建应用程序实例使用的是“new”方法而不是Symbian OS常见的“new (ELeave)”方法,这是因为TRAP harness(陷阱捕捉)这时还没有创立。如果系统不能为新的实例分配内存,那返回的指针就是NULL,应用程序框架能够检查到并处理这个问题。
c、返回UID:由框架调用AppDllUid()返回应用程序的UID。该函数必须返回在.mmp文件中指定的UID值,该值可用于确定应用程序的实例是否正在运行。如果一个应用程序正在运行,而要启动这个程序的另一个实例,这时该运行的程序就会被切换到前台,而不是重新生成一个。
d、新建文档实例:框架通过框架调用应用程序类实例的CreateDocumentL()函数获取指向新创建的Document类实例的指针。通过文档实例指针,框架就可以调用文档实例的某些功能,同时文档实例也通过调用自身的NewL()和NewLC()双重静态构造函数(为什么是双重构造,这跟Symbian的异常处理机制有关,而之所以设计成静态函数我现在也还不是很清楚)来创建自己。
e、是否装入文件:框架重新调用AppDllUid()来观察是否要从文件系统中装入一个文件。(似乎这里跟某些永久存储信息有关,目前项目还没用到这个功能,我也不知道这个该怎么用)
f、 新建AppUi和View实例:框架通过调用文档对象的CreateAppUiL()方法生成了一个AppUi实例并获取指向它的指针。此处AppUi实例创建自身时使用的是C++的默认构造函数并返回实例的指针,之后框架通过这个指针调用AppUi实例的ConstructL()函数来完成构造。而在这个ConstructL()函数中首先调用的是AppUi基类的BaseContructL()函数,处理了读入与该程序相关的资源的事宜,其次是新建需要加载的View类的实例(通过双重构造),如果不止一个View的情况下需要调用AddViewL()函数将新建的View实例加载进来,最后如果是多个View时通过SetDefaultViewL()函数设置缺省的默认视图。如读入一个与该程序相关的资源文件AppUi调用了AppView类的NewL函数来生成其实例,这里也是用的双重构造
g、 View的重绘:通过以上的创建过程,框架已经拥有了View的无限调度权利,此时如果有一般的system事件框架就可以通过窗口服务器调用View的Draw()函数,至于这些System事件一般指程序启动、应用程序获得焦点或者选项菜单消失等等。在这里需要注意的是编程开发者并不能直接调用Draw,它要求在调用前系统的graphics context处于激活状态,如果编程开发者希望进行屏幕的重绘,则只能调用DrawNow()方法。还有就是Draw函数是不能异常退出的,这是因为该函数能被框架直接调用,而框架是不知道如何处理可能发生的异常的。因此Draw自己需要捕捉和处理可能发生的错误。
h、 处理命令:完成以上步骤后,用户可以通过比如菜单选项之类的交互UI使框架调用HandleCommandL()函数,并传递一个参数aCommand,它指明了用户所选择的命令,HandleCommandL()会据此来判断不同的命令以分别调度执行。在此处还有一个必须注意的地方是如果要程序的View实例也回应用户的按键,则必须将View实例通过AppUi的AddToStackL()函数加入到AppUi实例的控件堆栈(control stack)中。具体的调用方式实现以按键来解释如下流程所示:
对于上面的调用方式实现说明,个人觉得有必要再将AppUi的几个重要事件处理方法罗列一下:
HandleWsEventL()用于处理窗口服务器传递的事件,它的作用使框架调用下面这些具体事件处理方法;
HandKeyEvent()用于处理用户按键事件(此函数在控件堆栈为空时调用,否则框架将会调用OfferKeyEventL()函数);
HandleForegroundEventL()当应用程序切换到前台或从前台切换到后台时调用该函数,默认的实现可以处理键盘焦点的改变;
HandleSystemEventL()用于处理由窗口服务器生成的事件;
HandleApplicationSpecificEventL()用于处理自己定义的自定义事件。默认的实现可以处理颜色方案改变的通知;
HandleCommandL()用于处理用户选择的菜单项;
HandleSwitchOnEventL()用于处理像设备切换之类的特定切换事件;
HandleMessageReadyL()用于处理窗口服务器产生的消息事件。
在以上各函数处理事件中,除了第一个HandleWsEventL()函数外,其它函数默认都是纯虚函数,需要重载才能用。
通过以上对应用程序框架初始化步骤后,一个完整的框架就创建完毕了,其具体过程可以由一个图来形象做结。
本文中参考了网络上的一些文章链接如下:
Symbian程序框架研究http://www.sf.org.cn/Article/lumen/200607/18837.html
Symbian开发初级手册http://www.sf.org.cn/Article/lumen/200508/34.html
posted @
2007-09-21 06:56 frank.sunny 阅读(3840) |
评论 (0) |
编辑 收藏
摘要:
Symbian 资源文件解析
一、何为资源文件:
在symbian应用程序中,资源文件指的是后缀名为.rss的文件,每个应用程序至少要有一个与之关联的资源文件。资源编译器rcomp编译资源文件后,生成一个.rsc二进制文件和一个相伴的头文件(.rsg)。这样在应用程序框架启动应用程序时,会打开这个二进制文件,借助在.rsg文件中创建的资源标志符,根据需要把各个资...
阅读全文
posted @
2007-09-19 17:30 frank.sunny 阅读(2385) |
评论 (0) |
编辑 收藏
摘要: 该文档在网上比较多见,我只是找来结合自己的安装做了些增补,增补以红色字体示出
第一章 环境搭建
Symbian是Nokia公司开发的一款智能手机操作系统。Nokia根据手机的屏幕大小和价格高低把手机分成了多...
阅读全文
posted @
2007-09-19 17:27 frank.sunny 阅读(2044) |
评论 (4) |
编辑 收藏
自从开始用VC以后,一直以来都在用Visual Assist,感觉这个工具真的非常好,但是有些自动文档功能就个人觉得并非很适合,不过可能由于自身的E文比较差吧,从来没想过自己如何去修改这个东西。来新单位已经两个礼拜了,马上又要下班了,就冲着这个查了下如何修改AutoText,终于发现了官网上的详细说明,现在粘帖在下面,以备不时之需
http://www.wholetomato.com/products/features/autotext.asp为了查找方便,自己也将常用的命令粘帖过来
Code
Type your expanded code into the Code field. Include reserved strings to expand the date, filename and more.
|
Reserved String |
Meaning |
Date |
$DATE$ |
Year/month/day formatted as %04d/%02d/%02d |
|
$DAY$ |
Day of month formatted as %d |
|
$DAY_02$ |
Day of month formatted as %02d |
|
$DAYNAME$ |
Three-character abbreviation of day |
|
$DAYLONGNAME$ |
Full name of day |
|
$MONTH$ |
Month formatted as %d |
|
$MONTH_02$ |
Month formatted as %02d |
|
$MONTHNAME$ |
Three-character abbreviation of month |
|
$MONTHLONGNAME$ |
Full name of month |
|
$YEAR$ |
Year formatted as %d |
|
$YEAR_02$ |
Year formatted as %02d |
File |
$FILE$ |
Full filename with path* |
|
$FILE_UPPER$ |
Full filename with path in uppercase* |
|
$FILE_BASE$ |
Filename without path or extension* |
|
$FILE_BASE_UPPER$ |
Filename without path or extension in upper case* |
|
$FILE_EXT$ |
Filename extension* |
|
$FILE_EXT_UPPER$ |
Filename extension in upper case* |
|
$FILE_PATH$ |
Path of file* |
|
$FILE_PATH_UPPER$ |
Path of file in upper case* |
General |
$clipboard$ |
Current clipboard |
|
$end$ |
Position of caret after expansion |
|
$selected$ |
Current selection** |
|
$$ |
$ |
GUID |
$GUID_DEFINITION$ |
Generated GUID formatted for use in a definition |
|
$GUID_STRING$ |
Generated GUID formatted for use in a string |
|
$GUID_STRUCT$ |
Generated GUID formatted for use in a struct |
|
(Note that all instances of GUID reserved words will use a singe generated GUID.) |
Refactor |
$GeneratedPropertyName$ |
Property name generated during Encapsulate Field |
|
$MethodArg$ |
One parameter of the method and its type |
|
$MethodArgName$ |
One parameter of the method |
|
$MethodArgType$ |
Type of one parameter of the method |
|
$MethodBody$ |
Body of implementation |
|
$MethodQualifier$
| Optional qualifiers of method |
|
$ParameterList$ |
Parameters separated by commas |
|
$SymbolContext$ |
Context and name of method |
|
$SymbolName$ |
Name of method |
|
$SymbolPrivileges$ |
Access of method |
|
$SymbolStatic$ |
Keyword static or blank |
|
$SymbolType$ |
Return type of method |
|
$SymbolVirtual$ |
Keyword virtual or blank |
Time |
$HOUR$ |
Hour formatted as %d |
|
$HOUR_02$ |
Hour formatted as %02d |
|
$MINUTE$ |
Minute formatted as %02d |
|
$SECOND$ |
Second formatted as %02d |
*Reserved strings beginning with $FILE expand using the case of the current file.
**Lines with whitespace and $selected$ are omitted from expanded code if there is no selection. (This lets you define a single entry to be used with and without a selection.)
Autotext entries containing $GUID_* are available in IDL files.
Access the list of reserved strings using the context menu inside the Code field when editing Autotext.
posted @
2007-09-14 17:27 frank.sunny 阅读(1450) |
评论 (0) |
编辑 收藏
摘要:
IP地址与子网掩码
一般考试中都会给定一个IP地址和对应的子网掩码,让你计算1、子网数目2、网络号3、主机号4、广播地址5、可用IP地址范围碰到这类题,我们应该怎么样来解题呢。方法如下:
首先,不要管这个IP是A类还是B类还是C类,IP是哪一类对于解题是没有任何意义的,因为在很多题中B类掩码和A类或是C类网络一起出现,不要把这认为是一个错误,很多时候都是这样出题...
阅读全文
posted @
2007-08-05 22:03 frank.sunny 阅读(1614) |
评论 (5) |
编辑 收藏
关于C51内的code,idata,xdata
以前没搞过C51,大学时代跟单片机老师的时候也是捣鼓下汇编,现在重新搞单片机,因为手头资料不多,找到一些C51的程序,发现里面有这些关键字,不甚明了,没办法只好找了下,发现如下描述:
从数据存储类型来说,8051系列有片内、片外程序存储器,片内、片外数据存储器,片内程序存储器还分直接寻址区和间接寻址类型,分别对应code、data、xdata、idata以及根据51系列特点而设定的pdata类型,使用不同的存储器,将使程序执行效率不同,在编写C51程序时,最好指定变量的存储类型,这样将有利于提高程序执行效率(此问题将在后面专门讲述)。与ANSI-C稍有不同,它只分SAMLL、COMPACT、LARGE模式,各种不同的模式对应不同的实际硬件系统,也将有不同的编译结果。
在51系列中data,idata,xdata,pdata的区别
data:固定指前面0x00-0x7f的128个RAM,可以用acc直接读写的,速度最快,生成的代码也最小。
idata:固定指前面0x00-0xff的256个RAM,其中前128和data的128完全相同,只是因为访问的方式不同。idata是用类似C中的指针方式访问的。汇编中的语句为:mox ACC,@Rx.(不重要的补充:c中idata做指针式的访问效果很好)
xdata:外部扩展RAM,一般指外部0x0000-0xffff空间,用DPTR访问。
pdata:外部扩展RAM的低256个字节,地址出现在A0-A7的上时读写,用movx ACC,@Rx读写。这个比较特殊,而且C51好象有对此BUG,建议少用。但也有他的优点,具体用法属于中级问题,这里不提。
posted @
2007-08-05 18:19 frank.sunny 阅读(8545) |
评论 (0) |
编辑 收藏
摘要:
USB设备枚举全纪录
在编写这部分程序之前,首先需要了解有关USB协议,重点是USB数据通信结构、11条标准请求命令和标准USB描述符。
因为嵌入式设备的软硬件是密切相关的,所以还需做的准备工作是了解选用的USB芯片及主控MCU的性能。
一.硬件篇
USB芯片
作用:
1. 管理...
阅读全文
posted @
2007-08-04 21:33 frank.sunny 阅读(5306) |
评论 (2) |
编辑 收藏