Я дезертирую от C# до Delphi 2009, мне нравится он до сих пор очень.
Я записал процедуру двоичного поиска, которая хорошо работает. Я добавил простое, если еще оператор в конце моего proc и это просто не стреляет! Я не вижу ничто плохого с ним, и смущен, чтобы должными быть сказать, что я застреваю. Помогите!
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
тот, который не будет стрелять. не отлаживая никакой истинный или ложный огонь ответвлений, отладчик просто пропускает прямо по ним. Также if 54 = 65 then
то, которое является просто тестом, делает то же.
Если в моем повторном цикле хорошо работает все же.
Если я копирую проблему если оператор в мини-тест proc и затем называю proc, это работает, таким образом, это заставляет меня думать, что это - что-то еще в proc как отсутствие ;
заставляя что-то странное произойти, но я не вижу его. Помогите!
Возможно, отладчик просто пропускает эти операторы, даже если они фактически выполняются. Убедитесь, что все параметры включены в параметрах отладки. В Delphi 7 они находятся в Project \ Options на вкладке Compiler.
Компилятор Delphi довольно умен и с радостью удалит неиспользуемый код. Когда я компилирую ваш код, я получаю подсказки компилятора: «Значение, присвоенное 'rslt', никогда не использовалось». Поскольку значение никогда не используется, компилятор просто пропускает эти операторы.
Если вы добавите Writeln (rslt);
в конец вашей процедуры, вы обнаружите, что отладчик теперь будет отслеживать ваш оператор if
.
Оператора «Begin» сразу после оператора «Repeat» не должно быть. «Повтор» не использует начало. Я бы удалил его, чтобы убедиться, что это не вызовет никаких проблем.
"rslt" не используется. Поэтому Delphi оптимизирует его.
Очевидно, что вы хотите вернуть свой результат. Так что измените ваше объявление на:
procedure BinSearch(var rslt: integer);
или лучше, сделайте его функцией:
function BinSearch: integer;
и в конце поставьте:
Result := rslt;
и вы увидите, что эти выражения больше не пропускаются, потому что теперь используется rslt.
Но, вы увидите, что у вас возникнут проблемы с вашим утверждением:
rslt := not mid;
потому что mid - целое число. Я не уверен, что вы хотите здесь вернуть, но я знаю, что вы не хотите, чтобы оператор "not" применялся к "mid".
Посмотрите на этот код, который я получил из викикусков. Это может помочь разобраться.
(* 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;