2016-03-16 3 views
1

я определил три типа в трех различных модулей (в трех разных файлах) с помощью следующей иерархии:ТОЛЬКО пункт и наследуя от модулей в каскаде

MODULE module1 (low_level) 
    IMPLICIT NONE 
    TYPE type1 
     real(kind=kind(0.d0)) :: var1 
    END TYPE type1 
    ... more declarations ... 
END MODULE module1 

MODULE module2 (medium_level) 
    USE module1, only : type1 
    IMPLICIT NONE 
    TYPE type2 
     type(type1) :: var2 
    END TYPE type2 
    ... more declarations ... 
END MODULE module2 

MODULE module3 (high_level) 
    USE module2, only : type2 
    IMPLICIT NONE 
    TYPE type3 
     type(type2) :: var3 
    END TYPE type3 
    ... more declarations ... 
END MODULE module3 

Теперь у меня есть еще один модуль, в котором процедура модуля определяется:

MODULE module4 
    IMPLICIT NONE 
    CONTAINS 
    SUBROUTINE sub1(var4) 
     USE module3, only : type3 
     IMPLICIT NONE 
     type(type3), intent(inout) :: var4 
     type(type1) :: var5 
     ... using var5 ... 
    END SUBROUTINE sub1 
END MODULE module4 

компилятор жалуется при компиляции module4 в подпрограмме sub1:

Error: Derived type 'type1' at (1) is being used before it is defined 

Добавление USE module1, only : type1 в подпрограмму решает проблему.

Однако, учитывая, что подпрограмма sub1 использует module3, который использует module2, который использует module1, я не понимаю, почему я должен сказать компилятору «повторно объявить» type1, который уже объявлен в module1 и используется module3 через module2 от USE заявления, концепция наследования должна применяться здесь. Я не вижу преимущества использования модулей, вызывающих другие модули, если вам приходится писать все зависимости от модулей ...

Возможно, я, возможно, неправильно понял, любые объяснения будут оценены.

+1

Вы понимаете 'only' положение на' use' заявления? Это (по-быстрому) кажется ответом на меня, но если есть более фундаментальное неправильное понимание, было бы лучше подойти к этому. – francescalus

+0

Я признаю, что предложение 'only' здесь не обязательно, так как я только что объявил один тип в каждом модуле, но это только начало моих модулей (которые намного больше с гораздо большим количеством объявлений) – Coriolis

+0

Ну, если у вас есть' USE module2, only: type2' вы не можете получить доступ к 'type1', если вы импортируете только' type2', не так ли? Кажется, вы хотели использовать USE module2 только: type1, type2'. –

ответ

0

Если вы

module module2 
    USE module1, only : type1 

module module3 
    USE module2, only : type2 

вы не можете получить доступ к type1 в module3, потому что вы импортировать только type2.

Кажется, вы хотели

module module3 
    USE module2, only : type1, type2 

 Смежные вопросы

  • Нет связанных вопросов^_^