2017-07-01 55 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

我错过了。如果您计算生物传感器目标,则跨平台性具有很高的应用特定性。 –