2016-04-07 7 views
0

Существуют значительные различия между модулем, как следующийИСПОЛЬЗУЙТЕ модуль2 в SUBROUTINE, который содержится в модуле 1 или сам модуль1?

MODULE module1 
    USE module2 
    IMPLICIT NONE 
     : 
CONTAINS 

    SUBROUTINE subroutine1 
     IMPLICIT NONE 
      : 
    END SUBROUTINE subroutine1 

    SUBROUTINE subroutine2 
     IMPLICIT NONE 
      : 
    END SUBROUTINE subroutine2 

END MODULE module1 

и другой подобной следующей

MODULE module1 
    IMPLICIT NONE 
     : 
CONTAINS 

    SUBROUTINE subroutine1 
     USE module2 
     IMPLICIT NONE 
      : 
    END SUBROUTINE subroutine1 

    SUBROUTINE subroutine2 
     IMPLICIT NONE 
      : 
    END SUBROUTINE subroutine2 

END MODULE module1 

Помимо того, что в первом случае обе подпрограммы увидеть module2?

+2

Также имейте в виду, что, если у вас есть на уровне модуля 'implicit none', нет необходимости также реплицировать' implicit none' на уровне подпрограммы. Все, что содержится в вашем модуле, автоматически будет «имплицитным», если ваш модуль объявлен таким. – NoseKnowsAll

ответ

3

Различие, которое может быть существенным и который один должен знать о том, что в

MODULE module1 
    USE module2 

module1 будет по умолчанию экспорт также все государственные символы из module2. Этого не произойдет, если вы используете module2 только в подпрограмме, потому что модуль этого не видит.

Итак:

module module2 
    integer int 
    end module 

    module module1 
    use module2 
    end module 

    use module1 
    print *, int 
    end 

можно, но

module module2 
    integer int 
    end module 

    module module1 
    contains 
    subroutine s 
     use module2 
    end subroutine 
    end module 

    use module1 
    print *, int 
    end 

нет.

Разумеется, это поведение можно более подробно описать в соответствии с предложением only и операциями private и public.