我在C中有代码,我想将其转换为Delphi。我所做的是对还是错?
uint64_t s[ 16 ];
int p;
uint64_t next(void) {
uint64_t s0 = s[ p ];
uint64_t s1 = s[ p = ( p + 1 ) & 15 ];
s1 ^= s1 << 31; // a
s1 ^= s1 >> 11; // b
s0 ^= s0 >> 30; // c
return ( s[ p ] = s0 ^ s1 ) * 1181783497276652981LL;
德尔福代码:
Function next() : UInt64;
var
s : array of UInt64;
s0, s1 : UInt64;
p : integer;
begin
SetLength(s, 16);
s0 := s[p];
p := ( p + 1 ) and 15;
s1 := s[p];
s1 := s1 xor (s1 shl 31);
s1 := s1 xor (s1 shr 11);
s0 := s0 xor (s0 shr 30);
s[p] := (s0 xor s1) * 1181783497276652981;
result := s[p];
end;
答案 0 :(得分:0)
您的翻译在很多方面都是错误的。除此之外,您的Delphi代码无法编译,实际上也没有C代码。
该功能的结尾应该是:
s[p] := s0 xor s1;
Result := s[p] * 1181783497276652981;
在这里使用堆分配的数组是浪费的。请改用固定长度的数组。
我可以看到的另一个问题是s
和p
在C代码中的范围比Delphi代码更广。我们无法看到它们是如何在C代码中初始化的,因为很遗憾,您删除了许多重要的代码。显然,您的Delphi代码无法使用这种差异。在C代码中s
意味着在不同的调用之间保持不变。同样p
。
也许代码应该是:
var
s: array [0..15] of UInt64;
p: Integer;
function next() : UInt64;
var
s0, s1 : UInt64;
begin
s0 := s[p];
p := ( p + 1 ) and 15;
s1 := s[p];
s1 := s1 xor (s1 shl 31);
s1 := s1 xor (s1 shr 11);
s0 := s0 xor (s0 shr 30);
s[p] := s0 xor s1;
Result := s[p] * 1181783497276652981;
end;
但同样,我们不知道s
和p
是如何初始化的。你呢?
您需要做的是进行一些测试。比较两个程序的输出。如果他们同意,那很好。如果他们不这样做,请调试Delphi程序以找出它的分歧。