visual studio resueltos programaciĆ³n problemas compiler code fortran exit gfortran exit-code

studio - Detener programa fortran con estado de salida distinto de cero



problemas resueltos de programaciĆ³n en fortran 95 pdf (3)

Estoy adaptando algunos códigos de Fortran que no he escrito, y sin mucha experiencia con Fortran. Acabo de encontrar una situación en la que una entrada mal formada se ignoró silenciosamente y me gustaría cambiar ese código para hacer algo más apropiado. Si esto fuera C, entonces haría algo como

fprintf(stderr, "There was an error of kind foo"); exit(EXIT_FAILURE);

Pero en Fortran, lo mejor que sé hacer parece

write(*,*) ''There was an error of kind foo'' stop

que carece de la opción de flujo de salida (problema menor) y estado de salida (problema mayor).

¿Cómo puedo terminar un programa fortran con un estado de salida distinto de cero?

En caso de que esto sea dependiente del compilador, una solución que funcione con gfortran sería agradable.


Además de detener n , también hay una parada de error n desde Fortran 2008. Con gfortran bajo Windows, ambos envían el número de error al sistema operativo, como puede verse con un nivel de echo %errorlevel% posterior. La parada de error de la declaración también se puede pasar un mensaje de error.

program bye read *, n select case (n) case (1); stop 10 case (2); error stop 20 case (3); error stop "Something went wrong" case (4); error stop 2147483647 end select end program


La declaración de stop permite un valor entero o de carácter. Parece probable que estos se enviarán a stderr cuando exista, pero como stderr depende del sistema operativo, es poco probable que el estándar de idioma Fortran lo exija, si es que dice algo. También es probable que si utiliza la opción numérica se establezca el estado de salida. Lo probé con gfortran en una Mac, y ese fue el caso:

program TestStop integer :: value write (*, ''( "Input integer: " )'', advance="no") read (*, *) value if ( value > 0 ) then stop 0 else stop 9 end if end program TestStop

Mientras que precisamente lo que hará una stop con un entero o una cadena depende del sistema operativo, la declaración es parte del lenguaje y siempre se compilará. call exit es una extensión de GNU y puede que no se enlace en algunos sistemas operativos.


No pude encontrar nada sobre STOP en el índice de palabras clave gfortran 4.7.0 , probablemente porque es una palabra clave del lenguaje y no un intrínseco. Sin embargo, hay un intrínseco EXIT que parece hacer exactamente lo que estaba buscando: salir con un estado determinado. Y el wiki de fortran tiene un pequeño ejemplo de uso de stderr que menciona una constante ERROR_UNIT . Así que ahora mi código se ve así:

USE ISO_FORTRAN_ENV, ONLY : ERROR_UNIT […] WRITE(ERROR_UNIT,*) ''There as an error of kind foo'' CALL EXIT(1)

Esto al menos lo compila. Las pruebas aún están pendientes, pero debería funcionar. Si alguien conoce una solución más elegante o más adecuada, siéntase libre de ofrecer respuestas alternativas a esta pregunta.