Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
327582.doc
Скачиваний:
2
Добавлен:
01.04.2025
Размер:
392 Кб
Скачать
☆

13. Синтаксис определения производных типов

Определение производного типа содержит комплекс операторов описания

составляющих его компонент и должно размещаться в блоке описания пе-

ред описаниями этих элементов. Самым подходящим местом для размеще-

ния определений производных типов может быть модуль, включаемый в ос-

тальные программные компоненты оператором use. Общий вид оператора

определения производного типа:

TYPE [ [, атрибут_доступа ] :: ] имя_типа

[ PRIVATE ]

оператор_описания_компонента

[оператор_описания_компонента]

…

[оператор_описания_компонента]

END TYPE [имя_типа]

где имя_типа не должно совпадать с именами встроенных типов.

Например:

TYPE, PRIVATE :: VARIATION

INTEGER LENGTH

CHARACTER*1, POINTER, DIMENSION( : ) :: STRING

END TYPE VARIATION

Оператор_описания_компонента строится по правилам, общим для всех опе-

раторов описания с некоторыми ограничениями: атрибутами компонентов

могут быть только pointer и dimension. Если компонентом производного

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

pointer, тип, к которому относится данный компонент, должен быть опи-

сан ранее. Аналогичный компонент с атрибутом pointer может иметь опи-

сываемый производный тип или тип, описание которого будет приведено

в дальнейшем примере

пример. Описание производного типа

TYPE ELEMENT

INTEGER NUMBER

REAL X, Y

TYPE(ELEMENT), POINTER :: NEXT_ELEMENT

END TYPE ELEMENT

Наличие элемента next_element описываемого типа позволяет произволь-

ным образом упорядочивать (связывать) множество объектов этого типа. Без

атрибута pointer вхождение компонента описываемого типа не допускается

Атрибутами доступа, объявляемыми в заголовке оператора определения ти-

па, могут быть атрибуты public и private, имеющие смысл только для оп-

ределений типов, размещаемых в модулях. Это же относится к оператору

private, производящему то же действие, что и одноименный атрибут

в операторе описания. Тип, отмеченный как private, доступен только внут-

ри модуля-носителя, то есть для любого блока видимости, включающего

модуль с описанием производного типа, не возможны ни выбор компонент,

ни генерация структур данного типа

Атрибут sequence используется для "совмещения" объектов производных

типов посредством ассоциированной памяти — прием, относящийся к нере-

комендуемым свойствам языка.

14. Атрибут parameter. Именованные константы и константные выражения

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

но в разных местах программы обращаться к одной и той же постоянной

величине, к ряду таких величин или значениям, производным от них. Хо-

рошим примером такого обращения являются параметры разновидности

буквальных констант числовых типов, физические или математические кон-

станты (например, числа е и п, скорость света, ускорение свободного паде-

ния и т. п.). Чтобы значение такого объекта сохранялось неизменным, нужно

защитить его от случайного переназначения. Использование буквальной

константы в качестве такой величины приведет к пересмотру множества

операторов и выражений, если понадобится изменить значение постоянной.

Для поддержания объектов такого рода применяются именованные констан-

ты. Именованная константа должна быть обязательно инициализирована

при описании. Появление именованной константы в левой части оператора

присваивания квалифицируется как ошибка компиляции. Описанное здесь

поведение именованных констант обеспечивается заменой на этапе компи-

ляции всех вхождений именованной константы ее значением, инициализи-

рованным в блоке описания.

Именованная константа определяется атрибутом parameter, который может

появляться:

- в списке атрибутов оператора описания:

INTEGER, PARAMETER :: NUM = 10;

- в операторе назначения атрибута (не рекомендуется):

INTEGER NUM, I, J, К

PARAMETER (NUM = 100)

Именованная константа может быть массивом:

INTEGER, PARAMETER, DIMENSION(3) :: DIMS = (/0, 1, 2/),

или структурой, т. е. объектом производного типа:

TYPE POINT

REAL X, Y

INTEGER I

END TYPE POINT

TYPE(POINT), PARAMETER :: ORIGIN = POINT(0., 0., 1)

Обязательным элементом определения именованной константы, как в опе-

раторе описания, так и в операторе назначения атрибута, является ее ини-

циализация в списке_объектов после двойного двоеточия:

REAL, PARAMETER :: PI = 3.14159265,

или в скобках после оператора parameter:

REAL PI

PARAMETER (PI = 3.14159265 )

Ввиду обязательности инициализации, в описании именованных констант

символьного типа можно использовать подразумеваемую длину:

CHARACTER(LEN = *), PARAMETER :: TEXT = 'Длинная строка'

Так как значение именованной константы подставляется в выражения на

этапе компиляции, их можно использовать в константных выражениях по-

следующих операторов описания, например, в качестве экстентов массивов:

INTEGER, PARAMETER :: NUM = 100

REAL X(NUM), Z(NUM, NUM), Y(2 * NUM)

CHARACTER(LEN = NUM) TEXT(NUM**2)

Константным называется такое выражение, в котором все операции встро-

енные, а операндами могут быть:

-константа или подобъект константы, в котором все индексные выраже-

ния представлены константными выражениями;

- конструкторы структур или массивов, в выражениях которых использу-

ются только константные выражения или переменные неявных циклов;

-обращение к встроенной элементной или преобразующей функции, ар-

гументы которой являются константными выражениями;

-обращение к справочной функции (кроме функций present, associated

или allocated), в котором каждый аргумент — константное выражение

или явно назначенная переменная.

В инициализирующем константном выражении допускаются:

-возведение в степень с целым показателем;

-встроенные элементные функции с результатами и аргументами целого

или символьного типа;

-преобразующие функции repeat, reshape, selected_int_kind,

SELECTED_REAL_KIND, TRANSFER И TRIM.

Например:

INTEGER, PARAMETER :: РАМ = 12, DOUBLE_REAL = KIND(0.DO)

INTEGER, PARAMETER :: LONG = SELECTED_REAL_KIND(PAM)

Объект, отмеченный атрибутом parameter, не может быть формальным па-

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

выделяемым объектом; и поэтому с ним несовместимы атрибуты pointer,

target, allocatable. Трудно представить, зачем может понадобиться со-

вмещение атрибута parameter с атрибутами intrinsic или external. Име-

нованная константа модуля может иметь атрибуты public или private.

Единственный атрибут, уверенно совмещаемый с атрибутом parameter, —

ЭТО DIMENSION

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]