franksunny的个人技术空间
获得人生中的成功需要的专注与坚持不懈多过天才与机会。 ——C.W. Wendte

今天一个很偶然的机会,需要回答一个将无符号数据存到有符号变量的问题。我编码如下,结果很有意思,我是在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工具将S60Ethernet Packet Service这个服务停掉了,后来每一次模拟器试图用Socket连接时都弹出“Error1058 无法启动服务……”的报错。该错误在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服务器之间的相互作用。

应用程序核心框架类

第一层:CBaseCActive两个基类,其中CActive也是派生于CBase,而CActive又被第二层的CConEnv派生

第二层:包含两个基本组件:AppArcCONEAppArc代表应用程序架构,这些类提供了基本的应用程序结构、将系统信息提交到应用程序的机制,以及使用文件服务器持久化数据。其中的类在命名时都带有前缀“*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)、应用程序UIApplication 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 新建AppUiView实例:框架通过调用文档对象的CreateAppUiL()方法生成了一个AppUi实例并获取指向它的指针。此处AppUi实例创建自身时使用的是C++的默认构造函数并返回实例的指针,之后框架通过这个指针调用AppUi实例的ConstructL()函数来完成构造。而在这个ConstructL()函数中首先调用的是AppUi基类的BaseContructL()函数,处理了读入与该程序相关的资源的事宜,其次是新建需要加载的View类的实例(通过双重构造),如果不止一个View的情况下需要调用AddViewL()函数将新建的View实例加载进来,最后如果是多个View时通过SetDefaultViewL()函数设置缺省的默认视图。如读入一个与该程序相关的资源文件AppUi调用了AppView类的NewL函数来生成其实例,这里也是用的双重构造

g View的重绘:通过以上的创建过程,框架已经拥有了View的无限调度权利,此时如果有一般的system事件框架就可以通过窗口服务器调用ViewDraw()函数,至于这些System事件一般指程序启动、应用程序获得焦点或者选项菜单消失等等。在这里需要注意的是编程开发者并不能直接调用Draw,它要求在调用前系统的graphics context处于激活状态,如果编程开发者希望进行屏幕的重绘,则只能调用DrawNow()方法。还有就是Draw函数是不能异常退出的,这是因为该函数能被框架直接调用,而框架是不知道如何处理可能发生的异常的。因此Draw自己需要捕捉和处理可能发生的错误。

h 处理命令:完成以上步骤后,用户可以通过比如菜单选项之类的交互UI使框架调用HandleCommandL()函数,并传递一个参数aCommand,它指明了用户所选择的命令,HandleCommandL()会据此来判断不同的命令以分别调度执行。在此处还有一个必须注意的地方是如果要程序的View实例也回应用户的按键,则必须将View实例通过AppUiAddToStackL()函数加入到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.

autotextCodeInsertNew.png 
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内的codeidataxdata

 

以前没搞过C51,大学时代跟单片机老师的时候也是捣鼓下汇编,现在重新搞单片机,因为手头资料不多,找到一些C51的程序,发现里面有这些关键字,不甚明了,没办法只好找了下,发现如下描述:


   从数据存储类型来说,
8051系列有片内、片外程序存储器,片内、片外数据存储器,片内程序存储器还分直接寻址区和间接寻址类型,分别对应codedataxdataidata以及根据51系列特点而设定的pdata类型,使用不同的存储器,将使程序执行效率不同,在编写C51程序时,最好指定变量的存储类型,这样将有利于提高程序执行效率(此问题将在后面专门讲述)。与ANSI-C稍有不同,它只分SAMLLCOMPACTLARGE模式,各种不同的模式对应不同的实际硬件系统,也将有不同的编译结果。

 

51系列中data,idata,xdata,pdata的区别

data:固定指前面0x00-0x7f128RAM,可以用acc直接读写的,速度最快,生成的代码也最小。

idata:固定指前面0x00-0xff256RAM,其中前128data128完全相同,只是因为访问的方式不同。idata是用类似C中的指针方式访问的。汇编中的语句为:mox ACC,@Rx.(不重要的补充:cidata做指针式的访问效果很好)

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)编辑 收藏
仅列出标题
共7页: 1 2 3 4 5 6 7 

常用链接

留言簿(13)

随笔分类

个人其它博客

基础知识链接

最新评论

阅读排行榜

评论排行榜