2011-05-25 24 views
5

Estoy leyendo un código Fortran, y de vez en cuando el programador anterior arroja la declaración 'n = n'. ¿Cuál es el propósito de esto? Un código de ejemplo:¿Cuál es el propósito de 'n = n'?

if (cmult.lt.5.) then 
    kx = 0 
    do k=ipd(ii),lpd(ii) 
     kx = kx + 1 
     p1(kx) = epp_rfc(ipp,k) 
     epp_rfc(ipp,k) = cmult*epp_rfc(ipp,k) + x 
     zero(ix) 
     p2(kx) = epp_rfc(ipp,k) 
     n = n 
    enddo 

if (cmult.gt.0.) then 
    n = n 
endif 

else 
    nk = lpd(ii) - ipd(ii) + 1 
    do k=ipd(ii),lpd(ii) 
     kx = kx + 1 
     p1(kx) = epp_rfc(ipp,k) 
     epp_rfc(ipp,k) = pp(imem) + zero(ix) 
     p2(kx) = epp_rfc(ipp,k) 
     n = n 
    enddo 
endif 

Respuesta

14

código como este se utiliza con frecuencia para permitir que el programador para establecer un punto de interrupción en los depuradores que no soportan los puntos de interrupción condicionales.

Al establecer un punto de interrupción en esa línea, un viaje de solo ser golpeado si cmult.gt.0.

+0

¿Cómo lo supo? Eso es muy interesante. – tofutim

+1

+1, @tofutim la mayoría de los depuradores FORTRAN no son tan buenos como los de .Net, por lo que muchos de estos "hacks" son comunes. He visto estos constructos en la mayoría de los idiomas donde la depuración 'write' /' printf' es común. – user7116

1

El hecho de que n = n se utiliza para comprobar el valor de cmult.gt.0. y se utiliza como 'condición de punto de interrupción' es una coincidencia en un sentido que es no es el motivo por el que n = n aparece en el fragmento de código anterior.

La razón real por la que n = n se usa en este caso radica en el hecho de que el alcance en el código fuente nunca es traducido por los compiladores más populares al lenguaje ensamblador (la computadora no es lo suficientemente inteligente como para entender qué 'alcance' es a menos que sea explícitamente programado por el programador y si lo hiciera los programas se ejecutarán cientos de veces más lento ... debido a las instrucciones adicionales emitidas para que la lógica respalde el alcance). Solo está ahí para restringir al programador en el código fuente e introducir una estructura en el código para que el compilador & pueda hacer su trabajo o emitir un error si infringe el alcance.

Dado que el alcance no existe enddo no se puede pausar en a menos que el comipler tenga cuidado de insertar algunas instrucciones (como nop) y símbolos de depuración para permitir mágicamente que el depurador se detenga en enddo. Sin n = n, el resultado de esta línea p2(kx) = epp_rfc(ipp,k) no se puede verificar a medida que los valores se restablecen en la parte superior del ciclo. Es por esto que n = n se usa para detenerse después del p2(kx) = epp_rfc(ipp,k) y verificar el resultado final en cada iteración. Después de que cuando llega este código:

if (cmult.gt.0.) then 
    n = n 
endif 

se utiliza por conveniencia (de nuevo no se puede parar en endif o más) los propósitos y sí esto es una especie de punto de interrupción condicional. Pero n = n se utiliza de nuevo porque no se puede dejar de después de comprobarif (cmult.gt.0.) - se puede dejar de en ella, pero no después de - la siguiente instrucción será después del exterior si otra cosa. Espero que esto tenga sentido.

Editar: Si aún así no tiene mucho sentido que aquí hay información adicional: con el fin de comprobar el valor de p2(kx) después p2(kx) = epp_rfc(ipp,k) ha ejecutado el depurador tiene que emitir instrucciones para comprobar/buscarlo - por lo que es se requiere saber a) cuál es el tamaño de p2(kx) b) su ubicación - ¡recuerde las últimas instrucciones! y c) emitir las instrucciones apropiadas para obtener el valor p2(kx). Todo complicado para el depurador ya que esto es realmente lógico: el depurador tiene que ser "inteligente" (cae en el dominio AI), si un depurador pudiera hacer esto, Terminator ya habría existido.

Cuestiones relacionadas