http://pic.du8.com/onlineimg/31/bp/sep/2003/31bp.0001.png
這本書的地址是從這里開始的,,,0002 0003 …0100…N
posted @ 2008-04-20 17:52 yutou 閱讀(242) | 評論 (0) | 編輯 收藏
|
|||
du8.com的書..很不錯..但是要VIP,,,又是VIP
http://pic.du8.com/onlineimg/31/bp/sep/2003/31bp.0001.png 這本書的地址是從這里開始的,,,0002 0003 …0100…N posted @ 2008-04-20 17:52 yutou 閱讀(242) | 評論 (0) | 編輯 收藏 很好的一個小冊子,不大不小,卻是一個學習的好幫手.放此收藏.
感謝LXH2002的收集整理. ;-) posted @ 2008-04-10 22:55 yutou 閱讀(393) | 評論 (1) | 編輯 收藏 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() posted @ 2008-04-07 17:24 yutou 閱讀(248) | 評論 (0) | 編輯 收藏 在if else if 使用中出現的一點問題,編譯器報出“在return的前面缺少 ';' ”
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() //更改后通過編譯的代碼 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() posted @ 2008-04-07 17:06 yutou 閱讀(224) | 評論 (0) | 編輯 收藏 code: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]()
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]()
posted @ 2008-04-07 16:58 yutou 閱讀(413) | 評論 (0) | 編輯 收藏 信息來源:http://blog.21ic.com/user1/2949/archives/2007/35599.html 一個定義為volatile的變量是說這變量可能會被意想不到地改變,這樣,編譯器就不會去假設這個變量的值了。精確地說就是,優化器在用到這個變量時必須每次都小心地重新讀取這個變量的值,而不是使用保存在寄存器里的備份。下面是volatile變量的幾個例子:
1). 并行設備的硬件寄存器(如:狀態寄存器) 2). 一個中斷服務子程序中會訪問到的非自動變量(Non-automatic variables) 3). 多線程應用中被幾個任務共享的變量 回答不出這個問題的人是不會被雇傭的。我認為這是區分C程序員和嵌入式系統程序員的最基本的問題。嵌入式系統程序員經常同硬件、中斷、RTOS等等打交道,所用這些都要求volatile變量。不懂得volatile內容將會帶來災難。 假設被面試者正確地回答了這是問題(嗯,懷疑這否會是這樣),我將稍微深究一下,看一下這家伙是不是直正懂得volatile完全的重要性。 1). 一個參數既可以是const還可以是volatile嗎?解釋為什么。 2). 一個指針可以是volatile 嗎?解釋為什么。 3). 下面的函數有什么錯誤: int square(volatile int *ptr) { return *ptr * *ptr; } 下面是答案: 1). 是的。一個例子是只讀的狀態寄存器。它是volatile因為它可能被意想不到地改變。它是const因為程序不應該試圖去修改它。 2). 是的。盡管這并不很常見。一個例子是當一個中服務子程序修該一個指向一個buffer的指針時。 3). 這段代碼的有個惡作劇。這段代碼的目的是用來返指針*ptr指向值的平方,但是,由于*ptr指向一個volatile型參數,編譯器將產生類似下面的代碼: int square(volatile int *ptr) { int a,b; a = *ptr; b = *ptr; return a * b; } 由于*ptr的值可能被意想不到地該變,因此a和b可能是不同的。結果,這段代碼可能返不是你所期望的平方值!正確的代碼如下: long square(volatile int *ptr) { int a; a = *ptr; return a * a; } posted @ 2008-04-06 17:29 yutou 閱讀(269) | 評論 (0) | 編輯 收藏 By SmartPtr(http://www.shnenglu.com/SmartPtr/)
這幾天工作時碰到一個C++的編譯錯誤(我使用的是Visual C++ 7.0),說是有一個類重復定義,仔細想想我們的這個項目也是做了好幾個Release了, 內部代碼應該不會有這樣的低級錯誤, 真把類型給重復定義了,檢查結果正如我預料的一樣。 就這樣, 我左右沒找到原因,被一個編譯錯誤給卡在那里了。(在我的概念中, 程序錯誤的等級為:編譯錯誤->鏈接錯誤->邏輯錯誤, 此錯誤屬于最低級 )。這時我仔細看了一下錯誤提示, 發現重復定義是由于從兩個不同的路徑包含了同一個頭文件而引起的,同事也建議從另外一個路徑打開工程試試, 這才慢慢發現了原因。這個原因可能有些拗口,而事實上要出現這種錯誤也有些“曲折“, 讓我從不同情況下的類型重定義來解釋一下吧。
我總結的C++中類型重定義情況有三。 1 沒有在文件頭加#pragma once指示符。 ![]() ![]() ![]() ![]() ![]() ![]() ![]() Main.cpp: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() 2 兩個不同的頭文件中定義了相同的類型(均有#pragma once) ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() 這里main.cpp中同時包含了Type1.h, Type2.h兩個頭文件, 雖然其文件頭都有#pragma once,但因為是不同的文件, 預編譯器還是會兩次把Type類的定義放在Main.cpp中, 所以也會出現了重定義。 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() 3 從兩個不同的路徑包含了同一個頭文件 前面兩種是比較常見, 也是比較容易解決的情況, 而這里要講的第三種情況, 比較少見, 而且一般出現在有虛擬映射盤的時候。(這樣才能做到從兩個不同的路徑包含同一個頭文件), 其他會在什么時候出現, 我還沒想到, 知道的朋友頂一下:)。下面我來分析一下: Type1.h: ![]() ![]() ![]() ![]() ![]() ![]() ![]() Main.cpp: main.cpp這樣包含了兩個頭文件, 從本質上來講, 它們都對應于物理盤D:\Test下的文件Type1.h, 是同一個文件。但在不同的操作下, VC對其有不同的解釋。#include "X:\Type1.h"用的是絕對路徑, 自然沒有什么異議, 但#include "Type1.h"卻有些變化: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() 這里我們在 4) 在D:\Test下打開工程, 編譯, 出現類型Type重復定義錯誤 這種情況下,main.cpp預編譯為: Main.cpp: 只保證本文件被編譯一次, 這里VC將其認為是兩個不同的文件, 所以都要編譯, 出現編譯錯誤自然也就不奇怪了。 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() #pragma once 總結我在VC7, VC8,和Dev C++中都測試了第三種情況, 發現只有Dev C++是可以通過編譯的。這可能是微軟VC的#pragma once還不夠智能吧,輕易的被Windows的虛擬盤給蒙蔽了雙眼, 看不到其本質(只是猜測, 或許VC這么處理是有其他用意的)。 因為在稍大一點的工程開發中, 我們一般都會用虛擬盤來方便工作, 一是訪問快捷,簡化了路徑, 二是因為多人協同開發,我們一般希望大家源代碼路徑相同,但我們不應強制要求大家都把源代碼放死在某一目錄下, 這時把你放源代碼的路徑映射為一個虛擬盤(比如說統一為X:)就能把大家的代碼路徑統一起來了。但是另一方面,有了虛擬盤, 就為出現類型重定義提供了條件, 以下是我得出的兩個解決方法: 來保證頭文件只被編譯一次。這樣不管是包含兩個相同的文件,還是包含兩個不同的文件,或是包兩個文件相同但路徑不同的文件, 只要_XXX_H被定義過, 就不會再編譯那個編譯(但這里我們要保證_XXX_H的唯一性, 如果兩個不同的頭文件里用了同一_XXX_H,是會出問題的)
![]() ![]() ![]() ![]() ![]() ![]() 2 在包含頭文件時,不要使用絕對路徑, 哪怕那是虛擬盤的絕對路徑。 posted @ 2008-03-10 16:32 yutou 閱讀(485) | 評論 (0) | 編輯 收藏 yutou posted @ 2008-03-10 00:11 yutou 閱讀(180) | 評論 (0) | 編輯 收藏 用可行性研究論證您的項目
Scott W. Ambler 在任何項目的開始階段,項目組都要為項目的總體工作做一些準備工作。在 Rational Unified Process(RUP)和面向對象的軟件過程(OOSP)中,這個階段稱為啟動階段。本周,我們考慮如何確定一個項目是否值得啟動。本文由《Process Patterns》的第五章改編而來。 啟動項目的一個重要環節就是對項目進行論證;也就是說,確定是否應該立項。遺憾的是,論證經常是完成得最差的一項任務。85% 以上的大型項目以失敗告終(請參閱參考資源中的《Patterns of Software Systems Failure and Success》一書),這一事實表明大多數項目在論證階段就應該中止,而不是在為其作了大量投資(并造成損失)之后。論證階段的主要目標是,確定項目的最佳實施方案,如果存在這樣的方案,還要論證它為什么是最佳的。 圖1描繪了針對論證階段的過程模型的解決方案。論證項目時需要完成幾項工作,論證項目的主要結果便是可行性研究。為了進行可行性研究,您將重復下列步驟: · 選擇一項可選方案 · 確定潛在的風險
圖 1. 論證階段的過程模型
確定可選的實施方案
評估經濟可行性 評估技術可行性 評估運行可行性 選擇一項可選方案 確定潛在的風險 參考資源 · 《Process Patterns — Building Large-Scale Systems Using Object Technology》,Scott W. Ambler 著。Cambridge University 出版社,紐約,1998 年。 · 《More Process Patterns — Delivering Large-Scale Systems Using Object Technology》,Scott W. Ambler 著。Cambridge University 出版社,紐約,1999 年。 · 《The Object Primer 2nd Edition》,Scott W. Ambler 著。Cambridge University 出版社,紐約,2000 年。 · 《The Unified Process Inception Phase》,Scott W. Ambler 和 Larry L. Constantine 著。R&D Books,CA,Gilroy,2000 年。 · 《The Unified Process Elaboration Phase》,Scott W. Ambler 和 Larry L. Constantine 著。R&D Books,CA,Gilroy,2000 年。 · 《Patterns of Software Systems Failure and Success》,Capers Jones 著。International Thomson Computer 出版社,MA,Boston,1996 年。 · 《The Rational Unified Process: An Introduction》,第二版,Philippe Kruchten 著。Reading, MA: Addison-Wesley Longman, Inc.,MA,Reading,2000 年。 · 《The Squandered Computer: Evaluating the Business Alignment of Information Technologies》,Paul Strassmann 著。New Canaan,CT:Information Economics 出版社,CT,New Canaan,1997 年。 · 《The Process Patterns Resource Page》,Scott Ambler 著
posted @ 2008-03-09 23:45 yutou 閱讀(3174) | 評論 (0) | 編輯 收藏 “我近三十年來一直在學習馬克思主義哲學,并總是試圖用馬克思主義哲學指導我的工作。馬克思主義是智慧的源泉。” --錢學森在給一位朋友的信中這樣說道
馬克思主義哲學對一個人的思想有著革命性的意義. blog之,提醒自己不要忽視哲學,并且鞭策自己要堅持學習! posted @ 2008-03-04 13:30 yutou 閱讀(211) | 評論 (0) | 編輯 收藏 |
|||