Почему делает мой, “если” оператор, кажется, не работает?

Я дезертирую от 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 как отсутствие ; заставляя что-то странное произойти, но я не вижу его. Помогите!

5
задан Rob Kennedy 22 December 2009 в 08:09
поделиться

4 ответа

Возможно, отладчик просто пропускает эти операторы, даже если они фактически выполняются. Убедитесь, что все параметры включены в параметрах отладки. В Delphi 7 они находятся в Project \ Options на вкладке Compiler.

4
ответ дан 18 December 2019 в 09:07
поделиться

Компилятор Delphi довольно умен и с радостью удалит неиспользуемый код. Когда я компилирую ваш код, я получаю подсказки компилятора: «Значение, присвоенное 'rslt', никогда не использовалось». Поскольку значение никогда не используется, компилятор просто пропускает эти операторы.

Если вы добавите Writeln (rslt); в конец вашей процедуры, вы обнаружите, что отладчик теперь будет отслеживать ваш оператор if .

14
ответ дан 18 December 2019 в 09:07
поделиться

Оператора «Begin» сразу после оператора «Repeat» не должно быть. «Повтор» не использует начало. Я бы удалил его, чтобы убедиться, что это не вызовет никаких проблем.

0
ответ дан 18 December 2019 в 09:07
поделиться

"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;
0
ответ дан 18 December 2019 в 09:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: