線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:794
推到 Plurk!
推到 Facebook!

關於模組的使用工具跟方法

答題得分者是:Justmade
huangeider
高階會員


發表:288
回覆:492
積分:231
註冊:2003-02-26

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-03-21 17:37:25 IP:210.201.xxx.xxx 未訂閱
小弟想增加以下這些資料 請問要使用什麼工具或有書可看嗎(介紹一下書,我自已看) 才能知道這些碼的意義及使用它? gLunarMonth:array[0..74] of Byte=( $00, $50, $04, $00, $20, //1910 $60, $05, $00, $20, $70, //1920 $05, $00, $40, $02, $06, //1930 $00, $50, $03, $07, $00, //1940 $60, $04, $00, $20, $70, //1950 $05, $00, $30, $80, $06, //1960 $00, $40, $03, $07, $00, //1970 $50, $04, $08, $00, $60, //1980 $04, $0a, $00, $60, $05, //1990 $00, $30, $80, $05, $00, //2000 $40, $02, $07, $00, $50, //2010 $04, $09, $00, $60, $04, //2020 $00, $20, $60, $05, $00, //2030 $30, $b0, $06, $00, $50, //2040 $02, $07, $00, $50, $03); //2050 aric
Justmade
版主


發表:94
回覆:1934
積分:2030
註冊:2003-03-12

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-03-21 19:23:20 IP:218.16.xxx.xxx 未訂閱
其實 William 兄在 http://delphi.ktop.com.tw/topic.php?TOPIC_ID=27252 已將用法說明好了,但我再解釋一下罷。    1. gLunarMonth 是甚麼 gLunarMonth 其實就是一個變數,而這個變數的形態(字串,數字,等等)是一個 Array (陣列),即是一格格相同的空間。    那有多少格呢? [0..75] 即是說這陣列包括第0格到第75格,即 76格。    那每格裡又是甚麼? of Byte 即是說每格是一個 Byte (可存放數字 0 - 255)。    =($00,....); 又是甚麼呢? 就是直接將每一格的數值給存進這個陣列,那一個 $00 放進第 0 格,$50放進第 1 格,如此類推。    那些既是 0 - 255 的數字,為甚麼有 $ 符號,還有 b 耶? $代表該數字用十六進制來表示,十六進制是算到16才進1的,數字0-9跟十進制一樣,a-f 分別代表10到15。在十六進制裡,$0f 就代表 15 $10 就代表 16。計算一下 $ff 就剛好等於 255 啦,所以一個 Byte 在 16進制裡剛好有兩個位。    要甚樣才可取得某一格的數值? gLunarMonth[x] 即可,要取得第8格資料就用 gLunarMonth[8]。    //1910 是甚麼? 在 Delphi // 後就是給人看的備註,對電腦是沒意義的,至於為甚麼是1910,一會再說。    總結 : gLunarMonth 是一個裝著 75 個 Bype 的陣列,而其內容一開始就以十六進制的數值來設定好了。    2. 這 75 個 Byte 的意義 一般來說,一個 Byte 的意義就是它的數值,比如 $50 就是 80 的意思。但是在這裡有點不同,因為這個陣列的設計者將每個 Byte 以十六進制一分為二,每個位都代表一個獨立的數據,所以 $50 就變成代表 5 和 0 了。換句話說,這個陣列雖只有75格,但由於每格有兩個數據,即是共用150個數據了。    那每個數據又是甚麼呢? 根據設計者說,每個數據代表在某一年的閏月是幾月,而0即是沒閏月。由於是十六進制,所以當一格是5時就是五月,a時是十月,b時就是十一月了。    作者說明了第一個數據是1901年的,而每一行有十個數據(5個Byte),所以第一行的就代表了 1901年到1910年的閏月數了,現在應知道 //1910 是甚麼了罷。    $00, $50, $04, 即是說 1901 年 閏月是 沒有 1902 年 閏月是 沒有 1903 年 閏月是 五月 1904 年 閏月是 沒有 1905 年 閏月是 四月 1906 年 閏月是 沒有    3. 要如何用這個陣列呢?    這個陣列應放在那裡呢? 建議放在 implementation const // 因為數值不會變 gLunarMonth:array[0..74] of Byte=( $00, $50, $04, $00, $20, //1910 $60, $05, $00, $20, $70, //1920 $05, $00, $40, $02, $06, //1930 $00, $50, $03, $07, $00, //1940 $60, $04, $00, $20, $70, //1950 $05, $00, $30, $80, $06, //1960 $00, $40, $03, $07, $00, //1970 $50, $04, $08, $00, $60, //1980 $04, $0a, $00, $60, $05, //1990 $00, $30, $80, $05, $00, //2000 $40, $02, $07, $00, $50, //2010 $04, $09, $00, $60, $04, //2020 $00, $20, $60, $05, $00, //2030 $30, $b0, $06, $00, $50, //2040 $02, $07, $00, $50, $03); //2050 用甚麼程式來讀取資料呢? 該陣列出處已有一程式但較難懂,William 君寫的的程式比較好解說 :
Function GetLeapMonth(Year: integer): integer;
var
    index: integer;
begin
    index := (Year-1901) div 2; // 註1
    if (index>=Low(gLunarMonth)) and (index<=High(gLunarMonth)) then //註2 
    begin
        if (Year mod 2)=0 then // 註3
            Result := Lo(gLunarMonth[index]) //註4
        else
            Result := Hi(gLunarMonth[index]); //註5
        end
    else
        Result := 0;
end;
註1 : 先將要找的年份減去開始的年份,如若找 1901 年的話,就是 1901-1901 即是第0年,找 2003年即是 2003-1901 就是第 102 年。 那為甚麼要將結果 div 2 (除2後取整數) 呢,是因為每格是放2年的資料,所以要將第幾年除2才知道去相對格找,如2003年就是第102年就應去51格找。 註2 : 這裡是查一查輸入的年份是否在數據的範圍 Low(gLunarMonth) 就是gLunarMonth最先的格 (即0) High(gLunarMonth) 就是gLunarMonth最後的格 (即74) 即是說當 index < 0 (1900年或以前) 或 index > 74 (2051 年或以後),就會跳到 else 那裡傳回 0 (其實傳回 -1 更好,免得誤會沒閏月);否則的話就會到 gLunarMonth 去查數據。 註3 : Year Mod 2 就是將年份給2除之後取餘數, = 0 即是可除儘即是雙數年(進到註4),否則即是單數年(進到註5) 註4 : 剛才第1大點說過要取得某格的數值,用 gLunarMonth[x] 即可,但是取得的是一整格即兩年的數值,要甚樣取得某一年的數值呢? 由於年份是由1901年開始的,即是左邊(高位元)的是單數年而右邊(低位元)的是雙數年。 在這裡要取得雙數年的值,所以用 Lo 來取得低位元的值 註5 : 在這裡要取得單數年的值,所以用 Hi 來取得低位元的值 實例 : GetLeapMonth(2003); 1. index := 2003-1901 / 2 = 51 (即是資料在51格) 2. 51 格是在 0..74之內 3. 2003 mod 2 = 1 即是單數年 5. gLunarMonth[51] 是 $02 , 高位元是 0 所以結果就是0即是沒閏月 明白了沒有? [修改 - 紅色部份是補充的] 發表人 - Justmade 於 2003/03/21 19:32:29
huangeider
高階會員


發表:288
回覆:492
積分:231
註冊:2003-02-26

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-03-21 23:38:03 IP:210.201.xxx.xxx 未訂閱
引言: 謝謝前輩的教導 < face="Verdana, Arial, Helvetica"> aric
系統時間:2024-05-07 15:09:25
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!