2015-07-16 1 views
2

я определил структуру с отдельным компонентом в следующем примере:Конструктор с частным компонентом

module mtypes 
    implicit none 

    type mytype 
     integer, private :: nr 
    end type 

end module mtypes 

program main 

    use mtypes 
    type(mytype) :: t1 

    t1 = mytype(1) 
    print *, t1 

end program main 

Структура конструктор вызывается с 1 в качестве аргумента. Для моего понимания это не должно быть возможным, потому что nr является частным. Однако это составлено Intel(R) Visual Fortran Compiler XE 14.0.5.239 [IA-32], но не с gfortran 4.9.3 с использованием cygwin. Кроме того, оператор print показывает значение nr на выходе. Действительно ли это Fortran, чтобы определить структуру с частным компонентом таким образом, используя последний стандарт? Или это ошибка компилятора Intel?

ответ

3

В проекте Fortran 2008 неявные (то есть те, которые исходят от конструкторов структуры производного типа) подробно описаны в 4.5.10. Одним из ограничений является

Имя типа и все компоненты типа, для которых появляется спецификация компонента, должны быть доступны в модуле области видимости, содержащем конструктор структуры.

В качестве компонента nr не доступен в основной программе это ограничение нарушается наличием nr в качестве компонента-спецификации. Использование этого неявного конструктора структуры в модуле будет хорошо, так же как и инициализация по умолчанию для частного компонента.

nagfor также жалуется на ваш пример кода по этой причине.

В заявлении print это явно недействительно, и Ifort 15 жалуется на это. Для отображения t1 в списке выходных данных вы должны использовать процедуру вывода определения.