я определил три типа в трех различных модулей (в трех разных файлах) с помощью следующей иерархии:ТОЛЬКО пункт и наследуя от модулей в каскаде
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
заявления, концепция наследования должна применяться здесь. Я не вижу преимущества использования модулей, вызывающих другие модули, если вам приходится писать все зависимости от модулей ...
Возможно, я, возможно, неправильно понял, любые объяснения будут оценены.
Вы понимаете 'only' положение на' use' заявления? Это (по-быстрому) кажется ответом на меня, но если есть более фундаментальное неправильное понимание, было бы лучше подойти к этому. – francescalus
Я признаю, что предложение 'only' здесь не обязательно, так как я только что объявил один тип в каждом модуле, но это только начало моих модулей (которые намного больше с гораздо большим количеством объявлений) – Coriolis
Ну, если у вас есть' USE module2, only: type2' вы не можете получить доступ к 'type1', если вы импортируете только' type2', не так ли? Кажется, вы хотели использовать USE module2 только: type1, type2'. –