buena práctica dicta que los argumentos de subrutina en Fortran deben tener cada uno un intento especificado (es decir, intent(in)
, intent(out)
o intent(inout)
como se describe this question):intención Fortran (inout) versus omitiendo intención
subroutine bar (a, b)
real, intent(in) :: a
real, intent(inout) :: b
b = b + a
...
Sin embargo, no especificando una intención Fortran es válida:
subroutine bar (a, b)
real, intent(in) :: a
real :: b
b = b + a
...
¿hay diferencias reales más allá del tiempo de compilación para un argumento especificado como un argumento intent(inout)
y sin especificado en ¿tienda? ¿Hay algo de lo que deba preocuparme si estoy adaptando los intentos al código antiguo, libre de intento?
He construido cuatro casos de prueba tratando de modificar un parámetro en una subrutina. Dos pruebas con subrutinas externas, es decir, en un archivo por sí mismas, con y sin intención (inout). El compilador no se queja de ninguno de esos. Esto no es una sorpresa (sin interfaz) y el resultado resultante es seg. He pegado la subrutina en un módulo para las dos últimas pruebas y veo la segfault para el caso sin intención y un error del compilador ("El argumento real en (1) debe definirse ya que el argumento ficticio 'b' es INTENT = OUT/INOUT ") con la interfaz. Esto es con gfortran 4.4.4-2 desde un sistema Debian. –
Excelente, ambos aprendimos algo. –
En estos días, los parámetros se colocan en una parte de memoria solo de lectura, pero esto no siempre ha sido cierto. El famoso ejemplo en compiladores muy antiguos fue la redefinición de las constantes numéricas http://coding.derkeiler.com/Archive/Fortran/comp.lang.fortran/2005-01/0485.html –