Saturday, July 23, 2011

PTT - C語言新手十誡

在PTT的C_and_CPP板中


-------------

C 語言新手十誡(The Ten Commandments for Newbie C Programmers)
by Khoguan Phuann


1. 不可以使用尚未給予適當初值的變數
2. 不能存取超過陣列既定範圍的空間
3. 不可以提取不知指向何方的指標
4. 不要試圖用 char* 去更改一個"字串常數"
5. 不能在函式中回傳一個指向區域性自動變數的指標
6. 不可以只做 malloc(), 而不做相應的 free()
7. 在數值運算、賦值或比較中不可以隨意混用不同型別的數值
8. 在一個運算式中,不能對一個基本型態的變數修改其值超過一次以上
9. 在 Macro 定義中, 務必為它的參數個別加上括號
A. 不可以在 stack 設置過大的變數
B. 使用浮點數要注意精確度所造成的誤差問題
C. 不要猜想二維陣列可以用 pointer to pointer 來傳遞
D. 函式內 new 出來的空間記得要讓主程式的指標接住



.

編譯器與連結器的基本概念

編譯器與連結器的基本概念

C/C++ 語言的特性
作業系統如何執行一個程式
編譯器的工作

"一個程式所呼叫的函式可能在另一個原始碼檔案(.c 或 .cpp)當中,也可能在另一個機械碼檔案(.obj)中,也可能在程式庫檔案中(.lib)中,無論如何,當編譯器在編譯 HelloWorld.cpp 的時候它並不知道 printf( ) 的程式碼在哪裡,亦不知道程式的流程該跳往何位址,所以在編譯出的 .obj 檔案中這個「空格」會被保留下來,而由連結器(linker)收集了所有的機械碼檔案(.obj與.lib)以後,才將它們填上,其實程式庫檔案(.lib)只不過是一些機械碼檔案(.obj)的集合體。

承續上面的例子,如下圖所示,連結器所產出的可執行檔(executable file)裡面,它把 HelloWorld.obj 和 printf( ) 的機械碼都合併 HelloWorld.exe 當中了,所以在 HelloWorld.obj 當中呼叫 printf( )函式所造成的程式流程跳躍(jump),就變成了是同一個 .exe 檔案內(作業系統載入後是同一塊記憶體內)的位址跳躍了,所以連結器可以明確地寫上位址數值,總結地來說連結器所做的事情就是收集像這樣互相參考的機械碼、合併為執行檔、並且填寫這些機械碼之間的參考位址,這就是為甚麼通常由原始碼產生的可執行檔都會比原始檔案大很多,因為合併了許多來其他檔案的機械碼。

作業系統載入一個可執行檔的時候,它只會配置該程式的專屬記憶體,並且把可執行檔載入到記憶體當中,並從其中某個位置開始執行程式,所有該程式需要的一切,都必須已經在 .exe 檔案裡面,所以由原始碼產生執行檔的過程中,除了要編譯(compile)還需要經過連結(link)才能得到這樣的可執行檔。"


.

"Foo"的由來

教程式語言的書中常常用"foo"這個字作含式名字

那這個字是怎麼來的呢?

我好奇上網查了一下

發現其實有很久的淵源


資料來源

-------------------

"Foo" 的辭源

語法範例句中使用變數的第一個標準 (bar 、 baz 、 qux 、 quux 、 corge 、 grault 、 garply 、 waldo 、 fred 、 plugh 、 xyzzy 、 thud) [JARGON]
當使用 bar 有關的字眼,它追溯到二次大戰年代軍隊中的粗話縮寫 FUBAR ( 操到爛再來大修 , `***ed Up Beyond All Repair') ,後來演變成 foobar 。早期由 Jargon 的文件 [JARGON] 解釋這個變化是戰後精簡的粗話,但現在看來比較像是因 FUBAR 衍生的字 `foo' 或許 受德文 `furchtbar'( 可怖的 ) 影響, `foobar' 可能實際上就是這個原意。

至於單字 `foo' 本身從戰前在漫畫及卡通上開始出現,至少看起來是這樣。在西元 1938 年時, Robert Clampett 在華納卡通導演的 " 達菲鴨 " (The Daffy Doc) ,達菲鴨做個手勢說 "SILENCE IS FOO!" 是極早版本, `FOO' 以及 `BAR' 亦出現在 Walt Kelly 的連環漫畫 "Pogo" 中。最早的文獻該算是 Bill Holman 的有關打火弟兄的超現實連環漫畫 "Smokey Stover" 。大約從西元 1930 至 1952 年止,這本漫畫有各式的美式喜感,包括 "Everybody's" 。 "FOO" 這個字眼常出現在汽車車牌上;或是背景畫面中無義意的話,如 "He who foos last foos best" 或 "Many smoke but foo men chew" ;或者 Smokey 說 "Where there's foo, there's fire" 。連環漫畫的作者 Bill Holman 一直充滿了古怪的笑話和個人的奇謀,包括了其它的胡言亂語,諸如 "Notary Sojac" 及 "1506 nix nix" 。根據華納卡通指南 (Warner Brothers Cartoon Companion, WBCC) 所述, Holman 自稱 "foo" 這個字是由某個中國的小雕像底部來的。這似乎言之有理,中國的雕像通常都會加上趨吉避凶的刻文。這可能是中國字的 ' 福 ' (fu) ,有時將它譯成同音的 `foo' ,它是幸福的意思,口頭說時會搭配合適的語調。 ( 獅子狗守護在許 多中國餐 館的門口二側,正式的名稱為 ` 福狗 ') [PERS] 。英語的說法接納了 Holman 的 `foo' 這個胡說八道的字,肯定受了猶太的 `feh' 及英文的 `fooey' 及 `fool' 影響。 [JARGON, FOLDOC]

Holman 連環漫畫中將很有特色的消防車,稱之為 Foomobile ,它是二輪的車種。他的漫畫在 1930 年代極其流行,造成了印弟安那州已量產可用的 Holman 式 Foomobile 的傳說。根據美國漫畫百科全書 (Encyclopedia of American Comics, EAC) 的講法, `Foo' 曾在美國掀起一陣狂熱,發現經由流行歌曲,產生了超過五百個 `Foo 俱樂部 ' 。通俗文化使內含 `foo' 蔚為風潮 ( 包括了華納在 1938-39 年的卡通 ) ,但起源反而迅速遭到遺忘。 [JARGON]


......

-------------

ps.
網友uranusjr補充說
"Fucked up Beyond All Repair 其實是「爛到修不好」的意思,是在設
備根本不能用的時候狗幹用的..."




.

程式風格 - 命名規則與註解規則

程式風格 - 命名規則與註解規則

很棒的文章 整理出來命名規則
命名規則是寫程式很重要的東西

除此之外 在這個人的網頁中 還有UML基本概念和大型專案的觀念值得學習
這些是在其他地方不容易看到 需要特別找的
而這些在這裡被寫得很清楚 簡單 很讚



.

Thursday, July 21, 2011

vgod's [追求神乎其技的程式設計之道] 系列

這是一個才大我三歲的資工學生寫的
他現在在MIT讀書 非常厲害
這系列文章是寫他學程式的過程 以及寫程式的心得
很熱血!很好看!


他學程式是從寫MUD的外掛開始的
使他成為MUD裡的神手大大
此後 好奇心和學習興趣驅使他不斷的自己鑽研
從奧林匹亞資訊競賽中得到 國際科展獲取當台灣代表
進台大 進MIT
這樣的熱情 興趣讓他在"玩"的過程中完成了相當了不起的事
這樣的經驗 學習過程很振奮人心 值得參考


而他紮實的基礎和訓練而來的觀念
也可以做為程式學習者的觀念參考


我實在太愛這系列文章了
將這系列文章整理好連結列出來

追求神乎其技的程式設計之道(一)
追求神乎其技的程式設計之道(二)
追求神乎其技的程式設計之道(三)
追求神乎其技的程式設計之道(四)
追求神乎其技的程式設計之道(五)
追求神乎其技的程式設計之道(六)
追求神乎其技的程式設計之道(七)
追求神乎其技的程式設計之道(八)
追求神乎其技的程式設計之道(九)
追求神乎其技的程式設計之道(十)
追求神乎其技的程式設計之道(十一)- 抽象化與命名
追求神乎其技的程式設計之道(番外篇)



.

Monday, July 18, 2011

追求神乎其技的程式設計之道(一)

追求神乎其技的程式設計之道(一)

"最近有讀者問到我學寫程式的方法和經驗,讓我一下掉入時光隧道回想起當初用VB寫出自己第一個遊戲時的成就感,但當初沒料到的是我真的就此迷上了電腦和寫程式的快感,不知不覺也過了10年的光陰…。在這篇文章中,我想寫出我對程式設計的看法和我一路學習上來的歷程和經驗。寫程式是一條無止境的道路,不只是科學和工程,更是一種藝術。而我還在追求「神乎其技」的半路上,雖然還有很多要學的,但我也希望能讓初學者更容易看清楚這條路是什麼樣子,避免陷入盲目追求新技術的死巷中。"

他的經歷很熱血 很好看!