intent(inout)
e intent(out)
non sono certamente uguali. Hai notato perché, sebbene tu non tragga la conclusione corretta. Entrando nella subroutine useless
a
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.
È 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'. –
@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. –