Delphi 7布尔方程是';行不通
我有一个用Delphi7编写的程序,它似乎遇到了一些逻辑问题。下面这行永远不会给出一个真正的值,即使我的手表窗口说它应该Delphi 7布尔方程是';行不通,delphi,delphi-7,boolean-expression,Delphi,Delphi 7,Boolean Expression,我有一个用Delphi7编写的程序,它似乎遇到了一些逻辑问题。下面这行永远不会给出一个真正的值,即使我的手表窗口说它应该 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^和(非Seq^.Step[2])或(
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^和(非Seq^.Step[2])或(RetryDelay^.Done和(非Seq^.Step[2])或(Seq^.Step[1]和(非Seq^.Step[reset^])
为真,但Seq^.Step[1]
的值从未设置为真
真正奇怪的是,我有许多程序,它们的代码行完全相同,而且似乎都正常工作
步骤[1]:=
(PlcStart^和(非以下步骤[2])或
(RetryDelay^.完成且(非后续步骤[2])或
(顺序步骤[1]和(不是顺序步骤[reset])
我不熟悉Delphi,但我熟悉布尔逻辑。如果我读对了,你会说:
(一)∧ (B)∨ (C)∧ (B)∨ (D)∧ (E)
在javascript中,这是:
(a && !b) || (c && !b) || (d && !e)
使用生成真值表,并将“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
这张表可能正确,也可能不正确,我还没有验证过。你可以自己去做决定。无论如何,假设它是正确的,您可以检查给定输入的预期输出,并验证您的预期是否正确。看起来您发现了一个编译器错误!或许不是。试着做一些调试。向我们证明Delphi逻辑表达式求值器已损坏。尝试将表达式拆分为3个变量,并分别对每个步骤求值。我不认为编译器在此类表达式上失败。也许编译器可以在搜索路径中看到单元的另一个版本或单元已更改,但编译器使用旧的DCU。。。尝试在不进行编译器优化的情况下构建项目,并在CPU调试窗口中逐指令执行它。通过这种方式,您可以确保编译器真正编译该代码,并且您将看到如何一步一步地完成计算。在两个项目中,“项目>选项>德尔福编译器>编译>语法选项>完成布尔计算”是否设置为相同的值?