2012-02-03 7 views
7

Supponiamo che io abbia un modulo che definisce alcune costanti di base comeTra cui un modulo più di una volta

integer, parameter :: i8 = selected_int_kind(8) 

Se includo nel mio programma principale e includo anche un modulo che fa alcune altre cose (chiamare questo modulo functions) ma functions anche use s constants, quindi sto essenzialmente incluso constants due volte nel mio programma principale?

Se sì, è così male? Può essere pericoloso includere un modulo troppe volte in un programma?

+1

No, va bene così. Tutto quello che stai facendo con le istruzioni 'use' sta portando le variabili in un ambito di sottoprogrammi. Non è come dichiarare le variabili ogni volta che sono "usate". L'unica cosa di cui diffidare sono le * dipendenze circolari *, dove il modulo 'A' usa il modulo' B' e il modulo 'B' usa il modulo' A'. Questo non è permesso. – Chris

+1

grazie, fai una risposta così posso darti un segno di spunta! – drjrm3

+0

Grazie, ho fatto e aggiunto un po 'più di informazioni. – Chris

risposta

11

No, è giusto farlo. Tutto quello che stai facendo con la dichiarazione use sta fornendo l'accesso alle variabili e alle funzioni definite nel tuo modulo tramite usa l'associazione. Non è come dichiarare variabili ogni volta che sono use 'd (sono comunque redeclared comunque).

L'unica cosa da stare attenti a sono dipendenze circolari, dove modulo A usa le modulo B e il modulo B usa le modulo A. Questo non è permesso.

Modifica: Da Metcalf e altri. Fortran 95/2003 ha spiegato, pag. 72:

Un modulo può contenere istruzioni use che accedono ad altri moduli. Non deve accedere direttamente o indirettamente tramite una catena di istruzioni use, ad esempio a, accesso a b e b, accesso a a.

Mentre questa citazione non risponde direttamente alla tua domanda, ribadisce che in realtà l'unica cosa che non puoi fare è avere una dipendenza circolare. Quindi il seguente è perfettamente valido:

module one_def 
    implicit none 
    integer, parameter :: one=1 
end module one_def 

module two_def 
    use one_def, only : one 
    implicit none 
    integer, parameter :: two=one+one 
end module two_def 

program test 
    use one_def, only : one 
    use two_def, only : two 
    implicit none 

    print*, two == one+one ! This prints .True. 

end program 
Problemi correlati