为什么我的“if”语句似乎没有运行?

时间:2009-12-20 00:47:26

标签: delphi debugging

我正在从C#叛逃到Delphi 2009,我非常喜欢它。

我写了一个二进制搜索程序,工作正常。我在proc的末尾添加了一个简单的if-else语句,它只是不会触发!我看不出有什么不妥,我不好意思说我被卡住了。请帮忙!

procedure BinSearch;
var
  min,max,mid, x: integer;
  A : array[0..4] of integer;
  rslt : integer;

begin

  writeln('binary search');
  A[0] := 34; A[1] := 65; A[2] := 98; A[3] := 123; A[4] := 176;
  listarray(a);
  x := 62;
  min := 0;
  max := 4;

  repeat
    begin
    mid := (min + max) div 2;
    if x > A[mid] then
      min := mid + 1
    else
      max := mid - 1;
    end;
  until (A[mid] = x) or (min > max);

  writeln(mid);
  writeln(a[mid]);

  if A[mid] = x then
    rslt := mid
  else
    rslt := not mid;

  if 54 = 65 then
    rslt := mid
  else
    rslt := not mid;

end;

if A[mid] = x then不会发射。在调试true或false分支时,调试器只是直接跳过它们。此外,仅作为测试的if 54 = 65 then也是如此。

我的重复循环里面的if工作正常。

如果我将问题if语句复制到一个迷你测试过程中,然后调用proc它就可以了,所以它让我觉得它在proc中的其他东西就像一个丢失的;导致一些奇怪的事情发生但是我看不到。请帮忙!

4 个答案:

答案 0 :(得分:14)

Delphi编译器非常智能,它将很乐意删除未使用的代码。当我编译你的代码时,我得到了编译器提示,说“分配给'rslt'的值从未使用过”。由于从未使用过该值,因此编译器只会跳过这些语句。

如果在程序结束时添加Writeln(rslt);,您会发现调试器现在将跟踪您的if声明。

答案 1 :(得分:4)

可能是调试器正在跳过这些语句,即使它们实际上正在运行。确保在调试选项中打开所有选项。在Delphi 7中,它们位于Compiler选项卡下的Project \ Options下。

答案 2 :(得分:0)

“重复”语句之后的“Begin”语句不应该存在。 “重复”不使用开头。我会删除它只是为了确保它不会导致任何问题。

答案 3 :(得分:0)

“rslt”未使用。因此德尔福对其进行了优化。

显然,您想要返回结果。因此,请将您的声明更改为:

procedure BinSearch(var rslt: integer); 

或更好,使它成为一个功能:

function BinSearch: integer;

最后放入:

Result := rslt;

执行上述任一操作,您会发现这些语句不再被跳过,因为现在正在使用rslt。

但是,你会发现你的陈述会有问题:

rslt := not mid;

因为mid是一个整数。我不确定你想要回到这里,但我知道你不希望“not”运算符应用于“mid”。


查看I got from wikibooks的代码。它可能会帮助你搞清楚。

(* Returns index of requested value in an integer array that has been sorted
in ascending order -- otherwise returns -1 if requested value does not exist. *)

function BinarySearch(const DataSortedAscending: array of Integer;
 const ElementValueWanted: Integer): Integer;
var
    MinIndex, MaxIndex: Integer;
    { When optimizing remove these variables: }
    MedianIndex, MedianValue: Integer;
begin
    MinIndex := Low(DataSortedAscending);
    MaxIndex := High(DataSortedAscending);
    while MinIndex <= MaxIndex do begin
        MedianIndex := (MinIndex + MaxIndex) div 2; (* If you're going to change
         the data type here e.g. Integer to SmallInt consider the possibility of
         an overflow. All it needs to go bad is MinIndex=(High(MinIndex) div 2),
         MaxIndex = Succ(MinIndex). *)
        MedianValue := DataSortedAscending[MedianIndex];
        if ElementValueWanted < MedianValue then
            MaxIndex := Pred(MedianIndex)
        else if ElementValueWanted = MedianValue then begin
            Result := MedianIndex;
            Exit; (* Successful exit. *)
        end else
            MinIndex := Succ(MedianIndex);
    end;
    Result := -1; (* We couldn't find it. *)
end;