Declaración de retorno Fortran
return (3)
Estoy tratando de obtener un código compilado bajo gfortran que compila bien bajo g77. El problema parece ser de una declaración de devolución:
ffuncs.f: 934.13:
RETURN E
1
Error: la instrucción RETURN alternativa en (1) requiere un especificador de retorno SCALAR-INTEGER
En el código, cualquier cosa E se especificó como real * 8:
IMPLICIT REAL * 8 (A - H, O -Z)
Sin embargo, a E nunca se le dio un valor ni nada, de hecho, nunca lo verá hasta la declaración de devolución. No sé casi nada sobre Fortran. ¿Cuál es el significado de una declaración de devolución con un argumento en fortran?
Gracias.
Creo que @Carl Smotricz tiene la respuesta. ¿La lista de argumentos de ffuncs tiene argumentos ficticios que son asteriscos (para hacer coincidir la etiqueta de asterisco en las llamadas)? ¿O fue utilizado sin que haya retornos alternativos? Si no hubo devoluciones alternativas, simplemente elimine la "E". Si hay devoluciones alternativas, la gran pregunta es qué estaba haciendo el programa antes en tiempo de ejecución ya que la variable era del tipo incorrecto y no se inicializó. Si la variable no tiene un valor entero que coincida con una de las ramas esperadas, tal vez el programa tomó la rama de retorno regular, pero eso es solo una suposición, si es así, la solución más fácil es volver a eliminar la "E".
La función "retorno alternativo" se considera "obsoleta" por el estándar de idioma y podría eliminarse en un estándar futuro; es probable que los compiladores sigan siendo compatibles si se eliminó debido al código heredado. Para el código nuevo, una alternativa simple es devolver una variable de estado entero y usar una declaración "seleccionar caso" en la persona que llama.
En FORTRAN (hasta Fortran 77, con el que estoy muy familiarizado), RETURN n
no se utiliza para devolver un valor de función; en cambio, hace algo así como lo que en otros idiomas sería manejado por una excepción: una salida a una ubicación de código distinta de la normal.
Normalmente llamarías a tal SUBROUTINE
o FUNCTION
con etiquetas como argumentos, por ejemplo
CALL MYSUB(A, B, C, *998, *999)
...
998 STOP ''Error 1''
998 STOP ''Error 2''
y si las cosas van mal en MYSUB, entonces RETURN 1
o RETURN 2
(en lugar del RETORNO normal) y estaría saltando directamente a la etiqueta 998 o 999 en la rutina de llamadas.
Es por eso que normalmente quiere un número entero en ese RETORNO - no es un valor sino un índice al cual la salida de error que desea tomar.
RETURN E
suena mal para mí. A menos que haya una sintaxis que desconozco, el compilador anterior debería haber marcado eso como un error.
En una función Fortran uno devuelve el valor, asignando el valor a una variable falsa que es el mismo nombre que la función. Una vez que haces eso, simplemente regresa.