2012-11-21 7 views
5

Considerare:C'è qualcosa di sbagliato nel passare un array non allocato a una routine senza un'interfaccia esplicita?

program main 
real, allocatable, dimension(:) :: foo 
integer n 
n=10 
call dofoo(foo,n,1) 
allocate(foo(n)) 
call dofoo(foo,n,0) 
end program main 

subroutine dofoo(foo,n,mode) 
real foo(n) 
integer i,n,mode 
if(mode.eq.1)then 
    n=6 
    return 
endif 
do i=1,n 
    foo(i)=i 
enddo 
return 
end subroutine dofoo 

qualcosa che non va con il codice di cui sopra? (Funziona con gfortran) Passo per la prima volta in un array non assegnato, ma non lo tocco - C'è qualcosa nello standard che potrebbe causare questo comportamento in modo dipendente dal sistema?

risposta

5

Hai quasi risposto alla tua domanda. Sì, secondo lo standard, è sempre illegale passare un array allocatable non allocato come argomento effettivo se non si dispone di un'interfaccia nell'ambito.

Se si dispone di un'interfaccia in ambito è legale solo se l'argomento dummy è anche allocabile.

E sì, sono stato morso da esso. Il mio lavoro è stato quello di allocare a zero dimensioni prima della chiamata.

+0

Grazie. Ero preoccupato che questo fosse il caso. Non sapevo cosa lo standard avesse da dire (sono molto familiare con lo standard f77, ma non ho letto la maggior parte dello standard f90) – mgilson

+0

Come nota a margine, il codice sopra funziona con gfortran (dopo I modificato i bug) – mgilson

+3

Il passaggio attorno agli array allocabili non è stato risolto fino a quando non si è passati allo standard F95. Lo stato e le dimensioni allocate sono _part_ della variabile array allocabile. Ciò è importante perché cose come intent (in) o intent (out) non ti dicono solo se _values_ dell'array può cambiare, ma se le dimensioni o lo stato di allocazione possono cambiare. Senza un'interfaccia esplicita, un programma dovrebbe assumere il peggio quando passa un array allocabile - potrebbe non conoscere più le dimensioni al momento del ritorno. Questa è un'enorme penalità per le prestazioni nel solito caso, quindi è stato deciso che è necessario avere un'interfaccia esplicita. –

Problemi correlati