2009-12-20 16 views
5

Estoy desertando de C# a Delphi 2009, me está gustando mucho hasta ahora.¿Por qué mi instrucción "if" parece no ejecutarse?

Escribí un procedimiento de búsqueda binaria, que funciona bien. ¡Agregué una instrucción if-else simple al final de mi proceso y simplemente no se dispara! No veo nada malo en ello y me da vergüenza tener que decir que estoy atascado. ¡Por favor ayuda!

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; 

Es la if A[mid] = x then uno que no se disparará. cuando la depuración de las ramas verdaderas o falsas no se dispara, el depurador se salta directamente sobre ellas. También el if 54 = 65 then que es solo una prueba hace lo mismo.

Sin embargo, si dentro de mi bucle de repetición funciona bien.

Si copio el problema si la instrucción en un mini proc prueba, y luego llamo al proc funciona, entonces me hace pensar que es algo diferente en el proceso como ; haciendo que algo extraño suceda pero no puedo verlo . ¡Por favor ayuda!

+6

Dado que rslt nunca se usa en ningún otro lugar que no sea la declaración de asignación, el compilador Delphi elimina ese trozo de código como parte de las optimizaciones. No afecta el código fuente, simplemente no escribe ese código en el archivo objeto. Probablemente tenga un compilador advirtiendo que la variable rslt nunca se usa ... – Sparky

+5

Bienvenido a StackOverflow, y a Delphi. –

+1

Solo un consejo, no necesita un par de inicio y final en un ciclo de repetición hasta que se repita. – Todd

Respuesta

4

Podría ser que el depurador simplemente omita esas declaraciones a pesar de que en realidad se están ejecutando. Asegúrese de que todas las opciones estén activadas en las opciones de depuración. En Delphi 7, están en Proyecto \ Opciones en la pestaña Compilador.

+0

Gracias por su rápida respuesta. Todo está bien, ¡estuvo trabajando todo el tiempo! No pude ver nada que cambiar en las opciones del depurador, pero de hecho estaba disparando y saltándome en el depurador. Supongo que porque si ... más ... Hay una afirmación que tiene algo que ver con eso, sin embargo es muy extraño cómo el depurador PODRÁ entrar en un código idéntico en otros lugares, y no en otros. Lo principal es que está funcionando sin embargo. No estoy más perplejo y eso es lo principal, gracias por su ayuda y sry por mi pregunta sobre el burro. – user235325

+0

Sí, el optimizador Delphi en compilaciones de depuración a veces me parece demasiado agresivo. –

14

El compilador Delphi es bastante inteligente, y con mucho gusto eliminará el código no utilizado. Cuando compilo tu código, recibo consejos del compilador que dicen "Valor asignado a 'rslt' nunca utilizado". Como el valor nunca se usa, el compilador simplemente omite esas declaraciones.

Si agrega un Writeln(rslt); al final de su procedimiento, verá que el depurador ahora rastreará a través de su declaración if.

+0

He visto este comportamiento antes, y apuesto a que eso es exactamente lo que está pasando! +1 –

0

La instrucción "Begin" justo después de la instrucción "Repeat" no debería estar allí. Una "Repetición" no usa un comienzo. Lo eliminaría solo para estar seguro de que no causa ningún problema.

0

"rslt" no se utiliza. Por lo tanto, Delphi lo optimiza.

Obviamente, desea devolver el resultado. Así que cambiar su declaración a:

procedure BinSearch(var rslt: integer); 

o mejor, lo convierten en una función:

function BinSearch: integer; 

y al final poner en:

Result := rslt; 

¿Alguno de los anteriores, y usted Descubrirá que esas declaraciones ya no se saltan porque ahora se usa rslt.

embargo, usted encontrará que usted tiene un problema con su declaración:

rslt := not mid; 

debido a mediados es un entero. No estoy seguro de qué quiere volver aquí, pero sé que no quiere que el operador "no" se aplique a "medio".


Mira este código que I got from wikibooks. Puede ayudarte a resolverlo.

Cuestiones relacionadas