2013-06-30 8 views
14

Ich bin etwas Fortran-Code anpassen, die ich nicht geschrieben habe, und ohne viel Erfahrung von mir selbst. Ich habe gerade eine Situation gefunden, in der einige fehlerhafte Eingaben ignoriert wurden und ich diesen Code gerne ändern würde, um etwas passenderes zu tun. Wenn dies C wäre, dann würde ich etwas tun, wieStop Fortran-Programm mit Nicht-Null-Ausgangsstatus

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

Aber in Fortran, das Beste, was ich weiß, wie man sieht nicht wie

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

, die die Wahl des Ausgangsstroms (kleine Ausgabe) fehlt und beenden Status (großes Problem).

Wie kann ich ein Fortran-Programm mit einem Nicht-Null-Exit-Status beenden?

Falls dies Compiler-abhängig ist, wäre eine Lösung, die mit Gfortran funktioniert, gut.

Antwort

18

Die stop-Anweisung ermöglicht einen Ganzzahl- oder Zeichenwert. Es scheint wahrscheinlich, dass diese in stderr ausgegeben werden, wenn das vorhanden ist, aber da stderr vom Betriebssystem abhängig ist, ist es unwahrscheinlich, dass der Fortran-Sprachstandard dies erfordert, wenn es überhaupt etwas sagt. Wenn Sie die numerische Option verwenden, ist es wahrscheinlich, dass der Exit-Status festgelegt wird. Ich versuchte es mit gfortran auf einem Mac, und das war der Fall:

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 

Während genau das, was stop mit einer ganzen Zahl oder String tut, ist OS-abhängig, die Aussage Teil der Sprache ist und wird immer kompilieren. call exit ist eine GNU-Erweiterung und möglicherweise keine Verknüpfung auf einigen Betriebssystemen.

+0

Nach dem Standard, "Zum Zeitpunkt der Terminierung, ist der Stop-Code, wenn vorhanden, in einer prozessorabhängigen Weise verfügbar." – astrojuanlu

4

Ich konnte nichts über STOP in der gfortran 4.7.0 keyword index finden, wahrscheinlich weil es ein Sprachschlüsselwort und kein intrinsic ist. Nichtsdestotrotz gibt es eine EXIT intrinsic, die genau das zu tun scheint, wonach ich gesucht habe: Exit mit einem bestimmten Status. Und the fortran wiki hat a small example of using stderr, die eine Konstante ERROR_UNIT erwähnt. So jetzt sieht mein Code jetzt so aus:

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

Dies zumindest kompiliert. Tests stehen noch aus, aber es sollte funktionieren. Wenn jemand eine elegantere oder geeignetere Lösung kennt, können Sie alternative Antworten auf diese Frage geben.

+2

STOP ist eine Aussage. EXIT() ist eine GNU-Erweiterung und möglicherweise nicht in anderen Compilern verfügbar. –

10

Neben Stop n, gibt es auch Fehlerstopp n seit Fortran 2008 Mit gfortran unter Windows, sie beide die Fehlernummer an das Betriebssystem zu senden, wie bei einer nachfolgenden echo %errorlevel% zu sehen ist. Die Anweisung Fehler Stop kann auch eine Fehlermeldung übergeben werden.

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