2012-04-03 141 views
0

我在C轉換開放源代碼應用到德爾福,但我有問題,將這些行:轉換定義從C到德爾福

#define IS_IN_SEARCH(mb, offset) (mb->searchmask[(offset)/8] & (1<<((offset)%8))) 
#define REMOVE_FROM_SEARCH(mb, offset) mb->searchmask[(offset)/8] &= ~(1<<((offset)%8)); 

我想這樣做的唯一的事情就是創建一個功能,但不知道其餘的..

我不知道如何將其轉換爲德爾福。

任何人都可以幫助我嗎?

感謝

+2

題外話:爲什麼有人將代碼從C轉換到Pascal,而不是相反呢? – 2012-04-03 02:56:11

+1

因爲我知道大多數Delphi比C,而且我需要在我的Delphi應用程序中實現這個代碼:/ – paulohr 2012-04-03 02:58:38

+0

如何聲明'mb'? – RRUZ 2012-04-03 03:12:21

回答

5

從創建雙參數函數開始。 (你知道它應該是兩個參數,因爲宏有兩個參數和宏的屍體不涉及任何其他標識符之外的參數。

function Is_In_Search(mb: X; offset: Y): Z; 
function Remove_From_Search(mb: X; offset: Y): W; 

另外,如果你想內嵌代碼,這意味着,讓編譯器將在每個調用點以上2個功能聲明生成的代碼,你可以內嵌指令添加到聲明,就像這樣:

function Is_In_Search(mb: X; offset: Y): Z; *inline;* 
function Remove_From_Search(mb: X; offset: Y): W; *inline;* 

接下來,找出那些類型應爲了做到這一點,看看參數和宏是如何使用的。

  • 我們可以猜到offset可能是一個整數,因爲宏使用模運算符,因此在函數聲明中用Integer代替Y
  • 我們不能從定義中知道mb應該是什麼,但是您有其他代碼,所以您可以查看使用宏的地方。找到第一個實際參數的類型,然後用該類型替換X。這可能是指向某種結構類型的指針,如記錄或類。
  • 第一個函數的返回類型是表達式的類型。這可能是一個整數,但基於函數的名稱,它實際上是一個布爾類型。任何非零整數都被認爲是真的。將Z替換爲Boolean

    第二個宏的結果可能也是一個整數,但它的名稱和語法暗示它的結果總是被忽略,所以你可以去掉W並將第二個函數改成一個過程。

最後,填寫函數的主體。將C語法轉換爲Delphi,你得到這個:

function Is_In_Search(mb: X; offset: Integer): Boolean; 
begin 
    Result := 0 <> (mb.searchmask[offset div 8] and (1 shl (offset mod 8))); 
end; 

procedure Remove_From_Search(mb: X; offset: Integer); 
begin 
    mb.searchmask[offset div 8] := mb.searchmask[offset div 8] and not (1 shl (offset mod 8)); 
end; 
+0

完美的作品,再次感謝你。愛你s2 – paulohr 2012-04-03 03:36:50

+0

我投這個票是因爲你解釋了你的答案,以及它是如何得出的。 – chuacw 2012-04-03 04:15:48

5

你沒有告訴如何declarated的mb變量,所以這只是一個僞代碼。

//IS_IN_SEARCH(mb, offset) (mb->searchmask[(offset)/8] & (1<<((offset)%8))) 
function IS_IN_SEARCH(mb:typegoeshere; offset: Integer) : Boolean; 
begin 
Result:= (mb.searchmask[offset div 8] AND (1 shl (offset mod 8)))<>0; 
end; 


//REMOVE_FROM_SEARCH(mb, offset) mb->searchmask[(offset)/8] &= ~(1<<((offset)%8)) 
procedure REMOVE_FROM_SEARCH(mb:typegoeshere; offset: Integer); 
begin 
mb.searchmask[offset div 8] := mb.searchmask[offset div 8] AND not (1 shl (offset mod 8)); 
end; 
+0

完美的作品,再次感謝你。愛你s2 – paulohr 2012-04-03 03:36:32