2012-02-03 8 views
7

Supongamos que tengo un módulo que define algunas constantes básicas tales comoLa inclusión de un módulo más de una vez

integer, parameter :: i8 = selected_int_kind(8) 

Si incluyo esto en mi programa principal y también incluyo un módulo que hace algunas otras cosas (llamar a este módulo functions) pero functions también use s constants, ¿entonces estoy esencialmente incluyendo constants dos veces en mi programa principal?

Si es así, ¿es esto malo? ¿Puede ser peligroso incluir un módulo muchas veces en un programa?

+1

No, está bien hacer esto. Todo lo que está haciendo con las declaraciones 'use' es llevar variables al alcance de un subprograma. No es como declarar variables cada vez que se usan. Lo único que hay que tener en cuenta son las * dependencias circulares *, donde el módulo 'A' utiliza el módulo' B' y el módulo 'B' usa el módulo' A'. Esto no esta permitido. – Chris

+1

gracias, haga de esto una respuesta para que pueda darle una marca de verificación! – drjrm3

+0

Gracias, lo he hecho y he añadido un poco más de información también. – Chris

Respuesta

11

No, está bien hacer esto. Todo lo que está haciendo con la instrucción use es proporcionar acceso a las variables y funciones definidas en su módulo a través de la asociación de uso . No es como declarar variables cada vez que son use 'd (de hecho, se vuelven a declarar).

La única cosa a tener cuidado con las dependencias circulares son , en donde el módulo A utiliza el módulo y el módulo BB utiliza el módulo A. Esto no esta permitido.

Editar: De Metcalf y otros. Fortran 95/2003 explicado, pág. 72:

Un módulo puede contener declaraciones use que acceden a otros módulos. No debe acceder a sí mismo directa o indirectamente a través de una cadena de declaraciones use, por ejemplo a teniendo acceso a b y b teniendo acceso al a.

Si bien esta cita no responde directamente a su pregunta, reitera que realmente lo único que no puede hacer es tener una dependencia circular. Entonces el siguiente es perfectamente válido:

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 
Cuestiones relacionadas