2013-10-23 45 views
0

我有一個用Delphi 7編寫的程序,似乎遇到了一些邏輯問題。即使在我的觀察窗口顯示它應該時,下面的行也不會給出真正的值。德爾福7布爾方程不起作用

Seq^.step[1] := 
    (PlcStart^ and (not Seq^.Step[2])) or 
    (RetryDelay^.Done and (not Seq^.Step[2])) or 
    (Seq^.Step[1] and (not Seq^.Step[reset_])); 

我的手錶窗口顯示(PlcStart^ and (not Seq^.Step[2])) or (RetryDelay^.Done and (not Seq^.Step[2])) or (Seq^.Step[1] and (not Seq^.Step[reset_]))是真實的,但的Seq^.Step[1]值永遠不會被設置爲true。

真正奇怪的部分是,我有許多程序具有完全相同的行,所有程序似乎都正常工作。

+1

看起來你已經發現了一個編譯器錯誤!或者可能不是。嘗試並做一些調試。向我們證明,Delphi邏輯表達式評估器已被破壞。 –

+7

嘗試將你的表達式分解爲3個變量,並分別評估每個步驟。 –

+1

我不認爲這種表達式編譯器會失敗。也許編譯器可以在搜索路徑中看到另一版本的單元或單元已更改,但編譯器使用舊的DCU,...嘗試在沒有編譯器優化的情況下構建項目,並在CPU調試窗口指令中按指令執行它。通過這種方式,您可以確保編譯器真正編譯該代碼,並且您將看到如何一步一步地完成計算。 –

回答

0

SEQ ^。步驟[1]:= (PlcStart ^和(不是SEQ ^。步驟[2]))或 (RetryDelay^.Done和(不是SEQ ^。步驟[2]))或步驟[1]和(步驟2)。步驟[重置]]);

我不熟悉Delphi,但我熟悉布爾邏輯。如果我讀這個權利your're說:

(A ∧ ¬ B)∨(C ∧ ¬ B)∨(d ∧ ¬ E)

在JavaScript這就是:

(a && !b) || (c && !b) || (d && !e) 

使用http://mustpax.github.io/Truth-Table-Generator/生成一個真值表並將「false」轉換爲「0」和「true」爲「1」,我們得到真值表:

a b c d e (a & !b) | (c & !b) | (d & !e) 
1 1 1 1 1 0 
0 1 1 1 1 0 
1 0 1 1 1 1 
0 0 1 1 1 1 
1 1 0 1 1 0 
0 1 0 1 1 0 
1 0 0 1 1 1 
0 0 0 1 1 0 
1 1 1 0 1 0 
0 1 1 0 1 0 
1 0 1 0 1 1 
0 0 1 0 1 1 
1 1 0 0 1 0 
0 1 0 0 1 0 
1 0 0 0 1 1 
0 0 0 0 1 0 
1 1 1 1 0 1 
0 1 1 1 0 1 
1 0 1 1 0 1 
0 0 1 1 0 1 
1 1 0 1 0 1 
0 1 0 1 0 1 
1 0 0 1 0 1 
0 0 0 1 0 1 
1 1 1 0 0 0 
0 1 1 0 0 0 
1 0 1 0 0 1 
0 0 1 0 0 1 
1 1 0 0 0 0 
0 1 0 0 0 0 
1 0 0 0 0 1 
0 0 0 0 0 0 

該表可能會也可能不正確,我還沒有驗證。你可以通過它自行決定。無論如何,假設它是正確的,你可以檢查給定輸入的預期輸出,並驗證你的期望是否正確。