Delphi的分類轉(zhuǎn)換
發(fā)表時(shí)間:2024-02-19 來(lái)源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]Delphi是一種強(qiáng)類型轉(zhuǎn)換的語(yǔ)言。在VC中,賦值符用″=″,例如x=1;到了Delphi賦值符就變成了″:=″,例如x:=1。 從賦值時(shí)用符號(hào)″:=″而不用″=″,就隱約可見(jiàn)Delphi對(duì)類型匹配要求之嚴(yán),即賦值符右邊的類型一定要和左邊一致。用慣了VB或VC的程序員,初用Delphi,稍不留神,...
Delphi是一種強(qiáng)類型轉(zhuǎn)換的語(yǔ)言。在VC中,賦值符用″=″,例如x=1;到了Delphi賦值符就變成了″:=″,例如x:=1。 從賦值時(shí)用符號(hào)″:=″而不用″=″,就隱約可見(jiàn)Delphi對(duì)類型匹配要求之嚴(yán),即賦值符右邊的類型一定要和左邊一致。用慣了VB或VC的程序員,初用Delphi,稍不留神,就會(huì)出現(xiàn)類型不匹配的錯(cuò)誤。對(duì)初學(xué)者而言,類型轉(zhuǎn)換也是學(xué)習(xí)Delphi的重點(diǎn)和難點(diǎn),為此本文特對(duì)Delphi的類型轉(zhuǎn)換做一總結(jié),以供讀者參考。
一、數(shù)的類型轉(zhuǎn)換
把表達(dá)式的類型從一種類型轉(zhuǎn)化為另一種類型,結(jié)果值是把原始值截?cái)嗷驍U(kuò)展,符號(hào)位保持不變。例如:
數(shù)的類型轉(zhuǎn)換
舉例
字符轉(zhuǎn)換為整數(shù)
Integer('A')
整數(shù)轉(zhuǎn)換為字符
Char(48)
整數(shù)轉(zhuǎn)換為1個(gè)字節(jié)的邏輯型
Boolean(0)
整數(shù)轉(zhuǎn)換為2個(gè)字節(jié)的邏輯型
WordBool(0)
整數(shù)轉(zhuǎn)換為4個(gè)字節(jié)的邏輯型
LongBool(0)
整數(shù)轉(zhuǎn)換為10進(jìn)制pascal型字符串
caption:=intToStr(15)
整數(shù)轉(zhuǎn)換為16進(jìn)制pascal型4位字符串
caption:=intToHex(15,4)
地址轉(zhuǎn)換為長(zhǎng)整型數(shù)
Longint(@Buffer)
二、數(shù)的“分開(kāi)”與“合成”
取32位longint型數(shù)的高16位數(shù)為
hiword(longint-var)
低16位數(shù)為
loword(longint-var)
取16位數(shù)的 高8位數(shù)
hibyte(integer_var)
低8位數(shù)為
lobyte(integer_var)
取32位地址的段選擇符和偏移量 段選擇符(高16位地址)為
selectorof(p)
偏移量(低16位地址)為
offsetof(p)
段選擇符和偏移量合成為指針
Ptr(SEG, OFS: Word)相當(dāng)于C語(yǔ)言的宏MK-FP(SEG,OFS)
例如在Windows中,Task DataBase結(jié)構(gòu)0FAh偏移處包含'TD'標(biāo)識(shí),我們可以容易地編寫(xiě)如下代碼觀察到這個(gè)位于Windows內(nèi)部的未公開(kāi)的秘密:
{函數(shù)ptr(seg,ofs)的用法,相當(dāng)于C語(yǔ)言的MK-FP(seg,ofs)}
var p:pbyte;ch:char;
p:=ptr(getcurrentTask,$FA);
ch:=char(p^); {結(jié)果為ch='T'}
p:=ptr(getcurrentTask,$FA+1);
ch:=char(p^); {結(jié)果為ch='D'}
三、字符串string 字符數(shù)組與指向字
符串的指針pchar的區(qū)別與聯(lián)系
這3者的基本概念相同,但有一些非常細(xì)微的差別,在編程時(shí)稍不注意就會(huì)出錯(cuò),需高度重視。
1、使用指向字符串的指針,如果不是以0結(jié)尾,運(yùn)行時(shí)就會(huì)出現(xiàn)錯(cuò)誤。為了避免這種錯(cuò)誤,需要在字符串結(jié)尾人工加入0 即char(0),或用strpcopy函數(shù)在字符串結(jié)尾自動(dòng)加0。
例1: 指向字符串的指針,如果不是以0結(jié)尾,運(yùn)行時(shí)會(huì)出現(xiàn)錯(cuò)誤:
{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是字符串的長(zhǎng)度}
p:=@s[1];{不是以0結(jié)尾,莫用pchar型指針}
label3.caption:=strpas(p); {運(yùn)行時(shí)出現(xiàn)錯(cuò)誤}
end;
例2:在字符串結(jié)尾人工加入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結(jié)尾,可用pchar型指針}
label1.caption:=strpas(p); {new}
label2.caption:=s; {new}
label3.caption:=intTostr(integer(s[0])); {4是字符串長(zhǎng)度 end;
例3: 用strpcopy函數(shù)賦值會(huì)在字符串s結(jié)尾自動(dòng)加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函數(shù)在字符串結(jié)尾自動(dòng)加0}
label1.caption:=strpas(p);{new}
label2.caption:=s;{new}
label3.caption:=intTostr(integer(s[0]));{4}
end;
2、下標(biāo)為0的字符串標(biāo)識(shí)符存放的是字符串長(zhǎng)度,字符型數(shù)組基本相當(dāng)于字符串,但不能存放字符串長(zhǎng)度。字符串可以用s:='a string'的形式賦值,但是字符型數(shù)組a[ ]不可直接用a:='array'的形式賦值,用此種形式會(huì)出現(xiàn)類型不匹配錯(cuò)誤,可選用strpcopy函數(shù)賦值。
例4: 字符型數(shù)組s[ ]相當(dāng)于字符串,但沒(méi)有存放字符串長(zhǎng)度的位置。
{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}{錯(cuò)誤}
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]));}{不會(huì)出現(xiàn)4, 下
超出錯(cuò)誤}
end;
例5:下標(biāo)從0開(kāi)始的字符數(shù)組s,s相當(dāng)于@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}{錯(cuò)誤}
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、下標(biāo)從0開(kāi)始和從1開(kāi)始的字符數(shù)組地址的表示方法也有細(xì)微不同:
例6:下標(biāo)從1開(kāi)始的數(shù)組a 與下標(biāo)從0開(kāi)始的數(shù)組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'); {正確 因?yàn)閎即是@b[0] }
strpcopy(@b[0], 'from 0 to 10'); {正確 與上個(gè)表達(dá)式
果相同}
strpcopy(@a[1], 'from 1 to 10'); {正確 }
strpcopy( a, 'from 1 to 10'); {類型匹配錯(cuò)誤 因?yàn)閍即是a[0]}
end;