2015-04-20 13 views
9

Secondo lo standard Fortran:Differenza tra intenti (out) e di intenti (inout)

L'attributo INTENT (OUT) per un argomento fittizio nonpointer specifica che l'argomento fittizio diventa indefinito sulla chiamata di procedura

Tuttavia questo semplice codice mi dà 5 come output, quindi sembra che l'argomento non sia diventato indefinito all'inizio della procedura (in questo caso una subroutine).

subroutine useless(a) 
    integer, intent(out) :: a 
    print *,a 
end subroutine useless 

program test 
    integer :: n=5 
    call useless(n) 
end program test 

Cosa mi sto sbagliando? Sembra che lo intent(inout) e lo intent(out) siano gli stessi.

+1

È interessante notare che sia gfortran che ifort stampano 5, sebbene ifort avverta che "Un argomento fittizio con una dichiarazione INTENT (OUT) esplicita non ha un valore esplicito'. –

+0

@Ross hai probabilmente ragione con il re-tag, ma ci sono così tante domande simili là fuori ... Probabilmente è meglio aspettare finché non puoi modificare senza revisione se vuoi fare molte di queste modifiche. Lascio spesso il [tag: fortran90] anche quando aggiungo il tag generico per essere sicuro di non modificare le intenzioni di OP. –

risposta

10

intent(inout) e intent(out) non sono certamente uguali. Hai notato perché, sebbene tu non tragga la conclusione corretta. Entrando nella subroutine uselessa non è definito, piuttosto che definito.

Avere una variabile "indefinita" significa che non è possibile fare affidamento su un comportamento specifico quando lo si fa riferimento. Hai notato che la variabile a aveva un valore 5 ma ciò non significa che l'unico valore che potresti osservare sia 5. In particolare "non definito" non significa "assume un valore specifico come NaN".

Il codice non è conforme allo standard a causa di questo riferimento a una variabile non definita. Vedi Fortran 2008 6.2 (il significato simile sarà da qualche parte in Fortran 90 come inizialmente taggato). Di particolare nota è che il compilatore non deve segnalare il tuo errore.

Con intent(inout) la variabile a verrà definita al riferimento e verrà garantito il valore 5 (per un processore conforme).

Più ampiamente, ci sono altre differenze tra i due attributi di intenti e questo aspetto "coincidente" della somiglianza della definizione della variabile a potrebbe essere più problematico.

Gli allocabili e gli oggetti con parametri di tipo differito, ad esempio, sono deallocati; i tipi derivati ​​diventano indefiniti (e qualsiasi componente allocabile deallocato) e i componenti con inizializzazione predefinita sono "reinizializzati"; i puntatori hanno il loro stato di associazione diventato indefinito.

Tutte queste ultime cose hanno il potenziale per risultati molto scomodi, molto più che con un intero scalare, se vengono referenziati senza essere definiti per primi.

Problemi correlati