一些簡單的C++進階用法

在程式語言之中,C++一直是我最熟悉的語言之一,也由於之前在五專時代曾經寫過物件導向SCSI驅動程式的經驗,讓我的C的程式語言能力有一定的水準。不過自從上了大學之後,就一路忙著學習著Linux的架設與網頁程式(PHP,ASP,ZOPE…等)其實C++已經忘記的差不多。所以最近去幾家公司面試的時候也著實讓我吃盡了苦頭。

由於我之前去許多家公司面試軟體研發工程師(RD)的職位,也由於我本身喜歡挑戰新的領域與事物,於是我在面試的時候,全部避開之前熟悉網站程式設計或是Linux的架設部分,而盡量選擇系統軟體程式設計師或是LINUX的程式設計師。所以去每家公司自然而然要考一些基本的C++基礎與一些程式設計的概念。或許大家看到這邊,會覺得很簡單,C++不就是基本的程式概念,有哪一些需要學習呢?但是自從我去幾家軟體公司面試以來,有一些題目還真是有點刁鑽與難懂,明明是很簡單的概念,卻往往容易疏忽而犯錯。以下就將幾題我之前去面試的題目提供出來,你又能答對幾題呢?

 

</table>
1. #include void main() { int i=3,j=5; if ((i=3)||(j=6)){ cout <<"i="<<i<<" j="<<j;} } </td> </tr>
Q: What is the output? i=?? j=??
</table>  
2. #include class C1 { public: int i; C1( ){ cout <<"1--------"<<endl;} ~C1( ){ cout <<"2--------"<<endl;} }; class C2 { public: int i; C2(){ cout <<"3--------"<<endl;} ~C2( ){cout <<"4--------"<<endl; } }; int fun1( ) { static C2 aa; C1( ); cout <<"test_function--------"<<endl; } void main() { int x=0; C1 c; C2 * v; cout <<"test1--------"<<endl; *v=C2( ); **v=&C2( );** cout <<"test2--------"<<endl; fun1( ); v->i =111; cout <i<<endl; } </td> </tr>
Q: What is the output?
3. Static i; Global j;
Q: What is difference between i,j?? and what is difference between Static and Global??
 
4. string s1("test1"); string s2("test2~~~"); string & rs=s1; string * ps=&s1; cout <<"rs1="<<&rs<<" ps1="<<*ps; rs=s2; //_Label 1_ ps=&s2; //_Label 2_ cout <<"rs2="<<&rs<<" ps2="<<*ps;
Q: What is the output aboute between Label1 and Label2?
  **解答1:** 第一題的答案是 i=3 j=5,並不會執行 j=6 這個給定值,由於C++是左手邊優先(Left hand side),所以當OR( || )給值出現的時候,所出現的就是第一個成立就不再往下看。所以並不會執行到 j=6 自然而然 j=5 **解答2:** 針對這一題,可真是難倒我了,答案就是 1--------- test1----- 3--------- 4--------- test2----- 3-------- 1-------- 2-------- test_function---------- 2--------- 4--------- 在類別的建構者函數與解構者函數之中,會呼叫到建構者函數就是當物件成立的時候,所以當 C1 c; 的時候就會呼叫 C1 的建構者函數。但是 在建立類別指標的時候(物件指標)並不會呼叫建構者函數與解構者函數,反倒是在指向位址時所使用的 C2( ) 所代表的就是將『類別當成靜態函數來使用』這樣一來可以讓指標去指定該物件,但是由於是當成函數使用所以 C2的建構者函數與解構者函數都會一併執行。而在Scope方面,由於 Static 的Scope 是最大的,所以相對的解構者函數也會比較慢出現~~~ **解答3:** 在Scope方面,大家都知道 Static 與 Global的用法,就是比起一般區域變數的Scope都還大,但是這兩個到底有什麼差距呢?原來,比起來Global比Static 更廣大的Scope,也就是 Static 代表該變數的 Scope範圍到『整個檔案』,但是 Global卻是橫跨數個檔案,皆可以呼叫Global的參數(只要使用 extern來呼叫即可~~~)所以大家都會忘記,其實 Global的範圍才最大,但是記得使用外部檔案的變數還是要宣告一下。 **解答4:** 這一題只要是在考『指標』(pointer)與『物件化身』(reference)兩者的差別,根據去查書『More Effective C++』裡面有提到,其實兩者用法很像,確有以下的不同 * Reference 沒有空值(NULL)存在 * Pointer 的位置可以變動而 Reference 則否 所以以上的題目中 rs =s2 是將 s1中的值改為 s2的數值,而 ps=&s2 則是將指標 ps 指向 s2而已罷了~~~     大家對幾題阿?有題目的話歡迎來分享~~~  

開心點把東東打飛吧

最近看到學弟的文章,講到關於抓取畫面的軟體,還有一些雪人遊戲(我想這些是大家上班的良伴~~),在此為大家整理同一款的雪人遊戲(不過有三個版本啦),順便把畫面抓了下來,給各位參考一下,有空來把壞心情打飛ㄅㄟ~~~~~~

打東東遊戲一覽表

正常版 [

正常版

](http://meph.eu.org/pinguin.swf)

_

http://meph.eu.org/pinguin.swf_

 

精緻版

精緻版

_

http://home.pchome.com.tw/good/pink3158/yetisports1.swf

皆大歡喜版 _

皆大歡喜版

_

_http://www.blueidea.com/articleimg/2004/01/1590/wow.swf

打出去要等他掉下來等好久..一個不小心就打出8971.2了唷~~~

 

碩士班不是過渡嗎?

在烏來拍到的花

<照片:烏來裡春天的一朵小花>

昨天為了研討會忙了一整天,而家中的網路似乎也抗議休息過少似的,就這樣斷線了一天。自從禮拜一得知稿件沒有上ICIM研討會,為了完成老師所要求的,至少上一個研討會才能順利畢業而努力。每天就是不斷的改文章、不斷地找研討會的訊息….。覺得在學校的生活過得有點乏味,也覺得整個學生的最後生涯過的相當的痛苦,每天似乎也把剩餘的學生生涯變成一種等待、等待著離開學校、等待著到社會工作。看著日曆逐漸逼近的論文口試的日子,或許在別人眼中是緊張,但是在我的心中或許有一絲的輕鬆。

當然~很多人都跟我講,到了社會之後,絕對不會比在學校輕鬆,不論是上班的主管管教的態度、或者是加班。但是,或許在我心中對於能早點投入社會是嚮往已久的事情,能夠將自己學習的實際的到職場現實的戰場之中,感到相當的期待所致。也或許是對於現在的學生生涯有點煩悶所致,身為天秤座的我,對於現在日復一日的生活,有點厭倦了~~更討厭被限制著自由的感受…

不過最近看到幾篇網路文章,覺得還不錯~~~希望大家看了也會有相同的感覺~~

> > **生命中沒有過渡** > > > > 和一位留德的老師談起老師在德國的留學生活。 老師:「在德國,因為學制還有一些適應的問題,有些人一待就會待上十年才拿 到博士學位。」 我說:「哇!那好久哦。」對於才二十歲的我而言,十年,不就是生命的一半嗎 ? 老師笑了笑:「你為什麼會覺得那很『久』呢?」 我說:「等拿到學位回國教書或工作,都已經三、四十歲了呢!」 老師:「就算他不去德國,有一天,他還是會變成『三、四十歲』,不是嗎?」 「是的。」我答道。 老師:「你想透了我這個問題的涵義了嗎?」 我不解的看著老師。 「生命沒有過渡、不能等待,在德國的那十年,也是他生命的一部分啊!」老師 語重心長的說。 「啊!我了解了!」 那一段談話,對我的影響很大,提供了我一個很重要的生活哲學與價值觀。 前一陣子工作很忙,學弟問我:「你要忙到什麼時候呢?」 「我應該要忙到什麼時候?或者說到什麼時候我才該不忙呢?」我反問。 「忙碌也是我生活的一部分,重點應在於,我喜不喜歡這樣的『忙碌』。 如果我喜歡,我的忙碌就應該持續下去,不是嗎?」我補充著。 對我而言,忙碌不是生命的「過渡階段」,而是我最珍貴的生命的一部分。 很多人常會抱怨:「工作太忙,等這陣子忙完後,我一定要如何如何...」 於是一個本屬於生命一部分的珍貴片段,就被定義成一種過渡與等待。 「等著吧!挨著吧!我得咬著牙渡過這個過渡時期!」當這樣的想法浮現,我們 的生命就因此遺落了一部分。 「生命沒有過渡、不能等待。」這時,老師的話就會清晰的浮現在我的耳邊。 所以,我總是很努力的讓自己喜歡自己每一個生命階段,每一個生命過程,因為 那些過程的本身就是生命,不能重來的生命。

STL學習-Vector初探與學習心得

Vector是STL容器裡面最簡單的一個,但是在資料結構裡面也鮮少有提到,但是在STL裡面卻時常利用這個資料結構。在這裡擺上我今天學習Vector的一些重點,讓大家分享一下。

  • **引用STLPORT版本 **:stlport4.0在bcb5.5上實做

  • **引用函示庫 **** **:位置: _您安裝STLPORT的位置stlportvector_

  • **實際運作函示庫 **:位置: 您安裝STLPORT的位置stlportstl_vector.h

Vector是一個線性空間,但是為一個可以變動大小的線性空間,在宣告之後整個空間就像陣列(array)一樣為一個連續的線性空間,亦可以在上面進行類似Array的操作(比如說直接給值 a[i]=5 ; 或是直接顯示值 a[i]),而且Vector還可以隨意插入任何一個位置之中,並且使之後的元素均往後退一個(這個在array之中倒是需要實做上去加強的功能),並且最重要的是在Vector之中,他的位置是可以變動大小的。也就是若你一開始宣告的Vector大小為5,但是當你插入第6個元素的時候,整個Vector會自動變更大小到現在的兩倍(10個)。針對這個功能,所以Vector在使用上變的相當的方便,加上STL中泛型的設計概念使得Vector變得更強大,能解決的問題也就更多。整理Vector的特點如下:

Vector特點

  1. 線性空間

  2. 與陣列操作相同

  3. 可以任意插入在任何位置

  4. 若是空間不足,將會自動擴大兩倍的空間

在今天的學習筆記之中,我附上一個自己的範例程式碼,方便各位如果要測試程式的時候一個參考依據:

#include #include #include

using namespace std;

int main() { int i; vector iv(2,9); cout «“iv[1]=”«iv[0]; cout «“iv[2]=”«iv[1]«endl; cout «“size=”«iv.size()«endl; cout «“capacity=”«iv.capacity()«endl; cout «”—————————————–”«endl;

iv.push_back(1);
cout <<"iv[3]="<<iv[1]<<endl;
cout <<"size="<<iv.size()<<endl;
cout <<"capacity="<<iv.capacity()<<endl;
cout <<"-----------------------------------------"<<endl;

iv.push_back(2);
cout <<"iv[4]="<<iv[1]<<endl;
cout <<"size="<<iv.size()<<endl;
cout <<"capacity="<<iv.capacity()<<endl;
cout <<"-----------------------------------------"<<endl;

iv.push_back(3);
cout <<"iv[5]="<<iv[1]<<endl;
cout <<"size="<<iv.size()<<endl;
cout <<"capacity="<<iv.capacity()<<endl;
cout <<"-----------------------------------------"<<endl;

iv.push_back(4);
cout <<"iv[6]="<<iv[1]<<endl;
cout <<"size="<<iv.size()<<endl;
cout <<"capacity="<<iv.capacity()<<endl;
cout <<"-----------------------------------------"<<endl;

for (i=0;i<iv.size();++i)
	cout <<iv[i]<<"--";
cout <<endl;

iv.push_back();
iv.push_back();
cout <<"size="<<iv.size()<<endl;
cout <<"capacity="<<iv.capacity()<<endl;
for (i=0;i<iv.size();++i)
	cout <<iv[i]<<"--";
cout <<endl;

vector::iterator ivite= find(iv.begin(), iv.end(),1);
if (ivite) {iv.erase(ivite);}
cout <<"-----------------------------------------"<<endl;
cout <<"size="<<iv.size()<<endl;
cout <<"capacity="<<iv.capacity()<<endl;
cout <<*ivite;
for (i=0;i<iv.size();++i)
	cout <<iv[i]<<"--";
cout <<endl;

ivite= find(iv.begin(), iv.end(),2);
if (ivite) {iv.insert(ivite,3,7);}
cout <<"-----------------------------------------"<<endl;
cout <<"size="<<iv.size()<<endl;
cout <<"capacity="<<iv.capacity()<<endl;
for (i=0;i<iv.size();++i)
	cout <<iv[i]<<"--";
cout <<endl;


ivite= find(iv.begin(), iv.end(),7);
cout <<iv.begin()<<"**"<<endl;
cout <<ivite<<"==";
ivite= find(ivite, iv.end(),7);
cout <<ivite<<"==";



iv.clear2();
cout <<"-----------------------------------------"<<endl;
cout <<"size="<<iv.size()<<endl;
cout <<"capacity="<<iv.capacity()<<endl;
for (i=0;i<iv.size();++i)
	cout <<iv[i]<<"--";
cout <<endl;

}

解說:這個程式主要就是在測試一些Vector的功能,就是建立一個大小為(2)的Vector,並且不斷插入(pushback)一些數值之後,顯示整個Vector的size(已用的空間)與capacity(整個Vector的空間),而這個也是參考[侯捷老師所寫的書](http://www.jjhou.com/jjwbooks-tass.htm)裡面的範例所打的。

尚未完成:雖然整體的Vector應用已經有一定程度的瞭解,但是總覺得對於空間的配置上,Vector自動擴充到兩倍空間這個特性其實有點浪費空間,也使得一開始的宣告上變的不能使用太大的空間(避免兩倍擴充空間變成龐大空間負擔)。並且Vector在clear之後,擴大的空間無法縮回來,使得整個空間大小變的相當的巨大(往往操作過後,會變的很大),以上兩點是我這幾天希望能修改原始碼完成的,但是由於stlport裡面所用的Vector程式碼與[](http://www.jjhou.com/jjwbooks-tass.htm)裡面的內容有一點點不同,可能這幾天看懂後才開始修改~~~

 

23頁第五行–11又1/2逆向管理

11又1/2逆向管理

最近許多BLOG都有這樣大串連的活動,就是讓你拿起手邊的書,將他第23頁打開,找到第五段話,寫在BLOG上面跟大家分享。我一開始看到這個活動的時候,起先也覺得只是一個大家一窩蜂的活動,但是隨著每個人拿起手邊的書寫下相關句子與心得的時候,閱讀的人也正在吸收著相同的知識,可能是很少的話語,卻能讓看的人有不同的吸收。

而活動詳細內容如下:

> > 第二十三頁的遊戲: 一、找一本離妳最近的書。 二、翻到第二十三頁。 三、找到第五個句子(sentence)。 四、發表到妳的網誌、新聞台或是個人版,並附上這份說明。 (以上來自[微風夕語](http://bone.twbbs.org.tw/index.php)的〈[第二十三頁的遊戲:王惠玲‧她從海上來。](http://bone.twbbs.org.tw/Misc/1082472614.php)〉)

 

而我翻到手邊的書(11又1/2逆向管理)之中內容如下:

辛特-格吉說:『形成新發現的因素之一,乃是和別人觀察同樣的東西,但有不同的思考』

 

這句話主要是在講『識相曾似』(Vu ja De):「新角度看舊事物」的一種方式,這一段話主要是講到說,在企業經營時,隨著太多所謂的典範或是成規,反而使得管理者跳不出思考的框架,無法有創新的思維。如果無法跳出新的框架,不妨學習『識相曾似』將就的成規試著用新的觀點去觀察,或許創新也是這樣而來~

跟大家分享一下~~~~希望也能看見各位的~

STL學習-簡易學習STL的概念

 

 

 

 

 

 

緣起

STL( Standard Template Library)與泛行程式設計是一個設計程式的概念,將資料容器與演算法加以分開的一個設計程序,不僅僅可以簡化整個設計流程,更可以使程式模組設計好之後,可以獲得更廣泛的應用空間。這麼好的設計方式,其實已經行之有年,記得前幾天去某些科技公司面試的時候,他們不斷的詢問我問知不知道『侯捷』有沒有修過他的課程,後來才知道原來侯捷算是國內的MFC與STL的大師,只要有修過他開的課程,基本上的程式設計能力就有一定的能力。於是我修了STL與泛型程式設計

在修的過程中,與我之前去接CASE的概念完全不同,雖然我已經相當的熟練物件導向的設計方式,與一些簡單的Template概念,但是卻沒有繼續的研讀一些軟體設計的方法論。所以聽到這些概念的時候,其實整個人是很感動的,在修了幾次的課程之後,於是開始回去架設可以執行STL的執行平台。

所以這篇文章主要是一個架設起可以執行STL的平台,裡面包括(1).STL架設在BCB5.0上的步驟(詳細請參照該篇文章),(2).利用UltraEdit建立一個可以Compiler的空間

  1. 架設STL的執行平台

雖然STL的設計概念非常的好,但是若你想要執行實做在你手邊有的IDE介面似乎是沒有的,所以我找了一些現有的一些資料裡面。關於STL的開發函示庫中,裡面以SGI的STL算是不錯,而侯捷老師開關於這些課程,也都是再追蹤SGI的STL裡面的源碼(source code)。當你無法直接使用這些函示庫的時候,可以使用STLPORT這個網站所提供的套件去將STL移植到你常使用的IDE介面(比如說VC++,BCB,BC++….)但是有那麼簡單嗎?如果能像STLPORT裡面所提的Have Fun!那也就好了~~我在GCC上面一直無法PORT成功。所以察看侯捷所寫的『STL源碼剖析』後面有位作者孟岩所寫的文章,是關於使用STLPORT在BCB與VC++上。 根據所以以下的操作先根據這樣的步驟,下載好BCB的compiler並且可以去這裡下載STLPORT4.0的版本,依照該上面提到關於BCB5的部分,即可架設完整,裡面可能會遇到的是,MAKE的時候若是MAKE的時候,出現了Page Table 的Size不夠大,即可修改 Makefile將第16行中的

LINK = tlib /P128 ===> LINK = tlib /P256 即可。

  1. 使用UltraEdit去建立編輯,執行平台

但是全部的編輯完成後,其實相當的麻煩,也就是每次編輯的時候需要透過DOS模式下COMMAND的方式去編輯軟體。UltraEdit是一個大家常用來撰寫原始碼、或是做些簡單的文書處理用的軟體。但是其實他可以搭配著Compiler去直接當成一個有簡單的IDE介面的CODE軟體。只要你WINDOW的目錄設定好(PATH裡面有包含到COMPILER的執行檔,可直接在COMMAND LINE測試一次,即可知道)就可以利用UltraEdit去編譯程式。方法如下(以下說明針對英文版,中文請將相關位置找到即可):

首先先到 [Advanced]—>[Tool Configuration],即可看到一個編輯畫面如下:

 UltraEdit中 Tool configuration的畫面

先設定Compiler的部分:

根據這個畫面,將[Command Line]填入:” bcc32 %F” 指的就是可以利用bcc32 這個compiler去編譯這個檔案。而將[Working Directory]設定到 “%P” 也就是編譯出來的中間檔放在該目錄之下。[Menu Item Name]裡面就是該TOOL的名稱,就隨便你填入你想要的名稱即可。並且記得將 [Show DOS Box]與 [Capture Output]兩個選項打勾,即可將這個操作的輸出結果抓取到另外一個檔案。

設定好之後,在主畫面中的[Advanced]下就會出現一個新的選項(快速鍵是 Shift+CTL+某個數字鍵),可拿著某個STL程式作一個簡單的測試。

接著設定執行程式的部分:

一樣到剛才那個畫面根據這個畫面,將[Command Line]填入:”%P%N.exe” 指的就是可以利用執行這個檔案編譯好的執行檔。而將[Working Directory]也設定 “%P” 。[Menu Item Name]裡面就是該TOOL的名稱,一樣你填入你想要的名稱即可。記得也需要將並且記得將 [Show DOS Box]與 [Capture Output]兩個選項打勾,才能由畫面看到您的執行結果。

若要測試這樣的程式是否成功,可以利用UltraEdit開啟該CPP檔案,按下(CTL+Shift+0)『假設你設定COMPILER是第一個),就會出現一個編譯畫面,並且會出現一個新的編輯文字方塊,裡面出現相關的錯誤訊息或是正確訊息。要執行的話按下(CTL+Shift+1),就會看到其相關的執行結果在另外一個編輯文字的檔案之中。