next up previous contents
След.: Подмодули Выше: f08_new_win Пред.: Комассивы в процедурах   Содержание


Модули

Модули являются программными единицами, содержащими данные, процедуры, описания типов, объектов и т.п. Заголовок модуля обязателен и имеет вид MODULE имя, завершается модуль указанием END MODULE [имя]. Имя, если есть, то же самое. Сначала в модуле располагаются объявления -- типов, данных и процедур, а затем, после слова CONTAINS, могут идти определения (тела) модульных процедур.

Отметим, что и другие программные единицы, а именно, основная программа и процедуры, также могут иметь свои внутренние процедуры, описываемые после слова CONTAINS. Внутренние процедуры имеют доступ к данным объемлющей программной единицы. Внутренние процедуры не могут иметь свои внутренние процедуры.

Данные и процедуры, объявленные с атрибутом PUBLIC, доступны программным единицам, использующим модуль: открытые данные (здесь под данными подразумеваются также и процедуры). Этот атрибут назначен по умолчанию. Слово PUBLIC включает этот атрибут по умолчанию. Атрибут PRIVATE сопутствует скрытым данным и процедурам, которые используются только внутри модуля. Оператор PRIVATE включает этот атрибут по умолчанию. Данные, объявленные с атрибутом PROTECTED, доступны для чтения вне модуля, но их нельзя изменять вне модуля. Пример, приведенный в [14]: в модуле имеются две переменные, содержащие температуру по шкале Цельсия и Фаренгейта, а также процедура, принимающая температуру в градусах Цельсия в качестве параметра и определяющая соответствующие защищенные переменные. В итоге значения температуры доступны для чтения и могут быть изменены (посредством процедуры), но гарантируется согласие значений температуры в двух шкалах.

Для использования модуля его следует объявить в операторе USE:

USE имя [, [ONLY:] список имен ]

То есть после слова USE указывается имя модуля. Если на этом оператор кончается, все открытые данные модуля доступны под своим именем. Слово ONLY позволяет сделать доступными только перечисленные данные из числа открытых в модуле. Возможно переименование данных в виде A => myA. Если слово ONLY: опущено, список имен служит для переименования данных. Возможность импорта лишь нужных данных и их переименования чрезвычайно полезна, особенно при сопровождении и развитии чужого кода, когда возникают конфликты имен. Можно подключить встроенный модуль, указав слово INTRINSIC (эта возможность позволяет подключать одноименные внешний и внутренний модули).

Примеры. Пусть модуль описан так:

MODULE consts

REAL, PARAMETER:: pi = 3.14, Euler = 2.7

REAL, PARAMETER:: diag = SQRT(2)

REAL, DIMENSION(100):: sins

PRIVATE

REAL:: full_angle = 360.

PUBLIC gr2rad

CONTAINS

FUNCTION gr2rad(g) RESULT r

REAL, INTENT(IN):: g

PURE, REAL :: gr2rad

r = g * pi / 180.

RETURN

END FUNCTION

END MODULE consts

Пусть в начале программы имеется оператор

USE consts, ONLY: pi, Euler => e

Это означает, что в программе доступны константы $ \pi$ и $ \mathrm{e}$ , причем последней дано новое имя (вместо используемого в модуле имени Euler).

Модули, в частности, используются для:

  1. хранения констант, общих для всей программы;
  2. объявления глобальных данных, в том числе -- размещаемых;
  3. определения производных типов;
  4. создания библиотек процедур;
  5. перегрузки операций;
  6. абстракции данных и кода -- пользователю доступны открытые данные и процедуры, а детали скрыты атрибутом PRIVATE;
  7. создания библиотеки классов.

Для создания своих модулей следует понять синтаксис оператора USE (с возможностью частичного импорта и переименования объектов), атрибутов PRIVATE и PUBLIC. Нужно помнить, что реализация процедур отделена от части объявлений оператором CONTAINS.



Подсекции

Ilya A. Chernov 2012-12-19
X