全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:2425
推到 Plurk!
推到 Facebook!

Delphi的類型轉換

 
jackkcg
站務副站長


發表:891
回覆:1050
積分:848
註冊:2002-03-23

發送簡訊給我
#1 引用回覆 回覆 發表時間:2002-10-26 03:44:19 IP:210.65.xxx.xxx 未訂閱
此為轉貼資料 Delphi的類型轉換 Delphi是一種強類型轉換的語言。在VC中,賦值符用〃=〃,例如x=1;到了Delphi賦值符就變成了〃:=〃,例如x:=1。 從賦值時用符號〃:=〃而不用〃=〃,就隱約可見Delphi對類型匹配要求之嚴,即賦值符右邊的類型一定要和左邊一致。用慣了VB或VC的程式師,初用Delphi,稍不留神,就會出現類型不匹配的錯誤。對初學者而言,類型轉換也是學習Delphi的重點和難點,?此本文特對Delphi的類型轉換做一總結,以供讀者參考。 一、數的類型轉換 把運算式的類型從一種類型轉化?另一種類型,結果值是把原始值截斷或擴展,符號位元保持不變。例如: 數的類型轉換 舉例 字元轉換?整數 Integer('A') 整數轉換?字元 Char(48) 整數轉換?1個位元組的邏輯型 Boolean(0) 整數轉換?2個位元組的邏輯型 WordBool(0) 整數轉換?4個位元組的邏輯型 LongBool(0) 整數轉換?10進制pascal型字串 caption:=intToStr(15) 整數轉換?16進制pascal型4位元字串 caption:=intToHex(15,4) 地址轉換?長整型數 Longint(@Buffer) 二、數的"分開"與"合成" 取32位longint型數的 高16位數? hiword(longint-var) 低16位數? loword(longint-var) 取16位數的 高8位數? hibyte(integer_var) 低8位數? lobyte(integer_var) 取32位地址的段選擇符和偏移量 段選擇符(高16位地址)? selectorof(p) 偏移量(低16位地址)? offsetof(p) 段選擇符和偏移量合成?指標 Ptr(SEG, OFS: Word)相當於C語言的巨集MK-FP(SEG,OFS) 例如在Windows中,Task DataBase結構0FAh偏移處包含'TD'標識,我們可以容易地編寫如下代碼觀察到這個位於Windows內部的未公開的秘密: {函數ptr(seg,ofs)的用法,相當於C語言的MK-FP(seg,ofs)} var p:pbyte;ch:char; p:=ptr(getcurrentTask,$FA); ch:=char(p^); {結果?ch='T'} p:=ptr(getcurrentTask,$FA 1); ch:=char(p^); {結果?ch='D'} 三、字串string 字元陣列與指向字 符串的指標pchar的區別與聯繫 這3者的基本概念相同,但有一些非常細微的差別,在編程時稍不注意就會出錯,需高度重視。 1、使用指向字串的指標,如果不是以0結尾,運行時就會出現錯誤。?了避免這種錯誤,需要在字串結尾人工加入0 即char(0),或用strpcopy函數在字串結尾自動加0。 例1: 指向字串的指標,如果不是以0結尾,運行時會出現錯誤: {s[0]=3 s[1]='n' s[2]='e' s[3]='w'} var s:string; p:pchar; begin s:='new'; label1.caption:=s; {new} label2.caption:=intTostr(integer(s[0]));{3是字串的長度} p:=@s[1];{不是以0結尾,莫用pchar型指標} label3.caption:=strpas(p); {運行時出現錯誤} end; 例2:在字串結尾人工加入0即char(0),可使用指向字串的指標。 {s[0]=4 s[1]='n' s[2]='e' s[3]='w' s[4]=0;} {p-->'new'} var s:string; p:pchar; begin p:=@s[1]; s:='new' char(0); {以0結尾,可用pchar型指標} label1.caption:=strpas(p); {new} label2.caption:=s; {new} label3.caption:=intTostr(integer(s[0])); {4是字串長度} end; 例3: 用strpcopy函數賦值會在字串s結尾自動加0。 {s[0]=4 s[1]='n' s[2]='e' s[3]='w' s[4]=0;} {p-->'new'} var s:string; p:pchar; begin p:=@s[1]; strpcopy(p,'new');{strpcopy函數在字串結尾自動加0} label1.caption:=strpas(p);{new} label2.caption:=s;{new} label3.caption:=intTostr(integer(s[0]));{4} end; 2、下標?0的字串識別字存放的是字串長度,字元型陣列基本相當於字串,但不能存放字串長度。字串可以用s:='a string'的形式賦值,但是字元型陣列a[ ]不可直接用a:='array'的形式賦值,用此種形式會出現類型不匹配錯誤,可選用strpcopy函數賦值。 例4: 字元型陣列s[ ]相當於字串,但沒有存放字串長度的位置。 {s[1]='n' s[2]='e' s[3]='w' s[4]=0;} {p-->'new'} var s:array[1..10] of char; p:pchar; begin {s:='new' char(0); error}{錯誤} p:=@s[1]; {p:=@s; is not correct} strpcopy(p,'new'); label1.caption:=strpas(p);{new} label2.caption:=s;{new} {label3.caption:=intTostr(integer(s[0]));}{不會出現4, 下標超出錯誤} end; 例5:下標從0開始的字元陣列s,s相當於@s[0]。 { s[0]='n' s[1]='e' s[2]='w' s[3]=0;}{p-->'new'} var s:array[1..10] of char; p:pchar; begin {s:='new' char(0); error}{錯誤} p:=s; {p:=@s[0] is also correct} strpcopy(p,'new'); label1.caption:=strpas(p);{new} label2.caption:=s;{new} label3.caption:=s[0];{n} end; 3、下標從0開始和從1開始的字元陣列位址的表示方法也有細微不同: 例6:下標從1開始的陣列a 與下標從0開始的陣列b 的比較。 var a:array[1..10]of char; b:array[0..10]of char; {a:='1..10';}{type mismatch} {b:='0..10';}{type mismatch} begin strpcopy( b, 'from 0 to 10'); {正確 因?b即是@b[0] } strpcopy(@b[0], 'from 0 to 10'); {正確 與上個運算式結果相同} strpcopy(@a[1], 'from 1 to 10'); {正確 } strpcopy( a, 'from 1 to 10'); {類型匹配錯誤 因?a即是@a[0]} end;
------
**********************************************************
哈哈&兵燹
最會的2大絕招 這個不會與那個也不會 哈哈哈 粉好

Delphi K.Top的K.Top分兩個字解釋Top代表尖端的意思,希望本討論區能提供Delphi的尖端新知
K.表Knowlege 知識,就是本站的標語:Open our mind
系統時間:2024-05-09 6:23:50
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!