如何将这部分 C++ 代码翻译成 Delphi

How to translate this portion of C++ code to Delphi

我试图将 RefPack compression implementation 移植到 Delphi,但我无法理解部分代码:

hashtbl = NEW int32[65536];
link    = NEW int32[131072];

hashptr = hashtbl;
for (i=0; i<65536L/16; ++i)
{
    *(hashptr+0)  = *(hashptr+1)  = *(hashptr+2)  = *(hashptr+3) =
    *(hashptr+4)  = *(hashptr+5)  = *(hashptr+6)  = *(hashptr+7) =
    *(hashptr+8)  = *(hashptr+9)  = *(hashptr+10) = *(hashptr+11) =
    *(hashptr+12) = hashptr[13] = hashptr[14] = hashptr[15] = -1L;
    hashptr += 16;
}

这是我的代码:

var
hashtbl: PUInt32;
hashptr: PUInt32;

GetMem(hashtbl, 65536);
GetMem(link, 131072);

hashptr := hashtbl;

for I := 0 to (65536 div 16) - 1 do
begin
    ?!?
    hashptr := hashptr + 16;
end;

问题一: "65536L"这个"L"是什么意思?

问题二: 我不知道循环中的代码是做什么的,也不知道如何将其转录为 Delphi...有人能启发我吗?

Ps:我正在使用 Delphi 社区版。

L后缀代表long-1L 是一个 long 常量(在您的示例中是二进制 32)。

第二部分将 hashtbl 数组的每个元素设置为 -1。它以 16 个元素为单位进行处理。

for I := 0 to 65535 do
begin 
  hashtbl[I] := -1;
end;

在 C++ 中,integer literals 可以包含一个后缀来指定文字的数据类型。在这种情况下,L 后缀用于 long。 Delphi 没有此类后缀,但您可以使用类型化常量代替。

在 C++ 中,赋值 = 运算符 returns 对被赋值的左侧变量的引用。该引用可用于后续表达式。所以,C++中的表达式*(hashptr+0) = *(hashptr+1) = ... = hashptr[14] = hashptr[15] = -1L;表示-1赋值给hashptr[15],然后hashptr[15]赋值给hashptr[14],以此类推,直到*(hashptr+1) ] 分配给 *(hashptr+0)。 Delphi 不支持,您必须将这样的表达式拆分为单独的语句。

在 C++ 中,表达式 *(hashptr+N)hashptr[N] 在这种情况下 相同 。它们都将 hashptr 指针递增 N 个元素,然后取消引用结果以访问所指向的元素。

因此,将所有内容放在一起,C++ 代码只是循环遍历 hashtbl 数组,将每个元素设置为 -1,每次循环迭代 16 个元素。 C++ 代码到 Delphi 的简单 文字 翻译看起来像这样:

{$POINTERMATH ON}

var
  hashtbl, link, hashptr: PInt32;
  i: Integer;

...

GetMem(hashtbl, SizeOf(Int32) * 65536);
GetMem(link, SizeOf(Int32) * 131072);

hashptr := hashtbl;

for i := 0 to (65536 div 16)-1 do
begin
  (hashptr+0)^ := -1;
  (hashptr+1)^ := -1;
  (hashptr+2)^ := -1;
  (hashptr+3)^ := -1;
  (hashptr+4)^ := -1;
  (hashptr+5)^ := -1;
  (hashptr+6)^ := -1;
  (hashptr+7)^ := -1;
  (hashptr+8)^ := -1;
  (hashptr+9)^ := -1;
  (hashptr+10)^ := -1;
  (hashptr+11)^ := -1;
  (hashptr+12)^ := -1;
  hashptr[13] := -1;
  hashptr[14] := -1;
  hashptr[15] := -1;
  Inc(hashptr, 16);
end;

...

FreeMem(link);
FreeMem(hashtbl);

其中可以大大简化:

var
  hashtbl, link: array of Int32;
  i, j: Integer;

...

SetLength(hashtbl, 65536);
SetLength(link, 131072);

for i := 0 to (65536 div 16)-1 do
begin
  for j := 0 to 15 do begin
    hashtbl[(i*16)+j] := -1;
  end;
end;

...

或者简单地说:

var
  hashtbl, link: array of Int32;
  i, j: Integer;

...

SetLength(hashtbl, 65536);
SetLength(link, 131072);

for i := 0 to 65535 do
begin
  hashtbl[i] := -1;
end;

...