【问题标题】:What is the Delphi equivalent to C++'s memset?Delphi 等价于 C++ 的 memset 是什么?
【发布时间】:2014-11-11 16:05:30
【问题描述】:

sz 是一个 char 数组,缓冲区中的 memset 指向的是什么?如何将以下 C++ 代码转换为 Delphi?

int data = _ttoi(m_Strtag.GetBuffer(0));
unsigned char sz[4];
memset(sz,0, 4);
sz[0] = (unsigned char)((data >> 24) & 0xFF);
sz[1] = (unsigned char)((data >> 16) & 0xFF);
sz[2] = (unsigned char)((data >> 8) & 0xFF);
sz[3] = (unsigned char)(data & 0xFF);

这是 delphi 调用: 如果 SAAT_YTagSelect(hp, isenable, 1, sz, 4) 那么 ...

对于下面的delphi函数:

function SAAT_YTagSelect(pHandle: Pointer; nOpEnable1, nMatchType: Byte; MatchData: PByte; nLenth: Byte): Boolean; stdcall; 

【问题讨论】:

  • FillChar 是等价的。您真的希望我们为您翻译其余代码吗?你了解按位运算吗?
  • sz 中的所有字节都是之后设置的,不需要将它们预设为零。并且可以删除与 $FF 的 ANDing。
  • @LU 是的,可以删除 memset。 & 0xff 确保我们避免范围错误。
  • 还有FillMemory(),它更接近memset()实际所做的——用指定的值填充内存。但它也委托给FillChar()(它实际上是对字节而不是字符进行操作,因此在 D2009 以后它确实被误命名了)。

标签: c++ delphi


【解决方案1】:

memset 的等价物是FillChar,并用一个字节值填充一个字节范围。

由于数组sz中的所有字节都是在data的字节顺序颠倒时设置的,所以可以去掉这一行。

字节反转可以稍微简化一下(用类型限制替换and $FF):

data := StrToInt(aString);
sz[0] := Byte(data shr 24);
sz[1] := Byte(data shr 16);
sz[2] := Byte(data shr 8);
sz[3] := Byte(data);

通过用Byte() 括起来赋值,编译器被告知跳过范围检查。 比较生成的汇编代码(启用范围检查)表明这也会产生更高效的代码:

Project1.dpr.36: sz[0] := Byte(data shr 24);   
0041C485 A1BC3E4200       mov eax,[$00423ebc]
0041C48A C1E818           shr eax,$18
0041C48D A2C03E4200       mov [$00423ec0],al


Project1.dpr.40: sz[0] := (data shr 24) and $FF;  
0041C485 A1BC3E4200       mov eax,[$00423ebc]
0041C48A C1E818           shr eax,$18
0041C48D 25FF000000       and eax,$000000ff
0041C492 3DFF000000       cmp eax,$000000ff
0041C497 7605             jbe $0041c49e
0041C499 E8F290FEFF       call @BoundErr
0041C49E A2C03E4200       mov [$00423ec0],al

一种更直接的填充 sz 数组的方法,无需移位例程:

sz[0] := PByte(@data)[3];
sz[1] := PByte(@data)[2];
sz[2] := PByte(@data)[1];
sz[3] := PByte(@data)[0];

【讨论】:

  • 您确定这不会导致范围检查出错吗?
  • @DavidHeffernan,是的,我仔细检查了 :)
  • 可能值得一提的是有关有符号值的按位移位运算符的问题。问题中的代码至少可以说是可疑的。
  • @DavidHeffernan,您的意思是,在 C/C++ 中,>> 运算符的行为是在有符号值上实现定义的,并且必须进行检查。它可以是算术移位或逻辑移位。在此示例中,它没有相关性,因为最终结果将是相同的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-30
  • 1970-01-01
相关资源
最近更新 更多