Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
современный фортран , Бортеньев.pdf
Скачиваний:
242
Добавлен:
26.03.2015
Размер:
2.34 Mб
Скачать

О. В. Бартеньев. Современный ФОРТРАН

...

end module b

 

subroutine c

! Переменная s модуля a доступна подпрограмме c

use a

! под своим настоящим именем s и именем bs

use b

 

...

 

end subroutine c

 

Имена глобальных объектов используемых программной единицей модулей могут дублироваться, если:

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

глобальные объекты, не являющиеся родовыми интерфейсами, доступны программной единице, но в ней не используются.

Если операторы USE содержатся в модуле, то все выбранные объекты рассматриваются как объекты самого модуля. Им можно дать атрибуты PRIVATE или PUBLIC как явно, так и по умолчанию. Задавать какие-либо иные атрибуты у выбранных объектов нельзя, но их можно включать в одну или более namelist-групп. Однако нельзя задать атрибут PUBLIC объекту включаемого модуля, если в последнем объект имеет атрибут PRIVATE.

Пример. Выполняется переименование имен производных типов данных.

module geometry

! Определения производных типов данных

type square

 

real side

 

integer border

 

end type

 

type circle

 

real radius

 

integer border

 

end type

 

end module

 

program test

! Переименуем имена типов данных модуля для локального использования use geometry, lsquare => square, lcircle => circle

type(lsquare) s1, s2

! Используем новые имена при объявлении

type(lcircle) c1, c2, c3

! переменных

8.9. Атрибуты PUBLIC и PRIVATE

Атрибуты PUBLIC и PRIVATE могут быть даны только объектам модуля. Атрибут PUBLIC указывает, что объект модуля может быть доступен в результате use-ассоциирования в использующих модуль

230

8. Программные единицы

программных единицах. Напротив, если объект модуля имеет атрибут PRIVATE, то он может быть использован только внутри модуля. Задание атрибутов может быть выполнено как отдельным оператором, так и при объявлении типа:

PUBLIC | PRIVATE [[::] объекты модуля]

type-spec, PUBLIC | PRIVATE [, атрибуты] :: объекты модуля

Объекты модуля могут включать имена переменных, констант, процедур, namelist-групп, производных типов и родовых описаний.

type-spec - оператор объявления встроенного или производного типа данных.

По умолчанию объекты модуля имеют атрибут PUBLIC. Если оператор PRIVATE задан без списка объектов модуля и нет объектов, для которых явно задан атрибут PUBLIC, то действие атрибута PRIVATE распространяется на все объекты модуля, даже если они объявлены до оператора PRIVATE. Например:

module pupr

! Переменные a и b имеют атрибут PRIVATE

real a

 

private

 

integer b

 

Аналогичный эффект вызывает задание без списка объектов модуля оператора PUBLIC. В модуле может быть только один оператор без списка объектов модуля (PUBLIC или PRIVATE).

Объекту не может быть дан атрибут PUBLIC, если он уже имеет атрибут

PRIVATE.

Родовое описание, если оно не имеет атрибут PRIVATE, является PUBLIC, даже если одно или все его специфические имена объявлены

PRIVATE.

Если namelist-группа имеет атрибут PUBLIC, то ни один из ее компонентов не может иметь атрибут PRIVATE.

Компоненты объявленного PUBLIC производного типа имеют атрибут PUBLIC, за исключением компонентов, которые имеют атрибут PRIVATE.

Пример:

module pupr

! Все переменные типа pri будут

type pri

private

! иметь атрибут PRIVATE

integer ix, iy

 

end type pri

 

type, public :: pub

 

real x, y

! Этот компонент типа pub имеет

type(pri) epin

end type pub

! атрибут PRIVATE

type(pub), public :: ep = pub(3.0, 4.0, pri(3, 3))

231