如何将这部分 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;
...
我试图将 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;
...