精華區beta mud_sanc 關於我們 聯絡資訊
基礎 LPC 作者: Descartes of Borg 第一版: 23 april 1993 第二版: 17 june 1993 第三章: LPC 的資料型態 (data type) 3.1 你現在該知道的事 LPC 物件由零個或多個變數組合而成, 而這些變數由一個或多個函式組合而成. 在程式碼中, 這些函式的先後順序是無關緊要的. 當你寫的 LPC 第一次被參考 時, driver 把它複製一份到記憶體中. 之後, 還可藉此複製出更多相同的拷貝. 任何一份物件被載入記憶體時, 所有的變數一開始都指向「虛無值」. 精簡模式 mud 的 reset() 函式與原始模式的 create() 函式都都用於指定物件的初始變 數值. 物件載入記憶體之後, 會立刻呼叫創造的函式. 不過, 如果你讀這份課本 之前沒有寫過程式, 你大概不知道什麼是函式 (function) , 或函式是怎麼被呼 叫的. 就算你以前寫過程式, 你大概也想知道新創造的物件中, 函式之間互相呼 叫對方的過程是什麼. 回答以上這些問題以前, 你得多了解函式在處理什麼. 所 以你應該先徹底了解 LPC 資料型態背後的觀念. 說實在的, 在這份手冊裡頭最 無聊的主題, 也是最重要的主題, 90% 以上就是用錯 LPC 資料型態 (放錯 {} 和 () 不算在內). 所以說, 你得要耐心看完非常重要的這一章, 因為我覺得你 如果搞懂這一章, 可以讓你以後寫程式大大輕鬆不少. 3.2 與電腦溝通 你應該已經知道電腦不懂人類所使用的單字與數字. 電腦所說的「語言」由 0 與 1 的「字母」所組合而成. 當然, 你知道電腦不懂人類的自然語言. 但是實 際上, 它們也不懂我們寫給它們的電腦語言. 像是 BASIC、C、C++、Pascal 等等 , 這些電腦語言全都是過渡語言. 這些電腦語言讓你能把想法組織起來, 讓思考 更易轉換成電腦的 0 與 1 語言. 轉換有兩個方法: 編譯 (compilation) 和直譯 (interpretation) . 這兩個方 法的差別在於程式語言轉換成真正電腦語言的時候. 對編譯的程式語言來說, 程 式設計者撰寫程式碼之後, 使用編譯程式 (compiler) 把程式碼轉換成電腦真正 的語言. 程式在執行之前就已經轉換完畢. 而直譯的程式語言, 在程式執行的時 候才開始轉換. 因此直譯的程式語言所寫的程式執行起來要比編譯的慢上許多. 總而言之, 不管你用什麼程式語言撰寫程式, 最後都要轉變成 0 與 1 才能讓 電腦搞懂. 但是你儲存在記憶體中的變數並不是單純的 0 與 1. 所以你用的程 式語言要有個方法告訴電腦, 這些 0 和 1 到底要當作十進位數字、字元 (characters) 、字串 (string) 、還是當作其他的東西看待. 你可以靠著指定 資料型態來辦到. 舉例來說, 假設你有個變數叫做 x , 而你給它一個十進位的值 ── 65. 在 LPC 裡面, 你會寫出下面的敘述: ----- x = 65; ----- 你等一下再做像這樣的事: _____ write(x+"\n"); /* \n 符號代表在此換行 (carriage return) */ y = x + 5; ----- 第一行讓你送出 65 和換行到某個人的螢幕上. 第二行讓你把 y 設定為 70. 問題是你告訴電腦 x = 65; 時, 它不知道 65 到底是啥意思. 你認為是 65, 對電腦來說也許認為是: 00000000000000000000000001000001 而且, 對電腦來說, A 這個字母就是: 00000000000000000000000001000001 所以, 不管你什麼時候告訴電腦 write(x+"\n");, 電腦總要有個方法知道你想 看到 65 而不是 A. 電腦能透過資料型態了解 65 與 A 的不同. 資料型態只是說記憶體位置中儲存 的指定變數到底是屬於什麼型態的資料. 所以說, 每一個 LPC 變數都有變數型 態指導如何轉換資料. 在上面的範例裡, 你應該會在程式碼「之前」加上以下這 行: ----- int x; ----- 這一行告訴 driver 無論 x 指向何處, 都當作「int」 資料型態來使用. int 是整數 (interger, 或稱 whole number) 的縮寫. 現在我們已經初步介紹為什 麼要有資料型態. 這樣一來, driver 才能搞清楚電腦儲存在記憶體中的 0 與 1 到底是代表什麼意義. 3.3 LPC 的資料型態 所有的 LPMud driver 都有以下的資料型態: void (無), status (狀況), int (整數), string (字串), object (物件), int * (整數指標), string * (字串指標), object * (物件指標), mixed * (混合指標) 很多種 driver (不是全部) 有下列資料型態值得討論: float (浮點數), mapping (映射), float * (浮點數指標), mapping * (映射指標) 少數 driver 有下列罕用的資料型態, 並不值得討論: function (函式), enum, struct (結構), char (字元) (譯註: 目前台灣絕大多數的 LPMud 所使用的 driver 是 MudOS, 其資料型態 有些許不同之處. 請詳見參考譯者所翻譯之 MudOS 參考文件) 3.4 簡單的資料型態 這份簡介性質的課本會介紹 void, status, int, float, string, object, mixed 這幾種資料型態. 你可以在中階課本 (intermediate book, 譯註: 本作 者另外有寫一份中階 LPC 手冊, 譯者亦有翻譯) 找到像是 mapping (映射) 或 array (陣列) 這種更複雜的資料型態. 本章先介紹兩種最簡單的資料型態 (以 LPC 程式設計者的觀點來看) ── 整數 (int) 和字串 (string). int 表示任何整數. 所以 1, 42, -17, 0, -10000023 都是整數 (int) 型態. string 是一個以上的字元或數字. 所以 "a", "we are borg", "42", "This is a string" 都是字串. 請注意, 字串前後都要加上雙引號 "" , driver 才能分辨 int 42 和 string "42". 也才能區別變數名稱 (像是 x ) 與字串 (像是 "x" ). 當你在程式碼中使用變數, 你一開始要讓 driver 知道這個變數所指的是哪種變 數型態. 這種處理方式叫做「宣告」 (declaration). 你得在函式一開始的地方 宣告, 或是在物件程式碼的開頭之處 (在函式之外, 任何函式用到該變數之前). 要宣告變數型態的話, 只要像底下一樣, 把變數型態擺在變數的名字前便即可. ----- void add_two_and_two() { int x; int y; x = 2; y = x + x; } ----- 像這樣, 這是一個完整的函式. 函式的名稱是 add_two_and_two(). 函式一開始 宣告一個整數變數 x, 之後宣告一個整數變數 y. 所以, 在這裡 driver 有兩個 變數指向 NULL (虛無) 值, 而這兩個變數期待的變數值是整數型態. 關於虛無 (void) 和狀態 (status) 資料型態: 無 (void) 是一種很普遍的資料型態, 它不指向任何東西. 它並不是用在變數上面的 型態, 而是用於函式. 你稍後會了解這裡所說的事. 而現在, 你只需要知道 void 不指向任何值. 狀況 (status) 資料型態是布林 (boolean) 資料型態. 就是說, 它的值是 0 或 1. 這種值常常稱為真 (true) 或偽 (false). 3.5 本章總結 對變數來說, driver 需要知道電腦儲存在記憶體中的 0 與 1 要如何轉換成 你想使用的形式. 最簡單的 LPC 資料型態是 void, status, int, string. 變 數不使用 void 的資料型態, 但是這種資料型態用於函式. 另外, 資料型態用於 轉換格式, 決定 driver 應該使用哪種規則處理運算, 像是 +, - ......以此類 推. 舉例說, 運算式 (expression) 5+5, driver 知道 5 加上 5 的值是 10. 對字串來說, 對字串使用整數加法沒有意義. 所以, "a"+"b" 把 "b" 加在 "a" 的後面, 最後得出 "ab". 當你試著把 "5"+5 就會產生錯誤. 因為把整數加上字 串是無意義的, 所以 driver 會把第二個 5 轉換成 "5" 再加起來. 最後的結 果是 "55". 如果你想看的結果是 10 , 你最後只得到錯誤的程式碼. 請記住, 大多數的情況下, driver 不會像前面這樣產生 "55" 這種有用的結果. 它會產 生 "55" 是因為它早有一條規則處理整數加上字串的情況, 也就是把整數當成字 串看待. 在大多數的狀況中, 如果你在運算式或函式中使用資料型態並沒有事先 定義 (像是你試著把 "this is" 除以 "nonsense", "this is" / "nonsense") , driver 會嘔吐並回報錯誤給你. 翻譯: Spock of Final Frontier 98.Jan.22.