- •Алфавит, лексемы, ключевые слова языка Фортран. Метки. Комментарии.
- •Структура программы. Внешние подпрограммы. Внутренние подпрограммы. Модули.
- •Переменные. Переменная – это величина, которая может в программе принимать различные значения.
- •Условный оператор if... Then...End if.
- •12.Неявное определение типа.
- •13. Синтаксис определения производных типов
- •14. Атрибут parameter. Именованные константы и константные выражения
- •15. Атрибуты dimension и allocatable. Описание массивов.
- •16. Атрибут intent. Описание формальных параметров.
- •17. Определенные и неопределенные переменные. Выражения с массивами и присваивание массивов.
- •24,Внешние подпрограммы.
- •30.Оператор use
- •31.Основные сведения о массивах
- •32.Массивы. Динамические массивы.
- •33.Операторы allocate, deallocate.
- •34.Форматирование ввода-вывода. Оператор format.
- •35.Соединение файла с логическим устройством
- •Алфавит, лексемы, ключевые слова языка Фортран. Метки. Комментарии.
- •15. Атрибуты dimension и allocatable. Описание массивов.
- •18. Скалярные числовые выражения и скалярное числовое присваивание.
- •27. Модули. Области общей памяти.
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
