今天一個很偶然的機會,需要回答一個將無符號數據存到有符號變量的問題。我編碼如下,結果很有意思,我是在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 閱讀(3007) |
評論 (13) |
編輯 收藏
摘要: 昨天遇到類內靜態函數,本想自己整理下,誰知道已經有人整理的很好了,為此就不麻煩了,看了一篇就轉貼在自己空間里,以便以后查詢。C++的static關鍵字作者:韓耀旭
C++的static有兩種用法:面向過程程序設計中的static和面向對象程序設計中的static。前者應用于普通變量和函數,不涉及類;后者主要說明static在類中的作用。
一、面向過程設計中的static
1、靜態全局變量
...
閱讀全文
posted @
2007-10-16 21:03 frank.sunny 閱讀(1758) |
評論 (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 閱讀(2893) |
評論 (2) |
編輯 收藏
本文檔我上傳過程中圖片沒有粘貼上來,為此如果有人感興趣,請下載word文檔,地址是http://www.shnenglu.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 閱讀(3850) |
評論 (0) |
編輯 收藏
摘要:
Symbian 資源文件解析
一、何為資源文件:
在symbian應用程序中,資源文件指的是后綴名為.rss的文件,每個應用程序至少要有一個與之關聯的資源文件。資源編譯器rcomp編譯資源文件后,生成一個.rsc二進制文件和一個相伴的頭文件(.rsg)。這樣在應用程序框架啟動應用程序時,會打開這個二進制文件,借助在.rsg文件中創建的資源標志符,根據需要把各個資...
閱讀全文
posted @
2007-09-19 17:30 frank.sunny 閱讀(2403) |
評論 (0) |
編輯 收藏
摘要: 該文檔在網上比較多見,我只是找來結合自己的安裝做了些增補,增補以紅色字體示出
第一章 環境搭建
Symbian是Nokia公司開發的一款智能手機操作系統。Nokia根據手機的屏幕大小和價格高低把手機分成了多...
閱讀全文
posted @
2007-09-19 17:27 frank.sunny 閱讀(2055) |
評論 (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 閱讀(1487) |
評論 (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 閱讀(1648) |
評論 (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 閱讀(8584) |
評論 (0) |
編輯 收藏
摘要:
USB設備枚舉全紀錄
在編寫這部分程序之前,首先需要了解有關USB協議,重點是USB數據通信結構、11條標準請求命令和標準USB描述符。
因為嵌入式設備的軟硬件是密切相關的,所以還需做的準備工作是了解選用的USB芯片及主控MCU的性能。
一.硬件篇
USB芯片
作用:
1. 管理...
閱讀全文
posted @
2007-08-04 21:33 frank.sunny 閱讀(5370) |
評論 (2) |
編輯 收藏