0

我有一个用 Delphi 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]从未将值设置为真。

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

4

1 回答 1

0

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

我不熟悉 Delphi,但我熟悉布尔逻辑。如果我没看错,你的意思是:

(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

该表可能正确也可能不正确,我尚未验证。您可以通过它并自己决定。无论如何,假设它是正确的,您可以检查给定输入的预期输出并验证您的预期是否正确。

于 2013-10-25T07:06:04.960 回答