2013-06-30 15 views
14

Sto adattando un codice Fortran che non ho scritto e senza molta esperienza fortran. Ho appena trovato una situazione in cui alcuni input malformati sono stati ignorati in silenzio, e vorrei cambiare quel codice per fare qualcosa di più appropriato. Se questo fosse C, poi mi piacerebbe fare qualcosa di simileArresto del programma fortran con stato di uscita diverso da zero

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

Ma in FORTRAN, il meglio che so fare sembra

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

che manca la scelta del flusso di uscita (problema minore) e lo stato di uscita (problema principale).

Come posso terminare un programma Fortran con uno stato di uscita diverso da zero?

Nel caso in cui questo dipenda dal compilatore, una soluzione che funzioni con gfortran sarebbe piacevole.

risposta

18

L'istruzione stop consente un valore intero o di carattere. Sembra probabile che questi vengano inviati a stderr quando esiste, ma dal momento che stderr dipende dal sistema operativo, è improbabile che lo standard di linguaggio Fortran lo richieda, se dice qualcosa. È anche probabile che se si utilizza l'opzione numerica verrà impostato lo stato di uscita. Ho provato con gfortran su un Mac, e che era il 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 

Mentre esattamente ciò stop con un numero intero o una stringa farà è OS-dipendente, la dichiarazione è parte del linguaggio e sarà sempre la compilazione. call exit è un'estensione GNU e potrebbe non essere collegata in alcuni sistemi operativi.

+0

Secondo lo standard, "Al momento della terminazione , il codice di arresto, se presente, è disponibile in modo dipendente dal processore." – astrojuanlu

4

Non ho trovato nulla su STOP nello gfortran 4.7.0 keyword index, probabilmente perché è una parola chiave della lingua e non intrinseca. Tuttavia, c'è uno EXIT intrinsic che sembra fare proprio quello che stavo cercando: uscire con un dato stato. E the fortran wiki ha a small example of using stderr che menziona una costante ERROR_UNIT. Così ora il mio codice ora appare così:

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

Questo almeno compila. I test sono ancora in sospeso, ma dovrebbe funzionare. Se qualcuno conosce una soluzione più elegante o più appropriata, sentiti libero di offrire risposte alternative a questa domanda.

+2

STOP è una dichiarazione. EXIT() è un'estensione GNU e potrebbe non essere disponibile in altri compilatori. –

10

Oltre a fermata n, c'è anche fermata errore n dal Fortran 2008. Con gfortran sotto Windows, entrambi inviano il numero di errore al sistema operativo, come si può vedere con un successivo echo %errorlevel%. Il messaggio di errore stop può essere inoltrato anche a un messaggio di errore.

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 
Problemi correlati