我正在从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中的其他东西就像一个丢失的;
导致一些奇怪的事情发生但是我看不到。请帮忙!
答案 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;