2013-10-23 9 views
5

Ho bisogno in un programma di passare alcuni array allocabili a subroutine, e ho bisogno di sapere se il modo in cui lo faccio sono nello standard o no.fortran, passando gli array allocabili a una subroutine con limiti a destra

Se sai dove posso cercare lo standard di Fortran, Dimmi per favore.

Ecco un po 'di codice che verrà spiegare meglio di quanto le parole

program test 

use modt99 

implicit none 

real(pr), dimension(:), allocatable :: vx 

allocate(vx(-1:6)) 
vx=(/666,214,558,332,-521,-999,120,55/) 
call test3(vx,vx,vx) 
deallocate(vx) 

end program test 

con il modulo modt99

module modt99 

contains 
subroutine test3(v1,v2,v3) 
    real(pr), dimension(:), intent(in) :: v1 
    real(pr), dimension(0:), intent(in) :: v2 
    real(pr), dimension(:), allocatable, intent(in) :: v3 

    print*,'================================' 
    print*,v1(1:3) 
    print*,'================================' 
    print*,v2(1:3) 
    print*,'================================' 
    print*,v3(1:3) 
    print*,'================================' 

end subroutine test3 


end module modt99 

sullo schermo, ho

================================ 
    666.000000000000  214.000000000000  558.000000000000  
================================ 
    214.000000000000  558.000000000000  332.000000000000  
================================ 
    558.000000000000  332.000000000000  -521.000000000000  
================================ 

Così sono i tre modi di argomenti fittizi in subroutine test3 legale (in quale versione di fortran, 90, 95, 2003?) e sono il loro comportamento normale?

risposta

5

La prima versione passa la sezione dell'array alla subroutine. Si noti che le informazioni sui limiti non vengono passate in questo modo, si presume che gli array inizino a 1 e passino allo size(array).

Il secondo modo è proprio come il primo, ma è possibile impostare manualmente il limite inferiore per 0, è per questo che la stampa v3(1:3) ti dà i valori con un offset di 1.

La terza via passa tutte le informazioni di matrice alla subroutine (compresi i limiti), quindi l'indicizzazione "corretta". Gli array allocatable sono stati introdotti con Fortran 2003.

Oltre al fatto che si ha un problema di aliasing (passando la stessa variabile a tre diversi argomenti fittizi), tutte e tre le versioni sono legali.

È possibile trovare tutti i documenti degli standard here.

Soprattutto, date un'occhiata al Fortran 2003 standard, Ch. 5.1.2.5 DIMENSION attribute per vedere le differenze tra assunto forma e forma differita array in argomenti fittizi.

+0

grazie per la risposta, mi aiuterà molto. Nel link che dai, sembra che sia ok anche in f95 o no? – user2910558

+0

* Tutti * I documenti standard vengono forniti qui, a partire da * Fortran per IBM 704 * (1957!). –