2017-07-01 61 views
3

這些功能是有用的:德爾福和FPC有MakeWord函數(兩個字節或字符)?

function MakeWord(low, high: char): word; 
begin 
    result := byte(high) shl 8 + byte(low); 
end; 

function MakeWord(low, high: byte): word; 
begin 
    result := high shl 8 + low; 
end; 

但是我想知道如果這些種功能(可以不同方式實現)的地方已經存在(不是在Windows API的特定文件,而是一個跨平臺的RTL功能)。

示例用例:取兩個字符GT並將WORD結果寫出來。

MakeWord('G','T'); 

我覺得這不是插入SHL/SHR和/或十六進制的操作和在不說明什麼代碼做代碼的其他黑客更具可讀性...所以肯定存在這些功能已經某處?或者人們在自己的應用中推出自己的產品?

或者類似的東西:

var x: word; 
begin 
    lo(x) := byte('G'); 
    hi(x) := byte('T'); 
end; 

不過,這並不像左側工作不能被分配到:但它是更具可讀性,比其他一些解決方案,IMO。

我想我已經看到LoWord和HiWord的功能(或LoByte,HiByte),但通常在只讀的情況下。怎麼寫給你和洛?

+3

您是否知道'Char'的大小? – MBo

+0

@MBo:我想這個轉換爲'Byte()'解決了這個問題。 –

+0

@Rudy Velthuis這個角色隱藏了潛在的問題(信息丟失),但沒有完全解決它 – MBo

回答

8

Delphi和FreePascal的兩者都具有在SysUtils單元WordRec記錄:

的Delphi:http://docwiki.embarcadero.com/Libraries/en/System.SysUtils.WordRec

FreePascal的:https://www.freepascal.org/docs-html/rtl/sysutils/wordrec.html

例如:

uses 
..., SysUtils; 

var 
    x: Word; 
begin 
    WordRec(x).Lo := Byte(Ord('G')); 
    WordRec(x).Hi := Byte(Ord('T')); 
end; 
+0

感謝您的回答:只是一個說明:你需要投它兩次,使用ord和字節,或者只是使用byte()強制轉換,並完全跳過ord? –

+0

@OverflowingHuman取決於編譯器。由於字符在Delphi 2009+中是2字節'WideChar',所以通常需要'Ord'將它們作爲序數值使用。額外的「字節」轉換對於分配的內容更加明確。使代碼更加自我記錄並避免任何含糊之處。 –

0

是,FreePascal的已makeword在windows單元中(makeword最初是winapi宏IIRC)

此外,它還內聯優化了類似這樣的小功能的通話開銷。

+0

德爾福具有相同的。 –

+1

是的,但它是一個** Windows **宏,在** Windows **單元中。這個問題特別要求**跨平臺**解決方案。 –

+1

我錯過了。如果您計算生物傳感器目標,則跨平臺性具有很高的應用特定性。 –