2015-10-11 80 views
-3

我有C代碼,我想將它轉換爲Delphi。我所做的是對還是錯?將XORShift算法從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; 

Delphi代碼:

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; 
+3

讓我們從一個簡單的問題開始:它是否編譯?一個更復雜的問題:如果它編譯,它會給你預期的結果嗎? –

+0

「p」定義爲局部變量,並且將是未定義的。如果您嘗試編譯它,編譯器將顯示警告。你從來沒有試圖編譯它?嘗試在兩個實現上運行一些測試。 –

回答

0

你的翻譯是錯誤的許多方面。除此之外,你的Delphi代碼不會編譯,事實上也沒有C代碼。

函數的端應爲:

s[p] := s0 xor s1; 
Result := s[p] * 1181783497276652981; 

這是浪費的在這裏使用一個堆分配陣列。改爲使用固定長度的數組。

我可以看到的另一個問題是sp在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; 

但同樣,我們不知道如何sp是爲了被初始化。你做?

你需要做的是一些測試。比較兩個程序的輸出。如果他們同意,很好。如果他們不這樣做,請調試Delphi程序以找出它的分歧。

+0

C代碼不是我的我從這篇文章中獲得了「Marsaglia的xorshift發電機的實驗性探索,炒作」 – SHdotCom

+1

我不認爲這會改變任何事情。 –

+0

我做出了這些更改: - p,s公共變量; p:= 0; // 初始值。 - 由另一個函數填充。 – SHdotCom