Вы находитесь на странице: 1из 472

С. Д.

Алгазин,
В. В. Кондратьев

Программирование
на
VISUAL FORTRAN

МОСКВА • • 2008
УДК
ББК
А45

А лгазин С. Д ., К ондратьев В. В.
А45 П рограм м ирование на V isual Fortran. - М.: Д иалог-М И Ф И , 2008. - 472 с.
ISBN 978-5-86404-224-3
В книге описы вается новая версия Intel Fortran, которая вклю чает в себя Fortran 90,
Fortran 95 и элем енты Fortran 2003.
Книга в первую очередь предназначена для научных сотрудников, занимающихся
м атематическим м оделированием задач на язы ке Fortran, но мож ет полезна студентам,
аспирантам и инж енерам в их повседневной работе.

Учебное пособие
А лгазин Сергей Д м итриевич,
К ондратьев Владимир Васильевич
П рограм м ирование на Visual Fortran

Редактор О. А. Голубев
Макет Н. В. Дмитриевой

Подписано в печать 15.06.2008.


Формат 70x100/16. Бум. офс. Печать офс. Гарнитура Таймс.
Уел. печ. л. 38,06. Уч.-изд. л. 25,69. Тираж I 000 экз. Заказ

ООО “ Издательство ДИАЛОГ-МИФИ"


! 15409, Москва, ул. Москворечье, 31. корп. 2. Т.: (495) 320-30-77. 320-43-77
Http://\vvvvv.dialog-mi fi.ru E-mail zakazC« dialog-mifr.ru
ООО "ИНСОФТ"
117105, г. Москва. Варшавское ш , д 37А

978-5-86404-224-3 © Алгазин С. Д., Кондратьев В. В., 2008


© Оригинал-макет, оформление обложки
ООО “Издательство ДИАЛОГ-МИФИ", 2008
Предисловие

На русском язы ке имеется несколько книг но соврем енном у F ortran [1 -4 ]. К ниги [1 ,4 ]


посвящ ены описанию стандартов Fortran 95 и 90. Книга [2] вклю чает кром е этих стан ­
дартов описание элементов Fortran 2003. Книга [3] описы вает конкретную реализацию
Com pac Visual Fortran, который в настоящ ее время фирм ой не поддерж ивается. Д анная
книга посвящ ена описанию последней версии Intel V isual F ortran 9.1 (которы й вклю чает
Fortran 90/95, элементы Fortran 2003 и многочисленны е ф ирм енны е расш и рен и я этих
стандартов), ш ироко распространённой в России.
П рограммный продукт, описанны й в этой книге, обеспечивает и н струм ентальны е
средства для разработчиков програм много обеспечения W indow s, для создания прилож е­
ний, которые управляю тся процессорами Intel 1А-32, процессорам и Intel с расш иренной
памятью технологии Intel 64 (Intel ЕМ 64Т) и процессорам и Intel llanium 2. О птим изация
вклю чает поддерж ку Stream ing S1MD Extensions 2 S1MD 2 (SSE 2) в процессорах Intel
Pentium 4 и Intel Pentium M, Stream ing SIM D E xtensions 3 SIM D 3 (SSE3) в процессорах
Intel Pentium 4 и Intel Core с поддерж кой SSE3 и конвейерной обработкой програм м ного
обеспечения в процессорах Intel Itanium 2. М еж процедурная оптим изация (1РО) и уп р ав­
ляемая конфигурацией оптим изация (PG O ) м ож ет обеспечить больш ее прикладное зн а­
чение. П оддерж ка компиляторов Intel обеспечивала кодовую разработку через п оддерж ­
ку О репМ Р и автопараллелизм.
Стандартное издание этого продукта состоит из ком пилятора Intel V isual Fortran, о т­
ладчика Intel, интеграции в визуальны е среды разработки M icrosoft, кодовое покры тие и
тестовых инструментальных средств установления приоритетов. П роф есси он альн ое и з­
дание вклю чает всё из стандартного издания и библиотеку F ortran IM SL 5.0.

Введение
Fortran 95 вклю чает Fortran 90 и больш инство возм ож ностей Fortran 77. Fortran 90 яв­
ляется надмнож еством, которое вклю чает Fortran 77. Intel Fortran полностью поддерж и­
вает Fortran 95, Fortran 90 и Fortran 77.
Ниже обсуждается соответствие стандартов Intel Fortran, язы ковая совм естим ость
и новый язык. О бсуждаю тся возм ож ности Fortran 2003, поддерж иваем ы е Intel Fortran.

Языковое соответствие стандартов


Intel Fortran соответствует А мериканском у национальном у эталону F ortran 95 (A N SI
X 3J3/96-007), который соответствует стандарту М еж дународной организации по стан ­
дартизации 1SO/1EC 1539-1:1997 (Е), и А мериканскому национальном у эталону Fortran
90 (ANSI ХЗ. 198-1992), который соответствует стандарту М еж дународной организации
по стандартизации 1SO/1EC 1539:1991 (Е), и вклю чает поддерж ку некоторы х возм ож н о­
стей из стандартного Fortran 2003.
Комитет ANSI X3J3 в настоящ ее время отвечает за вопросы интерпретации язы ковы х
возможностей Fortran 95 и Fortran 90. Л ю бы е ответы , данны е комитетом A N SI, которы е
связаны с возможностями, осущ ествленны м и в Intel Fortran, м огут привести к изм енени­
ям в будущ их выпусках компилятора Intel Fortran, даж е если изм енения приводят к несо­
вместимости с более ранними выпусками Intel Fortran.

ûm am m 3
4 С. Д A.ijaji/H, В В Кондратьев. Программирование на Visual FORTRAN

Intel Fortran обеспечиваех м нож ество расш ирений к стандарту Fortran 95.
Intel Fortran такж е вклю чает поддерж ку програм мам, которы е соответствую т преды­
дущ им стандартам F ortran (A N SI Х3.9--1978 и A N SI Х З.0 -1 9 6 6 ), стандарту М еж дународ­
ной организации по стандартизации ISO 1539-1980 (Е), Ф едеральному стандарту И нсти­
тута обработки инф орм ации F1PS 69-1 и спецификации Стандарта Вооруженных
Сил 1753.

Языковая совместимость
Intel Fortran хорош о совм естим с Fortran Com paq и Fortran Com paq 77 на поддерж и­
ваемых платф орм ах, и он сущ ественно совместим с P D P -1 1 и Fortran VAX 77.

Новые языковые возможности


Главны е новые возм ож ности таковы :
■ О пределяем ы е пользователем операторы м огут быть переименованы в утверждениях
USE (возм ож ность Fortran 2003). П ереименовы вание или единственный оператор в
утверж дении USE м огут теперь чакже установить определяемы й оператор (см.
разд. 7.4).
■ А трибут и утверж дение P R O TEC TED (возм ож ность Fortran 2003). А трибут
PR O T E C T E D огран ичивает использование объектов модуля (см. разд. 4.18).
■ О бъекты указателя м огут иметь атрибут IN TEN T (возм ож ность Fortran 2003) Атрибут
IN T E N T м ож ет бы ть определен для параметров формального аргум ента (см.
разд. 4.11).
■ Встроенная подпрограм м а M O V E A L L O C (возм ож ность Fortran 2003).
■ В строенная подпрограм м а M O V E A LLO C , перемещ ает распределение от одного рас­
пределяем ого объекта к другом у (см. гл. 8).

Возможности Fortran 2003


Intel Fortran поддерж ивает следую щ ие возможности Fortran 2003:
■ Расш ирение для ком понентов производного типа, р езу л ь таю в функций и формальных
параметров.
■ В строенная подпрограм м а G ET_C O M M A N D .
■ В строенная п одпрограм м а G E T C O M M A N D A RG U M EN T.
■ В строенная подпрограм м а C O M M A N D A R G U M E N T C O U N T .
■ Встроенная подпрограм м а G E T EN V IR O N M E N T V A RIA B LE.
■ Р аспределяем ы е ком поненты производны х типов.
■ Распределяем ы е ф орм альны е параметры .
■ Р аспределяем ы е ф ункциональны е результаты.
■ А три бут и утверж дение V O LA T ILE .
■ И мена длиной до 63 знаков.
■ У тверж дения до 256 строк.
■ И менованны й парам етр константы м ож ет бы ть частью комплексной константы.
■ Во всех утверж дениях ввода/вы вода следую щ ие числовые значения могут быть лю бо­
го вида: U N IT =, 10S T A T =.
■ Числовы е значения O PEN м огут бы ть лю бого вида: RECL =.
■ Числовы е значения R EA D и W R IT E м огут бы ть лю бого вида: REC SIZE =.
П редисловие 5
■ Следую щ ие числовы е значения IN Q U IR E м огут быть лю бого вида: N E X T R EC =,
NU M BER -R E C L =, SIZE =.
■ Рекурсивный ввод/вывод допускается, если новый начинаемый ввод/вывод является
внутренним, который не изменяет никакого внутреннего файла кроме ero собственного.
■ Бесконечности 1ЕЕЕ1 и N ans показываю тся форм атированны м выводом как оп ределе­
но Fortran 2003.
■ В форматном вводе/вы воде запятая после описателя редактирования Р является н е­
обязательной, ког да сопровож дается специф икатором повторения.
■ Встроенные подпрограммы им ею т необязательны й параметр K IN D =: A CH A R,
COUNT, LACHAR, 1CHAR, IN D EX , LBO U N D , LEN, L E N T R 1 M , M A X LO C ,
M IN LO C, SCAN, SHA PE, SIZE, U BO U N D , V ERIFY .
■ Квадратны е скобки [] допускаю тся для разграничения конструкций м ассива вместо
двух сим волов слеш а (//).
■ Набор символов Fortran расширен и содержит 8-битовые знаки ASCII: \, [ ] ,', Л, {}, | , #.
Следую щ ие новые возм ож ности Fortran 2003 в этом выпуске:
■ О пределяемые пользователем операторы м огут быть переименованы в утверж дениях
USE.
■ Встроенная подпрограмм а M O V E A LLO C.
■ А трибут и утверж дение PR O TEC TED .
■ Объекты указателя м огут иметь атрибут IN TEN T.

1 IEEE The Institute o f Electrical and Electronics Engineers, Inc., (произносится ай-трипл-и) - Ин­
ститут инженеров по электротехнике и радиоэлектронике, ИИЭР (США), крупнейшая в мире ор­
ганизация (w ebsite: http://www.ieee.org/), объединяющая более 300 тыс. технических специалистов
из 147 стран, ведущая организация по стандартизации, отвечающая также за сетевые стандар­
ты. Обраювана в 1963 г. в результате слияния американских обществ IAEE, основанного в 1884 г.,
и IRE, основанного в 1912 г. ИИЭР проводит и спонсирует технические конференции, симпозиумы
и семинары, ведет большую издательскую и образовательную деятельность.
Глава 1. Структура программы, знаки
и исходные формы

1.1. Структура программы


П рограм ма Fortran состоит из одной или нескольких программных единиц. П ро­
граммная единица - обычно последовательность предлож ений, которые определяют ср е­
ду данных и шаги, необходимые, чтобы выполнить вычисления; эти предложения закан­
чиваю тся утверж дением END. П рограм мная единица м ож ет быть основной программой,
внеш ней подпрограммой, м одулем или модулем программы блока данных. Выполнимая
программа содерж ит одну основную програм му и произвольное число программных
единиц других видов. П рограм мные единицы м огут бы ть собраны отдельно. Внешняя
подпрограмма - функция или подпрограмм а, которая не содерж ится в пределах основной
программы , модуля или другой подпрограмм ы . О на определяет процедуру, которая будет
выполнена и м ож ет быть вы звана из других програм мны х единиц программы Fortran.
М одули программы блока данных невы полнимы , таким образом они, как полагаю т, яв­
ляю тся процедурами. (М одули м огут содерж ать процедуры модуля, которые, тем не ме­
нее, являю тся вы полнимыми.) Модули содерж ат определения, которые могут быть сдела­
ны доступны м и для других модулей програм мы : данны е и определения типов, определе­
ния процедур (называемых подпрограммами модуля) и интерфейсы процедуры. Подпро­
граммы модуля могут быть или функциями или подпрограммами. Они могут быть
вызваны другим и подпрограммами модуля в модуле или другим и модулями программы.
Модуль программы блока данных определяет начальны е значения для объектов, данных в
именованных общ их блоках. В Fortran 90/95 этот тип модуля программы мож ет быть за­
менен модулем программной единицы.
О сновны е программы, внеш ние подпрограмм ы и подпрограмм ы модуля могут содер­
ж ать внутренние подпрограммы. Главная программная единица или процедура, которая
содерж ит внутренню ю процедуру, назы вается объемлю щ им контекстом внутренней про­
цедуры, или хостом (от англ. host - объемлю щ ий контекст). В нутренние подпрограммы
м огут быть вызваны только их хостом или другим и внутренними подпрограммами в том
же самом хосте. В нутренние подпрограмм ы не долж ны содерж ать внутренние подпро­
граммы.

1.2. Утверждения
Утверждения программы группируются в 2 основных класса: выполнимый и невыполни­
мый. Выполнимое утверждение определяет действие, которое будет выполнено. Невыполни­
м ое утверж дение описывает атрибуты программы, такие как расположения и характеристи­
ки данных, гак же как информацию преобразования данных и редактирования.

Порядок утверждений в модуле программы


Н а рис. 1.1 показан необходимый порядок утверж дений в модуле программы Fortran.
Н а этом рисунке вертикальны е линии отделяю т типы утверж дений, которые могут бы ть
вставлены. Например, вы мож ете вставить утверж дение D A TA с выполнимыми конст­
рукциями. Горизонтальны е линии указы ваю т типы утверж дений, которые не могут быть
вставлены. Н апример, вы не м ож ете вставить утверж дение DATA с утверждением
CO N TA IN S.

йтоттп 6
Глава 1. С т рукт ура програм м ы , т аки и исходны е ф орм ы 7
О братите внимание, что на этом рисунке утверж дения директивы IN C LU D E, утвер­
ждения OPTIO NS и порядок утверж дений N A M E LIST - язы ковы е расш ирения.
Утверждения PUBLIC и PR IV A TE разреш аю тся только в м одулях обзора модулей.
В Fortran 95/90 утверждения N A M E LIST м огут появиться только среди описаний. О дн а­
ко Intel Fortran позволяет им такж е появляться среди вы полним ы х утверж дений.
Линии комментариев, Ут­
верждения INCLUDE Утверждение OPTIONS
и Директивы
Утверждение PROGRAM, FUNCTION, SUBROUTINE, MODULE или BLOCK DATA
Утверждения USE
Утверждения
NAMELIST,
Утверждение IMPLICIT NONE
FORMAT
и ENTRY
Утверждения PARAMETER Утверждения IMPLICIT
Определения производного типа,
Блоки интерфейса, Утверждения
Утверждения PARAMETER и DATA объявления Типа, Утверждения
функции,
Утверждения и Описания
Утверждения DATA Выполнимые Утверждения
Утверждение CONTAINS
Внутренние Подпрограммы или Подпрограммы Модуля
Утверждение END
Рис. 1.1. Обязательный порядок утверждений

Таблица 1.1. Утверждения, ограниченные в блоках области действия


Модуль обзора Ограниченные утверждения
Основная программа Утверждения ENTRY и RETURN
Программная единица Block Утверждения CONTAINS, ENTRY и FORMAT, блоки интерфейса,
Data функции и выполнимые утверждения
Внутренняя подпрограмма Утверждения CONTAINS и ENTRY
Тело интерфейса Утверждения CONTAINS, DATA, ENTRY, SAVE и FORMAT, утвержде­
ние функции и выполнимые утверждения

Имена
Имена идентифицирую т объекты в пределах программной единицы Fortran (тип пе­
ременных, результаты функции, им енованны е константы, процедуры, програм мны е м о­
дули, группы списка имен и форм альны е параметры). В Fortran 77 имена назывались
"символическими именами".
Имя может содержать символы, цифры, символ подчеркивания (_) и знак доллара
( $ ) - специальный знак. П ервы й знак долж ен бы ть символом или знаком доллара.
В Fortran 95/90 имя может содерж ать до 31 знака. Fortran Intel разреш ает имена до
63 знаков.
Длина имени модуля (в утверж дениях M O D U LE и USE) может быть ограничена ва­
шей файловой системой.
Примечание. Будьте внимательны, определяя имена, которые содержат долларовые признаки.
Знак доллара может быть символом для команды или замены символа в различных оболочках и
сервисных командах.
8 С .Д А ъчи ин, В В К ондрат ьев П рограм ирование на Visual FO RTRAN

В вы полним ой програм ме им ена следую щ их объектов глобальны и долж ны быть


уникальны ми во всей программе:
■ О сновная программа.
■ Внеш ние процедуры.
» О бщ ие блоки.
■ М одули.
С ледую щ ие примеры показы ваю т допустим ы е и недопустимы е имена:
Допуст имо
NUM BER
F1N D 1T
X
Н едопуст имые имена
5Q - начинается с числа.
В.4 - содержит специальный знак, отличный от подчеркивания (_) или знака доллара ($).
W RO NG - начинается с подчеркивания.

1.3. Наборы символов


F ortran Intel поддерж ивает следую щ ие знаки:
1. Н абор сим волов Fortran 95/90, который состоит из следую щ их символов:
■ все прописны е буквы латинского алф авита и сим волы ниж него регистра (через Z и
через z);
■ цифры 0 до 9;
■ сим вол подчеркивания (_); 1
■ специальны е знаки, приведенны е для наглядности в таблице.
Символ ■ Имя Символ Имя
А или <ТаЬ> Пробел или табулятор Двоеточие
= Знак равенства " Кавычки
+ Знак плюс % Знак процента
* Амперсанд
Звездочка &
1 Слеш 1 Точка с запятой
< Левая круглая скобка < Меньше чем
) Правая круглая скобка > Больше чем
Запятая ? Вопросительный знак
Период (десятичная точка) $ Знак доллара
* Апостроф
2. Д ругие пригодны е для печатания знаки, которые вклю чаю '1 в себя символ табуля­
ции (09 ш естнадцатеричны й) и знаки А 8СП с кодами от 20 (ш естнадцатеричный) до 7Е
(ш естнадцатеричны й). П ригодны е для печатания знаки, которые не находятся в Рог1-
гап 95/90 набор сим волов м ож ет только появиться в комм ентариях, символьных констан­
тах, холеритовы х константах, строке редактирования оиисателя и записях ввода/вывода.
П рописны е буквы и сим волы нижнего регистра обрабаты ваю тся как эквивалентные
(кром е сим вольны х констант и холеритовы х констант).

1.4. Форматы исходного текста


В пределах програм мы исходный текст мож ет бы ть в свободном формате, фиксиро­
ванном форм ате или табулированной форм е (расш ирение Рог1гап 1п1е1 - вводится при по­
Г лава 1 С т рукт ура программ ы , т аки и исходны е ф орм ы 9
мощи клавиши табуляции). Ф иксируемый формат или табулированная ф орм а не долж ны
быть смеш анными со свободной формой в той же самой исходной програм ме, но м огут
использоваться в других различных исходных формах. Все исходны е формы позволяю т
символам нижнего регистра использоваться как альтернатива заглавным знакам.
Н есколько знаков-индикаторов в исходном тексте (если они не появляю тся в преде­
лах комментария в холеритовых или символьных константах). П рименимы следую щ ие
правила для индикаторов во всех исходных формах:
/ [с л е ш ]; [точка с запятой];
( [левая круглая скобка] < [меньше чем];
) [правая круглая скобка] > [больше чем];
, [запятая] ? [вопросительный знак];
. [период (десятичная точка)] $ [знак доллара];
’[апостроф].
Индикатор комментария может предш ествовать первому утверж дению модуля
программы и появляться где-нибудь в пределах м одуля програм мы . Если индикатор
комментария появляется в пределах исходной строки, комм ентарий простирается до
конца строки. Вся пустая строка - такж е строка комм ентария. Ком м ентарии не имею т
никакого эффекта на интерпретацию модуля программы.
Разделитель утверждения. Больш е чем 'одно утверж дение (или только часть утвер­
ждения) может появиться на отдельной исходной строке, если между утверж дениями
помещен разделитель утверждения. Разделитель утверж дения - точка с запятой (;). П о­
следовательные точки с запятой (с прош едш ими пробелам и или без них), эквивалентны
точке с запятой. Если точка с занятой - последний знак на строке или последний знак пе­
ред комментарием, текст после него игнорируется.
Индикатор продолжения. П редложение мож ет бы ть продолж ено больш е чем на од­
ну строку, если помещ ен индикатор продолж ения на строке. Fortran Intel позволяет по
крайней мере 511 строк продолж ения для фиксированной исходной програм мы или та­
булированной программы и по крайней мере 255 продолж ений для свободной формы ис­
ходной программы.
Комментарии м огут появиться внутри продолж аемого утверж дения, но строки ком ­
ментария не могут бы ть продолжены. Внутри модуля програм мы утверж дение END не
может быть продолж ено и никакое другое утверж дение в м одуле программы не мож ет
иметь начальную строку, начинаю щ ую ся с END модуля программы .
Для получения дополнительной информации об индикаторах продолж ения в свобод­
ной исходной форме (см. "Свободная исходная форма"); в фиксированном формате и в
табулированном формате формы счета (см. разд. 1.5).
Табл. 1.2 описы вает знаки, используемые как индикаторы в исходны х формах.

Таблица 1.2. Индикаторы в форматах исходного текста


Исходный элемент Индикатор1 Исходный формат Позиция
Комментарий ! Все форматы Где-нибудь в исходном тексте
Строка комментария ! Свободный В начале исходной линии
!, С или * Фиксированный В столбце 1
Табулированный В столбце 1
Строка продолжения2 & Свободный В конце исходной линии
Любой символ Фиксированный В столбце 6
кроме нуля или
пробела
10 С. Д . А чгазин, В В К он драт ьев П рограм ирование на Visual FORTRAN

Исходный элемент Индикатор1 Исходный формат Позиция


Любая цифра Табулированный После первого табулятора
кроме нуля
Разделитель утверждения Все форматы Между утверждениями на той же
строке
Метка утверждения 15 десятичных Свободный Перед утверждением
цифр
Фиксированный В столбцах 1-5
Табулированный Перед первым табулятором
Утверждение отладки3 Фиксированный В столбце 1
Табулированный В столбце 1
1 Если символ появляется в холеритовой или символьной константе, он не индикатор и игнорируется.
2 Для фиксированного или табулированного формата исходного текста допускаются по крайней мере 511 строк продолже­
ния. Свободный исходный формат допускает по крайней мере 255 строк продолжения
3 Только фиксированный и табулированный формат.

И сходны й текст мож ет бы ть записан так, чтобы он был используемым для всех ис­
ходны х форм (см. разд. 1.7).

Метки утверждения
Метка ут верж дения (или номер утверж дения) идентифицирует утверждение так,
чтобы другие утверж дения могли обратиться к нему, или получить информацию , или пе­
редать управление. М етка м ож ет предш ествовать лю бом у утверж дению , которое не яв­
ляется частью другого утверж дения.
М етка утверж дения долж на бы ть длины до пяти десятичны х цифр; пробелы и началь­
ные нули игнорирую тся.
Все нулевы е метки утверж дения недействительны и пустой оператор не может быть
маркирован.
М аркированны й FO R M A T и м аркированны е вы полним ы е утверждения - единствен­
ные утверж дения, которы е м огут бы ть упом януты другими утверждениями. Утвержде­
ния F O R M A T упом януты только в специф икаторе ф ормата ввода/вывода или в утвер­
ж дениях A SSIG N . Д ва утверж дения внутри модуля не могут иметь ту же самую метку.

Свободная исходная форма


В свободной исходной ф орм е утверж дения не ограничены определенными позициями
на исходной строке. В Fortran 95/90 свободная исходная строка формы может содержать
от 0 до 132 знаков. Fortran Intel позволяет иметь строку лю бой длины.
Знаки пробела сущ ественны в свободной исходной форме. П рименимы следую щ ие
правила для знаков пробела:
■ Знак пробела не долж ен появляться в лексических сим волах, кроме как внутри си м ­
вольного контекста. Для примера: не мож ет быть никаких пробелов внутри оператора
возведения в степень **. Знак пробела м ож ет использоваться свободно между лекси ­
ческими сим волам и, чтобы улучш ить четкость.
■ Знак пробела долж ен использоваться, чтобы отделять имена, константы или метки от
см еж ного клю чевого слова, имени, константы или метки. Например, рассмотрите
следую щ ие утверж дения:
INTEGER NUM
GO ТО 40
20 DO К=1,8
Глава I С т рукт ура програм м ы , знаки и исходны е ф орм ы 11
Пробелы требую тся после INTEG ER, ТО, 20 и DO.
Таблица показывает, какие клю чевые слова им ею т доп олнительны е или требуем ы е
пробелы.
Необязательные пробелы Требуемые пробелы
BLOCK DATA CASE DEFAULT
DOUBLE COMPLEX DO WHILE
DOUBLE PRECISION IMPLICIT type-specifier
ELSE IF IMPLICIT NONE
ELSEWHERE INTERFACE ASSIGNMENT
END BLOCK DATA INTERFACE OPERATOR
END DO MODULE PROCEDURE
END FILE RECURSIVE FUNCTION
END FORALL RECURSIVE SUBROUTINE
END FUNCTION RECURSIVE type-specifier FUNCTION
END IF type-specifier FUNCTION
END INTERFACE type-specifier RECURSIVE FUNCTION
END MODULE
END PROGRAM
END SELECT
END SUBROUTINE
END TYPE
END WHERE
G O TO
IN OUT
SELECT CASE
Для информации о разделителях утверж дения (;) во всех ф орм ах (см. разд. 1.7).

Индикатор комментария
В свободной исходной форм е восклицательны й знак (!) указы вает ком м ентарий, если
он располож ен в пределах строки, или строку ком м ентария, если это первы й знак в ис­
ходной строке.

Индикатор продолжения
В свободной исходной форме символ ам персанда (&) указы вает строку продолж ения
(если этот знак не появляется в холеритовой или сим вольной константе, или в пределах
комментария). Строка продолж ения - это первая строка неком м ентария после ам п ерсан ­
да. Хотя РогЧгап 95/90 разреш ает до 39 продолж ений строки в програм мах свободной
формы, РогЧгап 1п1е1 допускает до 511 строк продолж ения.
Следую щ ий прим ер показы вает продолж ение утверж дения:
ТС 08Н (У ) = ЕХР(У) + & ! Начальная строка утверждения
ЕХР(-У) ! строка продолжения
Если первый знак не знак пробела на следую щ ей строке неком м ентария - ам персанд,
утверж дение продолж ается в знаке после амперсанда. П реды дущ ий прим ер м ож ет бы ть
записан таким образом:
ТС 08Н (У ) = ЕХР(У) + &
& ЕХР(-У)
и _______ С. Д. Алгазин, В. В. К ондрат ьев Программирование на Visual FORTRAN

Если лексический сим вол долж ен быть продолж ен, первый не знак пробела на сле­
дую щ ей строке неком ментария долж ен бы ть амперсанд, сопровож даемый немедленно
остальной частью символа. Н апример:
TCOSH(Y) = EXP(Y) + ЕХ&
&P(-Y)
Если вы продолж аете сим вольную константу, ам персанд долж ен быть первым знаком
строки (пробелы перед ам персандом игнорирую тся). У тверж дение продолж ается со сле­
дую щ им знаком после ам персанда. Для примера:
ADVERTISER = "Davis, O’Brien, Chalmers & Peter&
&son"
ARCHITECT = "O’Connor, Emerson, and Davis&
& Associates"
Если ам персанд опущ ен на строке продолж ения, утверж дение продолж ается с первым
не знаком пробела в строке. Так, в преды дущ ем примере был бы поставлен пробел перед
"A ssociates".
А мперсанд не м ож ет быть единственны м не знаком пробела в строке, или единствен­
ном не знаком пробела перед комм ентарием ; ам персанд в комментарии игнорируется.

1.5. Фиксированные и табулированные формы


В Fortran 95 фиксированная исходная форма идентифицирована как устареваю щ ая.
В фиксированной и табулированны х ф орм ах1 есть ограничения на то, что утверж де­
ние м ож ет появиться в пределах строки. По ум олчанию утверж дение мож ет простираться
до позиции 72. В этом случае лю бой текст после позиции 72 игнорируется, и никакое
предупреж даю щ ее сообщ ение не печатается. Вы можете определить опцию компилятора,
и тогда строка кончается позицией 132. Кром е того, в символьном контексте пробелы не­
сущ ественны и м огут использоваться свободно повсю ду в программе для максимальной
четкости.
Н екоторы е компиляторы Fortran использую т пробелы, чтобы удлинить короткие ис­
ходны е строки к 72 знакам. По ум олчанию Intel Fortran не делает этого. Если вы обеспо­
коены м обильностью програм мы , то можете использовать оператор конкатенации (свя­
зи), чтобы предотвратить преобразование исходных строк от того, чтобы быть дополнен­
ными другим и компиляторами Fortran (см. пример в "И ндикатор продолжения"), или вы
м ож ете вы нудить короткие исходны е строки быть дополненны ми при использовании о п ­
ций компилятора.

Индикатор комментария
В ф иксированном и табулированном исходных форматах символ (!) восклицательного
знака указы вает комм ентарий, если он находится внутри исходной строки. (Он не долж ен
появляться в столбце 6 строки фиксированного формата; этот столбец зарезервирован
для индикатора продолж ения.)
Символ С (или с), звездочка (*) или восклицательный знак (!) указываю т строку ком ­
ментария, когда они появляю тся в столбце 1 исходной строки.

1 Файл программы на РоПгап в фиксированной форме должен иметь расширение ]ог, а в свобод­
ном формате ?Э0.
Г иш а I С т рукт ура програм м ы , т аки и исходны е ф орм ы 13
Индикатор продолжения
В фиксированной и табулированной форме строка продолж ения обозначена одним из
следую щ их способов: '
■ Для фиксированной формы: лю бой знак (кроме нуля или пробела) в колонке 6 исход­
ной строки.
■ Для табулированной формы: лю бая цифра (кроме 0) после табулятора.
Ком пилятор полагает, что знаки после индикатора продолж ения будут частью п реды ­
дущ ей строки. Х отя Fortran 95/90 разреш ает до 19 строк продолж ения в програм ме ф и к­
сированного формата, Fortran Intel разреш ает до 511 строк продолж ения.
Если нуль или пробел использую тся как индикатор продолж ения, ком пилятор полага­
ет, что строка будет начальной строкой утверж дения Fortran. О бласть метки утверж дения
строки продолж ения долж на бы ть пробелом (кроме случая отладки утверж дения).
Когда длинны е сим вольны е или холериговы е константы продолж ены поперек строк,
могу г возникнуть проблемы м обильности. И спользуйте оператор конкатенации (связи),
чтобы избеж ать таких проблем. Например:
PRINT *, ’ Это очень длинная символьная константа 'II
+ ’ которая безопасно продолжена поперек строк’
Используйте этот тог же самы й метод, инициализируя данны е с длинны м и си м воль­
ными или холеритовыми константам и. Наггример:
CHARACTER^*) LONG.CONST
PARAMETER (LONG.CONST = This is a very long 7/
+ ’character constant which is safely continued 'II
+ ’across lines’)
CHARACTER* 100 LONG.VAL
DATA LONG_VAL /LONG .CONST/
Х олериговы е константы долж ны бы ть преобразованы к сим вольны м константам п е­
ред использованием метода конкатенации продолж ения строки.

1.6. Индикатор утверждения отладки


В фиксированной и табулированной формах область метки у!верж ден и я мож ет со ­
держать метку утверж дения, комм ентарий индикатора или индикатор утверж дения о т­
ладки. Символ D указывает утверж дение отладки, когда он появляется в колонке 1 ис­
ходной строки. Н ачальная строка утверж дения отладки может' содерж ать метку утвер ­
ждения в остаю щ ихся колонках области метки утверждения.
Если утверж дение отладки продолж ено на больш е чем одну строку, каж дая строка
продолж ения долж на начинаться с D и индикатора продолж ения. По ум олчанию ком пи­
лятор обрабаты вает утверж дения отладки как комментарии. О днако вы м ож ете оп реде­
лить опцию компилятора, чтобы вы звать компилятор и обработать утверж дения отладки
как исходный текст, который будет собран.

Строки фиксированного формата


В фиксированной исходной форме, в исходной строке текст разделяется гго колонкам
в поля для меток утверж дения, индикатора продолж ения, текст утверж дения и порядко­
вого номера. Каждая колонка представляет единственны й знак.
14 С Д А ¡газин, В В. К ондрат ьев . П рогралш рованне на Visual FORTRAN

Позиции колонки для каждой области следующие:


Поле Столбец
М етка утверждения 1-5
И ндикатор продолж ения 6
У тверж дение 7-72 (или 132 с опцией компилятора)
П орядковый номер 73-80
По умолчанию порядковый номер или другая информация идентификации могут поя­
виться в колонках от 73 до 80 лю бой строки ф иксированного формата в программе
РоПгап 1те1. Ком пилятор игнорирует знаки в этой области. Если вы расш иряете область
утверж дения до позиции 132, область порядкового номера не сущ ествует.
Примечание. Если вы используете поле порядкового номера, не используйте табуляторы где-
нибудь в исходной линии, или компилятор может интерпретировать порядковые номера как
часть поля утверждения вашей программы.

Строки табулированного формата


В табулированном исходном формате вы можете сами установить поле метки утвер­
ждения, поле индикатора продолж ения и поле утверж дения, но не поле порядкового но­
мера.
Примечание. Если вы используете область порядкового номера, не используйте табуляторы
где-нибудь в исходной строке, или компилятор может интерпретировать порядковые номера
как часть области утверждения в вашей программе.
Рис. 1.2 показывает эквивалентные исходные строки, закодированны е с табулирован­
ной и фиксированной исходных форм.

1 2 3 4 5 6 7 Ô 9 10 11 12 13 14 15 16 17 1$ 19 20
С \ШI RRST VALUE с F 1 R S Т V А L и Е
10 fTÂBl I = J + 5*K + 1 0 I J + 5 * К +

1 L*M 1 L * М

I V А 1 Г I ♦ 2
IVAL = I+2
Табулированный формат Фиксированный формат
Рис. 1.2. Пример форматирования строк

О бласть метки утверж дения предш ествует первому сим волу табуляции. Область ин­
дикатора продолж ения и область утверждения следую т за первым символом табуляции.
И ндикатор продолж ения - лю бая цифра, отличная ог нуля. О бласть утверждения м о­
ж ет содерж ать лю бое утверж дение Fortran. У тверж дение Fortran не может начаться с
цифры.
Если утверж дение продолж ено, индикатор продолж ения долж ен быть первым знаком
(после п ервою tab) в строке продолжения.
М ногие редакторы текста и терминалов продвигаю т каретку печати к предопределен­
ной позиции печати, когда вы наж имаете клавиш у <ТаЬ>. О днако компилятор Fortran
Intel не интерпретирует знак tab таким образом. Он обрабаты вает знак tab в области ут­
верждения тем же самым способом, что и знак пробела. В распечатке программы, кото­
рую компилятор производит, tab вызывает знак, который следует напечатать в следую ­
щем табуляторе (обычно расположенный в колонках 9, 17, 25, 33 и т. д.).
['лава /. С т рукт ура програм м ы , знаки и исходны е формы 15
Примечание. Если вы используете область порядкового номера, не используйте tabs где-
нибудь в исходной строке, или компилятор может интерпретировать порядковые номера как
часть области утверждения в вашей программе.

1.7. Исходный текст, используемый для всех исходных форм


Чтобы записать исходный текст, который используется для всех исходных форм (сво­
бодным, фиксированным или табулированны м ), следуйте этим правилам:
Пробелы. Рассматриваю тся как значим ы е (см. разд. 13.31).
Метки ут верж дений. Разм ещ аю тся в столбцах 1-5 (или перед первым символом т а ­
буляции).
Утверждения. Н ачинаю тся в столбце 7 (или после первого символа табуляции).
Индикатор комментария. И спользуется только (!). Располагается где-нибудь кроме
позиции 6 столбца (или немедленно после первого сим вола табуляции).
Индикатор продолжения. И спользуется только &. Располагается в столбце 73 на­
чальной линии и каждой линии продолж ения и в столбце 6 каждой линии продолж ения
(никакой символ табуляции не м ож ет предш ествовать амперсанду в столбце 6).
Следую щий пример действителен для всех исходных форм:
Столбец:
12345678...__________________________________________________________________________________________ 73

! Определение функции пользователя MY_SIN


DOUBLE PRECISION FUNCTION MY_SIN(X)
MY_SIN=X-X**3/FACTOR(3)+X**5/FACTOR(5) &
& -X**7/FA CTO R (7)
CONTAINS
INTEGER FUNCTION FACTOR(N)
FACTOR = 1
DO 1 0 1= N ,1 ,-1
10 FACTOR = FACTOR* I
END FUNCTION FACTOR
END FUNCTION M Y.SIN
Глава 2. Типы данных, константы и переменные

Каждая константа, переменная, массив, вы раж ение или ссы лка функции в утверж де­
нии Fortran имею т тип данных. Тип данны х этих пунктов м ож ет бы ть врожденным из
конструкции, подразум еваем ой в соответствии с соглаш ением , или явно объявленным.
Каждый тип данных имеет следую щ ие свойства:
Имя. И мена встроенны х типов данны х предопределены , в то время как имена произ­
водных типов определены определениями производного типа. О бъекты данных (констан­
ты, переменны е или части констант или переменны х) объявлены , используя имя типа
данных.
Ряд связанных значений. Каждый тип данны х имеет ряд допустим ы х значений. Типы
данны х Integer и real имею т диапазон действительны х значений. C om plex и производные
тины им ею т наборы значений, которые являю тся комбинациям и значений их индивиду­
альных компонент.
Способ представления значений констант. Константа - объект данных с ф икси­
рованным значением , которое не может бы ть изменено в течение выполнения програм ­
мы. Значение константы м ож ет бы ть числовым значением , логическим значением или
знаком строки.
Константа, которая не имеет имени, - литеральная константа. Литеральная констан­
та долж на иметь встроенны й 1 ип, но она не м ож ет бы ть массивом.
Константа, которая имеет имя, - именованная константа. И менованная константа
м ож ет им еть лю бой тип, включая производны й тип, и она м ож ет быть массивом. И м ено­
ванная константа имеет атрибут PA R A M ET ER и определена в утверж дении объявления
типа или утверж дении PA R A M ETER .
Ряд операций для манипулирования этими значениями и их интерпретирования.
Тип данны х переменной определяет операции, которые могут использоваться, чтобы
управлять им.
П омим о встроенны х операторов и операций вы м ож ете также определить операторы
и операции.

2.1. Встроенные типы данных


Fortran Intel обеспечивает следую щ ие встроенны е типы данны х:
■ IN TEG ER.
Ес ть 4 вида параметра для данны х типа "целое":
IN T E G ER ([K IN D =] 1) или IN TEG ER* 1
IN T E G E R ([K IN D =]2) или IN TEG ER*2
IN T E G E R ([K IN D =]4) или INTEG ER*4
IN T E G E R ([K IN D =]8) или IN TEG ER*8
■ REAL.
Есть 3 вида парам етра для данны х типа real:
R E A L ([K IN D =]4) или REA L*4
R E A L ([K IN D =]8) или REA L*8
REA L([K 1N D =]16) или REA L* 16
■ D O U B LE PR EC ISIO N .
П араметры вида не разреш ается для данны х, объявленны х с типом DOUBLE
PREC ISIO N . Д анны е этого типа те же, что у REAL ([K IN D =] 8).

mmommw 16
l'ia e a 2 Типы данных, конст ант ы и перем енны е 17
- COM PLEX.
Есть 3 вида параметра для данных комплексного типа:
CO M PLEX ([K lN D =]4) или CO M PLEX *8
CO M PLEX([KIN D=]8) или CO M PLEX * 16
C 0M PLEX ([K 1ND =] 16) или CO M PLEX *32
- DOUBLE COM PLEX.
Параметры вида не разреш ается для данны х, объявленны х с типом D O UBLE
COM PLEX. Данные этого типа те же, что у C O M PLE X ([K IN D =] 8).
■ LOGICAL (см. разд. 2.2).
Есть 4 вида параметра для данных логического типа:
LOGICAL ([KIND =] 1) или LO GICA L *1
LOGICAL ([KIND =] 2) или LO GICA L *2
LOGICAL ([K IND =] 4) или LO G ICA L *4
LOGICAL ([KIND =] 8) или LO GICA L *8
- CH A RA CTER (см. разд. 2.3).
Есть один вид параметра для данных типа "символьный": C H A R A C TER ([K IN D =] 1).
■ BY TE - это 1-байтовое значение; гип данны х эквивалентен IN TEG ER ([K IN D =] 1).
KIND встроенной функции м ож ет использоваться, чтобы определить вид параметра
типа представления.
Для большего количества мобильны х программ, вы не долж ны использовать
INTEGER форм ([K IND =] п) или R E A L ([K IN D =] п). Вы долж ны вместо этого оп реде­
лить константу, используя PA R A M ETER SELECTED IN T K1ND или соответствую щ ую
функцию SELECTED REA L KIND. Д ля примера: следую щ ие утверж дения определяю т
константу PARAM ETER для вида IN TEG ER, который имеет 9 цифр:
INTEGER, PARAMETER:: M Y JN T.K IN D = SELECTED_INT_KIND(9)

¡NTEGER(MY_INT_KIND):: J

Обратите внимание, что синтаксический разделитель(::) используется в утверж дениях


объявления типа.
Следующ ие разделы описы ваю т встроенны е типы данны х и форматы для литераль­
ных констант для каждого типа.
Табл. 2.1 содерж ит требования к объему памяти для встроенны х типов данных.

Таблица 2.1. Требования памяти типа данных


Тип данных Требования памяти, байт Тип данных Требования памяти, байт
BYTE 1 REAL(4) 4
LOGICAL 2:4, или 8 DOUBLE PRECISION 8
LOGICALd) I REAL(8) 8
L0GICAL(2) 2 REAL(16) 16
L0GICAL(4) 4 COMPLEX 8 ,1 6 или 32
LOGICAL® 6 C0MPLEX(4) 8
INTEGER 2:4, или 8 DOUBLE COMPLEX 16
INTEGERO) 1 C O M P LEX ® 16
INTEGERS) 2 C0MPLEX(16) 32
INTEGERS) 4 CHARACTER 1
INTEGER® 8 CHARACTERIen len
REAL 4 ,8 или 16 CHARACTERS*) Подразумеваемая длина
18 С. Д. А б а зи н . В . В К ондрат ьев П рограм ирование на Visual FORTRAN

Типы данных Integer


Типы данны х Integer м огут бы ть определены следую щ им образом:
IN TEG ER
lN T E G E R ([K IN D =]tf)
IN T E G E R S
где п - параметр вида 1, 2, 4 или 8.
Если родовой парам етр kind определен, целое число имеет определенный вид. Если
родовой параметр kind не указан, целочисленны е константы интерпретирую тся следую ­
щим образом:
■ Если целочисленная константа - в пределах целочисленного kind диапазона по ум ол­
чанию , вид - целое число но ум олчанию . Ц елое число по умолчанию - INTEGER(4).
Вы м ож ете изм енить поведение по ум олчанию , определяя опцию компилятора, кото­
рая управляет целочисленны м видом но умолчанию .
■ Если целочисленная константа - вне целочисленного kind диапазона, по умолчанию
вид целочисленной константы является наименьш им целочисленны м видом, который
определяется константой.

Константы Integer
Целочисленная константа - целое число без десятичной точки. Константы Integer
приним аю ! следую щ ую форму:
№[«■■■][ J \
где s - знак минус, если число отрицательное, и плюс, если число положительное; п - д е­
сятичная цифра 0 до 9 (лю бы е начальны е нули игнорирую тся).
к - дополнительны й параметр: 1 для INTEG ER (1), 2 для INTEGER (2), 4 для
IN T E G E R (4) или 8 для IN T EG ER (8). Этому знаку предш ествует символ подчеркивания
(_). К онстанта без знака, как предполагаю т, является неотрицательной. По умолчанию
целы е числа вы раж ены в десятичны х значениях (по основанию 10). Для определения не­
десятичной константы используйте следую щ ий синтаксис:
[s][[base] #]nnn...
где s - дополнительны й знак плюс (+) или минус (-); base - лю бая константа от 2 до 36.
Если base опущ ен, но # определен, целое число интерпретируется в base 16. Если и base и
# опущ ены , целое число интерпретируется по основанию 10.
Для оснований 11-36 латинские буквы от А до Z представляю т числа, больше чем 9.
Н априм ер, для основания 36, А представляет 10, В представляет И , С представляет 12
и т. д. до Z, которая представляет 35. Случай символов несущ ественен.
С ледую щ ие прим еры показы ваю т верное и неверное написание десятичных констант:
Правильно
0
-127
+32123
47_2
Недопуст имо Объяснение
9999999999999999999 С лиш ком больш ое число.
3.14 Д есятичная точка не разреш ается; допустим ая константа REAL.
32,767 Запятая не разреш ается.
Гчава 2 Типы данных, конст ант ы и п ерем ен ны е 19

33 3 Н еправильный вид для целых чисел.


Следую щ ие целые числа (больш инство которых не по основанию 10) соответствую т
десятичному числу 3 994 575.
I = 2#1111001111001111001111
m = 7#45644664
J = +8#17171717
К = #3CF3CF
n = +17#2DE110
L = 3994575
index = 36#2DM8F
Вы можете исиользовать целочисленны е константы , чтобы назначить значения на
данные. Следую щ ая таблица показы вает назначения на различны е данны е и списки ц ело­
го числа и его ш естнадцатеричное представление в данных:
Шестнадцатеричное значение
Назначение Fortran Целочисленное значение в данных
в данных
LOGICAL(1)X
INTEGER(1)X
X = —128 -1 2 8 Z'80'
X = 127 127 Z7F'
X = 255 -1 Z'FF'
LOGICAL(2)X
INTEGER(2)X
X = 255 255 Z'FF'
X = -32768 -32768 Z'8000'
X = 32767 32767 Z7FFF'
X= 65535 -1 Z'FFFF'

Типы данных Real


Типы данных Real м огут быть определены следую щ им образом :
REAL
REAL ([KIND =] п)
REAL *п
DOUBLE PRECISION
где n - число вида 4, 8 или 16.
Если параметр K IN D определен, константа R EA L им еет определенны й вид. Если па­
раметр K IN D не указан, то по ум олчанию константа - REA L (4). О пределяя опцию ком ­
пилятора, управляю щ ую видом REA L, м ожно изм енить п оведение по ум олчанию .
D OUBLE PRECISIO N - REA L (8). П араметр вида не разреш ается для данны х, объ яв­
ленных с типом D O U B LE PRECISIO N .

Общие правила для констант Real


Константа real является приближ енны м значением вещ ественного м атем атического
числа. Значение константы м ож ег бы ть полож ительны м, нулем или отрицательны м .
Общая форма константы real без экспоненциальной части:
[s]n[n...][J]
Константа real с экспоненциальной частью экспоненты им еет одну из форм:
[s]n[n...]E[s]nn. .[Jc]
[s]n[n...]D[s]nn...
20 С. Д Ачгазин , В. В. К ондрат ьев П рограм ирование на Visual FORTRAN

[s]n[/7 .]Q[s]nn...
где s - знак минус, если число отрицательное, и плюс, если число положительное; п - де­
сятичная цифра 0 до 9; к - дополнительны й параметр вида: 4 для REAL (4), 8 для REAL
(8) или 16 для REA L (16). Этому значению долж ен предш ествовать символ подчеркива­
ния (_).
Правила использования
Н ачальны е нули (нули слева от первой цифры, отличной от нуля) игнорируются в
подсчете значащ их цифр. Н апример, в постоянной 0.00001234567 все цифры, отличные
от нуля, и все нули являю тся сущ ественными.
Э кспонента представляет степень 10, на которую долж на быть умножена предш ест­
вую щ ая константа real или целочисленная константа (например, 1.0Е6 представляет зна­
чение 1.0 * 10 ** 6).
Константа real без экспоненциальной части и без параметра типа - по умолчанию
константа с одинарной точностью (REA L (4)). Вы можете изменить значение по умолча­
нию , определяя опцию компилятора, которая управляет видом real по умолчанию.
Если константа real не имеет экспоненциальной части, десятичная точка должна при-
сутствовать в строке (где-нибудь перед дополнительны м параметром вида). Если есть
экспоненциальная часть, десятичная точка является дополнительной в строке, предш ест­
вую щ ей экспоненциальной части; экспоненциальная часть не долж на содержать деся­
тичную точку.
С им вол экспоненты Е обозначает real с одинарной точностью (REAL (4)) константа,
если дополнительны й параметр вида не определяет иначе. Например, -9 . Е2_8 - констан­
та с двойной точностью (которая м ож ет быть записана как -9 . D2).
С им вол экспоненты D обозначает real с двойной точностью (REAL (8)) константа.
Сим вол экспоненты Q обозначает real учетверенной точности (REAL (16)) константа.
Знак минус долж ен присутствовать перед отрицательной константой real; знак плюс
является необязательным перед положительной константой. Точно так же знак минус
долж ен присутствовать между символом экспоненты (Е, D или Q) и отрицательной экс­
понентой, тогда как знак плюс является необязательным между символом экспоненты и
полож ительной экспонентой.
Если константа real вклю чает символ экспоненты, область экспоненты не может быть
опущ ена, но она мож ет быть нулем.
М ож но определить константу real, использую щ ую и символ экспоненты, и параметр
вида, но тогда символ экспоненты долж ен быть Е и параметр вида должен следовать за
частью экспоненты.

Константы REAL (4)


К онстанта REA L с одинарной точностью занимает 4 байта памяти. Число цифр неог­
раниченно, но только крайние левы е 7 цифр сущ ественны. И спользуется формат 1ЕЕЕ*
S_floating.
С ледую щ ие примеры показы ваю т правильны е и недопустимые константы REAL (4):
Правильно
3.14159
3 .1 4 1 5 9 4
621712._4
-.00127
+5.0ЕЗ
2Е-3 4
Г ш ва 2 Типы данных, конст ант ы и перем енны е 21
Недопустимо Объяснение
1,234,567. Запятые не разреш аю тся.
325Е-47, Слиш ком м аленькое число для REA L; допустим ая константа
DOUBLE PRECISION.
-47. Е47, Слиш ком больш ое число для REA L; допустим ая константа
D O UBLE PRECISIO N .
625._6 6 Н еправильный вид для вещ ественны х чисел.
100 Н ет десятичной точки; допустим ая целочисленная константа.
$25.00 Специальный знак $ не разреш ается.

Константы REAL (8) или DOUBLE PRECISION


Константа REAL (8) или D O U B LE PRECISIO N имеет точность, больш ую в 2 раза по
сравнению с константой REA L (4), и заним ает 8 байт памяти. Число цифры, которы е
предш ествую т экспоненте, неограниченно, но сущ ественны только крайние левы е
15 цифр.
И спользуется ф ормат IEEE T floating .
С ледую щ ие примеры показы ваю т правильны е и недопустимы е константы REA L (8)
или D O UBLE PRECISIO N:
Правильно
123456789D+5
123456789Е+5_8
+2.7843D 00
-.522D -12
2Е2008
2 .3 8
3.4Е7 8
Недопустимо Объяснение
-.25D0 2 2 Н еправильны й вид для вещ ественны х чисел.
+2.7182812846182 Нет указателя экспоненты D; допустим ая константа с одинарной
точностью .
123456789. D400, Слиш ком больш ое число для лю бого форм ата с двойной точн о­
стью.
123456789. D -400, Слиш ком м аленькое число для лю бого форм ата с двойной точн о­
стью.

Константы REAL (16)


Константа REAL (16) имеет в 4 раза больш ую точность, чем константа R E A L (4),
и занимает 16 байт памяти. Число цифр, которы е предш ествую т экспоненте, неограни­
ченно, но сущ ественны только крайние левы е 33 цифры. И спользуется ф орм ат IEEE
X flo a tin g .
С ледую щ ие примеры показы ваю т правильны е и недопустимы е константы REA L (16):
Правильно
123456789Q 4000
-1 .2 3 0 -400
+2.72Q 0
1.88 16
22 С. Д Алгазин, В В К ондрат ьев П рограм ирование на Visual FORTRAN

Недопустимо Объяснение
1. Q 5000 Слиш ком больш ое число.
1. Q -5000 Слиш ком м аленькое число.

Типы данных Complex


Типы данных Com plex могут бы ть определены следую щ им образом:
COMPLEX
COMPLEX([KIND=]n)
C0MPLEX*s
DOUBLE COMPLEX
где n - параметр вида 4, 8 или 16; 5 - параметр вида 8, 16 или 32. CO M PLEX (4) опреде­
лен как C O M PLEX *8. C O M PLEX (8) определен как C O M PLEX *16. CO M PLEX (16) оп­
ределен как CO M PLEX *32.
Если параметр вида определен, комплексная константа им еет определенный вид. Если
параметр вида не определен, вид обеих частей по ум олчанию - real, и константа типа по
ум олчанию -- комплексная. Комплексная константа по ум олчанию - CO M PLEX (4). Вы
можете изменить значение, определяя опцию компилятора, управляю щ ую видом real по
умолчанию .
D O U B LE CO M PLEX - C O M PLEX (8). Не разреш ается никакой параметр вида для
данны х, объявленных как D O U B LE CO M PLEX .

Общие правила для констант Complex


Комплексная константа - приближ енное значение м атематического комплексного
числа. К онстанта - пара действительны х или целочисленны х значений, отделенных запя­
той и заклю ченных в круглые скобки. Первая константа представляет действительную
часть комплексного числа; вторая константа представляет мнимую часть. Ниже приведе­
на общ ая форма комплексной константы:
(с, с)
где с определяется таким образом:
■ Д ля константы CO M PLEX (4) с - целое число или константа REAL (4).
■ Для константы CO M PLEX (8) с - целое число, константа REAL (4) или константа
D O U B LE PRECISIO N (REA L (8)). М инимум одна константа из пары должна быть
D O U B LE PRECISION.
■ Д ля константы CO M PLEX (16) с - целое число, константа REAL (4), константа REAL
(8) или константа REAL (16). М инимум одна константа из пары долж на быть кон­
стантой REAL (16).
О братите внимание, что требую тся запятая и круглые скобки.

Константы COMPLEX (4)


К онстанта C O M PLEX (4) - пара целочисленны х или вещ ественных констант с оди­
нарной точностью , которые представляю т комплексное число. Константа COM PLEX (4)
занимает 8 байт памяти и интерпретируется как комплексное число.
Если действительная и мнимая часть комплексной литеральной константы - оба дей­
ствительны , вид константы определяется частью с больш ей десятичной точностью.
П равила для константы REA L (4) использую тся в константах COM PLEX (см.
разд. 2.1).
REA L (4) константы в константе C O M PLEX им ею т ф орм ат IEEE S flo a tin g .
Глава 2. Типы данных, конст ант ы и перем енны е 23
Следую щ ие примеры показы ваю т правильные и недопустимые константы
COM PLEX (4):
Правильно
(1.7039,-1.70391)
(44.36 4 ,-] 2.2 Е 1 6 4 )
(+127Э 9Е ЗД )
( 1,2 )
Недопустимо Объяснение
(-1.23,) H er второй целочисленной или константы real с одинарной точностью.
(1.0, 2Н12) Х олеритовые константы не допускаю тся.

COMPLEX (8) или константы DOUBLE COMPLEX


Константа COM PLEX (8) или D O U B LE CO M PLEX - пара констант, которые пред­
ставляю т комплексное число. О дна константа из пары долж на быть константой real с
двойной точностью, другая может быть целым числом real с одинарной точностью или
с двойной точностью.
COM PLEX (8) или константа D O U B LE CO M PLEX занимает 16 байт памяти, интер­
претируется как комплексное число.
П равила для константы D O U B LE PRECISIO N (REA L (8)) такж е применимы к частям
двойной точности COM PLEX (8) или констант D O U B LE CO M PLEX (см. разд. 2.1).
Константы D O UBLE PRECISIO N в CO M PLEX (8) или константе DOUBLE
COM PLEX имеют формат IEEE Т floating.
Следующ ие примеры показы ваю т правильный инедопустимый вид констант
COM PLEX (8) или D O UBLE CO M PLEX:
Правильно
(1 .7 0 39,-1.7039D0)
(547.3Е0 8 , - 1.44 8)
(1.7039Е0,- 1 .7039D0)
(+12739D 3,0.D 0)
Недопустимо Объяснение
(1 .23D0,) Н едостает второй константы.
(1D1,2H 12) Константы Hollerith (холеритовы е) не применимы.
(1,1.2) Ни одна из констант не D O U B LE PRECISIO N; допустимая
константа с одинарной точностью .

Константы COMPLEX (16)


COM PLEX (16) константа - пара констант, которая представляет комплексное число.
О дна константа из пары долж на быть константой REA L (16), другая мож ет быть целым
числом, константой real с одинарной или с двойной точностью или REAL (16).
COM PLEX (16) константа занимает 32 байта памяти и интерпретируется как ком ­
плексное число.
П равила для констант REAL (16) соответствую т константам REAL (16), используе­
мым в константах CO M PLEX (см. разд. 2.1).
REAL (16) константы в константе C O M PLEX имею т ф орм ат IEEE X floating.
Следую щ ие примеры показы ваю т правильные и недопустимые константы CO M ­
PLEX (16).
24 С Д Л ъ ч п и н . В В К ондрат ьев. П рограм нрован не на Visita! FO RTRAN

Правильно
(1.7039 -1 .7039Q 2)
(5 4 7 .3 Е 0 _ 1 6 -1 .4 4 )
(+12739Q 3,0.Q 0)
Недопустимо Объяснение
(1.23Q 0,) Н едостает второй константы.
(1D 1,2H 12) Константы Hollerith (холеритовы е) не применимы.
( 1.7 0 39,-1.7039D0) Ни одна из констант не REA L (16); допустим ая константа
с двойной точностью .

2.2. Логические типы данных


Л огические типы данных м огут бы ть определены следую щ им образом:
LOGICAL
LOGICAL([KIND=]n)
LOGICAL *n
где n - парметр вида 1, 2, 4 или 8. Если параметр вида определен, логическая константа
имеет определенны й вид. Если параметр вида не указан, по ум олчанию вид константы
логический.

Логические константы
Логическая константа представляет только логические значения, истинные или лож ­
ные, и им еет одну из следую щ их форм:
.TRUE. [Je]
.FALS E. [Je]
где k - дополнительны й параметр вида: 1 для LO G ICA L (1), 2 для LO G ICA L (2), 4 для
LO G ICA L (4) или 8 для LO G ICA L (8). Этому параметру долж ен предш ествовать символ
подчеркивания (_).
Д иапазоны логического типа данны х соответствую т их сопоставимы м диапазонам це­
лочисленны х типов данных. Н априм ер, диапазон L O G IC A L (2) - тот же диапазон, что у
IN TEG ER (2).

2.3. Символьный тип данных


С им вольны й тип данны х может бы ть определен следую щ им образом:
CHARACTER
CHARACTER([LEN=]/en)
CHARACTER(LEN=/en, KIND=n])
C H A R A C T E R ^ , [KIND=]n)
CHARACTER(KIND=n [, LEN=/en])
C H A R A C TE R */^,]
где n - парметр вида 1; len - длина строки (см. разд. 4.1). Если не определен никакой вид
парам етра типа, по ум олчанию вид константы символьный.

Символьные константы
Символьная константа - строка сим волов, заклю ченная в разделители (апострофы
или кавы чки). П ринимает одну из следую щ их форм:
[k j[c h .. ]' [С]
[к—]"[с/7...]" [С]
Глава 2 Типы данных, конст ант ы и перем енны е 25
где к - дополнительный параметр вида 1 (по ум олчанию ). Он долж ен сопровож даться
символом подчеркивания (_) и в символьных константах должен предш ествовать кон­
станте.
ch - знак ASCII. С - спецификатор строки Си. Строка Си м ож ет использоваться, что­
бы определить строки с не пригодными для печатания знаками (см. разд. 2.3).
Правила использования
Значение символьной константы - строка знаков между разделителям и. Это значение
не вклю чают разделители, но вклю чает все пробелы или знаки табуляции в пределах раз­
делителей. Если символьная константа разграничена апострофами, используйте 2 после­
довательных апострофа ("), чтобы поместить знак апостроф а в символьной константе.
Точно так же, если символьная константа разграничена кавы чками, используйте 2 после­
довательных цитирования марки (""), чтобы поместить знак кавычки в сим вольную кон­
станту.
Длина символьной константы - число сим волов между разделителям и, но 2 последо­
вательных разделителя считаю тся как 1 знак. Д лина сим вольной константы долж на бы ть
в диапазоне от 0 до 2000. Каждый знак занимает байт памяти.
Если символьная константа появляется в числовом контексте (такой тип выражения в
правой стороне ариф метического оператора присваивания), она считается холеритовой
константой.
Символьная константа нулевой длины представлена двумя последовательны м и ап о­
строфами или цитированием марки.
Следую щ ие примеры показы ваю т константы правильного и недопустимого вида:
Правильно
"W HAT KIND TY PE? "
T O D A V 'S DATE I S : '
"The average i s : "
Недопустимо Объяснение
'HEADINGS Нет второго апострофа.
’Map Number: " Н ачальный разделитель не соответствует второму разделителю .

Си-строки в символьных константах


Значения строки на языке Си законченны е с нулевы ми символами (CHAR(O)) могут
содержать не пригодные для печатания знаки (типа возврат каретки на 1 символ). Не
пригодные для печатания знаки определены в соответствии с еэсаре-последователь-
ностями. Еэсаре-последовательность обозначается наклонной чертой влево (\), сопрово­
ждаемый единственным знаком, указы ваю щ им не пригодный для печатания знак. Этот
тип строки определен при использовании стандартной строковой константы, сопровож ­
даемой знаком С. Стандартная строковая константа тогда интерпретируется как констан­
та языка Си. Н аклонные черты влево обрабаты ваю тся как Escape, и нулевой символ ав­
томатически поставлен до конца строки (даже если строка уже заканчивается символом
нуля).
Табл. 2.2 показывает еБсаре-последовательности, которые разреш аю тся в символьных
константах.
26 С Д A.isaniH, В В. К о н д р а т ьев П р ограии рование на Visual FORTRAN

Таблица 2.2. Еэсаре-последоват ельност и С-ст иля


Escape-nocnedoeamenbHocmb Представляет
\а или \А Звонок
\Ь или \В Возврат на 1 символ
\f или \F Прогон страницы
\п или \N Новая строка
\г или \R Перевод каретки
\t или \Т Горизонтальный табулятор
№ или W Вертикальный табулятор
\х М или \Xhh Шестнадцатеричная битовая комбинация
\ооо Восьмеричная битовая комбинация
\0 Нулевой символ
\\ Наклонная черта влево (\)
Если строка содерж ит еэсаре-иоследовательность, которая не находится в этой табли­
це, наклонная черта влево игнорируется.
С трока Си долж на такж е бы ть допустим ой строкой Fortran. Если строка разграничена
апостроф ам и, апостроф ы в самой строке долж ны быть представлены двумя последова­
тельны м и апостроф ам и (”). Н апример, escape-последовагельносгь Ystring вызывает
ош ибку компилятора, потом у что Fortran интерпретирует апостроф как конец строки.
П равильная форма: \ ” string.
Если строка разгран ичена кавы чкам и, кавычки в самой строке должны быть пред­
ставлен двумя последовательны м и кавычками
П оследовательности \ооо и \xhh позволяю т задать лю бой знак ASCII - 3 восьмерич­
ными цифрами или 2 ш естнадцатеричны м и цифрами. Каждая восьмеричная цифра долж ­
на бы ть в диапазоне от 0 до 7 и каждая ш естнадцатеричная цифра долж на быть в диап а­
зоне от 0 к F. Н априм ер, С строка '\010'С и '\х08'С - обе представляю т символ возврата на
позицию , сопровож даем ы й сим волом нуля. С трока С '\\ abcd'C эквивалентна строке
'\abcd' с прилож енны м нулевы м символом. Строка "С представляет символ нуля ASCII.

Символьные подстроки
Символьная подст рока - непреры вная часть строки символов. П ринимает одну из
следую щ их форм:
v ( [ e 1Y[e 2])
a ( s [,s] . . . ) {[е 1]:[е2])

где v - обозначение скалярной константы, обозначение имени переменной скаляра или


обозначение компоненты структуры ; e l - целое число пли другое числовое выражение,
определяю щ ее крайню ю левую позицию знака подстроки: отправная точка\ е2 - целое
число или другое числовое вы раж ение, определяю щ ее правую позицию подстроки: ко­
нечная точка; а - имя текстовог о массива; s - выражение нижнег о индекса.
И e l , и е2 долж ны бы ть в пределах диапазона 1, 2 len, где len - длина исходной
текстовой строки. Если e l превы ш ает е2 , подстрока имеет нулевую длину.
Правила использования
С им вольны е позиции в пределах родительской строки сим волов пронумерованы сле­
ва направо, начиная с 1.
Г и т а 2 Типы данных, конст ант ы и п ерем ен ны е 27
Если значение числового вы раж ения e l или е2 не имеет ти п а "целое", это числовое
выражение преобразуется к целому числу перед использованием (дробная часть о тб ра­
сывается).
Если e l опущ ен, по ум олчанию е1=1. Если е2 опущ ен, по ум олчанию е2 = len. Н апри­
мер, N A M ES(1,3)(:7) определяет подстроку, начинаю щ ую ся с первой позиции и закан чи ­
ваю щ ую ся седьмой позицией. Значение позиции в сим вольном м ассиве - элем ент
N A M ES(1,3). Н апример:
C H A R A C T E R С, LABEL
LABEL = 'XVERSUSY'
С = LABEL(2:7)
LA BEL (2:7) определяет подстроку, начинаю щ ую ся со второй позиции и закан чи ­
ваю щ ую ся седьмой позицией символьной переменной LA B E L , таким образом , С им еет
значение 'VERSUS'.
Рассмотрите следую щ ий пример:
TYPE ORGANIZATION
INTEGER ID
CHARACTER*35 NAME
END TYPE ORGANIZATION
TYPE(ORGANIZATION) DIRECTOR
CHARACTER*25 BRANCH, STATE(50)
Д опустимы е подстроки, основанны е на предш ествую щ ем примере:
BRANCH(3:15) ! коренная строка - скалярная переменная
STATE(20) (1:3) ! коренная строка - элемент массива
DIRECTOR%NAME ! коренная строка - компонент структуры
Рассмотрите следую щ ий пример:
CHARACTER**), PARAMETER:: MY.BRANCH = "CHAPTER 204"
CHARACTER® B RA N C H.CH A P
BRANCH_CHAP = MY_BRANCH(9:11) | коренная строка - символьная константа
где B R A N СН СН А Р - строка из 3 сим волов, которая им еет значение '204'.

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


Кроме встроенных типов данны х, залож енны х в язык его разработчикам и, Fortran д о ­
пускает создание новых, производны х типов данных. П роизводный тип в Fortran пред­
ставляет собой структуру, которая состоит из нескольких компонентов. Типы ком понен­
тов могут различаться, причем тип компонента, в свою очередь, м ож ет бы ть п роизвод­
ным типом.
О пределение производного типа определяет имя оп ределенного пользователем типа и
типов компоненты. Это определение имеет следую щ ую форму:
TYPE [ [, access] :: ] name
component-definition
[component-defimtion]. . .
END TYPE [name]
где access (доступ) - клю чевое слово PUBLIC или PRIV A TE. К лю чевое слово м ож ет
быть только определено, если определение производного типа находится в части сп ец и ­
фикации модуля.
28 С Д Алгазин, В. В К ондрат ьев П рограм ирование на Visual FORTRAN

пате (имя) является именем производного типа. Это имя не долж но совпадать с име­
нем лю бого встроенного типа, или именем производного типа, к которому можно полу­
чить доступ из модуля.
component-definition (составляющее определение) является одним или нескольким ут­
верждением объявления типа, определяю щ им компонент производного типа.
П ервому составляю щ ем у определению может предш ествовать дополнительное ут­
верж дение PR IV A TE или SEQ U EN C E (только PRIV A TE или утверждение SEQUENCE
м огут появиться в определении данного производного типа).
PRIV A TE определяет, что компоненты доступны только в пределах определения мо­
дуля, даж е если сам производны й тип общ едоступен.
SEQ U EN CE сохраняет компоненты производного типа в той же самой последова­
тельности, в которой они перечислены в определении типов. Если SEQ U EN CE опреде­
лен, все производны е типы , определенны е в компоненте определения, должны быть ти ­
пами последовательности.
Составляю щ ее определение принимает следую щ ую форму:
type [ [, attr] ::] component [(a-spec)] [ *char-len] [init-ex]
где type - спецификатор типа. Это может быть встроенный тип или предварительно оп ­
ределенны й производный тип. (Если атрибут PO IN TER следует за этим спецификатором,
тип мож ет такж е бы ть лю бы м доступным производным типом, включая определяемый
тип.)
attr является дополнительны м атрибутом PO IN TER для компонента указателя, или
дополнительного D IM EN SIO N , или атрибутом A LLO C A TA BLE для компонента массива.
Вы не можете определить A L LO C A TA B LE и атрибут POINTER. Если определен
D IM EN SIO N , то это определение м ож ет сопровож даться спецификацией массива. Каж­
дый атрибут м ож ет появиться только однажды в данном составляющем определении
компонента.
com ponent - имя определяем ого компонента.
a-spec является необязательной спецификацией массива, заклю ченной в круглые
скобки. Если указаны PO IN TER или A LLO C A TA BLE, массив является массивом отло­
женной формы (deferred shape); иначе он имеет явную форму. В спецификации явной
формы каждая граница долж на быть константным скалярным целочисленным выражени­
ем. Для получения дополнительной информации о спецификациях массива см. разд. 4.2.
Если границы м ассива здесь не определены, они должны быть указанны после атри­
бута D IM EN SIO N . Такж е является именем определяемого компонента.
char-len является дополнительной скалярной целочисленной литеральной константой;
этом у параметру долж на предш ествовать звездочка (*). Этот параметр может быть опре­
делен, только если компонент им еет тип CH A RA CTER.
init-ex является вы раж ением инициализации или, для компонентов указателя, =>
N U LL (). Это - возм ож ность Fortran 95. Если init-ex определен, двойное двоеточие долж ­
но присутствовать в составляю щ ем определении. Символ равенства (=) может быть оп­
ределен только для неуказательны х компонент. Выражение инициализации приведено
в модуле обзора определения типов.
П роизводны е типы в определенном смысле мож но считать аналогом записей в языке
П аскаль и структур в язы ке Си. И ногда удобно объединять под общим именем разнород­
ные данные, имею щ ие разный тип. М ассивы объединяю т однот ипные данные и, следова­
тельно, не позволяю т реш ить эту проблему.
Г лава 2 Типы данных, конст ант ы и перем енны е 29
Правила исполь ювапия
Если имя указано после утверж дения EN D TY PE, то это имя долж но быть тем же са­
мым именем, которое приведено в утверж дении производного типа TYPE. П роизводный
тип может быть определен только однаж ды в блоке о б л асш действия. Если то же самое
имя производною типа появляется в определении производного типа другого блока об­
ласти действия, оно обрабаты вается независимо. С оставляю щ ее имя имеет возм ож ности
определения только производного тина. П оэтом у то же самое имя может использоваться
в другом определении производного ти па того же са м о ю блока области действия.
Д ва информационных объекта им ею т гот же самый тип. если они оба объявлены , как
тот же производный тип (к определению производного типа м ожно получить доступ из
модуля или ведущ его блока области действия).
Если объекты находятся в различны х блоках области действия, они м огут такж е
иметь тот же самый производный тип, если они объявлены в отнош ении других оп реде­
лений производного типа и если оба определения производного типа имею т следую щ ие
свойства:
■ то же самое имя;
■ утверждение SEQ U EN CE (они оба имеют тип последовательности);
■ компоненты, которые согласовы ваю тся с именем, порядком и атрибутам и; ком понен­
ты не могут быть частными.

Инициализация по умолчанию
И нициализация по ум олчанию происходит, если инициализация появляется по оп ре­
делению компонент производного типа. (Э то является возм ож ностью Fortran 95.) У ка­
занная инициализация компонента прим еняется, даж е если определением будет
PRIVATE. И нициализация по ум олчанию обращ ается к форм альным параметрам
lN TENT(O UT). Не подразум евается, что компонент п рои звод н ою типа им еет атрибут
SAVE. Явная инициализация в утверж дении объявления типа отменяет инициализацию
по умолчанию.
Чтобы определить инициализацию по ум олчанию компонента массива, используйте
постоянное выражение, которое вклю чает следую щ ее:
■ конструктор массива;
■ единственны й скаляр, который становится значением каж дого элемента массива.
Указатели могут иметь статус ассоциации связанны х, разъединенны х или неоп реде­
ленных. Если не определен по ум олчанию статус инициализации, статус указателя не о п ­
ределен. Чтобы определить разъединенны й статус для компонента указателя, используй­
те => NULL ().
Вы не должны определять инициализацию для каж дого компонента производного ти ­
па. Например:
TYPE REPORT
CHARACTER (LEN=20) REPORT.NAME
INTEGER DAY
CHARACTER (LEN=3) MONTH
INTEGER:: YEAR = 1995 ! Только компонент по умолчанию
END TYPE REPORT ! инициализация
Рассмотри хе следую щ ее утверж дение:
TYPE (REPORT), PARAMETER :: N O V.REPO RT = REPORT ("Sales", 15, "NOV", 1996)
30 С Л А 1гаш и, В. В. К ондрат ьев П рограм ирование на Visual FORTRAN

В этом случае явная инициализация в утверж дении объявления типа отвергает YEAR
компонент N O V R E P O R T . Н ачальное значение по умолчанию компонента может также
бы ть отвергнуто по умолчанию определенной инициализацией в определении типов. На­
пример:
TYPE MGR_REPORT
TYPE (R E PO R T):: STATUS = N 0V_R EP 0R T
INTEGER NUM
END TYPE MGR_REPORT
TYPE (MGR_REPORT) STARTUP
В этом случае компонент STA TU S STA R TU P получает начальное значение от
NOV REPO RT, отмена инициализации для компонента YEAR.

Компоненты структуры
Ссы лка на компонент структуры производного типа принимает следую щ ую форму:
parent [%component [(s-list)]]... %component [(s-//st)]
где p a ren t - имя скаляра или м ассива производного типа. Знак процента (%) называется
компонентом отборщ ика; component - имя преды дущ его pa ren t (родителя) или компо­
нента.
s-list является списком одного или более ниж них индексов. Если список содержит
триплеты нижнего индекса или векторные ниж ние индексы, ссылка к секции массива.
Каждый нижний индекс долж ен бы ть скалярным целым числом (или другим число­
вым выраж ением ) со значением, которое изменяется в пределах его границ.
Число нижних индексов в лю бом s -списке долж но равняться рангу предыдущ его ма­
теринского элем ента или компонента.
Правила использования
Каждый материнский элем ент или компонент (кроме младш его разряда) должны
иметь производный тип.
М атеринский элемент или один из ком понентов м огут иметь ранг, отличный от нуля
(бы ть массивом). Любой компонент м атеринского элем ента или компонента ранга, от­
личного от нуля, не должен иметь атрибут PO IN TER.
Ранг компонента структуры - ранг части (материнский элемент или компонент) с от­
личны м от нуля рангом (лю бым); иначе ранг - нуль. Тип и параметры типа (любые) ком­
понента структуры объявляю тся из части младш его разряда имени.
На компонент структуры нельзя сослаться или его определять перед объявлением ма­
теринского элемента объекта.
Если родительский объект имеет атрибут IN TEN T, TA R G ET или PARAM ETER, ком­
понент структуры такж е имеет атрибут’.
Следующий пример показывает определение производного типа с двумя компонентами:
TYPE EMPLOYEE
INTEGER ID
CHARACTER(LEN=40) NAME
END TYPE EMPLOYEE
С ледую щ ий пример показывает, как объявлять CO N TRA CT, чтобы иметь тип
EM PLO Y EE:
TYPE(EMPLOYEE) ;• CONTRACT
Г лава 2. Типы данных, конст ант ы и перем енны е 31
Обратите внимание, что оба примера начинаю тся с клю чевого слова ТУРЕ . П ервое
утверждение - определение производного типа называется утверждением производного
типа, в то время как утверждение, которое объявляет производный тип - объект назы ва­
ется утверждением ТУРЕ.
Следующий пример показывает, как сослаться на составляю щ ую ID родительской
структуры CONTRACT:
CONTRACT%ID
Следующий пример показывает производный тип с компонентом, который является
предварительно определенным типом:
TYPE DOT
REAL X, Y
END TYPE DOT

TYPE SCREEN
TYPE(DOT) C, D
END TYPE SCREEN
Следующий пример объявляет переменную типа SCREEN:
TYPE(SCREEN) М
Переменный М имеет компоненты М % С и M % D (оба типа DOT); М % С имеет компо­
ненты
М%С%Х и M%C%Y типа R EA L.
Следующий пример показы вает производны й тип с компонентом, который является
массивом:
TYPE CARJNFO
INTEGER YEAR
CHARACTER(LEN=15), DIM ENSION(IO):: MAKER
CHARACTER(LEN=10) MODEL, B0DY_TYPE*8
REAL PRICE
END TYPE

TYPE(CARJNFO) MY.CAR
О братите внимание, что M O D EL им еет сим вольную длину 10, но ВООУ Т У РЕ имеет
символьную длину 8. Вы можете назначить значение на компонент структуры; например:
MY_CAR%YEAR = 1985
Следующий пример показывает компонент структуры массива:
MYJ3AR%MAKER
В предыдущем примере, если список нижнего индекса (или подстрока) был приложен
к ссылке M AKER, не к компоненту структуры м ассива, но к элементу массива или сек­
ции.
Рассмотрите следующий пример:
MY_CAR%MAKER(2) (4:10)
В этом случае компонент - подстрока 4 -1 0 из второго элем ента м ассива MAKJER.
Рассмотрите следующ ий пример:
TYPE CHARGE
INTEGER PARTS(40)
32 С Д Л ¡гашн, В В Кондрат ьев. П р о гр а и и р о ва н и с на Visual FORTRAN

REAL LABOR
REAL MILEAGE
END TYPE CHARGE
TYPE(CHARGE) MONTH
TYPE(CHARGE) YEAR(12)
Н екоторы е допустим ы е ссылки для м ассива этого типа следую т:
MONTH%PARTS(l) »Элемент массива
MONTH%PARTS(l:K) ! Секция массива
YEAR(I)%PARTS ! Компонент структуры массива (целый массив)
YEAR(J)%PARTS(I) 1 Элемент массива
YEAR(J)%PARTS(I K) »Секция массива
YEAR(J:K)%PARTS(I) ! Секция массива
YEAR%PARTS(I) ! Секция массива
С ледую щ ий пример показы вает производны й тип с компонентом указателя, который
им еет определенны й тип:
TYPE NUMBER
INTEGER NUM
TYPE(NUMBER), POINTER :: START NUM => NULL()
TYPE(NUMBER), POINTER ;• NEXT.NUM => NULL()
END TYPE
Этот тип мож ет использоваться, чтобы создать связанны е списки объектов типа
N U M B ER . О братите внимание, что указателям даю т статус инициализации разъединен­
ных по умолчанию .
Следую щ ий пример показы вает частный тип:
TYPE, P R IVA TE :: SYMBOL
LOGICAL TEST
CHARACTER(LEN=50) EXPLANATION
END TYPE SYMBOL
Этот тип является частным к модулю . М одуль м ож ет использоваться другим модулем
обзора, но тип SY M B O L не доступен.

Конструкторы структуры
К онструктор структуры позволяет вам определять скалярны е значения производного
типа. Он имеет следую щ ую форму:
d-name (expr-list)
где d-nam e - имя производного типа, expr-list является списком выражений, определяю ­
щ их составляю щ ие значения. Значения долж ны бы ть согласованы в числе и порядке с
компонентам и производного типа. При необходим ости значения преобразовываю тся (со­
гласно правилам назначения), чтобы бы ть согласованны ми с их соответствую щ ими ком­
понентам и в типе и виде параметров.
Правила исполь юваиия
К онсгрукгор структуры не долж ен появит ься преж де, чем определен его производный
тип. Если компонент производного типа - массив, форм а в списке выраж ения долж на со-
ответсгвоват ь ф орм е составляю щ его массива. Если компонент производного типа - ука­
затель, значение в списке выражения долж но указы вать на объект, который был бы д о ­
пустимой целью в операторе присваивания указателя. (К онстанта - недопустимая цель в
операторе присваивания указателя.) Если все значения в конструкторе структуры - по­
стоянны е выраж ения, конструктор - вы раж ение константы производного типа.
Глава 2 Типы данных, константы и перем енны е 33
Рассмотрите следую щ ее определение производного типа:
TYPE EMPLOYEE
INTEGER ID
CHARACTER(LEN=40) NAME
END TYPE EMPLOYEE
Этот пример может использоваться, чтобы произвести следую щ ий конструктор
структуры:
EMPLOYEE(3472, "John Doe")
Следующ ий пример показывает тип с компонентом производного типа:
TYPE ITEM
REAL COST
CHARACTER(LEN=30) SUPPLIER
CHARACTER(LEN=20) ITEM_NAME
END TYPE ITEM
TYPE PRODUCE
REAL MARKUP
TYPE(ITEM) FRUIT
END TYPE PRODUCE
В этом случае, вы долж ны использовать внедренный конструктор структуры, чтобы
определить значения этого компонента; например:
PRODUCE(.70, ITEM (.25, "Daniels", "apple"))

2.4. Двоичные, восьмеричные, шестнадцатеричные


и холеритовые константы
Двоичные, восьмеричные, ш естнадцатеричные и холеритовы е константы - недеся­
тичные константы. Они не имеют встроенного типа данных, но приним аю т числовой тип
данных в зависимости от их использования. Fortran 95/90 позволяет двоичны м , восьм е­
ричным и ш естнадцатеричным константам без знака использоваться только в операторе
DATA; константа долж на соответствовать целочисленной скалярной переменной.
В Fortran Intel двоичные, восьмеричные, ш естнадцатеричны е и холеритовы е константы
могут появиться везде, где разреш аю тся числовые константы.

Двоичные константы
Двоичная константа - альтернативный способ представить числовую константу.
Двоичная константа имеет одну из следую щ их форм:
B'cf[cL]'
B"c/[cL]"
где d - набор из двух цифр (основание 2): 0 или 1.
Вы можете определить до 256 двоичных знаков в двоичной константе. Н ачальные ну­
ли игнорируются.
Следующие примеры показываю т допустим ы е и недопустимы е двоичны е константы:
Допустимо
В'ОЮНЮ'
ВТ
34 с д л 1га j u h , В В К он драт ьев П рограм ирование на Visual FORTRAN

Недопустил ю Объяснен не
В '0112' С им вол 2 недопустим.
В 1001 Г Нет апостроф а после В.
"1000001й Н ет В перед первой кавычкой.

Восьмеричные константы
Восьмеричная константа - альтернативны й способ представить числовые константы.
В осьм еричная константа имеет одну из следую щ их форм:
0 'd [d ...]'
0 "d[d..]"
d является восьм еричны м числом (основание 8) цифры (от 0 до 7). Вы можете опреде­
лить до 256 битов (86 восьм еричны х цифр) в восьм еричных константах. Н ачальные нули
игнорирую тся.
С ледую щ ие примеры показы ваю т допустим ы е и недопустимые восьмеричные кон­
станты:
Допустимо
0*07737'
О иI й
Недопуст имо Объяснение
07782' Ц иф ра 8 недопустима.
07772' Н ет апостроф а после О.
"0737" Н ет О перед первым кавычкой.

Шестнадцатеричные константы
Ш естнадцатеричная константа - альтернативны й способ представить числовые
константы. Ш естнадцатеричная константа приним ает одну из следую щ их форм:

Z'd[d..]'
Z "d[d...]"
где d - ш естнадцатеричное число (основание 16), цифра (от 0 до 9), прописная или
строчная буква в диапазоне от А до F.
Вы мож ете определить до 256 битов (64 ш естнадцатеричны х цифры) в ш естнадцате­
ричны х константах. Н ачальны е нули игнорирую тся.
С ледую щ ие примеры показы ваю т допустим ы е и недопустимы е ш естнадцатеричные
константы:
Допуст имо
Z 'A F9730'
Z"FFA B C "
Z'84'
Недопустимо Объяснение
Z '9 9 9 ' Д есяти чное число недопустимо.
"ZF9" К авы чка перед Z недопустима.

Холеритовые константы
Холеритовая константа - строка пригодны х для печатания сим волов ASCII, кото­
рым предш ествует сим вол Н. П еред Н долж на бы ть целочисленная константа по умолча-
_____________________ ['лава 2 Типы данных, конст ант ы и перем енны е 35
нию, отличная от нуля, без знака, указы ваю щ ая число сим волов в строке (вклю чая про­
белы и признаки табулирования). Х олеритовы е константы - строки 1-2000 сим волов.
Они сохранены как строки байтов, 1 символ в байте.
Следующие примеры показывают допустимые и недопустимые холеритовые константы:
Допустимо
16HTODAY'S D A TE IS:
1НВ
4H ABC
Недопустимо Объяснение
3H A BCD Н еправильное число символов.
ОН Х олери говая константа долж на содерж ать по крайней м ере 1 символ.

Определение типа данных недесятичных констант


Д воичные, восьмеричные, ш естнадцатеричны е и холеритовы е константы не им ею т
никакого встроенного типа данных. Эти константы принимаю т числовой тип данны х в
зависимости ог их использования.
Если константа используется с бинарным оператором , вклю чая оператор назначения,
то данный тип константы - тип данны х другого операнда. Н априм ер:
Тип данных Длина константы,
Утверждение
константы байт
IN TE G ER ® IC0UNT
INTEGER(4) jCOUNT
INTEGERS) N
REAL(8) DOUBLE
REAL(4) RAFFIA, RALPHA
RAFFIA = B’1001100111111010011' REAL(4) 4
RAFFIA = Z'99AF2' REAL(4) 4
RALPHA = 4HABCH REAL(4) 4
DOUBLE = B'1111111111100110011010' REAL(8) 8
DOUBLE = Z'FFF99A' REAL(8) 8
DOUBLE = 8HABCDEFGH REAL(8) 8
JCOUNT = ICOUNT + B'011101110111' INTEGERS) 2
JCOUNT = IC O U N T+ 0 7 7 7 ' IN TE G E R ® 2
JCOUNT = ICOUNT+ 2HXY IN TE G E R ® 2
IF (N .EQ. B'1010100') GO TO 10 INTEGERS) 4
IF (N .EQ. 0'123') GO TO 10 INTEGERS) 4
IF (N EQ. 1HZ) GO TO 10 INTEGERS) 14
Когда требуется определенный тин данны х (целое число), этот тип данны х принят для
константы. Н апример:
Утверждение Тип данныхкконстанты Длина константы, байт
Y(1X) = Y (0'15‘) + 3 INTEGERS) 4
Y(1X) = Y (1HA) + 3 INTEGERS) 4
Когда недесятичная константа используется как фактический параметр, происходит
следующ ее:
■ Д ля двоичных, восьмеричных и ш естнадцатеричны х констант, если значение п ри ­
сваивается целому числу, то по ум олчанию используется вид этого целого числа.
36 С. Д . Алгазин, В. В К ондрат ьев П рограм ирование на Visual FORTRAN

Иначе используется наим еньш ий целочисленны й вид, достаточно больш ой, чтобы со­
хранить значение.
■ Для холеритовых констант не принят никакой тип данных.
Н апример:
Утверждение Тип данных константы Длина константы, байт
CALL АРАС (Z'34BC2‘) 1МТЕСЕР(4) 4
CALLАРАС
Нет 9
(9HABCDEFGHI)
Когда двоичная, восьм еричная или ш естнадцатеричная константа используется в л ю ­
бом другом контексте, принят тип целочисленны х данных по умолчанию (целое число по
ум олчанию мож ет быть определено опциями компилятора). В следую щ их примерах це­
лое число по ум олчанию - 1МТЕСЕЫ(4):
Утверждение Тип данных константы Длина константы, байт
IF (Z'AF77') 1,2,3 INTEGERS) 4
IF (2НАВ) 1,2,3 INTEGERS) 4
I = 0 7 7 77' - Z'A 39'2 INTEGERS) 4
I = 1 H C - 1HA INTEGERS) 4
J = .NOT. 073777' INTEGERS) 4
J = .NOT. 1HB INTEGERS) 4
Если 2 константы без типа использую тся в операции, они обе имею т тип ум алчивае­
мого целочисленного.
Если недесятичны е константы другой длины , чем длина, подразумеваемая типом дан ­
ных, происходит следую щ ее:
■ Д воичны е, восьмеричные и ш естнадцатеричны е константы. Эти константы могут оп ­
ределить до 16 байт данных. Когда длина константы меньше, чем длина, подразуме­
ваемая типом данных, крайние левы е цифры имею т значение нуля. Когда длина кон­
станты больш е, чем длина, подразум еваем ая типом данных, константа обрезается
слева. Это вы зы вает ош ибку, если обрезаны какие-нибудь цифры, отличные от нуля.
Табл. 2.1 содерж ит список числа байтов, которых требует каждый тип данных.
■ Х олеритовы е константы. К огда длина константы меньше, чем длина, подразумевае­
мая типом данных, пробелы дописы ваю тся к константе справа. Когда длина констан­
ты больш е, чем длина, подразум еваем ая типом данных, константа обрезается справа.
Если какие-нибудь символы, кроме знаков пробела, обрезаны, происходит ошибка.
Каждый холеритовый сим вол занимает 1 байт памяти.

Переменные
Переменная - объект данны х, значение которого может быть изменено в лю бой точке
программы . П еременная м ож ет иметь следую щ ий вид:
Скаляр - единственны й объект, который имеет единственное значение; он может
иметь лю бой тип - встроенны й или производный (определенный пользователем).
Массив - собрание скалярны х элем ентов лю бого встроенного или производного типа.
Все элементы долж ны иметь тот ж е самый тип и вид параметров.
Указатель подобъекта. П одобъект является частью объекта. Следую щ ие выраже­
ния - подобьекты :
Элемент массива компонент структуры.
Секция м ассива сим вольная подстрока.
Глава 2. Типы данных, конст ант ы и перем енны е 37
Например, В (3) является подобъекгом (элемент м ассива) указателя на массив В. По-
добъект не может быть переменной, если ее родительский объект - константа.
Имя переменной связано с единственны м местополож ением памяти. П еременны е
классифицированы типом данны х как константы. Тип данных переменной указы вает тип
данных, которые она содерж ит, вклю чая его точность, и подразумевает требования п ам я­
ти. Когда данные лю бого типа присваиваю тся переменной, они преобразовы ваю тся в тип
данных переменной (в случае необходим ости). П еременная определена, когда вы задаете
ей значение. П еременная м ож ет бы ть определена во время компиляции до вы полнения
программы утверждением D A TA или утверж дением объявления типа. В течение вы п ол­
нения программы, переменны е м огут быть определены или переопределены в операторах
присваивания и утверж дениях ввода, или быть неопределенной (наприм ер, если п рои с­
ходит ошибка ввода/вывода). Когда переменная неопределенна, ее значение непредска­
зуемо. Когда переменная становится неопределенной, все переменны е, связанны е по п а­
мяти (storage association)1, такж е становятся неопределенными.

Типы данных скалярных переменных


Тип данных скалярной переменной м ож ет быть явно объявлен в утверж дении объ яв­
ления типа. Если тип не объявлен, переменная имеет неявный тип данны х, основанны й
на предопределенных правилах типа или утверж дении IM PLICIT. Я вное объявление типа
данных имеет приоритет но лю бом у неявному типу. Н еявны й тип, определенны й в у т­
верждении IM PLICIT, имеет приоритет по предопределенным правилам типа.

Спецификация типа данных


Тип утверждения объявления явно определяет тип данны х скалярны х переменных.
Например, следую щ ие утверж дения связы ваю т V A RI с м естополож ением памяти
8-байтового комплексного, a VAR2 - с местополож ением памяти 8-байтового с двойной
точностью:
COMPLEX (8) VAR1
REAL (8) VAR2
Примечание. Если никакой вид параметра не определен для типа данных, используется вид по
умолчанию. Вид по умолчанию может быть установлен опциями компилятора, которые задают
размер переменных.
Вы можете явно определить тип данны х скалярной переменной только однаж ды . Если
не задана явная спецификация типа данны х, тип определяется первым сим волом в д и ап а­
зоне, определенном в утверж дении IM PLICIT. Т екстовые утверж дения объявления типа
определяют, что данные переменны е представляю т сим вольны е значения определенной
длины. Например, следую щ ие утверж дения связы ваю т имена переменны х IN LIN E,
N AM E и N U M BER с м естополож ениям и памяти, содерж ащ ими сим вольны е данны е длин
72, 12 и 9, соответственно:
CHARACTER*72 INLINE
CHARACTER NAME*12, NUMBER*9
В отдельных подпрограммах могут использоваться символьные параметры предполагае­
мой длины, чтобы обрабатывать строки символов с различными длинами. Длина символьно­
го параметра предполагаемой длины определяется с символом звездочка, например:

1 Перевод дан в "Словаре терминов".


38 С Д А чгсиин, В В К ондрат ьев П рокламирование на Visual FORTRAN

CHARACTER * (*) CHARDUMMY


П араметр C H A RD U M M Y принимает длину фактического параметра.

Неявные определения типа


П о ум олчанию все скалярные переменные с именами, начинаю щ имися I, J, К, L, М
или N, как предполагаю т, являю тся целыми переменными но умолчанию . Скалярные пе­
рем енны е с именами, начинаю щ имися с лю бого другого символа, предполагаю тся real по
умолчанию . Например:
Действительные переменные Целочисленные переменные
ALPHA JCOUNT
BETA ITEM 1
TOTAL NUM NTOTAL
И мена, начинаю щ иеся со знака доллара ($), - неявно INTEGER.
Вы м ож ете от менить тип данных по умолчанию , определяя тип данных в лю бом ут­
верждении IM PLICIT или утверждении объявления типа.

Массивы
Массив - это ряд скалярных элементов, которые имею т тот же самый тип и вид пара­
метров. Лю бой объект, который объявлен со спецификацией массива, - массив. Массивы
могут быть объявлены при использовании утверждения объявления типа или при исполь­
зовании утверж дения DIM ENSION, CO M M O N , A LLO C A TA BLE, POIN TER или
TA RG ET.
На массив м ожно сослаться элементом (используя нижние индексы), секцией (ис­
пользуя список нижних индексов секции) или в целом. Список нижнего индекса (припи­
санный к имени массива) указывает ссылку на элемент или на секцию массива.
Список нижнего индекса секции состоит из нижних индексов, триплетов нижнего ин­
декса или векторных нижних индексов. Минимум один нижний индекс в списке должен
бы ть триплетом нижнего индекса или векторным нижним индексом.
Когда имя массива без любых нижних индексов появляется во встроенной операции (на­
пример, сложение), операция обращается к целому массиву (всем элементам в массиве).
М ассив обладает такими свойствами:
Тип данных. М ассив м ожег иметь любой встроенны й или производный тип. Тип дан­
ных массива (как лю бой другой переменной) определен в утверждении объявления типа
или подразум евается первым символом его имени. Все элементы массива имею т тот же
самый тип и вид параметров. Если значение, назначенное на индивидуальный элемент
массива, не то же самое, что тип массива, оно преобразовывается в тип массива.
Ранг. Ранг массива - число измерений в массиве. М ассив может иметь до семи изме­
рений. Ранг одном ерного массива представляет колонку данных (вектор), ранг двумерно­
го м ассива представляет таблицу данных, упорядоченных ио столбцам, ранг трехмерного
массива представляет таблицу данных относительно многократных страниц (или плоско­
стей) и т. д.
Границы. Массивы имеют нижнее и верхнее значение индексов в каждом измерении. Эти
границы определяют диапазон из значений, которые могут использоваться как нижние ин­
дексы для измерения. Значение любой границы индексов можег быть положительным, отри­
цательным или нулем. Границы измерения определены в спецификации массива.
Глава 2 Типы данных, коиипйнпш и переменные 39
Размер. Размер массива - общ ее количество элем ентов в массиве (произведение сте­
пеней массивов). Степень - общ ее количество элементов в специфическом измерении.
Степень определяется так: верхняя г раница - нижняя граница + 1. Если значение лю бой
из степеней массива - нуль, массив имеет размер нуля.
Форма. Ф орма массива определена его рангом и степенями и может быть представле­
на как одномерный массив (вектор), где каждый элемент - степень соответствую щ его
измерения. Два массива с той же самой формой, как говорят, являю тся соответствую­
щими. Скаляр является соответствую щ им массиву лю бой формы.
Имя и ранг массива долж ны бы ть определены при объявлении массива. Степень каж ­
дого измерения может быть постоянной или переменной. Степени м огут измениться во
время выполнения программы , если массив - массив с формальными параметрами, авто­
матический массив, указатель м ассива или размещ аемый массив. На массив ссылаю тся
по имени массива. На индивидуальны е элементы в названном массиве ссылаю тся ска­
лярным нижним индексом или списком скалярных нижних индексов (если в массиве
больше, чем одно измерение). А на секцию названного массива ссылаю тся нижним ин­
дексом секции.
Следую щ ие примеры - допустим ы е объявления массива:
DIMENSION А(10, 2, 3) ! утверждение DIMENSION
ALLOCATABLE В (:,:) ! утверждение ALLOCATABLE
POINTER С(:, \ :) ! утверждение POINTER
REAL, DIMENSION (2, 5):: D ! Тип объявления с атрибутом DIMENSION
Рассмотрите следую щ ее объявление массива:
INTEGER L(2:11,3)
У массива L следую щ ие свойства:
Тип данных: INTEG ER
Ранг: 2 (два измерения)
Границы: П ервое измерение: от 2 до 11
Второе измерение: от 1 до 3
Размер: 30 (произведение степеней: 1 0 x 3 )
Форма: (/10,3/) (или 10 к 3); вектор степеней 10 и 3
Следующ ий пример показывает другие допустим ы е способы объявить этот массив:
DIMENSION L(2:11,3)
INTEGER, DIMENSI0N(2:11,3):: L
COMMON L(2:11,3)
Следующ ий пример показывает ссылки на элементы, секции массива и целый массив:
REAL В (10) ! Объявляет ранг одномерного массива с 10 элементами
INTEGER С (5,8) »Объявляет ранг двумерного массива с 5 элементами
! в первом измерении и 8 элементами во втором измерении

В (3) = 5.0 ! Ссылка на элемент массива


В (2:5) = 1.0 ! Ссылка на секцию массива, состоящую из
! элементов: С (1,3) С (1,4)
! С (2,3) С (2,4)
! С (3,3) С (3,4)
В = 99 ! Ссылка на целый массив, состоящий из
! элементов: В (1), В (2), В (3), В (4), В (5),
! В (6), В (7), В (8), В (9) и В (10)
40 С л A w ajuii, В В К ондрат ьев П р о гр а и и р о ва н и е на Visual FORTRAN

Массив целиком
М ассив целиком (w hole array) - именованный массив; он является или именованной
константой, или переменной. Ссылки на него - но имени массива (без нижних индексов).
Если целый массив появляется в невыполнимом утверж дении, утверж дение обращается
ко всему массиву. Например:
INTEGER, DIMENSION (2:11,3):: L ! Определяет тип и измерения массива L
Если м ассив появляется в вы полним ом утверж дении, утверж дение применяется ко
всем элементам массива. Например:
L = 10 ! Значение 10 назначено на все элементы в массиве L
WRITE *, L ! Печать всех элементов в массиве L

Элементы массива
Элемент массива - один из скалярны х элем ентов данны х, которые составляю т мас­
сив. С писок нижнего индекса (прилож енны й к компоненту массива или массиву) опреде­
ляет, ссылку на элемент. С сы лка на элем ент м ассива приним ает следую щ ую форму:
массив (список нижнего индекса)

где массив - имя массива; список нижнего индекса - список одного или более нижних индек­
сов, отделенных запят ыми. Число нижних индексов должно равняться рангу массива.
Каждый нижний индекс долж ен бы ть скалярным целым числом (или другим число­
вым вы раж ением ) со значением , которое изменяется в пределах границ его измерения.
Правила использования
Каждый элем ент м ассива наследует тип, вид параметра типа и определенны е атрибу­
ты (IN TEN T, P A R A M ET E R и TA R G E T) родительского массива. Элемент массива не мо­
ж ет унаследовать атрибут POIN TER.
Если элем ент м ассива имеет тип character (символ), он м ож ет сопровождаться ди ап а­
зоном подстроки в круглых скобках; для примера:
ARRAY_D (1,2) (1:3)1 Элементы - подстроки длины 3
О днако в соответствии с соглаш ением такой объект является подстрокой, а не эле­
ментом массива.
Н екоторы е допустим ы е ссылки на элем ент м ассива для массива, объявленного как
R EA L В (10,20): В (1,3), В (10,10) и В (5,8).
Д ля информации о формах для спецификаций м ассива см. разд. 4.2.

Порядок элементов массива


Элементы массива ф орм ирую т последовательность, известную как порядок элементов
массива. П озиция элем ента в этой последовательности - значение его нижнего индекса.
Элементы м ассива сохраняю тся как линейная последовательность значений. О дно­
мерны й массив сохраняется с е ю первым элементом в первой ячейке памяти и его по­
следним элем ентом в последней ячейке памяти последовательности. М ногомерный мас­
сив сохранен так, что крайние левы е ниж ние индексы изменяю тся наиболее быстро. Это
назы вается порядком прогрессии ниж него индекса. Рис. 2.3 показывает хранение массива
в 1, 2 и 3 измерения.
Гпааа 2 Типы данных, конст ант ы и перем енны е 41
1 BRC(1) 2 BRC(2) 3 BRC{3) 4 BRC(4) 5 BRC(5) 6 BRC(6)
t t
Одномерный массив BRC (6)

1 BAN(1,1) 4 BAN(1,2) 7 BAN(1,3) 10 BAN(1,4)


2 BAN(2,1) 5 BAN(2,2) 8 BAN(2,3) 11 BAN(2,4)
3 BAN(3,1) 6 BAN(3,2) 9 BAN(3,3) 12 BAN(3,4)

Двумерный массив BAN (3,4)

19 BOS(1,1,3) 22 BOS(1,2,3) 25 BOS( 1,3,3)


20 BOS(2,1,3) 23 BOS(2,2,3) 26 BOS(2,3,3)

10 13 BOS( 1,2,2) 16 BOS(1,3,2) 27 BOS(3,3,3)

11 BOS(2,1,2) 14 BOS(2,2,2) 17 BOS(2,3,2)

BOSO.1,1) BOS(1,2,1) BOS(1.3,1) 18 BOS(3,3,2)

B0S(2,1,1) BOS(2,2,1) BOS(2,3,1)


BOS(3,2,1) BOS(3,3,1)

JL
Трехмерный массив BOS (3,3,3)
Рис. 2.3 Память массива (стрелками показаны позиции памяти)
Например, в двумерном массиве BAN элем ент BAN (1,2) им еет значение порядка
нижнего индекса 4; в трехмерном массиве BOS элем ент BO S (1,1 И) им еет значение по­
рядка нижнего индекса 1.
В секции массива порядок нижнего индекса элем ентов - их порядок непосредственно
в пределах секции. Для примера: если массив объявлен как В (20), секция В (4:19:4), со ­
стоит из элементов В (4), В (8), В (12) и В (16). Значение порядка ниж него индекса В (4) в
секции массива - 1; порядок нижнего индекса значения В (12) в секции - 3.

Секция массива
С екц и я м а с с и в а - часть массива, которая непосредственно является массивом. Это -
подобъект массива. Список нижних индексов секции (прилож енны й к компоненту м ас­
сива или массиву) определяет, какая часть является ссылкой. С сы лка на секцию массива
принимает следующую форму:
array(sect-subscript-list) - массив (список нижнего индекса-секции)
где аггау -м асс и в - имя массива; с п и с о к н и ж н е г о и н д е к с а -с е к ц и и - список одного или бо­
лее нижних индексов секции (нижние индексы, триплеты ниж него индекса, или вектор­
ные нижние индексы), указание ряда элементов по специф ическом у измерению .
Минимум один из пунктов в списке нижнег о индекса секции долж ен бы ть триплетом
нижнего индекса или векторным нижним индексом.
Триплет нижнего индекса определяет элементы м ассива в увеличении или ум еньш е­
нии порядка в данном большом шаге. А векторный нижний индекс определяет элементы
в любом порядке.
Каждый нижний индекс и триплет нижнего индекса долж ны бы ть скалярным целым
числом или другим числовым выражением. Каждый векторны й нижний индекс долж ен
быть одноранговым целочисленным выражением.
42 С Д Ai<4uuu, В В К о н д р а т ьев П роклам ирование на Visual FORTRAN

Правила использования
Если не определен никакой список нижнего индекса секции, ранг и форма секции
м ассива - ге же, что и у роди гельского массива.
В противном случае ранг секции массива - число векторных нижних индексов и тр и ­
плетов ниж него индекса, которы е появляю тся в списке. Его форма - ранг одномерного
массив, где каждый элем ент - значение целого числа в последовательности, обозначен­
ной соответс твующим триплетом ниж него индекса или векторным нижним индексом.
Если лю бая из этих последовательностей пуста, секция массива имеет размер нуль.
П орядок нижнег о индекса элем ента секции м ассива - элем ент объекта массива, которую
представляет секция массива.
К аж дая секция м ассива наследует тип, вид параметра типа и определенные атрибуты
(IN TEN T, PA R A M ET E R и TA R G E T) родительского массива. Секция массива не может
унаследовать атрибут PO IN TER .
Если массив (или компонент массива) имеет тип character (символ), он может сопровож­
даться диапазоном подстроки в круглых скобках. Рассмотрите следующее объявление:
CHARACTER (LEN=15) С (10,10)
В этом случае секция м ассива, на которую ссылаю тся как С (: :), (1:3) - массив формы
(10,10), чьи элем енты являю тся подстрокам и длины 3 из соответствую щ их элементов С.
С ледую щ ие прим еры показы ваю т допустим ы е ссылки построения секции. О братите
вним ание, что синтаксис (/.../) обозначает конструктор массива:
REAL, DIMENSION (20):* В

PRINT *, В (2:20:5) ! Сечение состоит из элементов В (2), В (7), В (12) и В (17)


К = (/3 ,1 ,4 /)
В (К) = 0.0 ! Секция В (К) - ранг один массив с формой (3)
! и размер 3. (0.0 назначен на В (1), В (3) и В (4).)

Триплеты нижнего индекса


Триплет ниж него индекса - ряд трех значений, представляю щ их нижнюю границу
секции м ассива, верхню ю связанную секцию м ассива и приращ ение (больш ой шаг) меж ­
ду ними. Т ребуется следую щ ая форма:
[первый-направляющий]: [последний-направляющий] [: большой ш аг]
где первый-направляющий - скалярное целое число или другое числовое выражение,
представляю щ ее первое значение в нижнем индексе последовательности. Если это вы ра­
ж ение опущ ено, используется заявленная нижняя граница измерения.
последний-направляющий - скалярное целое число или другое числовое выражение,
представляю щ ее последнее значение в нижнем индексе последовательности. Если это
вы раж ение опущ ено, используется заявленное верхнее значение измерения.
У казывая секции м ассива предполагаем ого размера, этот нижний индекс долж ен быть
определен.
большой ш аг - скалярное целое число или другое числовое выражение, представляю ­
щ ее приращ ение между последовательны м и нижними индексами в последовательности.
Это значение долж но бы ть отлично от нуля. Если это значение опущ ено, оно предпола­
гается равным 1.
Больш ой ш аг имеет следую щ ие эффекты:
■ Если больш ой ш аг - полож ительная величина, диапазон нижнего индекса н ач и н ай ся
с первого ниж него индекса и увеличивается на значение больш ого шага, пока не дос­
тигнуто наибольш ее значение, м еньш ее или равное второму нижнему индексу. Н а­
Г и т а 2 Типы данных, конст ант ы и перем енны е 43
пример, если массив был объявлен как В (6,3,2), секция массива, определенная как В
(2:4,1:2,2), - ранг м ассива 2 с формой (3,2) и разм ером 6. Он состоит из следую щ их
6 элементов:
В (2,1,2) В (2,2,2)
В (3,1,2) В (3,2,2)
В (4,1,2) В (4,2,2)
Если первый нижний индекс больш е второго, диапазон пуст.
■ Если больш ой ш аг отрицателен, диапазон ниж него индекса начинается со значения
первого нижнего индекса и ум еньш ается на абсолю тное значение больш ого ш ага до
наименьш его значения, больш его или равного второму ниж нем у индексу. Н априм ер,
если массив был объявлен как А (15), секция м ассива, определенная как А (1 0 :3 :- 2),
является массивом рангом 1 с формой (4) и размером 4. О на состоит из 4 элем ентов:
А (1 0 )
А (8 )
А (6 )
А (4 )
Если второй нижний индекс больш е, чем первый нижний индекс, диапазон пуст. Если
диапазон, определенный больш им ш агом пуст, секция м ассива им еет разм ер нуль.
Значение нижнего индекса (в триплете ниж него индекса) не обязательно долж но бы ть
в пределах заявленны х границ соответствую щ его изм ерения, если все используем ы е зна­
чения для выбора элем ента массива - в пределах заявленны х границ. Н априм ер, если
массив был объявлен как А(15), определение секции м ассива А (4 :16:10) допустим о. С ек­
ция имеет ранг 1, массив с формой (2) и измерения 2. О на состоит из элем ентов (4) и(14).
Если триплет нижнего индекса или больш ой ш аг не определяет границы , тогда для
измерения объявленного диапазона используется двоеточие ( :) .

Векторные нижние индексы


Векторный нижний индекс - это одном ерны й (ранга 1) массив целочисленны х значе­
ний (внутри заявленны х границ для измерения), который вы бирает сечение целого (ро­
дительского) массива. Элементы в сечении не долж ны бы ть упорядочены , как в массиве,
и секция может содерж ать двойны е значения.
Н апример, А - двухранговы й м ассив формы (4,6). В и С - одноранговы е массивы
формы (2) и (3), соответственно, со следую щ им и значениями:
В = (/1,4/) ! Синтаксис (/.../) обозначает конструктор массива
С = (/2,1,1/) ! Приведет к многозначному сечению массива
Сечение м ассива А (3, В) состоит из элем ентов А (3,1) и А (3,4). С ечение м ассива
А(С, 1) состоит из элем ентов А(2,1), А( 1,1) и А( 1,1). С ечение м ассива А (В, С) состоит из
следую щ их элементов:
А(1,2) А(1,1) А(1,1)
А(4,2) А(4,1) А(4,1)
Секция м ассива с векторным нижним индексом, которое им еет 2 или больш е элем ен ­
тов с тем же самым значением, называется многозначной секцией м ассива. М ногозначная
секция не долж на появиться слева от знака равенства в операторе присваивания, или как
входной элемент в утверж дении READ.
С ледую щ ие назначения С такж е показы ваю т прим еры векторны х ниж них индексов:
INTEGER А(2), В(2), С(2)

В = (/1,21)
С(В) = А(В)
44 С Д Алгазин, В В К ондрат ьев П рограм ирование на Visual FORTRAN

С = А((/1,2/))
Секция массива с векторны м нижним индексом не долж на быть:
■ внутренним файлом;
■ фактическим параметром , связанны м с формальным массивом, который определен
или переопределен (если атрибут IN TEN T определен, это должен быть INTENT (В));
■ целью в операторе присваивания указателя.
Если последовательность, определенная векторным нижним индексом, пуста, секция
м ассива имеет размер нуль.

Конструкторы массива
Конструктор массива может использоваться, чтобы создать и назначать значения масси­
ва ранга 1 (и массива констант). Конструктор массива принимает следующую форму:
(/ac-value-Ust/)
где ac-value-list - список одного или более выражений или неявных D O -циклов. Каждое
ac-vaíue долж но иметь одинаковы й тип и параметры вида и отделено запятыми.
Неявный D O -цикл в конструкторе массива принимает такую форму:
(ac-value-Hst, do-variable = exprl, expr2 [, ехргЗ])
где do-variable - имя скалярной целой переменной. Его возможности - возможности не­
явного D O -цикла.
ехрг является скалярны м целочисленны м выражением; exprl и ехрг2 определяю т ди а­
пазон значений для цикла; ехргЗ определяет больш ой шаг; ехргЗ должен быть значением,
отличным от нуля; если это вы раж ение опущ ено, оно предполагаются равным I .
Правила использования
Созданный массив им еет тот же самый тип, что и выражение ac-value-list. Если по­
следовательность значений, определенны х конструктором массива, пуста (пустое вы ра­
ж ение массива или неявный D O -цикл не производит никаких значений), массив ранга 1
имеет размер нуля.
ac-value интерпретируется следую щ им образом:
Формат ac-value Результат
Скалярное выражение Его значение - элемент нового массива.
Значения элементов в выражении (в порядке элемента массива) - соответствую­
Массив
щая последовательность элементов в новом массиве
Он расширяется, чтобы сформировать список элементов массива под управлени­
Неявный DO-цикл
ем переменной 0 0 (как конструкция 0 0 )
Следую щ ие вы раж ения показы ваю т 3 формы ас-значения:
С1 = (/4,87,6/) ! Скалярное выражение
С2 = (/В (1,1:5), В (l:J, 7:9)/) ! Выражение массива
СЗ = (/(1,1=1,4)/) ! Неявный DO-цикл
Вы можете такж е см еш ать эти формы, например:
С4 = (/4, А(1:5), (1,1=1,4), 71)
Если каж дое вы раж ение в конструкторе массива - постоянное выражение, конструк­
тор массива - постоянное выраж ение.
Если выражения им ею т тип character (символ), Fortran 95/90 требует, чтобы каждое
выражение имело ту ж е самую сим вольную длину.
Глава 2 Типы данных, конст ант ы и перем енны е 45
Однако Fortran Intel позволяет символьным выражениям цметь различны е сим воль­
ные длины. Д лина результирую щ его сим вольного массива - максимум длин индивиду­
альных символьных выражений. Н апример:
print *,len ( (/’a'/ab'/abc'/dV))
print ^ ,++V/(/,a,),ab,),abc,),d,/)//'--'
Ниже показан результат вы полнения этих операторов:
3
++а --++аЬ --++abc--++d --
Если неявный D O -цикл содерж ится в пределах другого неявного D O -цикла (влож ен ­
ного), то они не могут иметь ту же самую переменную DO (do-variable).
Чтобы определять массивы больш е чем одного измерения, используйте встроенную
функцию RESHAPE.
А льтернативные формы для конструкторов массива:
■ квадратные скобки (вместо круглых скобок и слеш ей), чтобы вклю чить конструкторы
массива; для примера: следую щ ие 2 конструктора м ассива эквивалентны :
INTEGER С(4)
С = (/4,87,6/)
С = [4,8,7,6]
■ отделенный двоеточием триплет (вместо неявного D O -цикла), чтобы определить д и а­
пазон значений и больш ой шаг; например, следую щ ие 2 конструктора массива экви ­
валентны:
INTEGER D(3)
D = (/1:5:2/) 1Формат триплета
D = (/(1,1=1,5,2)1) ! Формат неявного DO-цикла
Следующий пример показывает конструктор массива, используя неявный D O -цикл:
INTEGER ARRAY_C(10)
ARRAY_C = (/(I, l=30,48, 2)1)
Значения ARRAY C - четные числа 30-48.
Следующий пример показы вает конструктор м ассива производного типа, который
использует конструктор структуры:
TYPE EMPLOYEE
INTEGER ID
CHARACTER(LEN=30) NAME
END TYPE EMPLOYEE
TYPE(EMPLOYEE) CC 4T(4)
CC_4T = (/EMPLOYEE(2732,"JONES"), EMPLOYEE(0217,"LEE"), &
EMPLOYEE(1889,"RYAN"), EMPLOYEE(4339,"EMERSON")/)
Следующий пример показывает, как м ож ет использоваться встроенная функция
RESHAPE для создания многом ерного массива:
Е = (/2.3,4.7, 6.6/)
D = RESHAPE(SOURCE = (/3.5, (/2.0,1.0/), Е/), SHAPE = (/2,3/))
D -массив ранга 2 формы (2,3), содерж ащ ий следую щ ие элементы:
3 .5 1 0 4 .7
2.0 2.3 6 6
Глава 3. Выражения и операторы присваивания

3.1. Выражения
В ыражение представляет либо ссылку на данные либо результат вычисления и сфор­
мировано из операторов, операндов и круглых скобок. Результат выражения является или
скалярным значением, или массивом скалярных значений. Если значение выражения
им еет встроенный тип, оно имеет вид параметра типа. (Если значение имеет встроенный
тип CH A RA CTER , оно такж е имеет параметр длины .) Если значение выражения имеет
производный тип, оно не имеет никакого вида параметра типа.
Операнд - скаляр или массив. О ператор может бы ть или встроен, или определен.
Встроенный оператор известен компилятору и всегда доступен для лю бой программной
единицы программы. О пределенны й оператор, описанный явно пользователем, в подпро­
грамме функции и доступен для каждой программной единицы, которая использует под-
п роф ам м у.
Самая простая форма выражения (первичного) м ож ет бы ть лю бым следующ им выра­
жением:
■ константа; например 4.2;
■ подобъект константы; например ’LM N O P’ (2:4);
■ переменная; например V A R I;
■ конструктор структуры; например EM PLO Y EE (3472, "JOHN D O E”);
■ конструктор массива; например (/12.0,16.0/);
■ ссылка функции; например COS(X);
■ другое выражение в круглых скобках; например (1+5).
Лю бая переменная или ссылка функции, используем ы е как операнд в выражении,
долж ны бы ть определены до выполнения. Если операнд - указатель, он должен быть свя­
зан с целевым объектом (целью). Ц елочисленный операнд долж ен быть определен с це­
лочисленным значением, а не меткой утверждения значения. Все символы в символьной
ссы лке объекта данных долж ны бы ть определены. Когда сделана ссылка на массив или
секцию массива, все отобранные элементы долж ны быть определены. Когда ссылаются
на структуру, все компоненты структуры долж ны бы ть определены. В выражении, кото­
рое имеет встроенны е операторы с операндом массива, операция выполняется для каж­
дого элемента массива. В выражениях с больш е чем одним операндом массива, массивы
долж ны быть соответствую щ ими (они должны иметь ту же самую форму). К операции
обращ аю тся соответствую щ ие элементы массивов, и результат - массив той же формы
(то ю же самого ранга и степени), что и у операндов. В вы ражении, которое имеет встро­
енны е операторы с операндом в виде указателя, операция выполняется на значении цели,
связанной с указателем.
Для определенных пользователем операторов операции на массивах и указателях оп­
ределены определением процедуры операции.
Скаляр является соответствую щ им с лю бым массивом. Если один операнд выраже­
ния - массив и другой операнд - скаляр, выражение выполняется так, как будто значение
скаляра было скопировано, чтобы сформировать массив того же самого вида, как у опе­
ранда массива. Результат - массив той же самой формы, что у операнда массива.

м м от пт 46
Г пава 3 В ыраж ения и операт оры присваивания 47
Следующие секции описы ваю т числовые, символьные, относительны е и логические
выражения; определенные пользователем операции; резю ме приоритета операторов;
инициализацию и выражения спецификации.

Числовые выражения
Числовые выражения отраж аю т вычисления с числами и сформированы с числовыми
операндами и числовыми операторами. Результат числовой операции приводит к единст­
венному числовому значению.
Числовой - это термин, вклю чаю щ ий в себя и логические данные, так как они обраба­
тываются как целочисленны е данные, если использую тся в числовом контексте. По
умолчанию для .TRUE. =1; .FALSE. = 0. Значение по ум олчанию может измениться, если
используется определенная опция компилятора.
Числовые операторы определяю т вычисления, которые будут выполнены на значени­
ях числовых операндов. Результат - скалярное числовое значение или массив, элементы
которого -- скалярные числовые значения.
Следующие операторы - числовые операторы:
| Оператор Функция
i **
I Возведение в степень
I*
Умножение
/ Деление
+ Сложение или унарный плюс (тождество)
- Вычитание или унарный минус (отрицание)
Унарные операторы работаю т на единственном операнде. Бинарные операторы р а­
ботают на паре операндов. О ператоры плюс и минус м огут быть унарны ми или бинар­
ными. Когда эти операторы унарны е, они предш ествую т единственном у операнду и о бо ­
значают соответственно положительное или отрицательное значение. Возведение в сте­
пень, умножение и операторы деления - бинарные операторы. Д опустимы е числовые
операции должны иметь результаты, которые определены ариф метикой, используемой
процессором. Н апример, возведение в вещ ественную степень с отрицательным основа­
нием недопустимо.
Порядок выполнения операторов в числовом выражении определяется таким образом:
Оператор Старшинство
** Наивысшее
*и I -
Унарный + и - -
бинарный + и - Самое низкое
Операторы с равным приоритетом выполняю тся слева направо. О днако возведение
в степень выполняется справа налево. Н апример, А **В**С выполняется как А **(В**С).
В **С выполняется сначала, затем А возводится в полученную степень. О бычно
2 оператора не могут появляться вместе. О днако Рот1тап 1Ще1 позволяет 2 последователь­
ных оператора, если второй оператор - плюс или минус.
В следующем примере вначале выполняется оператор возведения в степень, а затем,
в соответствии со старш инством операций, оператор умножения:
А** В*С выполняется как (А** В) *С
В следующем примере оператор возведения в степень долж ен был бы быть выполнен
сначала. Однако, потому что 1Ще1 Ройтап позволяет комбинацию возведения в степень
48 С' ; l 4 i г а пт, В В К ондрат ьев П ро гр а и и р о ва н и с на Visual FO RTRAN

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


операт opa:
А**-В*С вычисляется как А**(-(В*С))
О братите внимание, что оператор ум нож ения выполняется сначала, так как он имеет
приоритет по сравнению с минус оператором.
Когда последовательны е операторы использую тся с константам и, унарны е операторы
плю с или минус выполняю тся преж де, чем обрабаты вается константа или лю бой другой
оператор. Это мож ет привести к неож иданным результатам . В следую щ ем примере сна­
чала выполняется оператор ум нож ения, так как он имеет приоритет по сравнению с ми­
нус-оператором :
X/-15.0*Y выполняется как Х/-(15 0*Y)

Использование круглых скобок в числовых выражениях


Вы можете использовать круглые скобки для вызова специф ического порядка выпол­
нения операций. Если часть выражения заклю чена в круглые скобки, то сначала выпол­
няется эта часть выражения. П олучаю щ ееся значение используется в вычислении остатка
выражения.
В следую щ их примерах номера приведенных операторов указы ваю т возможный по­
рядок вы полнения. А льтернативны е порядки выполнения возмож ны в первых 3 прим е­
рах, потому что они содерж ат операторы равного приоритета, которые не заклю чены в
круглы е скобки. В этих случаях компилятор свободен оценить операторы р
оритета в лю бом порядке, если результат тот же, что и результат, полученный от алгеб­
раического вычисления слева направо.
4 + 3 * 2 - 6/2 = 7
А А А А

2 1 4 3
(4 + 3) * 2 - 6/2 = 11
А А А А

1 2 4 3
(4 + 3 * 2 - 6)/2 = 2
А А А А

2 1 3 4
( (4 + 3) * 2 - б ) /2 = 4
А А А А

1 2 3 4
Вы раж ения в пределах круглых скобок выполняю тся согласно нормальному порядку
приоритета. В выраж ении, содерж ащ ем влож енные круглые скобки, выполняется сначала
вы раж ение во внутренних круглых скобах.
Н есущ ественны е круглые скобки не затрагиваю т порядок вы полнения выражения, как
показано в следую щ ем примере:
4+ (3*2)-(6/2)
О днако использование круглых скобок для определения порядка выполнения важно
для высокой точности вычисления. В таких вычислениях порядки выполнения, которые
являю тся алгебраически эквивалентны м и, возм ож но не эквивалентны в вычислительном
отнош ении, из-за способа округления промеж уточных результатов.
Г чава 3 В ы раж ении и операт оры присваивания 49
Круглые скобки могут использоваться в списках параметров, чтобы вынудить данный
параметр быть обработанным как выражение, вместо адреса пункта памяти.

Тип данных числовых выражений


Если каждый операнд в числовом выраж ении имеет один тот же тип данных, резуль­
тат такж е имеет тот же тип.
Если операнды различных типов данны х объединены в выраж ении, вы полнение этого
выражения и тип данных получаю щ егося значения зависит от упорядочивания, связанно­
го с каждым типом данных.
Следую щ ая таблица показы вает упорядочивание, назначенное на каждый тип данных:
Тип д анн ы х Упорядочивание
L O G IC A L (l) and BYTE С амое низкое
LOGICA L(2)
L0G 1CA L(4)
LOGICAL(8)
IN T E G E R (l)
1NTEGER(2)
1NTEGER(4)
1NTEGER(8)
REAL(4)
REA L(8)'
REAL(16)
CO M PLEX(4)
CO M PLEX(8)
C O M PLEX (16)2 Н аивы сш ее
Тип данных значения, произведенного операцией на двух числовых операндах р аз­
личных типов данных, - тип данных самого вы сокого ранга - операнда в операции. Н а­
пример, значение выражения с операцией с целым и действительны м операндом имеет
действительный тип. О днако операция с CO M PL EX (4) или C O M PLEX (8) типом данны х
и типом данных D O UBLE PRECISIO N дает результат C O M PL E X (8).
Тип данных выражения - тип данны х результата последней операции в этом вы раж е­
нии и определен согласно перечисленным ниже соглаш ениям .
Ц елочисленны е операции (Integer). В ы полняю тся только на целочисленны х операн­
дах. (Логические объекты, используемые в числовом контексте, обрабатываю тся как це­
лые числа.) По целочисленной ариф метике - деление нацело. Н апример, результат 9/10 —
нуль, а не единица.
Д ейст вит ельны е операции (Real). В ы полняю тся только на действительны х операн­
дах или комбинациях действительны х чисел, целых чисел и логических операндов. Л ю ­
бой целочисленный операнд преобразовы вается к действительном у типу данных с нуле­
вой дробной частью. Выражение затем вы полняется, используя действительную ариф м е­
тику. О днако в утверждении Y - (1/J)*X прим еняется целочисленная операция деления 1
на J и действительное ум нож ение результата на X. Если один операнд - действительный
более высокой точности (REA L (8) или REA L (16)) типа, другой операнд преобразовы ва­
ется к более высокой точности действительного типа перед выполнением выражения.

1DOUBLE PRECISION.
2 DOUBLE COMPLEX
50 С Д. А лгаш н, В В Кондрат ьев. Программирование на Visual FO RTRAN

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


операнду с двойной точностью , м ладш ие двоичны е знаки ненулевые. Это преобразова­
ние не увеличивает точность; преобразование десятичного числа не производит последо­
вательность десятичны х нулей. Н апример, переменная REAL, имею щ ая значение
0.3333333, преобразовы вается в 0.3333333134651184D0. О на не преобразовывается в
0.3333333000000000D 0 или в 0.3333333333333333D 0.
Комплексные операции (Complex) - операции, которые содерж ат лю бы е комплекс­
ные операнды , целочисленны е операнды , преобразованны е в действительный тип, как
предварительно описано. Результат с одинарной точностью или операнд с двойной точ­
ностью определяется как вещ ественная часть комплексного числа и нулевой мнимой ча­
стью. Затем вы раж ение вы числяется, используя комплексную арифметику, и получаю ­
щ ееся значение им еет ком плексны й тип. О перации с операндами типа CO M PLEX (4) или
C O M PL E X (8) и операндом типа D O U B LE PR ECISIO N выполняю тся как операции
C O M PL E X (8); операнд D O U B L E PRECISIO N не округлен. Эти правило такж е верно для
числовы х операций, в которы х один из операндов является константой. О днако если дей ­
ствительная или ком плексная константа используется в выраж ении более высокой то ч­
ности, дополнительная точность будет сохранена для константы. Эффект такой, как буд­
то представление константы D O U B L E PRECISIO N (REA L (8)) или REA L (16). Например,
вы раж ение 1.0D0 + 0.3333333 обработано так, как 1.0D0 + + 0.3333333000000000D 0.

Символьные выражения
С им вольное вы раж ение состоит из сим вольного оператора (//), который связывает
2 операнда сим вольного типа. Результат сим вольного выражения приводит к единствен­
ному значению т о ю же типа. Р езультат сим вольного выраж ения - строка символов, зна­
чение которой - значение левого сим вольного операнда, связанного со значением право­
го операнда. Д лина сим вольного выражения - сум м а длин значений операндов. Н апри­
мер, значение сим вольного выраж ения 'АВ' //’C D E ’ - ’A B C D E ’, которое имеет длину 5.
К руглы е скобки не затрагиваю т вы числение сим вольного выражения; например, сле­
дую щ ие сим вольны е вы раж ения эквивалентны:
(’АВС’ II ’DE’) II ’F’
’АВС’ II (’DE’ II ’F’)
’АВС’ II ’DE’ II ’F’
К аж дое из этих вы раж ений им еет значение 'ABCD EF'. Если сим вольны й операнд в
сим вольном вы раж ении содерж ит пробелы, пробелы вклю чены в значение символьного
вы раж ения. Н априм ер:
'ABC' II ’D Е’ II 'F' имеет значение ’ABC D EF

Выражения отношения
Выраж ение отношения состоит из двух или больш е выраж ений, значения которых
сравниваю тся, чтобы определить, удовлетворены ли отнош ения, заявленны е оператором
отнош ения. С ледую щ ие вы раж ения операторы отнош ения:
Операт ор Отношения
.LT. или < М еньш е чем
.LE. или < = М еньш е чем или равно
.EQ. или - ^Равно
.NE. или /= Не равно
.GT. или > Больш е чем
Глава 3 В ыраж ении и операт оры присваивания 51
.GE. или > = Больш е чем или равно
Результат выражения отнош ения .TRUE., если отнош ение, оп ределенное оператором ,
удовлетворено, результат .FA LSE., если отнош ение, определенное оп ератором , не у дов­
летворено. О ператоры отнош ения им ею т равный приоритет. Ч исловы е операторы и си м ­
вольный оператор // имею т более высокий приоритет, чем операторы отнош ения.
В числовом выражении отнош ения, операнды - числовы е вы раж ения. Рассм отрите сл е­
дую щ ий пример:
APPLE+PEACH > PEAR+ORANGE
Смысл этого вы ражения, что сумма A PPL E и PEA C H больш е, чем сум м а PE A R и
ORA N GE. Если эти отнош ения правильны, значение вы раж ения .TR U E.; в противном
случае значение .FALSE.
О перанды комплексного типа м огут только быть сравнены , используя оператор р а­
венства (= = или .EQ.) или оператор неравенства (/= или .NE.). О бъекты типа C om plex
равны, если равны их действительны е и мнимые части.
В символьном относительном выражении операнды - си м вольны е вы раж ения. В вы ­
раж ении сим вольного отнош ения меньш е, чем (< или .LT.) означает, что сим вольное
значение предш ествует в сопоставлении последовательности A SC II, и больш е, чем (>
или .GT.) означает, что сим вольное значение следует в сопоставлении последовательн о­
сти ASCII. Н апример:
'A B '/rZZZ' ! Т . 'ССССС
Этот оператор выражает, что 'A B ZZZ' - м еньш е, чем 'ССС С С '. В этом случае отн ош е­
ние, определенное оператором удовлетворено, таким образом р езультат .TRU E.
С им вольны е операнды сравниваю тся посим вольно (один сим вол одноврем енно), на­
чиная с первого сим вола из каждого операнда. Если операнды разной длины , более ко­
роткий дополняется справа пробелами, пока длины не станут равны м и; например:
'ABC' .EQ. 'ABC'
'АВ' ! Т . 'С'
П ервое относительное выражение имеет значение .TRU E, даж е при том , что длины
выражений не равны, а второе имеет значение .TRU E, даж е при том , что 'АВ' более д л и ­
нен, чем 'С'.
О тносительное вы раж ение м ож ет сравнить 2 числовых вы раж ения различны х типов
данных. В этом случае перед сравнением значение вы раж ения с м ладш им по званию ти ­
пом данны х преобразовано к более высокому упорядочиванию типа данны х.

Логические выражения
Л огическое вы раж ение состоит из одного или более логических оп ераторов и операн­
дов: логических, числовых или операции отнош ения. С ледую щ ие вы раж ения - л оги че­
ские операторы:
Оператор Пример Смысл
.AND. A .AND. В Логическая конъюнкция: выражение истинно, если и А и В истинны
.OR. A .OR. В Логическая дизъюнкция (включающее 0R ): выражение истинно, если А или
В или оба являются истинными
.NEQV. A .NEQV. В Логическая неэквивалентность (исключающее 0R ): выражение истинно, ес­
ли или А или В истинно, но ложь, если оба истинны
XOR. A XOR. В То же самое, что и Ж С )\/
52 С Д А чгазин, В В К ондрат ьев П р о гр а и и р о ва н и е на Visual FORTRAN

Оператор Пример Смысл


EQV A .EQV В Логическая эквивалентность: выражение истинно, если и А и В истинны или
оба - ложь
.NOT. .NOT. А Логическое отрицание: выражение истинно, если А - ложь и ложь, если А
(унарный) истина
Д ва оператора не могут' появиться последовательно, кроме тех случаев, когда второй
оператор .NOT. Н апример, следую щ ее логическое выражение допустимо:
А+В / (А-1) .AND. .NOT. D +B /(D -1 )

Типы данных, следующие из логических операций


Л огические операции на логических операндах производят отдельные логические
значения (.TRU E, или .FA LSE.) логического типа.
Логические операции на целых числах производят отдельные значения целочислен­
ного типа. О перация вы полняется поразрядно на соответствую щ их битах внутреннего
представления целочисленны х операндов. Л огические операции на комбинации целого
числа и логических значений такж е производят отдельные значения целочисленного ти­
па. Логические значения преобразовы ваю тся к целым числам, затем операция работает с
целыми числами.
Л огические операции не м огут быть выполнены на других типах данных.

Порядок выполнения логических выражений


Л огические выражения вы полняю тся в порядке согласно приоритету их операторов.
Рассмотрите следую щ ее выражение:
А*В+С*АВС == X*Y+DM/ZZ .AND. .NOT. К*В> TT
Это выражение выполняется в следую щ ей последовательности:
(((А*В)+(С*АВС)) == ((X*Y)+(DM/ZZ))) .AND. (.NOT ((К*В)> TT))
Как и с числовыми вы раж ениям и, вы можете использовать круглые скобки, чтобы
изменить порядок выполнения логического выражения.
Когда операторы им ею т равный приоритет, компилятор мож ет выполнить их в любом
порядке, если результат - тот же самый, что и результат, полученный алгебраическим
порядком выполнения слева направо (за исклю чением возведение в степень, которое вы­
полняется справа налево).
Вы не долж ны записы вать логические выражения, результаты которых могли бы за­
висеть от порядка вы полнения подвыраж ения. Ком пилятор свободен выполнить подвы­
раж ения в лю бом порядке. В следую щ ем примере лю бое выражение (А(1) +1.0) или
В (1) *2.0 могло быть вы полнено сначала:
(A(l)+1.0) .GT. В(!)*2.0
Н екоторые подвы раж ения не могли бы бы ть выполнены, если компилятор может оп­
ределить результат, проверяя другие подвы раж ения в логическом выражении. Рассмот­
рите следую щ ее выражение:
A .AND. (F(X,Y) .GT. 2.0) AND. В
Если компилятор вы полняет сначала А и А - ложь, то компилятор мог бы решить, что
выражение является лож ью , и не мог бы вызвать подпрограмму F (X, Y).
Глава 3 Вы раж ения и операт оры присваивания 53
Операции, определенные пользователем
Когда операторы определены для функций, на функции мож но затем с о с л а л с я , как
определено операцией. О ператоры определены при использовании родового блока ин­
терфейса, определяю щ его O PER A TO R, сопровож даем ого определенны м оператором
(в круглых скобках).
О пределенная операция ещ е не встроенная операция. О днако вы м ож ете использовать
определенную операцию к расш ирению значения встроенного оператора.
Для определенных унарны х операций функция долж на содерж ать 1 параметр. Для
бинарных операторов функция долж на содерж ать 2 параметра.
Интерпретация операции обеспечивается функцией, которая определяет операцию .
В Fortran 95/90 определенный оператор м ож ет содерж ать до 31 сим вола и заклю чает­
ся в круглые скобки (.).
Имя не м ожег совпадать с ниж еследую щ им :
- встроенные операторы (.N O T., .AND., .OR., .XOR., .EQV., .N EQ V ., .EQ., .NE., .GT.,
.GE., .LT. и .LE.).
■ логические литеральны е константы (.TRU E, или .FALSE.).
Встроенный оператор может сопровож даться определенным унарны м оператором .
Результат определенной операции м ож ет иметь лю бой гии. Тип р е зу л ы а т а (и его зн а­
чение) должен быть определен функцией определения.
Следую щ ие примеры показы ваю т выраж ения, содерж ащ ие определенны е операторы :
.COMPLEMENT А
X .PLUS. Y .PLUS. Z
М * MINUS. N

Резюме приоритета операторов


Табл. 3.1 показы вает приоритет всех встроенны х и определенны х операторов.

Таблица 3.1. Старшинство операторов


i Оператор Старшинство
Категория
Определяемые унарные операторы Наивысшее
! **
Числовой
Числовой * ИЛИ /
Числовой Унарный + или -
Числовой Бинарный + или -
Символьный II
.EQ., .NE., .LT., iE ., .GT., .GE. = =, /=, <, <=, >,
Отношения >=
Логический .NOT.
Логический .AND.
Логический .OR.
Логический .XOR,, .EQV., .NEQV.
Определяемые бинарные операторы Самое низкое

Инициализация и выражения спецификации


Постоянное выражение содерж ит встроенны е операции и часги, которы е являю тся
константами.
Вы раж ение инициализации - постоянное выражение, которое вы полняется, когда со­
брана программа.
54 С Д. Алгазин, В В. К о н д р а т ьев . Программирование на Visual FORTRAN

Вы раж ение спецификации - скаляр, целочисленное выражение, которое применяется


для объявления границ массива и сим вольной длины.
И нициализация и выражения специф икации м огут появиться в описаниях с некото­
ры м и ограничениями.

Выражения инициализации
В ы раж ение инициализации долж но быть выполнено во времени компиляции с задан­
ными константами. Оно используется, чтобы определить значение для объекта.
В выражении инициализации каж дая операция встроена и каждый операнд - одно из
следую щ их выражений:
■ К онстанта или подобъект константы.
■ Конструктор массива, где каждый элем ент и границы и результаты каждого неявного
D O -цикла, выражения, первичны е выборы которых - выражения инициализации.
■ Конструктор структуры, компоненты которого - выражения инициализации.
■ Элементная ссылка встроенной функции типа "целое" или символьного типа, пара­
метры которого - выраж ения инициализации типа "целое" или символьного типа.
■ Ссылка на одну из следую щ их функций запроса: B 1T S1Z E, M1NEXPONENT, DIGITS,
PRECISIO N , EPSILO N , RA D IX, H U GE, RA N G E, 1LEN, SHAPE, KIND, SIZE,
LBO U N D , TINY, LEN, U BO U ND , M A X EX PO N EN T.
Каждый параметр функции долж ен быть одним из следую щ их выражений:
■ Вы раж ением инициализации.
■ П еременной, чей параметр вида - типа, границы которого не определены или опреде­
лены утверж дением A L LO C A TE, назначением указателя или выражением, которое не
является выражением инициализации.
■ Ссылкой на одну из следую щ их функций преобразования (каждый параметр должен
быть выраж ением инициализации): REPEA T, SELECTED _REA L_ KIND, RESHAPE,
TRA N SFER, SELECT E D I N T_ K IND, TRIM .
■ Ссылкой на функцию преобразования NULL.
■ Н еявной D O -переменной в пределах конструктора массива, где границы и результаты
неявного D O -цикла - выражения инициализации.
■ Д ругим выражением инициализации, заклю ченным в круглые скобки. Каждый ниж­
ний индекс, нижний индекс секции и точка начала и конца подстроки должны быть
выражением инициализации. В выраж ении инициализации оператор возведения в
степень (**) долж ен быть типа "целое". Если выражение инициализации вызывает
функцию запроса для парам етра типа или связанного массива некоторого объекта,
параметр типа или связанны й м ассив долж ен быть определен в предшествующем
описании (или в левой части функции запроса в том же самом утверждении).
С ледую щ ие примеры показы ваю т допустим ую и недопустимую инициализацию вы­
раж ения:
Допустимо
-1 + 3
SIZE(B) IВ - именованная константа
7_2
INT(J, 4) ! J - именованная константа
SELECTEDJNT.KIND (2)
Недопустимо Объяснение
SUM (A ) Н еразреш енная функция.
Глава 3 Вы раж ения и операт оры присваивания 55
А/4.1 - К** 1.2 П оказатель степени не целое число. (А- и К -им енованны е константы.)
H UGE(4.0) Параметр не целое число.

Выражения спецификации
Выражение спецификации - выраж ение ограниченного применения, которое имеет
тип "целое" и имеет скалярное значение.
Этот тип выражения появляется только в объявлении границ м ассива и символьных
длин.
В ограниченном выражении каждая операция встроена и каждый операнд - одно из
следующих выражений:
■ Константа или подобъект константы.
■ Переменная, которая является одним из следую щ их выражений:
• формальный параметр, который не имеет атрибута O PTIO N A L или INTENT (OU T)
(или подобъект такой переменной);
• в общем блоке (или подобъект такой переменной);
• доступно использованием или хостом (или подобъектом такой переменной).
■ Конструктор структуры, компоненты которого - ограниченны е выражения.
■ Неявная - DO-переменная в пределах конструктора м ассива, где границы и результа­
ты неявного D O -цикла - ограниченны е выражения.
■ Ссылка на одну из следую щ их функций запроса: B IT S 1 Z E , M 1NEXPONENT, DIGITS,
PRECISION, EPSILO N , RA D IX, H U G E, RA N G E, 1LEN, SHA PE,K IN D , SIZE,
LBOUND, SIZEOF, LEN, TINY, M A X EX PO N EN T, UBO U ND .
Каждый параметр функции долж ен быть одним из следую щ их выражений:
■ О граниченное выражение.
■ Переменная, свойства которой не зависят от последнего измерения массива перени­
мающ его размера (assum ed-size array), не определены выраж ением, которое не явля­
ется ограниченным выражением, или неопределимым и назначениями указателя или
утверждением A LLO CATE.
■ Ссылка на лю бую другую встроенную функцию , где каж дый параметр - ограничен­
ное выражение.
■ Ссылка на спецификацию функции, где каждый параметр - ограниченное выражение.
■ Конструктор массива, где каждый элемент, границы и результаты каж дого неявного
DO-цикла, первичные выборы которых - ограниченны е выражения.
■ Д ругое ограниченное выражение, заклю ченное в круглые скобки.
Каждый нижний индекс, нижний индекс секции и точка начала и конца подстроки
должны быть ограниченным выражением.
Функции спецификации могут использоваться в выраж ениях спецификации, чтобы
указать атрибуты данных объекта. Ф ункция спецификации - функция без побочного эф ­
фекта. Она не может иметь формального параметра процедуры или бы ть любым сле­
дующим выражением:
■ встроенная функция;
■ внутренняя функция;
■ функция утверждения;
■ определенным как RECURSIVE.
Переменная в выражении спецификации долж на иметь его параметры типа и типа
(любого), определенного одним из следую щ их способов:
56 С Л А лгант , В В К ондрат ьев Программирование на Visual FO RTRAN

■ в соответствии с предыдущ им объявлением в том же самом модуле обзора;


■ при помощ и неявных правил типизации, действую щ их в настоящ ее время для блока
области действия;
■ при помощ и связывания хостом или использованием.
Если переменная в вы раж ении специф икации типа определена но неявным правилам
типа, ее появление в лю бом последую щ ем утверж дении объявления типа долж но под­
твердить неявные типы и параметры тина.
Если выраж ение специф икации вы зы вает функцию запроса для параметра типа или
массива связанного объекта, параметр типа или связанны й м ассив долж ны быть опреде­
лены в предш ествую щ ем описании (или в левой части задаваемой функции в том же са­
мом утверж дении).
В выраж ении спецификации число параметров для ссылки функции ограничено чис­
лом 255. Д опустим ы е выражения спецификации:
MAX(I) + J 11и J скалярные целые переменные
UBOUND (ARRAY_B, 20) * ARRAY_B - массив перенимающий размер

3.2. Операторы присваивания


О ператор присваивания определяет или переопределяет переменные. Эта секция опи­
сы вает следую щ ие виды операторов присваивания: встроенны й, определенный, указа­
тель, скры ты й под маской массив (W H E R E) и элем ент м ассива (FO RA LL).
У тверж дение A SSIG N назначает метку на целую переменную . Эго обсуждается в
разд. "У тверж дение A SSIG N и назначенны й GO ТО".

Встроенные назначения
В строенное назначение используется для задания значения неуказательной перемен­
ной. В случае указателей встроенное назначение используется, чтобы задать значение
цели, связанной с переменной указателя.
Значение переменной (или цели) определено в правой части от знака равенства.
Встроенный оператор присваивания принимает следую щ ую форму:
variable = expression (переменная = выражение)

где variable - имя скаляра или массива встроенного или производного типа (без опреде­
ленного назначения). М ассив не может быть массивом перенимаю щ его размера. Ни ска­
ляр, ни массив не могут быть объявлены с атрибутам и PA R A M ET E R или INTENT (В).
expression имеет встроенны й тип или тот ж е самый производны й тип, как и перемен­
ная. Его форма долж на соответствовать переменной. Если необходим о, это выражение
преобразовы вается к том у же самом у типу и виду, как и переменная.
Правила использования
П реж де чем значение назначено на переменную , часть выраж ения оператора при­
сваивания и лю бого выраж ения в пределах переменной долж ны быть выполнены. Н ика­
кое определение вы раж ений в перем енной не мож ет затронуть выполнимой части вы ра­
жения оператора присваивания.
Примечание. Когда систем а поддерж ки вы полнения н азначает скалярное целое число или сим ­
вольную перем енную и перем енную , которая короче, чем зн ачени е, оно м ож ет быть обрезано и
сущ ественн ы е биты (или сим волы ) потеряны . Это обрезание м ож ет произойти без предупреж ­
дения и м ож ет вы звать неправильную инф орм ацию в програм м е.
Гчава 3 Выраж ения и операт оры присваивания 57
Если переменная - указатель, он должен быть связан с определенной целью. Ф орма
цели и выражение, а такж е их тип и параметры вида долж ны соответствовать.

Числовые операторы присваивания


Для числовых операторов присваивания переменная и вы раж ение долж ны быть чи­
словым типом.
Выражение долж но привести к значению , которое соответствует требованиям диап а­
зона переменной. Для примера: действительное выраж ение, которое производит значе­
ние, большее чем 32767, недопустимо, если в левой части объекта перед знаком равенст­
ва стоит переменная IN TEG ER (2).
Значение может быть потеряно, если значение IN T E G E R (4), которое м ож ет предста­
вить значения из диапазона от -2 * 1 0 ** 9 до +2*10 ** 9, преобразовано к REAL (4)
(включая вещ ественную часть из комплексной константы ), значение которого, в свою
очередь, может быть представлено с точностью до 7 цифр.
Если переменная имеет тот же самый тип данны х, как и вы раж ение справа, утверж де­
ние присваивания задает значение непосредственно. Если типы данны х отличны, проис­
ходит преобразование типа данных перед назначением.
Табл. 3.2 обобщ ает правила преобразования данны х для числовых операторов при­
сваивания.

Таблица 3.2. Правила преобразования для числовых


операторов присваивания
Выражение (E)
Скалярная ссылка к
целочисленное, логическое
памяти (V) комплексное
или вещественное
Целочисленное V=INT(REAL(E))
V=INT(E)
или Логическое Мнимая часть Е не используется
REAL V=REAL(E) V=REAL(REAL(E))
(KIND=4) Мнимая часть Е не используется
REAL V=DBLE(E) V=DBLE(REAL(E))
(KIND=8) Мнимая часть Е не используется
REAL V=QEXT(E) V=QEXT(REAL(E))
(KIND=16) Мнимая часть Е не используется
V=CMPLX(REAL(REAL(E)),
COMPLEX V=CMPLX(REAL(E), 0.0)
REAL(AIMAG(E)))
(KIND=4)
V=CMPLX(DBLE(REAL(E)),
COMPLEX V=CMPLX(DBLE(E), 0.0)
DBLE(AIMAG(E)))
(KIND=8)
V=CMPLX(QEXT(REAL(E)),
COMPLEX V=CMPLX(QEXT(E), 0.0)
0ЕХТ(А1МАС(Е)))
(KIND=16)
Следующие примеры показываю т допустим ы е и недопустим ы е числовые операторы
присваивания:
Допустимо
BETA = -1./(2.*Х)+А*А /(4.*(Х*Х))
PI = 3.14159
SUM = SUM + 1.
ARRAY_A = ARRAY_B + ARRAY_C + SCALAR_l ! допустимо, если все массивы
! соответствуют в форме.
58 С Д Алгазин, В В. К он драт ьев П рограм ирование на Visual FO RTRAN

Не допустимо Объяснение
3.14 = А - В О бъект слева долж на бы ть переменной.
IC O U N T = А //В (3:7) Н еявно заданные типы данны х не соответствую т.
SC A LA R I = A R R A Y _A (:) Ф орм ы не соответствую т.

Логические операторы присваивания


Д ля логических операторов присваивания переменная долж на иметь логический тип и
вы раж ение м ож ет бы ть логического или числового типа. В случае необходимости, вы ра­
жение преобразовы вается к том у же самому типу и виду, как и переменная.
С ледую щ ие примеры показы ваю т допустим ы е логические операторы присваивания:
PAGEND = FALSE.
PRNTOK = LINE LE. 132 .AND. .NOT. PAGEND
ABIG = A GT.B .AND A.GT.C .AND. A.GT.D
LOGICAL _VAR = 123 ! Назначение целого значения 123 к LOGICAL _VAR

Символьные операторы присваивания


Д ля сим вольны х операторов присваивания переменная и выражение долж ны иметь
сим вольны й тип и гот же параметр вида. П еременная и вы раж ение могут иметь различ­
ные длины . Если длина вы раж ения больш е, чем длина переменной, сим вольное выраж е­
ние обрезается справа. Если длина выраж ение меньш е, чем длина переменной, сим воль­
ное вы раж ение заполняется справа знаками пробела.
Если вы назначаете значение на сим вольную подстроку, вы не затрагиваете сим воль­
ные позиции в лю бой части сим вольной скалярной переменной, не вклю ченной в под­
строку. Если сим вольной позиции вне подстроки предварительно назначили значение,
оно остается неизменны м. Если сим вольная позиция не определена, она остается неопре­
деленной.
С ледую щ ие примеры показы ваю т сим вольны е операторы присваивания допустим ого
и недопустим ого вида (в допустим ом примере все переменные имею т тип "character").
Допуст имо
FILE = 'PR0G2'
R EV 0L(1) = 'MARV/'CIA'
LOCA(3:8) = 'PLANT5'
TEXT(I,J+1)(2:N-1) = NAME/ /X
Недопустимо Объяснение
'ABC —CH A R S Левый элемент должен быть символьной переменной, элементом
массива или ссылкой подстроки.
C H A R S = 25 В ы раж ение не имеет сим вольного т ипа данных.
STR IN G = 5H BEG IN В ы раж ение не имеет сим вольного типа данных. (Х олеритовые
константы являю тся числовыми, а не сим вольны ми.)

Операторы присваивания производного типа


В операторах присваивания производного типа переменная и выражение должны
им еть тот же самы й тип. Не м ож ет быть никакого доступного блока интерфейса с опре­
деленны м назначением для объектов этого производного типа. Назначение производного
типа вы полнено, так что каж дый компонент выражения назначен на соответствую щ ий
ком понент переменной. Н азначение указателя выполняется для компонентов указателя,
а для неуказательны х ком понентов вы полняется назначение встроенного данного.
Глава 3. В ыраж ении и операт оры присваивания 59
Следую щ ий пример показывает назначение производного типа:
TYPE DATE
L0GICAL(1) DAY, MONTH
INTEGER(2) YEAR
END TYPE DATE
TYPE(DATE) TODAY, THIS_WEEK(7)
TYPE APPOINTMENT

TYPE(DATE) APP.DATE
END TYPE
TYPE(APPOINTMENT) MEETING
DO I = 1,7
CALL GET_DATE(TODAY)
THIS_WEEK(I) = TODAY
END DO
MEETING%APP_DATE = TODAY

Операторы присваивания массива


П рисваивание м ассива разреш ается, когда вы раж ение м ассива справа им еет ту же са­
мую форму, что переменная типа массива слева, или вы раж ение справа - скаляр.
Если выраж ение - скаляр и переменная - массив, скалярное значение п рисвоено каж ­
дому элементу массива.
Если выраж ение - м ассив, переменная долж на такж е бы ть массивом . Значения эле­
мента массива выражения присвоено (элемент за элем ентом ) к соответствую щ им элем ен ­
там переменной типа массив.
Многозначная секция м ассива определяется векторны м нижним индексом , которы й
имеет 2 или больш е элемента с тем же самым значением . П ри встроенном назначении
переменная не м ож ет быть многозначны м сечением м ассива, потому что результат на­
значения не определен.
В следую щ ем примере X и Y - массивы той же формы:
X=Y
Соответствую щ ие элементы Y присвоены таким же элем ентам X один за другим:
первый элемент из Y присвоен первому элементу X и г. д. П роцессор м ож ет выполнить
назначение элемента элементом в лю бом порядке.
Следую щ ий пример показы вает скаляр, назначенны й на массив:
B(C+1:N,C) = О
Это выражение устанавливает элементы В (С+1, С), В (С+2, С)... В (N, С) нулями.
Следую щ ий пример заставляет значения элем ентов м ассива бы ть полностью изм е­
ненными:
REAL А (2 0 )... А(1:20) = А(20:1:-1)

Определенные назначения
О пределенное назначение определяет операцию назначения. О но определяется п од­
программой, содерж ащ ей блок родового интерф ейса со специф икатором A SS IG N ­
M E N T ^ ). П одпрограмма определена утверж дением SU B R O U TIN E или утверж дением
ENTRY, которое имеет 2 обязательны х форм альны х параметра.
О пределенное элементное назначение обозначается E L E M E N T A L в утверж дении
SUBRO U TIN E.
60 С Д Алгазин, В В К ондрат ьев П рограм ирование на Visual FORTRAN

Ф орм альны е параметры представляю т переменную и выражение в том же порядке.


Ранг (и форма, если оба выраж ения - массивы), тип и параметр вида переменной и выра­
жения в операторе присваивания долж ны соответствовать таковым из соответствую щ их
ф орм альны х параметров.
Ф орм альны е параметры не долж ны оба быть числовыми, или логического типа или
сим вольного типа с тем же самым параметром вида.
Если переменная в элем ентном назначении - массив, определенное назначение вы ­
полнено элем ент за элементом, в лю бом порядке, на соответствую щ их элементах пере­
менной и выраж ения. Если вы раж ение - скаляр, оно обрабатывается, как массив той же
формы, что и переменная, и каждый элемент массива равняется скалярному значению
выражения.

Назначение указателя
О бъекты, которые указы ваю т на другие объекты, называю тся ссылками или указат е­
лями. Более строгое определение: указателем называется переменная, диапазон значений
которой состоит из адресов ячеек памяти. Для описания ссылки используется атрибут
pointer. С сы лка м ож ет указы вать как на сущ ествую щ ий объект, так и на специально от­
веденную область памяти. У казатели м ожно использовать для программирования дина­
мических структур данны х, таких как списки, очереди, стеки и деревья, а такж е в других
случаях.
У казатель назначения связан с целью и несет в себе определение цели. Если цель не
определена или разъединена, указатель приобретает тот же статус, что и цель. Оператор
присваивания указателя имеет такую форму:
pointer-object => target
где poin ter-object - имя переменной или компонент структуры, объявленной с атрибутом
PO IN TER .
target (цель) является переменной или выражением. Его тип и параметры вида и ранг'
долж ны бы ть теми же самы ми, как и цель указателя. Это выражение не может быть сек­
цией м ассива с векторны м нижним индексом.
Правила использования
Если цель - переменная, она долж на иметь атрибут PO IN TER или атрибут TARGET
или бы ть подобъектом , чей родительский объект имеет атрибут TARGET.
Если цель - выраж ение, результатом долж ен быть указатель.
Если цель не указатель (это вы раж ение имеет атрибут TA RG ET), объект указателя
связан с целью.
Если цель - указатель (это вы раж ение имеет атрибут POIN TER), его статус определя­
ет статус объекта указателя, следую щ им образом:
■ Если указатель связан, объект указателя связан с тем же самым объектом, как и цель.
■ Если указатель разъединен, объект указателя становится разъединенным.
■ Если указатель не определен, объект указателя становится неопределенным.
На указатель нельзя сослаться или определяться, если это выражение не связано с це­
лью , которая м ож ет быть ссылкой или определенным выражением.
Когда происходит назначение указателя, лю бое предыдущ ее связывание между объ­
ектом указателя и адресатом заканчивается.
Г ш ва 3 В ыраж ения и операт оры присваивания 61
Указатели м огут такж е бы ть назначены для компонента с ф у к т у р ы указателя вы п ол­
нением производного тина встроенного оператора присваивания или определенного опе­
ратора присваивания.
Указатели могут такж е стать связанны ми при использовании утверж дения
A LLO CATE, для того чтобы пом естить указатель.
Указатели могут стать разъединенны м и освобож дением , нуллиф икацией указателя
(используя утверж дение D E A LLO C A TE или утверж дение N U LL IFY ) или ссы лкой на
встроенную функцию NULL.
Следую щ ие выражения - примеры назначений указателя:
HOUR => MINUTES(1:60) ! цель - массив
M_YEAR => MY_CAR%YEAR ! цель - компонент структуры
NEW_ROW%RIGHT => CURRENT_ROW 1 объект указателя - компонент структуры
PTR => М. ! цель - переменная
POINTER _С => NULL () ! ссылка к встроенному NULL
Следую щ ий пример показы вает цель как указатель:
INTEGER, POINTER:: Р, N
INTEGER, TARGET:: М.
INTEGER S
M = 14
N => М.! N связан с М.
Р => N! Р связан с М. через N
S=Р+5
Значение S = 19 (14 + 5).

Утверждение и конструкция WHERE


Оператор W H ERE мож но рассм атривать как аналог оператора IF для массивов. Если
аргументом оператора IF является скалярное логическое вы раж ение, то аргум ентом опе­
ратора W H ERE является логический массив. О ператор W H E R E прим еняется при н еобхо­
димости выполнить какие-то действия только над элем ентам и м ассива, удовлетворяю ­
щими некоторому условию . Н апример, чтобы все полож ительны е элем енты вещ ествен­
ного массива А заменить значениями их логариф м ов, нужен оператор:
WHERE(A > 0.0) A=LOG(A),
который, вычислив массив-маску (А > 0), "наложит" ее на исходны й массив. С ледую щ ий
этап - вычисление логариф м ов, будет выполнен только для элем ентов с маской .TRUE,
без попыток вы числить логариф м ы неполож ительны х элем ентов м ассива А. Д алее эле­
ментам с маской .TRUE, будут присвоены полученные значения, а элем енты с м аской
.FALSE, останутся неизменны ми, т. е. утверж дение и конструкция W H E R E позволяю т
использовать замаскированное назначение м ассива, которое вы полняет операции над
массивом на отобранны х элементах. Этот вид назначения прим еняет логический тест к
массиву на основании замены элем ента элементом.
Утверж дение W H ERE приним ает следую щ ую форму:
WHERE (mask-exprt) assign-stmt
Конструкция W H ERE принимает следую щ ую форму:
[паше] WHERE (mask-exprt)
[where-body-stmf\...
[ELSE WHERE (mask-expr2) [name]
[where-body-stmt]...]
62 С .Д A h'cmiH, В В К ондрат ьев П рограм ироваиие на Visual FORTRAN

[ELSE WHERE [name]


[where-body-stmt].. ]
END WHERE [name]
где mctsk-exprl, mask-expr2 - логическое выражение м ассива (называемое выражениями
маски); assign-stm t - оператор присваивания формы: переменная типа массив = выраже­
ние массива; пате - имя конструкции W H ERE; where-body-stm t является одним из сле­
дую щ их выражений:
• An assign-stm t - назначение м ож ет бы ть определенны м, только если подпрограмма,
осущ ествляя определенное назначение, является элементной.
• У тверж дение или конструкция W H ERE.
Правила использования
Если имя конструкции определено в утверж дении W H ERE, то же имя должно по­
явиться в конечном утверждении EN D W H ERE. Эго же имя конструкции может произ­
вольно появиться в лю бом утверж дении ELSE W H ERE. (ELSE W HERE не может опре­
делить другое имя.)
В каждом операторе присваивания выражение маски, назначаемая переменная и вы­
раж ение в правой части долж ны быть соответствую щ ими. Кроме того, оператор при­
сваивания не м ож ет бы ть определенным назначением .
Только утверж дение W H ERE (или первая строка конструкции W HERE) может быть
маркировано как переход к утверж дению цели.
Следую щ ие выражения - пример утверждения W H ERE:
INTEGER А, В, С
DIMENSION А(5), В(5), С(5)
DATA А /0,1,1,1,0/
DATA В /10,11,12,13,14/
С = -1
W HERE(A.NE 0) С = В / А
Получаю щийся массив С содерж ит: - 1 , 11, 12, 13 и -1 .
О ператор присваивания выполняется только для тех элементов, для которых верна
маска. Выражение маски сначала вы полняется в логический массив, имеющий значение
"истина" для тех элементов, для которых А - полож ительная величина. Этот массив "ис­
тина" и "ложь" применен к массивам А, В и С в операторе присваивания. Правая часть
оператора выполняется только для элементов, для которых маска является верной. При­
своение в левой стороне выполнено только для тех элем ентов, для которых маска являет­
ся верной.
Элементы, для которых маска является "ложью ", не становятся назначенными значе­
ниями.
В конструкции W H ERE выражение маски выполняется один-единственный раз. Каж­
дое назначение утверждения после W HERE выполняется так, как будто это было утвер­
ж дение W H ERE с ”mask-expr\" и каждый оператор присваивания после ELSE WHERE
выполняется, как будто это было утверж дение W H ER E с ".NOT. mask -e x p r V Если ELSE
W H ERE определяет "mask-exprl", это выражение выполняется как "(.NOT. mask -expr 1)
.AND. mask-exprl" в течение обработки утверж дения ELSE W HERE.
Вы долж ны быть внимательны , если утверж дения им ею т побочные эффекты или из­
меняю т друг друга или маску выражения.
С ледую щ ее выражение - пример конструкции W H ERE:
DIMENSION PRESSURE(1000), ТЕМР(ЮОО), PRECIPITATION(IOOO)
Глава 3 В ыраж ении и операт оры присваивания 63
WHERE(PRESSURE .GE. 1.0)
PRESSURE = PRESSURE+ 1.0
TEMP = TEMP - 10.0
ELSEWHERE
PRECIPITATION = .TRUE.
ENDWHERE
Маска применена к параметрам функций в правой стороне оператора присваивания,
если они - элементные функции. Только элементные встроенны е функции считаю т эл е­
ментными функциями. Трансф ормационны е встроенны е функции, справочные встроен­
ные функции и функции или операции, определенны е в подпрограмме, могут являться
неэлементными функциями.
Рассмотрите пример, в котором используется элементная функция LOG:
WHERE(A .GT. 0) В = LOG(A)
Маска применяется к переменной А и LOG выполняется только для положительны х
значений А. Результат LOG назначен на те элементы В, для которых верна маска.
Рассмотрим следующ ий пример, в котором используется неэлементная функция
SUM:
REAL А, В
DIMENSION A(10,10), В(10)
WHERE(B .GT. 0.0) В = SUM(A, DIM=1)
Рассмотрите следую щ ий пример:
REALA, В, С
DIMENSION А(10,10), В(10), С(10)
WHERE(C GT. 0.0) В = SUM(LOG(A), DIM=1)/C
Поскольку SUM является неэлементной функцией, все его параметры выполнены
полностью независимо от того, являю тся ли они элем ентны ми или нет. В этом примере
LOG(A) полностью выполнены для всех элементов, даж е при том, что LOG является
элементной функцией. О братите внимание, что маска применена к результату SUM и
к С, чтобы определить выражение в правой стороне. Смысл этого в том, что все вы раж е­
ния в списке параметров - неэлементны е функции не использую т маску, все вычисления
производятся снаружи.

Утверждение и конструкция FORALL


Если оператор W H ERE организует работу, предположим, с условной выборкой эле­
ментов массива, а секция массива - с выборкой по множеству индексов, то оператор
FORALL комбинирует оба способа выбора элементов. Утверж дение и конструкция
FORALL - обобщ ение Fortran 95/90 назначения замаскированного массива (утверж дение
и конструкция W HERE). О но позволяет назначить больш ое количество общ их форм м ас­
сива, особенно в форме конструкции.
FORALL - возможность Fortran 95. О но принимает следую щ ую форму:
FORALL (triplet-spec [, triplet-spec]...[, mask-expr]) assign-stmt
Конструкция FORALL принимает следую щ ую форму:
[name\] FORALL (triplet-spec [, triplet-spec]...I mask-expr])
forall-body-stmt
[forall-body-stmf] ..
END FORALL [name]
64 С Д А и ч п и и .В В К ондрат ьев П роклам ирование па Visual FO RTRAN

где triplet-spec - спецификация триплета со следую щ ей формой:


subscript-name = subscripts : subscript-2 [.stride]
где su bscript-пате (имя ниж него индекса) долж но бы ть скаляром типа "целое". Это до­
пустимо только в рамках FORALL; его значение неопределенно по заверш ении FORALL.
subscripts (нижние индексы) и stride (большой шаг) не м огут содерж ать ссылку на лю ­
бое su bscript-пате (имя ниж него индекса) в triplet-spec (спецификациях триплета).
stride (большой шаг) не м ож ет бы ть нулем. Если это вы раж ение опущ ено, значение по
ум олчанию - 1. О ценка выраж ения в спецификации триплета не долж на затронуть р е­
зультат оценки лю бого другого выражения в другой специф икации триплета.
m ask-expr является логическим выражением массива (назы ваемы м выражением м ас­
ки). Если оно опущ ено, принимается значение .TRUE. Вы раж ение маски мож ет сослаться
на имя ниж него индекса в triplet-spec (спецификациях триплета).
assign-stm t является оператором присваивания или оператором присваивания указате­
ля. Н азначаем ая переменная долж на быть элементом м ассива или секцией массива и
долж на сослаться на все subscript-nam es (имена ниж него индекса), вклю ченные во все
triplet-specs (спецификации триплета),
пате - имя конструкции FORALL.
forall-body-stm t является одним из следую щ их выражений:
■ assign-stm t (назн ачение-stmt);
■ утверж дение или конструкция W H ERE; использует маску, чтобы сделать назначения
массива;
■ утверж дение или конструкция FORALL.

Правила использования
Если имя конструкции определено в утверж дении FO R A LL, то же самое имя долж но
появит ься в конечном утверж дении END FORALL.
У тверж дение FO R A LL вы полняется первой оценкой всех границ и выражений боль­
ш ого ш ага в специф икации триплета, давая ряд значений для каж дого имени нижнего
индекса. Н азначение утверж дения FO R A LL вы полняется для всех комбинаций значений
имени ниж него индекса, для которых выраж ение маски является верным.
О ператор присваивания FO R A L L выполняется, как будто все выражения (с обеих
сторон назначения) полностью выполнены прежде, чем лю бая часть левой стороны зам е­
нена. П равильны е значения назначены на соответствую щ ие элементы назначаемого м ас­
сива. Н икакой элем ент массива не мож ет быть назначен более одного раза.
К онструкция FO R A LL вы полняется так, как будто эго бы ли м ногократные утверж де­
ния FO R A LL , с тем же триплетом спецификацией и вы раж ением маски. Каждое утвер­
ж дение в геле FO R A LL выполняется полностью прежде, чем вы полнение начинается на
следую щ ем утверж дении гела FORALL.
Л ю бая процедура, на которую ссылаю тся в выражении маски или операторе присваи­
вания F O R A LL долж на быть чистой.
Ф ункции без побочного эффекта могут' использоваться в вы раж ении маски или вы зы ­
ваться непосредственно в утверж дении FORALL. Чистые подпрограмм ы не могут вызы­
ваться непосредственно в утверж дении FORALL, но м огут вызываться из другой чистой
процедуры.
Р ассм отрите пример:
FORALL(l = 1:N, J = 1 :N, A(l, J) .NE. 0.0) B(l, J) = 1 .0 1 A(l, J)
Глава 3 В ыраж ения и оп ерат оры присваивания 65
Это утверждение вы числяет обратную величину каж дого элем ента, отличного от нуля
массива A (1:N, 1:N), и назначает это выраж ение на соответствую щ ий элем ент массива В.
Элементы, которые являю тся нулем, не имею т обратной величины , и никакие назначения
не выполняю тся к соответствую щ им элементам В.
Каждый оператор присваивания массива и утверж дение W H ER E м огут бы ть записаны
как утверждения FORALL. Н екоторы е утверж дения FO R A L L не могут бы ть записаны
только при помощ и синтаксиса массива. Н априм ер, предш ествование утверж дению
FORALL эквивалентно:
W HERE(A/= 0.0) В = 1 .0 /А
О днако следую щ ий пример FO R A LL не м ож ет бы ть записан при помощ и синтаксиса
массива:
FORALL(l = 1:N, J = 1:N) H(l, J) = 1.0/REAL(I + J - 1 )
Это утверждение устанавливает элемент массива H(I, J) к значению 1.0/REAL(I + J - 1) для
значений 1 и J между 1 и N.
Рассмотрите следую щ ее выражение:
TYPE MONARCH
INTEGER, P O IN TER :: P
END TYPE MONARCH
TYPE(MONARCH), D IM E N S IO N ^ ):: PATTERN
INTEGER, DIMENSION^), TA R G ET:: OBJECT
FORALL(J=1:8) PATTERN(J)%P => OBJECT(1+IEOR(J-1,2))
Это утверж дение FO R A LL заставляет элементы 1-8 из м ассива PATTERN соответст­
вовать элементам 3, 4, 1, 2, 7, 8, 5 и 6 м ассива O BJEC T. Здесь можно сослаться на ф унк­
цию 1EOR, так как она не имеет побочного эффекта.
Следую щ ий пример показы вает конструкцию FORALL:
FORALL(l = 3:N + 1, J = 3:N + 1)
C(l, J) = C(l, J + 2) + C(l, J - 2) + C(l + 2, J) + C(l - 2, J)
D(l, J) = C(l, J)
END FORALL
Для каждого построения D используется одно из значений С, вычисленное в первом
утверждении конструкции (неважно, с чего конструкция начала выполнение).
Глава 4. Описания

Описание - невы полним ое утверж дение, которое объявляет атрибуты объектов дан ­
ных. В Fortran 95/90 есть м ного атрибутов, которые м огут быть определены в описаниях,
п роизвольно определенны х в утверж дениях объявления типа.

4.1. Типы утверждений объявления


У тверж дение объявления тииа явно определяет свойства объектов данных или ф унк­
ций. О бщ ая ф орм а утверж дения объявления типа следую щ ая:
type [[, att]... ::] v [lc-listl] [, v [lc-listl]]...
где type является одним из специф икаторов типа данных:
BYTE DOUBLE COMPLEX
INTEGER[([KIND=]k)] CHARACTER[([LEN=]n)[,[KIND=]k]]
REAL[([KIND=]k)] LOGICAL[([KIND=]k)]
DOUBLE PRECISION TYPE (имя производного типа)
COMPLEX[([KIND=]k)]
В дополнительном селекторе вида "([KIND=]A:)" к - параметр вида. Он долж ен соот­
ветствовать параметру вида для этого типа данных. Если селектор вида не присутствует,
объявленны е объекты им ею т тип по умолчанию . (Список допустим ы х несимвольных ти ­
пов данны х см. в табл. 4.2.)
П араметры вида для встроенны х числовых и логических типов данных могуг также
бы ть определены , используя ф орм ат *п, где п - длина (в байтах) объекта; например,
IN T E G E R *4.
a tt является одним из следую щ их специф икаторов атрибута: A LLO C A TA BLE,
PO IN T ER , A U TO M A T IC , PR IV A T E (специф икатор доступа) D IM EN SIO N , PRO TECTED ,
E X T E R N A L , PU B LIC (специф икатор доступа), INTEN T, SAVE, IN TR IN SIC , STATIC,
O PT IO N A L , T A R G E T, P A R A M ET ER , V O LA TILE.
v является именем объекта данны х или функции. О но может сопровождаться:
■ специф икацией м ассива, если объект - массив;
■ в объявлении ф ункции массив долж ен бы ть массивом отлож енной формы, если он
им еет атрибут PO IN TER ; иначе эго долж ен бы ть м ассив явной формы;
■ сим вольной длиной, если объект им еет тип character (символ);
■ вы раж ением инициализации, которому предш ествую т' = или, для объектов указателя,
=> N U LL ().
Имя ф ункции долж но бы ть именем встроенной функции, внеш ней функции, ф ункци­
ей пустой процедуры или ф ункцией утверж дения.
c-list является списком констант, как в утверж дении DATA. Если v - имя константы
или вы раж ения инициализации, c-list (с-список) не м ож ет присутствовать.
c-list (с-список) не м ож ет определить больш е чем одно значение, если он не инициа­
л и зи рует массив. И нициализируя массив, c-list (с-список) долж ен содерж ать значение для
каж дого элем ента в м ассиве.
П равила использования
У тверж дения объявления типа долж ны предш ествовать всем выполнимым утверж де­
ниям.

ûmommw 66
Г ia e a 4 . О писания 67
В больш инстве случаев, утверж дение объявления типа отм еняет (или подтверж дает)
неявный тип объекта.
О днако переменная, которая появляется в утверж дении D A TA и является переменной
неявного типа, мож ет появиться в последую щ ем объявлении типа, только если это о бъ ­
явление подтверж дает неявное задание типа.
Д войной разделитель двоеточие (::) требуется, только если объявление содерж ит сп е­
цификатор (описатель) атрибута или инициализации; иначе этот знак является д о п олн и ­
тельным.
Если двойной разделитель двоеточие присутствует в вы раж ении, c-list (с-список) не
м ож ет бы ть определен; например:
INTEGER 1121 ! Допустимо
INTEGER, SAVE :: 1121 ! Недопустимо
Т от же самый атрибут не долж ен появиться более одного раза в данном утверж дении
объявления типа, и объекту нельзя дать тот же самы й атрибут более одного раза в м одуле
обзора.
Если определен атрибут PA R A M ETER , объявление долж но содерж ать вы раж ение
инициализации.
Если определен => NU LL () для указателя, его начальны й статус ассоциации - р азъ е­
динен.
П еременная (или переменный подобъект) м ож ет бы ть инициализирована в вы п олн яе­
мой программе только один раз.
Если объявление содерж ит вы раж ение инициализации, но никакой атрибут
PA R A M ET E R не определен, объект - переменная, значение которой первоначально о п ­
ределено. О бъект становится определенны м, со значением , определенны м вы раж ением
инициализации согласно правилам встроенного назначения.
П рисутствие инициализации подразум евает, что имя объекта сохранено, за исклю че­
нием объектов в именованных общ их блоках или объектов с атрибутом PA R A M ETER .
С ледую щ ие объекты не м огут бы ть инициализированы в утверж дении объявления
типа:
■ формальный параметр;
■ результат функции;
■ объект в им енованном общ ем блоке (если объявление ти п а не находится в програм м е
данных блока модуля);
■ объект в непомеченном общ ем блоке;
■ размещ аем ы й массив;
■ внеш нее имя;
■ встроенное имя;
■ автом атический объект;
■ объект, который имеет атрибут A U TO M A TIC .
О бъект м ож ет иметь больш е чем один атрибут (табл. 4.1).

Таблица 4.1. Совместимые атрибуты


Атрибут Совместимость
ALLOCATABLE AUTOMATIC, DIMENSION (с задержанной формой), PRIVATE, PROTECTED, PUBLIC,
SAVE, STATIC, TARGET, VOLATILE
AUTOMATIC ALLOCATABLE, DIMENSION, POINTER, PROTECTED, TARGET, VOLATILE
DIMENSION ALLOCATABLE, AUTOMATIC, INTENT, OPTIONAL, PARAMETER, POINTER, PROTECTED,
PRIVATE, PUBLIC, SAVE, STATIC, TARGET, VOLATILE
EXTERNAL OPTIONAL, PRIVATE, PUBLIC
68 С Д Алгазин, В. В. Кондрат ьев. П рограм ирование на Visual FORTRAN

Атрибут Совместимость
INTENT DIMENSION, OPTIONAL, TARGET, VOLATILE
INTRINSIC PRIVATE, PUBLIC
OPTIONAL DIMENSION, EXTERNAL, INTENT, POINTER, TARGET, VOLATILE
PARAMETER DIMENSION, PRIVATE, PUBLIC
POINTER AUTOMATIC, DIMENSION (с задержанной формой), OPTIONAL, PRIVATE, PROTECTED,
PUBLIC, SAVE, STATIC, VOLATILE
PRIVATE ALLOCATABLE, DIMENSION, EXTERNAL, INTRINSIC, PARAMETER, POINTER,
PROTECTED, SAVE, STATIC, TARGET, VOLATILE
PROTECTED ALLOCATABLE, AUTOMATIC, DIMENSION, INTENT, OPTIONAL, POINTER, PRIVATE,
PUBLIC, SAVE, STATIC, TARGET, VOLATILE
PUBLIC ALLOCATABLE, DIMENSION, EXTERNAL, INTRINSIC, PARAMETER, POINTER,
PROTECTED, SAVE, STATIC, TARGET, VOLATILE
SAVE ALLOCATABLE, DIMENSION, POINTER, PROTECTED, PRIVATE, PUBLIC, SAVE, TARGET,
VOLATILE
STATIC ALLOCATABLE, DIMENSION, POINTER, PROTECTED, PRIVATE, PUBLIC, SAVE, TARGET,
VOLATILE
TARGET ALLOCATABLE, AUTOMATIC, DIMENSION, INTENT, OPTIONAL, PRIVATE, PROTECTED,
PUBLIC, SAVE, STATIC, VOLATILE
VOLATILE ALLOCATABLE, AUTOMATIC, DIMENSION, INTENT, OPTIONAL, POINTER, PRIVATE,
PROTECTED, PUBLIC, SAVE, STATIC, TARGET
С ледую щ ий пример показы вает допустимые утверж дения объявления типа:
DOUBLE PRECISION В(6)
INTEGER(KIND=2) I
REAL(KIND=4) X, Y
REAL(4) X, Y
LOGICAL, DIM ENSION(10,10):: ARRAY_A, ARRAY_B
INTEGER, PARAMETER :: SMALLEST = SELECTED_REAL_KIND(6, 70)
REAL(KIND (0.0)) M
COMPLEX(KIND=8):: D
TYPE(EMPLOYEE) ■: MANAGER
REAL, INTRINSIC :: COS CHARACTER(15) PROMPT
CHARACTERS2, SAVE :: HELLO_MSG
INTEGER COUNT, MATRIX(4,4), SUM
LOGICAL*2 SWITCH
REAL ::X = 2.0
TYPE (NUM), P O IN TE R :: FIRST => NULL()

Утверждения объявления на несимвольные типы данных


П риводим список типов данны х, которые м огут появиться в утверж дениях объявле­
ния несим вольного типа данных.
Н есимвольные типы данных
BYTE (то ж е,что и IN TEG ER (1)).
LO G IC A L (обрабаты вается как логическое значение по умолчанию ).
L O G IC A L (l) (или LO G ICA L* 1).
LO G IC A L (2) (или LO G ICA L*2).
L O G IC A L (4) (или LO G ICA L*4).
L O G IC A L (8) (или LO G ICA L*8).
IN T E G E R (обрабаты вается как целочисленное значение по умолчанию ).
IN T E G E R (l) (или IN TEG ER* 1).
IN T E G E R (2) (или IN TEG ER*2).
Глава 4 О писания 69
1NTEGER(4) (или IN T E G E R S ).
1NTEGER(8) (или 1NTEGER*8).
REAL (обрабатывается как действительное значение по умолчанию ).
REAL(4) (или RJEAL*4).
DOUBLE PRECISION (REA L(8) или REA L*8).
REAL(16) (или REAL* 16).
COM PLEX (обрабатывается как комплексное значение по ум олчанию ).
COM PLEX(4) (или CO M PLEX*8).
DOUBLE CO M PLEX (C O M PLEX (8) или C O M PLEX * 16).
COM PLEX(16) (или CO M PLEX*32).
В утверждениях объявления несимвольного типа, вы м ож ете произвольно определить
имя объекта данных или функций как v*n, где п - длина (в байтах) v. Так, определенная
длина отменяет задание длины, подразум еваем ой типом данны х по ум олчанию .
Значение для п долж но быть допустим ой длиной для типа v (см. табл. 2.1). С п ец и ф и ­
каторы типа BYTE, D O U B LE PRECISIO N и D O U B LE C O M PLEX им ею т одну д оп усти ­
мую длину, таким образом спецификатор п недопустим для них.
Для спецификации массива п долж ен бы ть помещ ен непосредственно после имени
массива; для примера: в утверждении объявления IN TEG ER, 1VEC*2 (10) - IN T E G E R (2)
массив из 10 элементов.
В утверждении объявления несимвольного типа последую щ ий параметр вида отм ен я­
ет любой начальный параметр вида. Н апример, рассм отрите следую щ ие утверж дения:
1NTEGER(2) I, J, К, M l2*4, Q, 1VEC*4(10)
REAL(8) W X1, WXZ, W X3*4, W X5, W X 6*4
REAL(8) P I/3.14159Е0/, Е/2.72Е0/, Q A R R A Y (10)/5*0.0,5*1.0/
В первом утверждении M l2*4 и 1VEC*4 отвергаю т специф икацию K1ND=2. Во вто­
ром утверждении W X 3*4 и W X 6*4 отвергаю т специф икацию K1ND=8. В третьем утвер ­
ждении QARRAY инициализирован с неявным преобразованием константы R EA L (4)
в тип данных REA L (8).

Утверждения объявления на символьные типы


Спецификатор типа C H A RA CTER может нем едленно сопровож даться длиной си м ­
вольного объекта или функции. Он принимает один из следую щ их форматов:
Форматы с ключевым словом
CHARACTER [([LEN=]/en)]
CHARACTER [([LEN=]/en [, [KIND=]n])]
CHARACTER [(KIND=n [, LEN=/en])]
Ф ормат без клю чевого слова (альтернативная форм а для совм естим ости с Fortran 77):
CHARACTER*/^,]
где len является одним из следую щ их выражений:
■ В форматах с клю чевым словом len - вы раж ение специф икации или звездочка (*). Е с­
ли длина не определена, по ум олчанию длина - единица. Если длина - отрицательное
значение, длина сим вольного объекта - нуль.
■ В формате без клю чевого слова len - вы раж ение специф икации или звездочка, заклю ­
ченная в круглые скобки, или скалярное целое число - литеральная константа (без п а­
раметра вида). Запятая разреш ается, только если нет двойного двоеточия (::) в у твер­
ждении объявления типа.
70 С. Д. Алгазин, В В . К ондрат ьев П рограм ирование на Visual FORTRAN

Эта форма может такж е (произвольно) быть определена после имени объекта данных
или функции (v*len). В этом случае, определенная длина отм еняет лю бую длину после
специф икатора типа CH A RA CTER.
Н аибольш ее допустимое значение для len в обеих формах - 2 ** 31-1 на процессорах
1А-32; 2 ** 63-1 на процессорах Intel ЕМ 64Т и Intel Itanium . О трицательные значения об­
рабаты ваю тся как нуль.
п - скалярное целочисленное выраж ение инициализации, определяю щ ее допустимый
параметр вида. В настоящ ее время единственны й доступны й вид - 1.
Правила использования
Автоматический объект может появиться в символьном объявлении. О бъект не может
быть формальным параметром и его длина долж ны бы ть объявлена с выражением спе­
цификации, которое не является константой.
Длина, указанная для сим вольного утверж дения функции или утверждения функции
форм ального аргумента типа C H A RA CTER , долж на бы ть целочисленным константным
выражением.
Когда используется спецификация длины звездочка * (*) для имени функции или
форм ального параметра, это выраж ение принимает длину соответствую щ ей ссылки
функции или фактического параметра. Точно так же, когда спецификация длины звез­
дочка используется для именованной константы, она принимает длину фактической кон­
станты. Например, STRING принимает 9-байтовую длину в следую щ ем утверждении:
CHARACTER^*) STRING
PARAMETER (STRING = VALUE IS:’)
Имя функции не долж но быть объявлено с * длиной, если функция - внутренняя или
функция модуль, или если это значение - массив м одифицировано указателем рекурсив­
но или чисто (без побочных эффектов).
Ф орма CH A RA CTER * (*) является устареваю щ ей возмож ностью в Fortran 95.
Следую щ ий пример показывает, что массив N A M ES содерж ит сто 32-символьных
элем ентов, массив SOCSEC содерж ит сто 9-сим вольных элементов и переменная
N A M ETY , которая является константой длиной в 10 сим волов и имеет начальное значе­
ние A BC D EFG H 1J'.
CHARACTER*32 NAMES(100),SOCSEC(100)*9,NAMETY*10 /’ABCDEFGHIJV
С ледую щ ий пример вклю чает утверж дение CH A RA CTER , объявляя две 8-символь­
ных переменные, LA ST и FIRST.
INTEGER, PARAMETER:: LENGTH=4
CHARACTER*(4+LENGTH) LAST, FIRST
С ледую щ ий пример показывает утверж дение CH A RA CTER , которое объявляет мас­
сив LETTER , содерж ащ ий 26 односимвольны х элементов. Это утверждение такж е объяв­
ляет формальный параметр BU B BLE, который имеет передаваемую длину, определяе­
мую программой вызова.
SUBROUTINE S1(BUBBLE)
CHARACTER LETTER(26), BUBBLE*(*)
В следую щ ем примере N A M E2 - автом атический объект:
SUBROUTINE AUT0_NAME(NAME1)
CHARACTER(LEN = *) NAME1
CHARACTER(LEN = LEN(NAMEI)) NAME2
Глава 4. Описания 71
Утверждения объявления на производные типы
Производный тип (TY PE) - утверж дение объявления, которое определяет свойства
объектов и функций типа, определенного пользователем.
Производный тип должен быть определен прежде, чем вы можете определить объек­
ты этого типа в утверждение объявления TYPE.
О бъект производного типа не долж ен иметь атрибута PUBLIC, если его тип -
PRIVATE.
Конструктор структуры определяет значения для объектов производного типа.
Следующие примеры - утверж дения объявления производного типа:
TYPE(EMPLOYEE) CONTRACT

TYPE(SETS), DIMENSION^,:), ALLOCATABLE :: S U B S E TJ.


Следующий пример показывает общ едоступны й тип с частными компонентами:
TYPE LISTJTEMS
PRIVATE

TYPE(LISTJTEMS), POINTER :: NEXT, PREVIOUS


END TYPE LISTJTEMS

4.2. Утверждения объявления на массивы


О бъявление массива (или оператор объявления м ассива) объявляет форму массива.
Требуется следующая форма:
(a-spec)
где а -spec является одной из следую щ их спецификаций массива:
■ Спецификации явной формы.
■ Спецификации перенимаю щ ей формы, конфигурации (assum ed-shape array).
■ Спецификации перенимаю щ его размера.
■ Спецификации отлож енной формы.
Спецификация массива может быть приписана к имени массива, когда массив объяв­
лен.
Следующие примеры показываю т объявления массива:
SUBROUTINE SUB (N, С, D, Z)
REAL, DIMENSION (N, 15):: IARRY ! Массив явной формы
REAL С (:), D (0:) ! Массив перенимающей формы
REAL, POINTER:: В (::) I Указатель массива отложенной формы
REAL, ALLOCATABLE, DIMENSION (•):: К ! Отложенная форма размещаемого массива
REAL:: Z (N, *) ! Массив, перенимающий размер

Спецификации явной формы


Массив явной формы объявлен с явны ми значениями для границ в каж дом измерении
массива. Спецификация явной формы принимает следую щ ую форму:
([dl:]du[t [d¡:]du]...)
где di - выражение спецификации, указы ваю щ ее нижню ю границу измерения. В ы раж е­
ние может иметь положительную величину, отрицательную или нулевое значение.
72 С Д . А т а пт, В В К ондрат ьев П р о гр а ч и р о ва н и е на Visual FO RTRAN

В случае необходим ости значение преобразовывается в целочисленны й тин. Если ниж­


няя граница не указана, она является 1.
du является выраж ением спецификации, указы ваю щ им верхнее, связанное измерение.
Вы раж ение м ож ет иметь полож ительную величину, отрицательную или нулевое значе­
ние. В случае необходим ости значение преобразовы вается в целочисленны й тип.
Границы м огут быть указаны как постоянные или непостоянны е выражения таким
образом:
■ Если границы - постоянны е вы ражения, диапазон ниж него индекса массива включает
набор целочисленны х значений между нижней и верхней границей. Если нижняя гра­
ница больш е, чем верхняя, диапазон пуст, степень в этом измерении - нуль, и массив
им еет размер нуля.
■ Если границы - непостоянны е выражения, массив долж ен бы ть объявлен в процедуре.
Границы м огут иметь другие значения при вы полнении процедуры, так как они опре­
деляю тся при вызове процедуры.
Границы переменных не могут быть переопределены или не определены в выражении
специф икации, во время выполнения процедуры.
С ледую щ ие м ассивы явной формы могут определить непостоянны е границы:
■ Автомат ический массив (массив - локальная переменная).
■ М ассив с переменны м и границами (массив - форм альны й параметр к подпрограмме).
С ледую щ ие примеры - спецификации явной формы:
INTEGER I (3:8,-2:5) 1Ранжирует двумерный массив; диапазон измерения первой
! переменной от 3 до 8, диапазон измерения
• второй переменной от -2 до 5
SUBROUTINE SUB (А, В, С)
INTEGER:: В, С
REAL, DIMENSION (В:С):: А ! Ранжирует одномерный массив; диапазон от В до С

Автоматические массивы
М ассивы, автом атически размещ аем ы е компилятором (автоматические массивы), -
это массивы , для которых память отводится при входе в процедуру и освобож дается при
вы ходе из нее. Границы измерений, а следовательно, к он ф ш урац и я и размер автом атиче­
ского м ассива вы числяю тся при каждом обращ ении к процедуре. В процессе выполнения
процедуры границы не долж ны переопределяться.
Автоматический массив - массив явной форм ы , который является локальной пере­
менной. А втом атические массивы - разреш аю тся в ф ункциях и подпрограммах и долж ны
бы ть объявлены в части специф икации подпрограмм ы . М инимум одна граница автом а­
ти ческого м ассива долж на быть выражением непостоянной спецификации. Границы оп ­
ределяю тся при вы зове подпрограммы.
С ледую щ ий прим ер показывает автом атические м ассивы:
SUBROUTINE SUB1 (А, В)
INTEGER А, В, LOWER
COMMON /BOUND/ LOWER

¡NTEGER AUT0_ARRAY1(B)

INTEGER AUT0_ARRAY2(L0W ER:B)


Глава 4 Описании 73
INTEGER AUTO_ARRAY3(20, В*А/2)
END SUBROUTINE

Массивы с переменными границами


Массив с переменными границами - массив явной формы, который является ф орм аль­
ным параметром подпрограммы. М инимум одна граница массива с переменны м и грани­
цами долж на быть непостоянным выражением спецификации. Границы определяю тся
при вызове подпрограммы. Спецификация массива м ож ет содерж ать целые переменны е,
которые являю тся или формальными параметрами, или переменными в общем блоке (!).
При вызове подпрограммы каждый формальный параметр, указанный в границах
массива, долж ен быть связан с фактическим параметром. Если спецификация вклю чает
переменную в общ ем блоке, переменная долж на иметь определенное значение. С пеци­
фикация массива выполняется, используя значения фактических параметров, а такж е л ю ­
бых констант или общ их основных переменных, которые появляю тся в спецификации.
Размер массива с переменными границами долж ен быть меньш е размера массива или
равным массиву, который соответствует фактическом у параметру.
Чтобы избежать возможных ош ибок в оценке ниж него индекса, удостоверьтесь, что
выражения границ использую тся, как объявлено, и что м ногом ерны е м ассивы с перемен-
• ными границами соответствую т границам так, как объявлено вызываю щ ей программой.
В следую щ ем примере функция вы числяет сумму элем ентов м ассива ранга 2. О брати­
те внимание, как формальные параметры М и N управляю т итерацией:
FUNCTION THE_SUM(A, М, N)
DIMENSION А(М, N)
SUMX = 0.0
DO J = 1, N
DO I = 1, M
SUMX = SUMX + A(l, J)
END DO
END DO
THE.SUM = SUMX
END FUNCTION
С ледую щ ие выражения - примеры запросов к TH E SUM :
DIMENSION A1(10,35),A2(3,56)
S U M 1=TH E_SU M (A1,10,35)
SUM2 = THE_SUM(A2,3,56)
Следую щ ий пример показывает, что границы м ассива определили, когда процедура
введена, и они не изменяю тся в течение выполнения:
DIMENSION ARRAY(9,5)
L=9
М=5
CALL SUB(ARRAY,L,M)
END
SUBROUTINE SUB(X,I,J)
DIMENSION X(-I/2:I/2,J)
X(I/2,J) = 999
J= 1
I= 2
END
74 С Д Алгазин, В В К он драт ьев П рограм ирование на Visual FORTRAN

Н азначения на I и J не затрагиваю т объявление м ассива с переменными границами X


как X (-4 :4 ,5 ) на входе подпрограмм ы .

Спецификации перенимающей формы (конфигурации)


М ассив перенимающей формы (конфигурации) - формальный массив, параметр кото­
рого принимает форму (конф игурацию ) связан ною с ним фактического массива пара­
метра. С пециф икация переним аю щ ей формы (конфигурации) принимает следую щ ую
форму:

где сИ - вы раж ение специф икации, указы ваю щ ее нижню ю границу измерения. Вы раж е­
ние м ож ет иметь полож ительную величину, отрицательную или нулевое значение.
В случае необходим ости значение преобразовано в целочисленны й тип.
Если нижняя граница не указана, она предполагается равной 1.
Ранг массива - число указанны х двоеточий (:). Значение верхней границы является
степенью соответствую щ его изм ерения связанного фактического параметра массива +
нижняя граница - 1.
С ледую щ ее вы раж ение - прим ер спецификации предполагаемой формы:
INTERFACE
SUBROUTINE SUB(M)
INTEGER M (:,1:,5:)
END SUBROUTINE
END INTERFACE
INTEGER L(20, 5-25,10)
CALL SUB(L)
SUBROUTINE SUB(M)
INTEGER M(:, 1:,5:)
END SUBROUTINE
М ассив M имеет те же сам ы е степени, что и у массива L, но массив М имеет границы
(1:20, 1:21,5:14).
О братите вним ание на то, что явный интерфейс требуется для вызова подпрограммы,
которая ож идает переним аю щ ую форму или массив указателя.

Спецификации перенимающего размера


М ассив перенимающий разм ер - форм альны й массив, параметр которого принимает
размер связанного с ним ф актического массива; ранг и степени могут отличаться для
ф актических и ф орм альны х м ассивов.
С пециф икация предполагаем ого разм ера принимает следую щ ую форму:
([expli-shape-spec], [expli-shape-spec]... [с//:] *)
где expli-shape-spec - специф икация явной форм ы (см. разд. 4.2).
d l является вы раж ением специф икации, указы ваю щ им нижню ю границу измерения.
Это вы раж ение м ож ет им еть полож ительную величину, отрицательную или нулевое зна­
чение. При необходим ости значение преобразовано в целочисленны й тип. Если нижняя
граница не указана, то, как предполагаю т, она является равной единице.
* - верхняя граница последнего измерения.
Ранг м ассива - число специф икаций явной формы плюс единица.
Размер м ассива приним ается от фактического параметра, связанного с предполагае­
мым размером ф орм ального массива, следую щ им образом:
Г iа ва 4 О т к ачни 75
■ Если фактический параметр - массив гипа кроме сим вольного по ум олчанию , размер
ф ормального м ассива - размер фактического массива.
■ Если фактический параметр - элем ент м ассива типа кроме сим вольного по ум олча­
нию, размер форм ального массива: а + 1 - s, где s - значение порядка н и ж н ею индек­
са; а - размер фактического массива.
■ Если ф актический параметр по ум олчанию - сим вольны й массив, элем ент м ассива
или подстрока элем ента массива и он начинается в сим вольном м одуле памяти Ь-
м ассива с ^-символьны м и модулями памяти, разм ер ф орм ального м ассива определя­
ется таким образом:
MAX(INT((n + 1 - b)/y), 0)
где у - длина элем ента форм ального массива.
М ассив перенимаю щ ий размер мож ет использоваться целиком только в ссы лках м ас­
сива в случаях:
■ Ф актического параметра в ссылке процедуры, которая не требует формы.
■ Во встроенной функции LBO U N D.
П оскольку натуральная величина массива переним аю щ его разм ера неизвестна, м ас­
сив перенимаю щ его размера не м ож ет быть используем ы м как лю бое следую щ ее вы ра­
жение в утверждении ввода/вывода:
■ имя массива в списке ввода/вывода;
■ идентификатор модуля для внутреннего файла;
■ спецификатор ф ормата во время выполнения.
П ример спецификации перенимаю щ его размера:
SUBROUTINE SUB (A, N)
REAL А, N
DIMENSION (1:N, *)

Спецификации отложенной формы


Массив отложенной формы - это указатель массива или разм ещ аем ы й массив. Раз­
мещ аемы е массивы отличаю тся от автом атических тем, что создание и уничтож ение
производятся при выполнении некоторы х операторов. Т акие м ассивы создаю тся при вы ­
полнении оператора A LLO C A TE и уничтож аю тся при вы полнении оператора
D EA LLO CA TE (или при выходе из процедуры, если они не им ею т атрибута SAV E).
С пецификация м ассива содерж ит двоеточие (:) для каж дого изм ерения массива. Н и ­
какие границы не указаны. Границы и форма разм ещ аем ого м ассива и указателя м ассива
определены при условии выделения пространства для м ассива в течение вы полнения
программы.
Указатель массива - это массив, объявленный с атрибутом PO IN TER . Его границы и
форма определены, если он связан с целью назначением указателя или если указатель
определен выполнением утверж дения A LLO C A TE.
В назначении указателя нижняя граница каж дого изм ерения указателя м ассива - р е­
зультат встроенной функции LBO U N D , обращ аю щ ейся к соответствую щ ем у изм ерению
цели. Верхняя граница каж дого измерения - результат встроенной ф ункции U BO U N D ,
обращ аю щ ейся к соответствую щ ем у измерению цели.
76 С Д Алгазин , В. В. К ондрат ьев. И рограм ирование на Visual FORTRAN

Ф ормальный параметр-указатель мож ет быть связан только с фактическим парамет-


ром -указагелем . Ф актический параметр-указатель может бы ть связан с неуказательным
формальным параметром.
Результат функции м ож ет бы ть объявлен, чтобы иметь атрибут указателя.
Размещ аемый м ассив объявляется с атрибутом A LLO CA TA BLE. Его границы и ф ор­
ма определены, если массив размещ ен выполнением утверждения ALLO CATE.
Следую щ ее выраж ение - примеры спецификаций отлож енной формы:
REAL, ALLOCATABLE:: А(:,:) ! Размещаемый массив
REAL, POINTER-: С (:), D ! Указатели массива

4.3. Атрибут и утверждение ALLOCATABLE


А трибут A L LO C A TA B L E определяет, что массив - размещ аемый массив с отлож ен­
ной формой. Ф орма разм ещ аем ого м ассива определена, если выполняется утверждение
A LLO C A TE, динамически разм ещ аю щ ее пространство для массива. А трибут
A LLO C A TA BLE может бы ть указан в утверж дении объявления типа или в утверждении
A L LO C A TA B LE и приним ает одну из форм:
Тип утверж дения объявления:
type, [att-ls] ALLOCATABLE [, att-ls] :: a[(d-spec)] [, a[(d-spec)]]...
Утверждение:
ALLOCATABLE [::] a[(d-spec)] [, a[(d-spec)]]...
где type - специф икатор типа данны х; att-ls - дополнительны й список спецификаторов
атрибута; а - имя разм ещ аем ого массива; это выражение не долж но бы ть формальным
параметром или результатом функции; d-spec - спецификация отлож енной формы ( : [ , : ]
...); каж дое двоеточие представляет измерение массива.
Правила использования
Если м ассиву даю т атрибут D IM EN SIO N в другом месте программы , он долж ен бы гь
объявлен как массив отлож енной формы.
Когда размещ аем ы й м ассив больш е не нужен, память мож ет быть освобож дена вы ­
полнением утверж дения D EA LLO CA TE.
Размещ аемый массив не м ож ет бы ть указан в CO M M O N , E Q U IV A LEN CE, DATA или
в утверж дении NAMEL1ST.
Разм ещ аем ые массивы не сохраняю тся по умолчанию . Если вы хотите сохранить зна­
чения размещ аем ого м ассива после вызовов процедуры, вы долж ны определить атрибут
SAVE для массива.
Следующий пример показывает утверждение объявления типа, определяющее атрибут:
ALLOCATABLE
REAL, ALLOCATABLE :: Z(:, :, :)
С ледую щ ее вы раж ение - пример утверж дения A LLO C A TA BLE:
REAL А, В(:) ALLOCATABLE :: А(:,:), В

4.4. Атрибуты и утверждения AUTOMATIC и STATIC


А трибуты A U TO M A TIC и STAT1C управляю т распределением памяти переменных
в подпрограмме.
I 'taeu 4. Описании 77
Атрибуты A U TO M A TIC и STA TIC могут бы ть указаны в утверж дении объявления
типа или утверж дения A U TO M A TIC или STA TIC и приним аю ! одну из форм:
Типы утверж дения объявления:
type, [att-ls] AUTOMATIC [, att-ls] [::] v [, v]...
type, [atf-/sj STATIC [, att-ls] [::] v [, v]...

Утверждение:
AUTOMATIC v[,v]...
STATIC vlv] . ..
где type - спецификатор типа данны х; att-ls - дополнительны й список специф икаторов
атрибута; v - имя переменной или специф икации массива; м ож ет иметь лю бой тип.
Правила использования
О бъявления A U TO M A TIC и STA TIC воздействую т на разм ещ енны е в памяти данны е,
следую щ им образом:
■ П еременная, объявленная как A U TO M A T IC и разм ещ енная в памяти, сохраняется
в стеке.
■ П еременная, объявленная как STA TIC и разм ещ енная в памяти, сохраняется в стати ­
ческой области памяти.
Если вы хотите сохранить определения переменны х после повторного входа к под­
программам, вы долж ны использовать атрибут SAVE.
Д инам ические локальны е неременны е могут ум еньш ить объем использованной пам я­
ти, потому что память под них выделяется только на время выполнения.
Д инам ические локальны е перем енны е допускаю т возм ож ную рекурсию . С рекурсией
подпрограмма может вы звать себя (прямо или косвенно), и получаю щ иеся значения д о с­
тупны на последую щ ий вызов или возвращ аю тся к подпрограмм е. Д ля рекурсии н еобхо­
димо указать оператор REC U R SIV E одним из следую щ их способов:
■ Как клю чевое слово в утверж дении FU N CTIO N или SU B RO U TIN E.
■ Как опция компилятора.
■ Как опция в утверж дении O PTIO N S.
По ум олчанию компилятор разм ещ ает локальны е переменны е нерекурсивны х п од­
программ, за исклю чением разм ещ аем ы х массивов, в статической области памяти. К ом ­
пилятор может разместить переменную в регистре, если он замечает, что переменная все­
гда определяется перед использованием.
С оответствую щ ее использование атрибута SA V E м ож ет предотвратить предуп реж де­
ния компилятора, если переменная используется преж де, чем она определена.
Чтобы изменить значения по ум олчанию для переменны х, определите их как
A UTOM ATIC или определите R EC U R SIV E (одним из упом януты х выш е способов).
Чтобы отменить лю бую опцию компилятора, которая м ож ет воздействовать на пере­
менные, явно определите переменные как A U TO M A T IC или STATIC.
Примечание. Переменные, которые инициализированы данны ми, и переменные в утверж дени­
ях C O M M O N и S A V E являются всегда статическими, независимо от опции компилятора, оп­
ределяющей рекурсию.
П еременная не мож ет бы ть указана как A U TO M A T IC или STA TIC более одного раза
в том же модуле обзора.
Если переменная - указатель, то A U TO M A TIC или STA TIC прим еняю тся только
к указателю непосредственно, а не к лю бой связанной цели.
78 С Д А 1гаш и, В В. Кондрат ьев. П рограм ироваине на Visual FO RTRAN

Н екоторые переменные не м огут быть указаны как A U TO M A TIC или STATIC. Сле­
дую щ ая таблица показы вает соответствую щ ие ограничения.
Переменная AUTOMATIC STATIC
Формальный аргумент Нет Нет
Автоматический объект Нет Нет
Элемент общего блока Нет Да
Связанный использованием элемент Нет Нет
Функциональный результат Нет Нет
Компонент производного типа Нет Нет
П еременная мож ет быть указана и с атрибутами SAVE и с STATIC.
Если переменная находится во внешней области действия модуля, она может быть
указана как STA TIC, но не как A U TO M A TIC.
Следую щ ие примеры показы ваю т утверждения объявления типа, определяю щ ие ат­
рибуты A U TO M A TIC и STATIC:
REAL, AUTOMATIC *: А, В, С
INTEGER, S TA T IC :: ARRAY_A
Следую щ ий прим ер показывает утверждения A U TO M A TIC и STATIC:

CONTAINS
INTEGER FUNCTION REDO_FUNC
INTEGER I, J(10), К
REAL C, D, E(30)
AUTOMATIC I, J, K(20)
STATIC C, D, E

END FUNCTION

4.5. Утверждение COMMON


У тверж дение CO M M O N определяет одну или более непрерывны е области или блоки
физической памяти (называемые общ ими блоками), к которым можно получить доступ
из лю бого модуля обзора в выполнимой программе. Утверж дения COM M ON также оп­
ределяю т порядок, в котором переменные и массивы сохранены в каждом общ ем блоке,
который м ож ет предотвратить располож енные с наруш ением границ элементы данных.
О бщ ие блоки могут быть названными (именованными) или неназванными (непоме­
ченный общий блок).
Утверж дение CO M M O N принимает следую щ ую форму:
COMMON [l[cname]f\ var-list [[,] l[cname]l var-lisf\...
где спате - имя общего блока; может быть опущено для непомеченного общего блока (If).
var-list является списком имен переменной, отделенны х запятыми. Переменная не
долж на бы ть формальным параметром, размещ аемым массивом, автоматическим объек­
том, функцией, результатом функции или входом в процедуру. О на не долж на иметь ат­
рибута PA R A M ETER . Если указан объект производного типа, он долж ен быть типа по­
ел едовател ьности.
Правила использования
Общ ий блок - глобальный объект и долж ен иметь имя, отличное от имен других гло­
бальных объектов в программе, типа подпрограммы или функции.
Гтааа 4 Описании 79
Лю бое общ ее имя блока (или непомеченны й общ ий блок) может появиться несколько
раз в одном или нескольких утверж дениях CO M M O N в модуле программы. Список по­
сле каждого последовательного появления общ его блока тог же. О бщ ее имя блока обр а­
батывается как продолж ение списка для блока, связанного с этим именем.
Переменная м ож ет появиться только в одном общ ем блоке в пределах м одуля обзора.
Если в общ ем блоке указан массив, он может сопровож даться спецификацией массива
явной формы, каждая граница массива долж на быть постоянным выражением специф и­
кации. Такой массив не долж ен иметь атрибут POIN TER.
Указатель может быть связан только с указателями того же типа, параметра вида и
ранга.
Объект с атрибутом TA R G E T м ож ет быть связан с другим объектом только с атри бу­
том TA RG ET того же типа и параметра вида.
П еременная-неуказатель может бы ть связана только с другой неуказательной п ере­
менной. Связывание зависит от их типа таким образом:
Тип переменной Тип связанной переменной
Числовое встроенное1 или последовательное Может иметь любой из этих типов
числовое2
Символьное по умолчанию или последователь­ Может иметь любой из этих типов
ное символьное2
Любой другой встроенный тип Должен иметь тот же самый тип и родовые параметры
Любой другой последовательный тип Должен иметь тот же самый тип
1 Целочисленное по умолчанию, действительное по умолчанию, действительное двойной точности, комплексное по умолча­
нию, комплексное двойной точности или логическое по умолчанию.
2 Объект последовательного числового или символьного типа появляется в общем блоке, как если бы индивидуальные ком­
поненты были бы перечислены непосредственно в общем списке.

П еременные могут быть связаны, если они имею т различный числовой тип. Н ап ри ­
мер, следующ ее выраж ение допустимо:
INTEGER (20)
REAL Y (20)
COMMON/QUANTA/A, Y
Если общ ие блоки от различных модулей программы имею т одно и то же имя, они
разделяю т одну ту же область памяти при условии объединения модулей в вы полним ую
программу.
Объектам память назначается общ ими блоками на взаимно однозначном основании.
Так, тип данных объектов, назначенный утверж дением C O M M O N в одном модуле про­
граммы, должен согласовы ваться с типом данных объектов, помещ енным в общ ий блок
другим модулем программы. Н апример:
Программная единица Л Программная единица В
COMMON CENTS INTEGER(2) MONEY
COMMON MONEY

Когда эти модули объединены в выполнимую программу, могут быть получены н е­


правильные результаты, если 2-байтовы й M O N EY целой переменной задан соответст­
вующим 2 байтам действительной переменной CENTS.
И менованные общ ие блоки долж ны бы ть объявлены так, чтобы иметь тот же размер в
каждой программной единице. Н епом еченный общ ий блок мож ет иметь разные длины
в различных программных единицах (!).
80 С Д A fi'cfJUH, В. В К ондрат ьев. Л рогр а м и р о ва н и е на Visual FO RTRAN

Примечание. Если общ ий блок инициализирован утверждением D A T A , модуль, содержащий


инициализацию , должен объявить, что общ ий блок будет максимальной определенной длины.
Это ограничение не применяется, если вы собираете все исходные модули вместе.
В следую щ ем примере в утверж дении CO M M O N переменные H EA T и X помещ аются
в непом еченны й общ ий блок и переменны е KILO и Q - в помеченный общ ий блок BLK1:
Основная програм ма П одпрограмма
COMMON HEAT, X /BLK1/KIL0, Q SUBROUTINE FIGURE
COMMON /BLK1/LIMA, R I /ALFA,BET

CALL FIGURE RETURN


END
О ператор CO M M O N делает доступны м и переменны е в разны х программны х едини­
цах. О ни м огут бы ть названы другим и именами. Они пом ещ аю тся в одни и те же ячейки
памяти.
С ледую щ ий прим ер показы вает, как утверж дение CO M M O N м ож ет использоваться
для объявления массивов:
COMMON / MIXED I SPOTTED(IOO), STRIPED(50,50)

4.6. Утверждение DATA


У тверж дение D A TA назначает начальные значения на переменны е перед вы полнени­
ем програм мы . Требуется следую щ ая форма:
DATA var-list/c-listl[[] var-list/c-list/\..
где var-list - список переменны х или неявных D O -списков, отделенны х запятыми. Вы ра­
ж ения ниж него индекса и вы раж ения в ссылках подстроки долж ны бы ть выражениями
инициализации.
Н еявны й D O -список в утверж дении D A TA приним ает следую щ ую форму:
{do-list, ш - ехрг1, ехрг2 [, ехргЗ])
где do-list - список одного или более элементов м ассива, подстрок, скалярных компонен­
тов структуры или неявного D O -списка, отделенны х запятыми. Лю бы е элементы массива
или скалярны е компоненты структуры не долж ны иметь постоянный родительский эле­
мент.
var - имя скалярной целой переменной (неявная D O -иерем енная).
ехрг - скалярное целочисленное выражение. М ож ет содерж ать переменные других
неявны х D O -списков. Эти вы раж ения имею т этот неявный D O -список в пределах их
диапазонов.
с-1ist - список констант (или имен констант) или объектов указателя NULL (); кон­
станты долж ны бы ть от делены запятыми. Если константа - конструктор структуры, каж­
дый ком понент долж ен бы ть вы раж ение инициализации. Если константа находится в
двоичной, восьм еричной или ш естнадцатеричной форме, объект передачи долж ен иметь
тип "целое".
К онстанта м ож ет бы ть указана в форме r*constant, где г - спецификация повторения.
Это неотрицательная скалярная целочисленная константа (без параметра вида). Если это
вы раж ение - им енованная константа, она долж на быть предварительно объявлена в мо­
дуле обзора или сделана доступной через связы вание хостом или использованием. Если г
опущ ен, эго вы раж ение является 1.
Глава 4 Описания 81
Правила использования
П еременная в выполнимой программе мож ет бы ть инициализирована только однаж ­
ды. П еременная, которая появляется в утверждении D A TA и им еет неявный тип, может
появиться в последующ ем объявлении типа, которое м ож ет изм енить неявное описание.
Число констант в c-Iist (с-списке) долж но равняться числу перем енны х в var-list (пе­
ременном списке). Константы назначаются на переменные в порядке, в котором они по­
являю тся (слева направо). Следую щ ие объекты не могут бы ть инициализированы в ут­
верждении DATA:
■ формальный параметр;
■ функция;
■ результат функции;
■ автоматический объект;
■ размещ аемый массив;
■ переменная, являю щ аяся доступной через связы вание хостом или использованием;
■ переменная в помеченном общем блоке (если утверж дение D A TA не находится в про­
грамме данных модуля блока);
■ переменная в непомеченном общ ем блоке.
За исключением переменных в помеченных блоках C O M M O N , им енованная пере­
менная имеет атрибут SAVE, если она инициализирована в утверж дении D A TA . Вы мо­
жете подтвердить это свойство, определяя переменную в утверж дении SA V E или утвер­
ждении объявления типа, содерж ащ ем атрибут SAVE. К огда имя м ассива появляется в
утверждении DATA, значения назначены на каждый элем ент этого массива в порядке
прогрессии нижнего индекса. Связанный постоянный список долж ен содерж ать доста­
точно много значений, чтобы заполнить массив.
Значения элемента массива могут бы ть инициализированы трем я способами: по им е­
ни, элементом или неявным D O -списком (интерпретируем ы м таким же образом , как кон­
струкция DO).
Следую щ ие конверсионные правила и ограничения относятся к переменны м и посто­
янным пунктам списка:
■ Если константа и переменная - числового типа, происходит преобразование:
■ постоянное значение преобразовано в тип данны х инициализируем ой переменной,
если это необходимо;
■ когда двоичная, восьмеричная или ш естнадцатеричная константа назначена на пе­
ременную или элемент массива, число цифр, которы е м огут бы ть назначены, зави­
сит от типа данных элемента данных. Если константа содерж ит меньш е цифр, чем
вместимость переменной или элем ента массива, константа продлевается слева ну­
лями. Если константа содерж ит больш е цифр, чем м ож ет бы ть сохранено, кон­
станта обрезается слева.
■ Если константа и переменная - символьного типа, происходит преобразование:
• при длине константы меньше длины переменной сим волы м ладш его разряда пози­
ции переменной инициализированы со знаками пробела;
■ при длине константы больш е длины переменной сим вольная константа обрезается
справа.
■ Если константа имеет числовой тип и переменная им еет сим вольны й тип, применяю т­
ся ограничения:
• символьная переменная долж на иметь длину одного символа;
82 С. Д Алгазин, В В Кондрат ьев. П рограм ирование на Visual FORTRAN


константа долж на бы ть целым числом, двоичной, восьмеричной или ш естнадцате­
ричной константой и долж на иметь значение в диапазоне от 0 до 255.
■ Когда константа и переменная соответствую т этим ограничениям , переменная ини­
циализирована с сим волом , который имеет код A SCII, определенны й константой.
(Это позволяет вам инициализировать символьный объект к лю бом у 8-битовому коду
A SC II.)
■ Если константа - холеритовая или символьная константа и переменная - числовая пе­
рем енная или числовой элем ент массива, то число символов, которое может быть на­
значено, зависит от типа данны х элем ента данных.
■ Если холеритовая или сим вольная константа содерж ит меньш е символов, чем вме­
стим ость перем енной или элем ента массива, константа продлевается справа знаками
пробела. Если константа содерж ит больш е сим волов, чем м ож ет быть сохранено, кон­
станта обрезается справа.
С ледую щ ий прим ер показы вает 3 способа, с помощ ью которых утверж дения DATA
м огут и нициализировать элем ент массива.
DIMENSION А(10,10)
DATA А/100*1.0/ ! инициализация по имени
DATA А(1,1), А(10,1), А(3,3) /2*2.5,2.0/ ! инициализация элементом
DATA ((A(I,J), 1=1,5,2), J=1,5) /15*1.0/ ! инициализация неявным DO-списком
С л едую щ и й п ри м ер п о к азы в ает утверж д ен и я D A T A , сод ер ж ащ и е ком п он ен ты
стр у кту р ы :
EMPLOYEE TYPE
ID INTEGER
CHARACTER (LEN=40) NAME
EMPLOYEE END TYPE
TYPE(EMPLOYEE) MAN_NAME, CON_NAME
DATA MAN_NAME / EMPLOYEE(417, ’Henry Adams’) I
DATA CON_NAME%ID, CON_NAME%NAME /891, "David James 7
В следую щ ем прим ере первое утверж дение D A TA назначает нуль на все 10 элементов
м ассива А и 4 звездочки, сопровож даем ы е 2 пробелами к символьным переменным
STA RS:
INTEGER А(10), В(10)
CHARACTER BELL, TAB, LF, FF, STARS*6
DATA A ,STA RS/10*0,’ **** ’/
DATA BELL,TAB,LF,FF /7,9,10,12/
DATA (B(l), 1=1,10,2) /5*1/
В этом случае второе утверж дение D A TA назначает коды управляю щ его символа
A SC II на сим вольны е перем енны е BELL, TA B, LF и FF. П оследнее утверж дение DATA
использует неявны й D O -список, чтобы назначить значение 1 к элементам с нечетным
ном ером в м ассиве В.
Как возм ож ность Fortran 95, указатель мож ет быть инициализирован как разъединен­
ный при использовании утверж дения DATA. Например:
INTEGER, POINTER :: Р
DATA P/NULL( )/
END
Глава 4. Описании 83

4.7. Атрибут и утверждение DIMENSION


А трибут D IM EN SIO N определяет, что объект - массив, и оп ределяет форму массива.
А трибут D IM EN SIO N может бы ть указан в утверж дении объявления типа или в ут­
верждении D IM EN SIO N и принимает одну из следую щ их форм:
Тип ут верж дения объявления:
type, [att-ls] DIMENSION (a-spec) [, att-ls] :: a[{a-spec)] [, a[(a-spec)]]...
Утверждение:
DIMENSION [::] a(a-spec) [, a(a-spec)]...
где type - спецификатор типа данных; att-ls - дополнительны й список специф икаторов
атрибута; a-spec - спецификация массива; (В утверж дении объявления типа лю бая сп е­
цификация массива, расположенная после м ассива, отм еняет лю бую специф икацию м ас­
сива после утверж дения D IM EN SIO N .) а - имя объявляем ого массива.
Правила использования
А трибут D IM EN SIO N размещ ает множ ество запом инаю щ их элем ентов каж дому им е­
нованному массиву, один запоминаю щ ий элем ент к каж дому элем енту м ассива в каждом
измерении. Разм ер каж дого запоминаю щ его элем ента определен типом данны х массива.
Общ ее количество запоминаю щ их элем ентов, назначенны х на массив, равно числу,
полученному умнож ением числа элем ентов в каж дом измерении в специф икации м асси­
ва. Для примера: следую щ ее утверж дение определяет М А С С И В из 16 действительны х
элементов по 4 байта в каждом и определяет М А ТРИ Ц У из 125 целочисленны х элем ен ­
тов по 4 байта в каждой:
DIMENSION ARRAY(4,4), MATRIX(5,5,5)
М ассив может бы ть объявлен в следую щ их утверж дениях: A L LO C A T A B L E ,
POIN TER, TA R G ET и CO M M O N .
Следую щ ие примеры показы ваю т утверж дения объявления типа, определяю щ ие ат­
рибут D IM EN SIO N :
REAL, DIMENSION (10,10):: А, В, С (10,15) ! Спецификация после С отменяет
! спецификацию после DIMENSION
REAL, ALLOCATABLE, DIMENSION^) :: E
Следую щ ие выражения - примеры утверж дения D IM EN SIO N :
DIMENSION ВОТТОМ(12,24,Ю)
DIMENSION Х(5,5,5), Y(4,85), Z(100)
DIMENSION MARK(4,4,4,4)
SUBROUTINE APROC(A1 ,A2,N1 ,N2,N3)
DIMENSION A1(N1:N2),A2(N3:*)
CHARACTER(LEN = 20) D
DIMENSION A(15), B (15,40), C (-5:8,7), D(15)

4.8. Утверждение EQUIVALENCE


У тверж дение EQ U IV A LEN CE определяет, что область пам яти используется двумя
или более объектами в программной единице. Это утверж дение объявляет' полную или
частичную ассоциацию памяти объектов, которы е разделяю т область памяти.
У тверж дение EQ U IV A LEN CE принимает следую щ ую форму:
EQUIVALENCE (equiv-list) [, (equiv-list)]...
84 С Д Алгазин, В В К ондрат ьев. П рограм ирование на Visual FORTRAN

где equiv-list - список двух или более переменных, элементов массива или подстрок, от­
деленны х запяты м и (этот список указы вает эквивалентный набор). Если указан объект
производного типа, он долж ен бы ть типа последовательности. О бъект не может иметь
атрибута TA RG ET. Каждое вы раж ение в нижнем индексе или ссылке подстроки должно
быть целочисленны м выраж ением инициализации. П одстрока не долж на иметь длины
нуля.
Правила использования
Следую щ ие объекты не м огут бы ть указаны в утверж дениях EQ UIV A LEN CE:
■ форм альны й параметр;
■ разм ещ аем ы й массив;
■ указатель;
■ объект непоследовательного производного типа;
■ объект последовательного производного типа, содерж ащ его указатель в структуре;
■ функция, вход или имя результата;
■ им енованная константа;
■ компонен г структуры;
■ п одобъекг лю бого из вы ш еупомянуты х объектов;
■ объект с атрибутом D L LIM PO R T или D LLEX PO R T.
У тверж дение EQ U IV A LEN C E заставляет все объекты в одном введенном списке быть
разм ещ енны м и в памяти, начинаю щ емся в том же самом адресе памяти.
А ссоциация объектов зависит от их типов таким образом, как это показано в таблице.
Тип объекта Тип связанного объекта
Встроенное числовое значение1 или числовая Может иметь любой из этих типов
последовательность
Принимаемое по умолчанию символьное зна­ Может иметь любой из этих типов. Длины не должны
чение или символьная последовательность быть равными
Любой другой встроенный тип Должен иметь тот же самый тип и родовые параметры
Любой другой последовательный тип Должен иметь тот же самый тип
1Принимаемое по умолчанию целочисленное, действительное, действительное двойной точности, комплексное, комплекс­
ное двойной точности или логическое.
О бъекты м огут быть связаны , если они им ею т различный числовой тип. Например,
следую щ ее утверж дение допустим о:
INTEGER А(20)
REAL Y(20)
EQUIVALENCE (A, Y)
Т екстовы е объекты по ум олчанию не долж ны иметь ту же длину. Следую щ ий при­
мер - текстовая переменная D эквивалентна с последним и четырьмя символами (из 6)
текстового м ассива F:
CHARACTER(LEN=4) D
CHARACTER(LEN=3) F(2)
EQUIVALENCE^, F(1)(3:))
О бъекты , им ею щ ие различны е типы данны х, могут быть связаны, потому что повто­
ряю щ иеся компоненты типа данны х м огут разделить память с отдельным компонентом
вы ш еупорядоченного типа данны х. Н апример, если вы сделаете целую переменную эк­
вивалентной комплексной переменной, целая переменная разделяет память с вещ ествен­
ной частью комплексной переменной.
Глава 4 Описании 85
Тот же модуль памяти не м ож ет встречаться более одного раза в последовательности
памяти, и последовательные модули памяти не могут б ь п ь указаны способом , который
сделал бы их непоследовательны ми.
Следую щ ее утверж дение EQ U IV A LE N C E недопустимо, потому что это определяет
тот же модуль памяти для X (1) и X (2):
REAL, DIMENSION^), *: X
REAL :: Y
E Q U IV A L E N C E S ), Y), (X(2), Y)
Следую щ ее утверж дение E Q U IV A LE N C E недопустимо, потому что А (1) и А (2) не
будут последовательными:
REAL А(2)
DOUBLE PRECISION D(2)
E Q U IV A L E N C E S ), D(1)), (A(2), D(2))
В следую щ ем примере утверж дение EQ U IV A LEN C E вы зы вает 4 элем ента целого
массива IARR, чтобы разделить гу ж е пам ять с вещ ественной перем енной D V A R д в о й ­
ной точности.
DOUBLE PRECISION DVAR
INTEGER (KIND=2) IARR (4)
EQUIVALENCE (DVAR, IARR (1))
В следующ ем примере утверж дение E Q U IV A LE N C E вы зы вает первый сим вол си м ­
вольных переменных KEY и STA R, чтобы разделить то же м естополож ение памяти.
Символьная переменная STA R эквивалентна подстроке (1:10) сим вольной переменной
KEY.
CHARACTER KEY*16, STAR*10
EQUIVALENCE(KEY, STAR)

Создание эквивалентных массивов


Когда вы делаете элем ент одного м ассива эквивалентны м элем енту другого массива,
утверждение EQ U IV A LEN CE такж е устанавливает эквивалентности м еж ду другим и эл е­
ментами 2 массивов. Таким образом , если первы е элементы 2 м ассивов равного разм ера
сделаны эквивалентными, оба м ассива разделяю т ту ж е память. Если третий элем ент
массива с 7 элем ентам и сделан эквивалентны м первому элем енту другого массива, по­
следние 5 элементов первого м ассива наклады ваю тся на первые 5 элем ентов второго
массива.
Д ва или более элем ентов того ж е м ассива не долж ны быть связаны друг с другом в
одном или более одного утверж дениях EQ U IV A LEN C E. Н априм ер, вы не м ож ете и с­
пользовать утверж дение E Q U IV A LEN C E , связы вая первый элем ент одного м ассива с
первым элементом другого м ассива и затем делая попытку связать четверты й элем ент
первого массива с седьмым элем ентом другого массива.
Рассмотрите следую щ ий допустим ы й пример:
DIMENSION TABLE (2,2), TRIPLE (2,2,2)
EQUIVALENCE(TABLE(2,2), TRIPLE(1,2,2))
Эти утверждения заставляю т весь массив TA B L E разделять часть пам яти, вы деленной
массиву TRIPLE. Табл. 4.2 показы вает, как эти утверж дения вы равниваю т массивы.
86 С. Д. А лгат н. В . В . К ондрат ьев П рограм ирование на Visual FO RTRAN

Таблица 4.2. Эквивалентность памяти массива


Массив TRIPLE Массив TABLE
Элементы массива Номер элемента Элементы массива Номер элемента
TRIPLE(1,1,1) 1
TRIPLE(2,1,1) 2
TRIPLE(1,2,1 ) 3
TRIPLE(2,2,1) 4 TABLE0.1) 1
TRIPLE(1,1,2) 5 TABLE(2,1) 2
TRIPLE(2,1,2) 6 TABLE(1,2) 3
TRIPLE(1,2,2) 7 TABLE(2,2) 4
TRIPLE(2,2,2) 8
Каждое из следую щ их утверждений совмещ ает 2 массива:
Е01Л\/А1_ЕМСЕ(ТАВ1_Е, ТР1Р1_Е(2,2,1))
ЕСША1_ЕМСЕ(ТР1Р1_Е(1,1,2), ТАВ1Е(2,1))
Вы можете такж е сделать массивы эквивалентными с ниж ними границами не едини­
цами. Н апример, массив определен как А(2:3,4) - последовательность 8 значений. Ссыл­
ка на А (2,2) относится к 3-му элементу в последовательности. Сделать массив А(2:3,4)
разделяю щ им память с массивом В(2:4,4) вы можете, используя следую щ ее утверждение:
Е01Л\/А1ЕМСЕ(А(3)4)) В(2,4))
Весь массив А занимает часть ячеек памяти, выделенной м ассиву В. Табл. 4.3 показы­
вает, как это утверж дение вы равнивает массивы.

Таблица 4.3. Эквивалентность массивов с неединичными


нижними границами
Массив В Массив А
Элементы массива Номер элемента Элементы массива Номер элемента
В(2,1) 1
В(3,1) 2
В(4,1) 3 А(2,1) 1
В(2,2) 4 А(3,1) 2
В(3,2) 5 А(2,2) 3
В(4,2) 6 А(3,2) 4
В(2,3) 7 А(2,3) 5
В(3,3) 8 А(3,3) 6
В(4,3) 9 А(2,4) 7
В(2,4) 10 А(3,4) 8
В(3,4) 11
В(4,4) 12
М ассивы м огут быть выравнены следую щ ими утверждениями:
EQUIVALENCE^, В(4,1)) EQUIVALENCE(B(3,2), А(2,2))
Т олько в утверж дении EQ U IV A LEN CE вы можете идентиф ицировать элемент масси­
ва с единственны м нижним индексом (описывая массив как одномерны й), даже при том,
что массив был определен как многомерный. Н апример, следую щ ие утверждения вырав­
ниваю т 2 м ассива так, как показано в табл. 4.3.
DIMENSION В(2:4,1:4),А(2:3,1:4)
E Q U IV A L E N C E S ), А(4))
Г ю в а 4 Описания 87
Создание эквивалентных подстрок
Когда вы делаете один символ подстроки эквивалентным другому, утверж дение
EQ UIV A LEN CE устанавливает ассоциации между другим и соответствую щ ими сим вола­
ми в символьном объекте; например:

CHARACTER NAME*16, ID*9


EQUIVALENCE(NAME(10:13), ID(2:5))

Эти утверждения заставляю т символьные переменные N A M E и 1D разделять про­


странство (рис. 4.1). М ассивы м огут такж е быть выравнены следую щ им утверждением:
EQUIVALENCE(NAME(9:9), Ю(1:1))

NAME STAR Нижний


Символьная Символьная позиция
индекс
позиция 1

Нижний F I E L D S
индекс Символьная позиция

ГО
Символьная
позиция

Рис. 4.1. Символьные


переменные NAME и ID

Если символьные ссылки подстроки -


элементы массива, утверж дение E Q U IV A ­
LENCE устанавливает ассоциации между
другими соответствую щ ими сим волами в
полных массивах. Текстовы е элементы
массивов могут налож иться в лю бой сим ­
вольной позиции. Н апример, следую щ ие
L/VW
утверждения заставляю т сим вольны е м ас­
сивы FIELDS и STA R разделять память
(см. рис. 4.2).

Рис. 4.2. Эквивалентность символьных


88 С Д Л ъ чш т , В В К ондрат ьев П рограм ироваиие на Visual FORTRAN

EQUIVALENCE и взаимодействие с COMMON


О бщ ий блок м ож ет простираться вне его первоначальны х границ, если переменные
или массивы связаны с объектам и, сохраненны ми в общ ем блоке.
О днако общ ий блок мож ет только простираться вне последнего элемента; расш ирен­
ная часть не может предш ествовать первому элементу в блоке.
Рис. 4.3 показывает' допустим ое расш ирение общ его блока:
D IM EN SIO N А(4), В(6)
COMMON А А (1) А (2) А (3) А (4)
E Q U IV A L E N C E (А (2) и В(1)) В (6)
В (1) В (2) В(3) В (4) В (5)
K-------------------------V------------------------*
а б
Рис. 4.3. Допустимоерасширение общего быока.
а - существующий COMMON-блок,
б - частьрасширения
Рис. 4.4 показы вает недопустимое расш ирение общ его блока:
D IM EN SIO N А(4), В(6)
СОМ MON А А (1) А (2) А(3) А (4)
E Q U IV A LEN C E (А ( 2 ), В(3))
В(1) В (2) В(3) В (4) В (5) В (6)

Рис 4.4. Недопустимоерасширение общего блока:


а - частьрасширения: б - существующий COMMON-
блок:
в - частьрасширения
Второй прим ер недопустим, потом у что расш иренная часть, В (1), предш ествует пер­
вому элем енту общ его блока.
С ледую щ ий пример показывает' допустим ое утверж дение и недопустимое утверж де­
ние E Q U IV A LEN C E в контексте о б щ ею блока:
COMMON А, В, С
DIMENSION D(3)
EQUIVALENCE (В, D (1)) • Допустимо, потому что общий блок продлен на конце
COMMON А, В, С
DIMENSION D (3)
EQUIVALENCE (В, D (3)) ! Недопустимо, потому что D(1) в общем
! блоке, предшествует местоположению А.

4.9. Атрибут и утверждение EXTERNAL


А трибут E X T E R N A L позволяет внеш ней или ф орм альной процедуре использоваться
как ф актический параметр. (Чтобы определить встроенны е процедуры как фактические
парам етры , используйте атрибут IN TR IN SIC .)
А трибут E X TER N A L может быть указан в утверж дении объявления типа или утвер­
ждении E X TE R N A L и приним ает одну из следую щ их форм:
Тип ут верж дения объявления:
type, [att-ls,] EXTERNAL [, att-ls] [*:] ex-pro [, ex-pro]...
Г лава 4. Описании 89
Утверждение:
EXTERNAL ex-pro [, ex-pro]...
где type - спецификатор типа данных; att-ls - дополнительны й список спецификаторов
атрибута; ех-рго - имя внеш ней (обеспеченной пользователем ) процедуры или форм аль­
ной процедуры.
Правила использования
В утверждении объявления типа только функция м ож ет бы ть объявлена как
EXTERNAL. О днако вы можете использовать ут верж дение EX TER N A L, чтобы объ я­
вить внеш ние подпрограммы и блоки данных программны х единиц так же, как функции.
Имя объявляет, что EX TER N A L является именем внеш ней процедуры, даж е если имя
совпадает с именем встроенной процедуры. Н априм ер, если S1N объявлен с атрибутом
EXTERNAL, все последую щ ие ссылки к S1N к обеспеченной пользователем названной
функции S1N, а не к встроенной функции с тем же самым именем.
Вы можете вклю чить имя блока данных модуля программы в утверж дение
EXTERNAL, чтобы вызвать поиск библиотек объектных модулей для данных блока во
время редактирования. О днако имя блока данных м одуля програм мы не долж но исполь­
зоваться в утверждении объявления типа.
Следующ ий пример показывает утверж дение объявления типа, определяю щ ие атри­
бут EXTERNAL:
PROGRAM TEST

¡NTEGER, EXTERNAL:: BETA


LOGICAL, EXTERNAL:: COS

CALL SUB(BETA)! Внешняя функция BETA - фактический параметр


Вы можете использовать имя, указанное в утверж дении E X TER N A L как фактический
параметр в подпрограмме, и подпрограмма мож ет затем использовать соответствую щ ий
формальный параметр в ссылке функции или в утверж дении CA LL. Н апример:
EXTERNAL FACET
CALL BAR(FACET)
SUBROUTINE BAR(F)
EXTERNAL F
CALL F(2)
Используемая в качестве параметра полная ссы лка функции представляет значение,
а не подпрограмму. Н апример, FUN C (В) представляет значение в следую щ ем утверж де­
нии:
CALL SUBR(A, FUNC(B), С)

4.10. Утверждение IMPLICIT


Утверждение IM PLICIT отм еняет неявные правила типа для имен, принимаемые по
умолчанию. (Тип данных по умолчанию : IN TEG ER - для имен, начинаю щ ихся с сим во­
лов от 1 до N, и REA L - для имен, начинаю щ ихся с лю бого другого символа.)
Утверждение IM PLICIT принимает одну из следую щ их форм:
IMPLICIT type (а[, а]...)[, type (а[, а]...)]...
IMPLICIT NONE
где type - спецификатор типа данных (C H A R A C T ER * (*) не разреш ается).
90 С. Д Алгазин, В . В К он драт ьев П рограм ирование на Visual FORTRAN

а - буква, знак доллара ($) или диапазон символов в алфавитном порядке. Ф орма для
диапазона из сим волов - а1 -а 2 , где второй символ следует за первым в алфавитном по­
рядке (наприм ер, А -С ).
Знак доллара может использоваться в конце диапазона символов, так как IM PLICIT ин­
терпретирует доллар, так что он в алфавитном порядке следует за символом Z. Например,
диапазон Х -$ обратился бы к идентификаторам, начинаясь с символов X, Y, Z или $.
Правила использования
У тверж дение IM PL IC IT назначает указанный тип данных (и параметр типа) ко всем
именам, не им ею щ им никакого явного типа данных и начинаю щ имся с указанного сим ­
вола или диапазона сим волов. Это правило не применимо для типов данных по ум олча­
нию встроенны х процедур.
К огда тип данны х - C H A R A C T E R *1еп, где len - длина для сим вольного типа, целая
константа без знака или целочисленное вы раж ение инициализации, заклю ченное в круг­
лы е скобки. Д иапазон для len составляет: 1-2 ** 31-1 на процессорах 1А-32 и 1-2 ** 63-1
на процессорах Itanium . И мена, начинаю щ иеся со знака доллара ($), - неявно IN TEG ER
У тверж дение IM PL IC IT N O N E отм еняет все неявные правила типа. Когда использу­
ется IM PL IC IT N O N E, все имена в м одуле программы долж ны быть явно объявлены. У т­
верж дение IM PL IC IT N O N E долж но предш ествовать лю бы м утверж дениям PA R A ­
M ETER , и не долж но бы гь никаких других утверждений IM PLIC IT в модуле обзора.
Примечание. Когда используются переменные, но нет объявлений, можно получать диагности­
ческие сообщ ения, определив опцию компилятора вместо применения IM P L IC IT N O N E .
С ледую щ ее утверж дение IM PL IC IT представляет типизацию ум олчания для имен, ес­
ли они явно не типизированы :
INTEGER IMPLICIT (l-N), REAL (A-H, 0-Z)
С ледую щ ие прим еры - утверж дения IM PLICIT:
IMPLICIT DOUBLE PRECISION (D)
IMPLICIT COMPLEX (S,Y), L0GICAL(1) (L.A-C)
IMPLICIT CHARACTER*32 (T-V)
IMPLICIT CHARACTER*2 (W)
IMPLICIT TYPE(COLORS) (E-F), INTEGER (G-H)

4.11. Атрибут и утверждение INTENT


V isual Fortran дает возм ож ность задавать спецификацию назначения формальных па­
рам етров в качестве входны х, выходных или входных-выходных, т. е. универсальных.
Специф икация назначения им еет одну из 3 форм: IN TEN T(IN ) - входные, IN TEN T
(O U T) - вы ходны е, IN T E N T (IN O U T ) - универсальные.
Если форм альны й параметр задан как входной IN TEN T(IN ), то он долж ен быть опре­
делен при входе в процедуру и не долж ен переопределяться в процедуре.
Если форм альны й параметр задан как выходной IN TEN T(O U T), то соответствую щ ий
ф актический параметр м ож ет бы ть не определен при входе в процедуру, но долж ен быть
определен к м оменту вы хода из процедуры. Ф актическим параметром в этом случае м о­
ж ет быть только переменная.
Если форм альны й парам етр задан как универсальный lN T E N T (lN O U T ), то он должен
бы ть определен при входе и выходе из процедуры, очевидно, что в этом случае ф актиче­
ский параметр - переменная.
Гпава 4. Описании 91
Таким образом, атрибут IN TEN T определяет намеченное использование одного или
более формальных параметров.
А трибут IN TEN T может быть указан в утверж дении объявления типа или утвер ж д е­
нии IN TEN T и принимает одну из следую щ их форм:
Тип утверж дения объявления:
type, [att-ls] INTENT (intent-spec) [, att-ls]:: d-arg [, d-arg]...
Утверждение:
INTENT (intent-spec) [: ] d-arg [, d-arg]...
где type - спецификатор типа данных; att-ls - дополнительны й сиисок специф икаторов
атрибута; intent-spec является одним из следую щ их спецификаторов:
■ 1N определяет, что формальный параметр будет использоваться только для того, что­
бы передать данные в процедуру. Ф орм альны й параметр не долж ен бы ть переопреде­
лен (или становиться неопределенным) в течение выполнения процедуры . Л ю бой свя­
занный фактический параметр долж ен быть выраж ением.
■ O U T определяет, что формальный параметр будет использоваться, чтобы передать
данны е от процедуры назад к вызову програм мы . Ф орм альны й парам етр не определен
на входе и долж ен бы ть определен прежде, чем на него ссы лаю тся в процедуре. Л ю ­
бой связанный ф актический параметр долж ен бы ть определим ы м .
■ 1NOUT определяет, что формальный параметр м ож ет обеспечить данны е к процедуре
и возвратить данны е к программе вызова. Л ю бой связанны й ф актический парам етр
долж ен быть определимым.
d-arg - имя форм ального параметра или форм ального указателя. Это вы раж ение не
может быть формальной процедурой или ф орм альны м указателем.
Правила использования
Утверждение INTENT может появиться только в части спецификации подпрограммы или
тела интерфейса. Если никакой атрибут INTENT не указан для формального параметра, его
использование подчинено ограничениям, связанным с фактическим параметром. Если функ­
ция определяет оператор, формальные параметры должны иметь значение IN.
Если подпрограмм а определяет определенное назначение, первы й парам етр долж ен
иметь IN TEN T O U T или 1NOUT, а второй параметр долж ен им еть IN T E N T IN.
Н еуказательный формальный параметр с INTEN T IN (или подобъект такого ф орм аль­
ного параметра) не долж ен появляться как лю бое из следую щ их выраж ений:
■ D O -переменная или неявная D O -переменная;
■ переменная оператора присваивания;
■ объект указателя оператора присваивания указателя;
■ объект или переменная STA T в A LLO C A T E или утверж дении D E A L L O C A T E ;
■ пункт входа в утверж дении READ;
■ имя переменной в утверж дении N A M ELIST, если N A M E LIST группы появляется в
спецификаторе N M L в утверж дении READ;
■ внутренний модуль файла в утверж дении W RITE;
■ определимая переменная в утверж дении IN Q U IR E (запросить);
■ спецификатор 10STA T или SIZE в утверж дении ввода/вы вода;
■ фактический параметр в ссылке на процедуру с явны м интерф ейсом, если связанны й
формальный параметр имеет значение O U T или INOUT.
IN TEN T на формальном параметре указателя относится к статусу ассоциации указа­
теля и не имеет никакого эф ф екта на значение цели указателя. Ф орм альны й парам етр
92 С. Д. Алгазин, В. В К ондрат ьев П рограм ироваиие на Visual FORTRAN

указателя со значением 1N (или подобъект такого параметра указателя) не должен поя­


виться как лю бое из следую щ их выражений:
■ объект указат еля в утверж дении N U LL IFY ;
■ объект указателя в операторе присваивания указателя;
■ объект в утверж дении A L LO C A TE или D EA LLO CA TE;
■ фактический параметр в ссы лке на процедуру, если связанный фиктивный параметр -
указатель с атрибутом IN TEN T(O U T ) или IN TEN T (1NOUT).
Если фактический параметр - секция м ассива с векторным нижним индексом, это вы­
раж ение не мож ет быть связано с форм альным массивом, который определен или пере­
определен (иметь значение O U T или 1NOUT).
Следую щ ий пример показы вает утверж дения объявления тииа, определяю щ ие атри­
бут INTENT:
SUBROUTINE T E S T (U )
INTEGER, IN TE N T(IN ):: I
INTEGER, INTENT(OUT), D IM EN SIO N(I):: J
Следующее примеры - утверждения INTENT:
SUBROUTINE TEST(A, В, X)
INTENT(INOUT):: A, В

SUBROUTINE CHANGE(FROM, TO)


USE EMPLOYEEJ/IODULE
TYPE(EMPLOYEE) FROM, TO
INTENT(IN) FROM
INTENT(OUT) TO

4.12. Атрибут и утверждение INTRINSIC (встроенный)


А трибут IN TR IN SIC позволяет собственном у имени встроенной процедуры исполь­
зоваться как фактический параметр. (Не все собственны е имена могут использоваться
как фактические параметры. См. табл. 8.1.)
А трибут IN TR IN SIC м ож ет бы ть указан в утверж дении объявления типа или утвер­
ж дении IN TR IN SIC и принимает одну из следую щ их форм:
Тип ут верж дения объявления:
type, [att-ls] INTRINSIC [, att-ls] [::] in-pro [, in-pro]...
Утверждение:
INTRINSIC in-pro [, /п-pro]...
где type - спецификатор типа данны х; att-ls - дополнительны й список спецификаторов
атрибута; in-pro - имя встроенной процедуры.
Правила использования
В утверж дении объявления типа только функции могут быть объявлены INTRINSIC.
О днако вы м ож ете использовать ут верж дение IN TR IN SIC , чтобы объявить подпрограм­
му, так же как функцию , чтобы сделать эту подпрограмм у встроенной.
П редполож им, что имя, объявленное в IN TR IN SIC , является именем встроенной про­
цедуры. Если родовому имени встроенной функции даю т атрибут INTRINSIC, имя со­
храняет его родовы е свойства.
Следую щ ий пример показы вает утверж дение объявления типа, определяю щ ее атри­
бут INTRIN SIC:
/ 'пава 4 Описания 93

PROGRAM EXAMPLE

REAL(8), IN TRINSIC:: DACOS

CALL TEST(X, DACOS) ! Встроенная функция DACOS - фактический параметр


Следую щ ий пример показы вает утверж дение INTRIN SIC:
Основная программа П одпрограмм а
EXTERNAL CTN SUBROUTINE TRIG(X, F, Y)
INTRINSIC SIN, COS Y = F(X)
RETURN
END
CALL TRIG(ANGLE, SIN, SINE)
FUNCTION CTN(X)
CTN = COS(X)/SIN(X)
CALL TRIG(ANGLE, COS, COSINE) RETURN
END
CALL TRIG(ANGLE, CTN, COTANGENT)
О братите внимание на то, что когда TRIG вы зы вается со вторым параметром S1N или
COS, то ссылки функции F (X) на библиотечны е функции SIN и COS Fortran 95/90; но
когда TRIG вызывается со вторым параметром CTN , F (X) ссылается на функцию поль­
зователя CTN.

4.13. Утверждение NAMELIST


У тверж дение N A M E LIST связы вает имя со списком переменных. Это имя группы
может быть использовано в некоторы х операциях ввода/вы вода. У тверж дение
N A M ELIST принимает следую щ ую форму:
HMJEUSTIgroup/var-list [\\Jgroup/var-list\..

где group - имя группы; var-Iisí - список переменны х (отделенный запяты м и), которы е
должны бы ть связаны с именем преды дущ ей группы. П еременные м огут им еть лю бой
тип данных.
Правила использования
Имя N A M ELIST группы используется N A M ELIST утверж дениями ввода/вы вода вм е­
сто списка ввода/вывода. У никальное имя группы идентиф ицирует список, объекты ко­
торого могут быть изменены или переданы. В операторах ввода/вы вода специф икация
формата заменяется именем N A M E L lS T -списка (FM T = заменяется на N M L = с указан и ­
ем имени списка). Список ввода/вы вода заверш ается комбинацией сим волов
П еременная мож ет появиться больш е чем в одной N A M E L lST -rpynne.
К каждой переменной в var-list (переменном списке) нужно получить доступ и споль­
зованием или ведущ ей ассоциацией (host), или эта переменная долж на им еть тот же тип,
параметры типа и форму, явно или неявно указанную в том 1же блоке области действия.
Если переменная неявного типа, она м ож ет появиться в последую щ ем объявлении типа,
только если оно подтверж дает неявный тип.
С ледую щ ие переменные не м огут бы ть указаны в N A M E L lST -rpynne:
■ формальный параметр массива с непостоянны м и границами;
■ переменная с принятой сим вольной длиной;
■ размещ аемый массив;
94 С Д Алгазин, В В. К он драт ьев FIрогр а м и р о ва н и е на Visual FORTRAN

■ автомат ический объект;


■ указатель;
■ переменная типа, которая им еет указатель как окончательный компонент;
■ подобъект лю бого из вы ш еупомянуты х объектов.
Только переменные, указанны е в N A M ELIST, м огут быть прочитаны или записаны в
операторе N A M ELIST ввода/вывода. Это не является необходимым для входных записей
в утверж дении N A M ELIST, чтобы определить каж дую переменную в связанном
N A M E L lST -списке. П орядок переменных в N A M ELIST управляет порядком, в котором
значения появляю тся на N A M E LlST -выводе. Ввод значений N A M ELIST может быть в
лю бом порядке.
Если имя группы имеет атрибут PU B LIC , никакой пункт в переменном списке не мо­
ж ет иметь атрибут PRIVA TE. Имя группы мож ет бы ть указано больш е чем в одном ут­
верждении N A M ELIST в м одуле обзора.
П еременный список после каж дого последовательного появления имени группы об­
рабатывается как продолжение списка того же имени группы.
В следую щ ем примере D и Е добавлены к переменным А, В и С для группы, назван­
ной LIST:
NAMELIST /LIST/ А, В, С
NAMELIST /LIST/ D, Е
В следую щ ем примере определены 2 имени группы:
CHARACTEFT30 NAME(25)
NAMELIST /INPUT/ NAME, GRADE, DATE /OUTPUT/ TOTAL, NAME
Имя группы INPU T содерж ит переменны е N A M E, G RA D E и DATE. Имя группы, на­
званной O U TPU T, содерж ит переменны е TO TA L и NAME.
В следую щ ем примере показан ф рагм ент программы с вводом управляемым имено­
ванным списком:
DIMENSION Х(8)
CHARACTER* 10 Р
NAMLIST /EXAMPL/ N, Р, X
READ (*, NML = EXAMPL)

Текст на вводе
&EXAMPLE N=12345, Х(1)=12345, Х(3:4)=2*1.6,
Р='ЭТО ПРИМЕР’/
П осле выполнения оператора REA D переменны е получат следую щ ие значения:
Переменная Значение
N 12345
Х (1) 12345
Х(2) не изменилось
Х (3),Х (4) 1.6
Х (5)-Х(8) не изменилось
Р ЭТО П РИ М ЕР
Глава 4 Описания 95

4.14. Атрибут и утверждение OPTIONAL


А трибут O PTIO N A L разреш ает формальным параметрам бы ть опущ енны ми в ссылке
процедуры, т. е. допускаю тся необязательные парамет ры, если они указаны в операторе
OPTIONAL.
А трибут O PTIO N A L может быть указан в утверж дении объявления типа или утвер­
ждении OPTIO NA L и принимает одну из следую щ их форм:
Тип утверж дения объявления:
type, [att-ls] OPTIONAL [, att-ls]:: d-arg [, d-arg]...
Утверждение:
OPTIONAL [:] d-arg [, d-arg]...
где type - спецификатор типа данны х; att-ls - дополнительны й список спецификаторов
атрибута; d-arg - имя фиктивного параметра.
Правила использования
А трибут O PTIO NA L мож ет появиться только в блоке области действия подпрограм ­
мы или тела интерфейса и мож ет бы ть указан только для формальных параметров.
Формальный параметр присутствует, если он связан с фактическим параметром.
Ф ормальный параметр - это не дополнительны й параметр, он долж ен присутствовать.
Вы можете использовать встроенную функцию PRESEN T, чтобы определить, связан ли
дополнительный формальный параметр с фактическим параметром.
Чтобы вызвать процедуру, которая имеет дополнительны й параметр, надо использо­
вать явный интерфейс.
Следующ ий пример показывает утверж дение объявления типа, определяю щ ее атр и ­
бут OPTIONAL:
SUBROUTINE TEST(A)
REAL, OPTIONAL, DIMENSION(-10:2):: A
END SUBROUTINE
С лед/ю щ ие примеры - утверж дения O PTIO NA L:
SUBROUTINE TEST(A, B, L, X)
OPTIONAL:: В
INTEGER A, B, L, X
IF (PRESENT(B)) THEN ! Печать В - условное выражение
PRINT *, А, В, L, X ! на его присутствие
ELSE
PRINT*, A, L, X
ENDIF
END SUBROUTINE
INTERFACE
SUBROUTINE TEST(ONE, TWO, THREE, FOUR)
INTEGER ONE, TWO, THREE, FOUR
OPTIONAL:: TWO
END SUBROUTINE
END INTERFACE
INTEGER I, J, K, L
1= 1
J=2
K=3
L=4
CALL TEST(I, J, K, L) ! Печать: 1 2 3 4
96 С .Д Ачгазин, В В К он драт ьев П рогралт ровапие на Visual FO RTRAN

CALL TEST(I, THREE=K, FOUR=L) ! Печать: 1 3 4 конец


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

4.15. Атрибут и утверждение PARAMETER


А трибут PA R A M ET E R определяет им енованную константу. Он мож ет бы ть указан в
утверж дении объявления типа или утверж дении PA R A M ET E R и принять одну из сле­
дую щ их форм:
Тип ут верж дения объявления:
type, [att-ls] PARAMETER [, att-ls] :: с = expr [, с - expr]...
Утверж дение:
PARAMETER [(] с = expr [, с = expr] . .[)]
где type - специф икатор типа данны х; att-ls - дополнительны й список спецификаторов
атрибута; с - имя константы; expr - выражение инициализации, мож ет иметь лю бой тип
данны х.
Правила использования
Тип, параметры типа и ф орм а им енованной константы определены одним из следую ­
щ их способов:
■ Я вны м утверж дением объявления типа в том же самом блоке области действия.
■ Н еявны м правилом типа для блока области действия. Если именованная константа -
неявного типа, она может появиться в последую щ ем объявлении типа, только если то
объявление подтверж дает неявный тип.
Р ассмотрите следую щ ее утверж дение:
PARAMETER (MU=1.23)
С огласно неявному типу, MU имеет целочисленны й тип, т. е. M U=1. Для того чтобы
MU равнялась 1.23, константа долж на бы ть предварительно объявлена REA L в объявле­
нии типа или бы ть объявлена в утверж дении IM PLICIT.
И менованная константа не долж на появляться в специф икации формата или как сим ­
вольное вы раж ение холеритовой константы. В результате компиляции запись имени кон­
станты - то же, что запись ее значения.
Если им енованная константа используется как специф икатор длины в объявлении
C H A R A C T ER , она долж на бы ть заклю чена в круглые скобки.
И мя константы не мож ет появиться как часть другой константы, хотя это имя может
появиться как действительная или мнимая часть комплексной константы.
Вы м ож ете использовать им енованную константу только в пределах модуля обзора,
со д ер ж ащ ею определение утверж дения PA R A M ETER .
Л ю бая именованная константа, которая появляется в выраж ении инициализации,
долж н а бы ть предварительно определена в том же утверж дении объявления типа (или в
преды дущ ем утверж дении объявления типа или в утверж дении PA R A M ETER ) или сде­
л ана доступной связы ванием хостом или использованием.
С ледую щ ий п р и м е р показы вает утверж дение объявления типа, определяю щ ее атри­
бут PA R A M ETER :
REAL, PARAMETER :: С = 2.9979251, Y = (4 .1 1 3.0)
Глава 4. Описания 97
Следую щ ие примеры - утверждения PARAM ETER:
REAL(4) PI, PI0V2
REAL(8) DPI, DPI0V2
LOGICAL FLAG
CHARACTER***) LONGNAME
PARAMETER (PN3.1415927, DPI=3.141592653589793238D0)
PARAMETER (PIOV2=PI/2, DPIOV2=DPI/2)
PARAMETER (FLAG= TRUE., LONGNAM E-A STRING OF 25 CHARACTERS’)

4Л6. Атрибут и утверждение POINTER


А трибут PO IN TER определяет, что объект - указатель (динамическая переменная).
У казатель не содерж ит данные, но указывает на скаляр или переменную типа массив,
в которой данные сохранены. У казатель не имеет начальной памяти. П ам ять для него р е ­
зервируется во время работы программы.
А трибут PO IN TER мож ет бы ть указан в утверж дении объявления типа или утверж де­
нии PO IN TER и принимает одну из следую щ их форм:
Тип утверж дения объявления:
type, [att-ls] POINTER [, att-ls] :: ptr[(d-spec)] [, ptr [(d-spec)]]...
Утверждение:
POINTER [::] ptr [(d-spec)] [, ptr [(d-spec)]]...
где type - спецификатор типа данных; att-ls - дополнительны й список спецификаторов
атрибута; p tr - имя указателя (не может бы ть объявлен с атрибутом INTENT или
PARAM ETER; d-spec - спецификация отлож енной-ф ормы (: [:] ...). Каждое двоеточие
представляет измерение массива.
Правила использования
П амять не выделяется для указателя, пока он не разм ещ ен с утверждением
A LLO CATE или пока не назначена цель. Н а указатель нельзя сослаться или определять,
пока с ним не связана память.
Каждый указатель имеет статус ассоциации, который говорит, связывается ли указа­
тель в настоящ ее время с целевым объектом. Когда указатель первоначально объявлен,
его статус не определен. Вы можете использовать встроенную функцию A SSO CIA TED ,
чтобы найти статус ассоциации указателя.
Если указатель - массив, и ему даю т атрибут D IM EN SIO N в другом месте в програм­
ме, он долж ен быть объявлен как массив отлож енной-формы .
Указатель не м ож ет быть указан в DATA, EQ U IV A LE N C E или утверж дении N A M E ­
LIST.
У казатели Fortran 95/90 не то ж е самое, что целочисленны е указатели (см. разд. 4.16).
Следующ ий пример показывает утверж дения объявления типа, определяю щ ие атри ­
бут POINTER:
TYPE(SYSTEM), POINTER :: CURRENT, LAST
REAL, DIMENSION^,:), POINTER :: I, J, REVERSE
Следую щ ие пример - утверждения POIN TER:
TYPE(SYSTEM ):: TODAYS
POINTER:: TODAYS, A(:,:)
98 С Д Алгазин, В В К ондрат ьев П рограм ирование на Visual FO RTRAN

4.17. Атрибуты и утверждения PRIVATE и PUBLIC


А трибуты PR IV A T E и PU BLIC определяю т доступность объектов в модуле. (Они
такж е назы ваю тся атрибутам и доступности.) О бъекты модуля, которые использую тся в
других програм мны х единицах, долж ны иметь атрибут PU B LIC (явно объявленный или
по ум олчанию ). Те объекты модуля, которые предназначены для использования лиш ь
внутри данного м одуля, долж ны бы ть объявлены с атрибутом PRIVATE.
А трибуты PR IV A TE и PU B LIC могут бы ть указаны в утверждении объявления типа
или в утверж дении PR IV A TE или PUBLIC и принимаю т одну из следую щ их форм:
Тип ут верж дения объявления:
type, [att-ls,] PRIVATE [, att-ls]:: entity [, entity]...
type, [att-ls] PUBLIC [, att-ls]:: entity [, entity]...
Утверж дение:
PRIVATE [[::] entity [, entity]..]
PUBLIC [[::] entity I entity]..]
где type - специф икатор типа данных; att-ls - дополнительны й список спецификаторов
атрибута; entity является одним из следую щ их выражений:
• имя переменной;
• имя процедуры;
• имя производного типа;
• им енованная константа;
• имя N A M E LIST группы.
В ф орм е утверж дения объект м ож ет такж е бы ть родовы м идентификатором (родовое
имя, определенны й оператор или определенное назначение).
Правила использования
А тр и б уты P R IV A T E и P U B L IC м огут появи ться то л ько в блоке области дей стви я
м одуля.
В блоке области действия м одуля без списка объекта разреш ается только одно утвер­
ж дение P R IV A T E или PU B LIC ; это утверж дение устанавливает доступность по ум олча­
нию всех объектов в м одуле.
Если никакое утверж дение PU BLIC или PRIV A TE не указаны в модуле, то по ум ол­
чанию доступность - PU B LIC . К объектам с доступностью PUBLIC можно получить дос­
туп снаруж и модуля средствам и утверж дения USE.
Если производны й тип - объявленны й PR IV A TE в модуле, его компоненты такж е -
P R IV A TE.
П роизводны й тип и его компоненты доступны для лю бы х подпрограмм в пределах
м одуля определения через связы вание хостом, но они не доступны извне модуля.
Если производны й тип - объявленны й PU B LIC в модуле, но его компоненты объяв­
лены PR IV A TE , лю бой блок области действия, обращ аю щ ийся к модулю , через связы ва­
ние использованием (или хост-связы вание) мож ет обратиться к определению производ­
ного типа, но не его компонентам .
Если процедура м одуля им еет форм альный параметр или результат функции типа, ко­
торы й им еет P R IV A T E доступность, процедура модуля долж на иметь доступность
PR IV A T E . Если модуль им еет родовой идентификатор, он долж ен бы ть такж е объявлен
PR IV A T E .
Глава 4 Описании 99
Если процедура имеет родовой идентификатор, доступность собственного имени
процедуры не зависит от доступности его родового идентификатора. О бъект м ож ет бы ть
объявленным PRIV A TE, иначе он объявляется PUBLIC.
С ледую щ ие примеры показы ваю т утверж дения объявления типа, оп ределяю щ ие ат­
рибуты PUBLIC и PRIVATE:
REAL, P RIVA TE:: А, В, С
INTEGER, PUB LIC :: LOCAL_SUMS
С ледую щ ие примеры - утверждения PRJV A TE и PU B LIC :
MODULE SOME_DATA
REAL ALL_B
PUBLIC ALL_B
TYPE RESTRICTED_DATA
REAL LOCAL_C
DIMENSION LOCAL_C(50)
END TYPE RESTRICTED_DATA
PRIVATE RESTRICTED.DATA
END MODULE
С ледую щ ее утверж дение объявления производного типа указы вает, что тип ограни­
чен вмодуле:
TYPE, PRIVA TE:: DATA

END TYPE DATA


С ледую щ ий пример показывает тип PU B LIC с компонентам и PR IV A T E :
MODULE M A H E R
TYPE ELEMENTS
PRIVATE
INTEGER C, D
END TYPE

END MODULE M A H E R
В этом случае компоненты С и D являю тся private к типу E L E M E N T S, но тип
ELEM ENTS не private к M O D U LE M A TTER . Л ю бой м одуль програм мы , которы й ис­
пользует модуль M A TTER , м ож ет объявить переменны е ти п а E L E M E N T S и передавать
как значения параметров типа ELEM EN TS.

4.18. Атрибут и утверждение PROTECTED


А трибут PRO TEC TED определяет ограничения на использование объектов м одуля.
Он мож ет бы ть указан в утверждении объявления типа или в утверж дении P R O T EC T ED
и принимает одну из следую щ их форм:
Тип утверж дения объявления:
type, [att-ls] PROTECTED [, att-ls] [::] entity [, entity]...
Утверждение:
PROTECTED entity I entity]...
где type - спецификатор типа данных; att-ls - дополнительны й список специф икаторов
атрибута; entity - имя объекта в модуле.
100 С Д Алгазин, В В. К ондрат ьев. П рограм ирование на Visual FORTRAN

Правила использования
А трибут PR O TEC TED мож ет появиться только в части спецификации модуля. Он
м ож ет бы ть указан только для именованной переменной, которая не находится в общем
блоке.
Н еуказательны й объект, который имеет атрибут PRO TECTED и получает доступ ас­
социацией использования, м ож ет не появляться на переменном определении или как
цель в операторе присваивания указателя.
О бъект указателя, который им еет атрибут PRO TEC TED и получает доступ при помо­
щи связывания использованием , не долж ен появиться как лю бое следую щ ее выражение:
■ объект указателя в утверж дении N U L L IFY ;
■ объект указателя в операторе присваивания указателя;
■ объект в утверж дении A L LO C A TE или D EALLO CA TE;
■ фактический параметр в ссы лке на процедуру, если связанный формальный пара­
метр - указатель с атрибутом IN TEN T(O U T) или INTEN T (INOUT).
Следую щ ие ограничения применяю тся вне модуля, в котором задан объект атрибут
PRO TEC TED :
■ неуказательный объект, возмож но, не определен или переопределен;
■ объект указателя, возмож но, не изменили его статус ассоциации через указатель.
Следую щ ий прим ер показы вает утверж дение объявления типа, определяю щ ее атри­
бут PRO TEC TED :
INTEGER, P R O TE C TED :: D, E
Рассмотрите следую щ ий пример:
MODULE counter_mod
INTEGER, P RO TEC TED :: current = 0
CONTAINS
INTEGER FUNCTION next()
current = current + 1 ! current может быть изменен здесь
next = current
RETURN
END FUNCTION next
END MODULE counterjnod
PROGRAM test_counter
USE counterjnod
PRINT *, next() ! Печатные издания 1
current = 42 ! Ошибка: переменная защищена
END PROGRAM test_counter

4.19. Атрибут и утверждение SAVE


А трибут SA V E сохраняет значения и определение объектов после выполнения утвер­
ждения R ETU RN или EN D в подпрограмме. А трибут SAVE может бы ть указан в утвер­
ждении объявления тип а или утверж дении SAVE и принимает одну из следую щ их форм:
Тип ут верж дения объявления:
type, [dtt-ls] SAVE [, att-ls] [[::] object [, objec(\...]
Утверждение:
SAVE [object I object]...]
Глава 4 Описании 101
где type - спецификатор типа данны х; att-ls - дополнительны й список специф икаторов
атрибута; object - имя объекта или общ его блока, закл ю ч ен н о ю в слеш и: (/соттоп-Ыоск-
пате/).
Правила использования
В Fortran Intel определенны м переменны м по ум олчанию даю т или не даю т атрибут
SAVE:
■ Переменные не сохранены по умолчанию :
• скалярные локальны е переменны е встроенного типа INTEGER,. REAL, CO M PL E X
и LO G ICA L;
• переменные, которы е являю тся заявленны ми A U TO M A TIC;
• локальны е переменные, которы е являю тся размещ аем ы м и массивами;
• переменные производного типа, которы е являю тся данны м и, и н и ц иализированны ­
ми по умолчанию , инициализация лю бой из их компонент;
• переменные RECORD , которы е являю тся данными, инициализированны м и но
умолчанию ; инициализация указана в объявлении STR U CTU RE.
■ П еременные сохранены но умолчанию :
• переменные CO M M O N ;
• скалярные локальны е переменны е не встроенного IN TEG ER типов, REA L,
CO M PLEX и LO G ICA L нерекурсивны х подпрограмм ;
• нескалярные локальны е переменны е нерекурсивны х подпрограмм;
■ данные, инициализированны е утверж дениями DATA.
■ Л окальны е переменны е, которы е не описаны в этих двух списках, сохранены по
умолчанию .
Чтобы расш ирять мобильность и избегать возм ож ны х сообщ ений предупреж дения
компилятора, Intel рекомендует:
■ Вы используете утверж дение SAVE, чтобы назвать переменны е, которы е вы хотите
сохранить между вы зовам и подпрограммы.
■ Когда утверж дение SAVE явно не содерж ит список, все допустим ы е пункты в модуле
обзора сохранены. У тверж дение SAV E не м ож ет определить следую щ ие выражения
(их значения не могут бы ть сохранены ):
• непомеченный общ ий блок;
• объект в общ ем блоке;
• процедура;
• формальный параметр;
■ результат функции;
• автоматический объект;
• константа PA R A M ETER .
Д аж е при том, что общ ий блок м ож ет бы ть вклю чен в утверж дение SAV E, индивиду­
альные переменные в пределах общ его блока м огут стать неопределенны м и (или переоп­
ределенными) в другом модуле обзора.
Если общ ий блок сохранен в каком-нибудь блоке области действия програм мы (кром е
основной программы ), он долж ен быть сохранен в каж дом блоке области действия, в ко­
тором появляется общ ий блок.
У тверж дение SAV E игнорируется в основной программе.
С ледую щ ий прим ер показывает утверж дение объявления типа, определяю щ ее атри ­
бут SAVE:
102 С. Д. Алгазин, В. В. К ондрат ьев П рограм ирование на Visual FORTRAN

SUBROUTINE TESTO
REAL, SAVE :: X, Y
Следую щ ее предлож ение - пример утверж дения SAVE:
SAVE А, /ВЮ СК_В/, С, /BLOCK_D/, Е

4.20. Атрибут и утверждение TARGET


А трибут T A R G ET определяет, что объект мог стать целью указателя (этот объект мо­
ж ет быть указанным). А трибут T A R G ET мож ет бы ть указан в утверждении объявления
тина или утверж дении TA RG ET и принимает одну из следую щ их форм:
Тип утверж дения объявления:
type, [att-ls] TARGET [, att-ls]:: object [(a-spec)] [, object [(a-spec)]]...
Утверждение:
TARGET [::] object [(a-spec)] [, object [(a-spec)]]...
где type - спецификатор типа данны х; att-ls - дополнительны й список спецификаторов
атрибута; object - имя объекта. О бъект не долж ен быть объявлен с атрибутом
PAR A M ETER ; a-spec - спецификация массива.
Правила использования
У казатель связан с целью назначением указателя или утверж дением ALLOCATE.
Если объект не имеет атрибута T A R G ET или не был размещ ен (с помощ ью утвержде­
нием A LLO C A TE), ни к какой части этого объекта получить доступ указателем нельзя.
Следую щ ий пример показы вает утверж дения объявления типа, определяю щ ие атри­
бут TARGET:
TYPE(SYSTEM), TA R G E T:: FIRST
REAL, D IM E N S IO N ^ , 20), TA R G ET:: C, D
Следую щ ий пример - утверж дения TA RG ET:
TARGET ::C(50, 50), D

4.21. Атрибут и утверждение VOLATILE (изменчивый)


А трибут V O LA TILE определяет, что значение объекта полностью непредсказуемо,
основано на информации, локальной для текущ ей программной единицы. Это препятст­
вует объектам быть оптим изированны ми в течение компиляции.
А трибут V O LA TILE мож ет бы ть указан в утверж дении объявления типа или утвер­
ждении V O LA T ILE и принимает одну из следую щ их форм:
Тип утверж дения объявления:
type, [att-ls] VOLATILE [, att-ls] [::] object [, object]...
Утверждение:
VOLATILE object [, object]...
где type - специф икатор типа данных; att-ls - дополнительны й список спецификаторов
атрибута; object - имя объекта или общ его блока, заклю ченного в слеши.
Правила использования
П еременная или блок C O M M O N долж ны быть объявленны м и VO LA TILE, если этот
объект м ож ег бы ть прочитан или записан в способе, не видимом компиляции. Например:
Гчава 4 Описании 103
■ Если используется возм ож ность операционной системы для помещ ения переменной в
совместно используемую память (так, чтобы эта переменная была доступна другим
программам), переменная долж на бы ть объявлена V O LA TILE.
■ Если к переменной получаю т доступ или ее изменяю т подпрограммой, вызываемой
операционной системой при асинхронном случае, переменная долж на быть объявлена
VOLATILE.
Если массив, объявлен V O LA TILE, каждый элем ент в массиве становится изменчи­
вым. Если общ ий блок объявлен V O LA TILE, каждая переменная в общ ем блоке стан о­
вится изменчивой.
Если объект производного типа объявлен V O LA TILE, его компоненты становятся из­
менчивыми.
Если указатель объявлен V O LA TILE, сам указатель становится изменчивым.
Утверждение V O LA TILE не мож ет определить такие выражения:
■ процедуру;
■ результат функции;
■ nam elist-группу.
Следующий пример показы вает утверж дение объявления типа, определяю щ ее атри ­
бут VOLATILE:
INTEGER, VOLATILE:: D, E
Следующ ий пример показы вает утверж дение V O LA TILE:
PROGRAM TEST
L0GICAL(1)IPI(4)
INTEGERS) A, B .C .D , E, ILOOK
INTEGER(4) P1.P2, P3, P4
COMMON /BLK1/A, B ,C
VOLATILE/BLK1/, D, E
EQUIVALENCE(ILOOK, IPI)
EQUIVALENCE^, P1)
E Q U IV A LE N C E S , P4)
Помеченный общий блок BLK1 и переменные D и Е изменчивы. Переменные Р1 и Р4
становятся изменчивыми из-за прямой эквивалентности Р1 и косвенной эквивалентности Р4.
Глава 5. Динамическое распределение

О бъекты данны х м огут быть статическим и или динам ическим и. Если объект данных
является статическим , ему во времени компиляции вы деляется фиксированный объем
памяти, который не освобож дается до выхода из программы . Если объект данных являет­
ся динам ическим , пам ять для объекта м ож ет бы ть создана (разм ещ ена) переменной или
освобож дена во время выполнения программы .
В Fortran 95/90 указатели, разм ещ аем ы е массивы и автом атические массивы - дина­
м ические объекты данных.
П ространство памяти не вы деляется для указателя, пока он не размещ ен с утверж де­
нием A L LO C A TE или до этого назначено разм ещ ение на цель. У казатель может быть
динам ически отсоединен от цели, используя утверж дения N U LLIFY .
У тверж дение A L LO C A TE м ож ет использоваться, чтобы вы делить память для разм е­
щ аемого массива. У тверж дение D E A L L O C A TE используется, чтобы освободить про­
странство памяти, зарезервированное в преды дущ ем утверж дении A LLO CATE.
А втом атические м ассивы отличаю тся от разм ещ аем ы х массивов тем, что они автом а­
тически разм ещ ены и память освобож дается всякий раз, когда вы входите или выходите
из процедуры .

5.1. Утверждение ALLOCATE


У тверж дение A L LO C A T E динам ически создает память, разм ещ ает цели указателя и
м ассивы. Разм ещ енное пространство памяти не инициализировано. Утверждение
A L L O C A T E приним ает следую щ ую форму:
ALLOCATE (object [(s-specl s-spec. .])] [, object[(s-spec[, s-spec...])]].[, STAT=sv])
где object - разм ещ аем ы й объект, имя переменной или ком понент структуры; он же -
у к азател ь или разм ещ аем ы й м ассив. О б ъ ект м ож ет им еть тексто вы й тип с нулевой
дл и н о й .
s-spec является специф икацией форм ы в форме [нижняя граница:] верхняя граница.
Каж дая граница, долж на бы ть скалярны м целочисленны м выраж ением. Число специфи­
каций ф ормы долж но бы ть тем же, что и у ранга объекта.
sv - скалярная целой переменная, в которой сохранен статус распределения.
Правила использования
Г раница в s-spec (s-спецификациях) не долж на бы ть вы раж ением , содерж ащ им функ­
цию запроса м ассива, чей параметр является разм ещ аем ы м объектом в том же утверж де­
нии A L LO C A TE. Н априм ер, следую щ ее выраж ение не разреш ено:
INTEGER ERR
INTEGER, ALLOCATABLE *: A(:), B(:)

ALL0CATE(A(10:25), B(SIZE(A)), STAT=ERR)


!A недопустимо как параметр
1функционирования SIZE
Если переменная STA T указана, она не долж на бы ть размещ ена в утверждении
A L LO C A TE , в котором она появляется. Если распределение успеш но, переменная уста­
новлена на нуль. Если распределение не успеш но, записы вается код ош ибки, который

йтоттп 104
Глава 5. Д инам ическое распределени е 105
присваивается переменной. Если переменная STAT не указана и происходит ош ибка, вы ­
полнение программы заканчивается.
Следую щ ее выражение - пример утверж дения A LLO C A TE:
INTEGER J, N, ALLOC.ERR
REAL, ALLOCATABLE :: A(:), B(:,:)

ALLOCATE(A(0:80), B(-3:J+1, N), STAT = ALLOC.ERR)

Распределение размещаемых массивов


Границы (и форма) размещ аю щ егося м ассива определены , когда он размещ ен. П осле­
дую щ ее переопределение или неопределение лю бы х объектов в связанны х выражениях
не воздействует на спецификации массива.
Если нижняя граница больш е, чем верхняя, то изм ерение им еет степень нуля и массив
имеет размер нуля. Если нижняя граница опущ ена, она предполагается равной 1.
Когда массив размещ ен, границы определены. Если вы пробуете разместить в на­
стоящ ее время размещ енный массив, происходит ош ибка.
Встроенная функция A LLO C A TED мож ет использоваться, чтобы определить, являет­
ся ли в настоящ ее время массив размещ енны м ; например:
REAL, ALLOCATABLE:: Е(:,:)

IF (.NOT. ALLOCATED(E)) ALLOCATE(E(2:4,7))

Статус распределения
В течение выполнения программы статус распределения размещ аем ого массива явля­
ется одним из следую щ их выражений:
■ Не в настоящ ее время размещ аем ый массив. М ассив никогда не размещ ался, или по­
следняя операция на нем была освобож дением. Н а такой массив нельзя сослаться или
определить.
■ В настоящ ее время размещ аем ы й массив. М ассив был размещ ен утверж дением
A LLO CATE. На такой массив можно сослаться, определить или освободить.
Если размещ аемый массив имеет атрибут SAVE, он им еет начальный статус "не в на­
стоящ ее время размещ енный". Если массив затем размещ ен, его статус изменяется на "в
настоящ ее время размещ енный". Этот статус сохраняется до освобож дения массива.
Если размещ аемый массив не имеет атрибута SAVE, он им еет статус "не в настоящ ее
время размещ енный" в начале каж дого вызова процедуры. Если статус массива изм еня­
ется на "в настоящ ее время размещ аем ый", он изм еняется, если процедура закончена вы­
полнением утверждения RETU RN или END.
Приводим программу, которая вы полняет виртуальное распределение памяти. Эта
программа использует стандарт Fortran 95/90 вместо того, чтобы вызывать подпрограмму
распределения памяти операционной системы.
! Программа получает целое число и отображает значения квадратного корня
INTEGER(4):: N
READ (5,*) N ! Читает целое значение
CALL MAT(N)
END
! Процедура МАТ использует типизированное целочисленное значение,
! чтобы отобразить значение квадратного корня чисел от 1 до I (прочитанное число)
SUBROUTINE MAT(N)
106 С. Д. А к а зн и , В В . К о н д р а т ьев . П рограм ирование на Visual FORTRAN

REAL(4), ALLOCATABLE:: SQR(:) ! Объявляет SQR как одномерный распределяемый


! массив ALLOCATE (SQR(N))
! Распределяет массив SQR
DO J=1,N
SQR(J) = SQRT(FLOATJ(J)) !FL0ATJ преобразует целочисленное в REAL
ENDDO
WRITE (6,*) SQR 1Отображает вычисленные значения
DEALLOCATE (SQR) ! Освобождает массив SQR
END SUBROUTINE MAT

Распределение целей указателя


Когда указатель разм ещ ен, он связан с целью и мож ет использоваться, чтобы сослать­
ся или определить цель. (Ц ель м ож ет бы ть массивом или скаляром в зависимости от того,
как был заявлен указатель.) Д ругие указатели м огут стать связанны ми с целью указателя
(или частью цели указателя) назначением указателя.
Чтобы разм естить массивы , указатель может бы ть размещ ен к новой цели, даже если
он в настоящ ее время уж е связан с целью. П реды дущ ее связы вание отменяется и указа­
тель связы вается с новой целью.
Если преды дущ ая цель была создана распределением , она становится недоступной,
если только она не упом янута другим и указателям и, которые в настоящ ее время связы­
ваю тся с этой целью.
Д ля определения, является ли указатель в настоящ ее время связанным с целью, может
использоваться встроенная функция A SSO C IA TE D (состояние связывания указателя
долж но бы ть определено). Н апример:
REAL, TA R G E T:: TAR(0:50)
REAL, P O IN TE R :: PTR(:)
PTR => TAR

IF (ASSOCIATED(PTR.TAR))...

5.2. Утверждение DEALLOCATE


У тверж дение D E A LL O C A T E освобож дает память, распределенную для размещ аемых
м ассивов и целей указателя (и заставляет указатели становиться разъединенными). Эго
вы раж ение приним ает следую щ ую форму:
DEALLOCATE (object I object]..\t STAT=sv])
где object - ком понент структуры или имя переменной и долж ен бы ть указателем или
размещ аем ы м массивом ; sv - скалярная целая переменная, в которой сохранен статус ос­
вобож дения.
Правила использования
Если переменная STA T указана, пам ять не долж на бы ть освобож дена в утверждении
D E A L L O C A TE , в котором эта переменная появляется. Если освобож дение прошло ус­
пеш но, переменная установлена на нуль. Если освобож дение прош ло неуспешно, пере­
менная содерж ит код ош ибки. Если переменная STAT не указана и происходит ошибка,
выполнение програм мы заканчивается.
Рекомендуется, чтобы вся явно размещ енная пам ять бы ла явно освобож дена, если она
не является нужной.
Гтава 5 Д инам ическое р а с п р е д е ieuue 107
Следую щ ий пример показывает освобож дение разм ещ аем ого массива:
INTEGER A LL0C .ERR
REAL, ALLOCATABLE :: A(:), B(:,:)

ALLOCATE (A(10), B(-2:8,1:5))

DEALLOCATE^, B, STAT = ALLOC.ERR)

Освобождение размещаемых массивов


Если утверж дение D EA LLO CA TE определяет м ассив, который в настоящ ее время не
размещ ен, происходит ошибка.
Если размещ аемый массив с атрибутом T A R G E T освобож ден, состояние связы вания
лю бого указателя, связанного с ним, становится неопределенны м .
Если утверж дение RETURN или END заканчивает процедуру, разм ещ аем ы й м ассив
имеет один из следую щ их статусов распределения:
■ Сохраняется его предыдущ ее распределение и статус ассоциации, если верно сл е­
дую щ ее утверждение:
• массив имеет атрибут SAVE;
• массив находится в блоке области действия м одуля, к которому обращ ается другой
блок области действия, вы полняю щ ийся в настоящ ее время;
• массив доступен связыванием хостом.
■ М ассив остается размещ енны м , если к нему получает доступ ассоциация и сп ользова­
ния, иначе его статус распределения освобож ден.
Встроенная функция A L LO C A TED м ож ет использоваться, чтобы определить, являет­
ся ли размещ аемый массив в настоящ ее время размещ енны м . Н апример:
SUBROUTINE TEST
REAL, ALLOCATABLE, SAVE :: F(\:)
REAL, ALLOCATABLE:: E(:,:,-)

¡F (.NOT. ALLOCATED(E)) ALLOCATE(E(2:4,7,14))


END SUBROUTINE TEST
О братите внимание на то, что при выходе из подпрограм м ы TEST, статус расп р ед ел е­
ния F поддержан, потому что F имеет атрибут SAVE. Так как Е не им еет атрибута SAVE,
он освобождается. На следую щ ем вызове TE ST Е будет иметь статус "не в настоящ ее
время размещ енный".

Освобождение целей указателя


Указатель не долж ен освобож даться, пока он им еет определенное состояние связы ва­
ния. Если утверж дение D EA LLO CA TE определяет указатель, который им еет н еопреде­
ленный статус связывания, или указатель, цель которого бы ла не создана р асп ределен и ­
ем, происходит ошибка.
Указатель не долж ен освобож даться, если он связан с разм ещ аем ы м м ассивом или он
связан с частью объекта (такого, как элем ент м ассива или секция м ассива).
Если указатель освобож ден, состояние связы вания лю бого другого указателя, связан ­
ного с целью (или частью цели), становится неопределенны м .
Выполнение утверждения RETURN или END в подпрограмм е вы зы вает состояние
связывания указателя из лю бого объявленного указателя (или получает доступ) в проце­
дуре и становится неопределенным при условии:
108 С. Д. Алгазин, В. В. К ондрат ьев. Программирование на Visual FORTRAN

■ Он имеет атрибут SAVE.


■ Он находится в блоке области действия модуля, к которому обращ ается другой блок
области действия, выполняемый в настоящ ее время.
■ Он доступен связы ванием хостом (см. стр. 93).
■ Он находится в непом еченном общ ем блоке.
■ Он находится в им енованном общ ем блоке, который появляется в другом блоке об­
ласти действия, выполняемом в настоящ ее время.
■ Он - возвращ аем ое значение функции, объявленной с атрибутом POINTER.
Если состояние связывания указателя становится неопределенным, на него нельзя
впоследствии сослаться или определить.
Следую щ ий пример показы вает освобож дение указателя:
INTEGER ERR
REAL, P O IN TE R :: PTR_A(:)

ALLOCATE (PTR_A(10), STAT=ERR)

DEALLOCATE(PTR_A)

5.3. Утверждение NULLIFY


У тверж дение N U LLIFY разъединяет указатель от его цели. Это утверждение прини­
мает следую щ ую форму:
NULLIFY (pointer-ob]ect [, pointer-ob]ecf\...)
где р о inter-object - компонент структуры или имя переменной (это долж ен быть указа­
тель, имею щ ий атрибут POIN TER.
Правила использования
Н ачальное состояние связы вания указателя не определено. Вы можете использовать
N U LLIFY , чтобы инициализировать неопределенный указатель, давая ему статус разъе­
динения. Затем указатель м ож ет бы ть проверен, используя встроенную функцию A SSO ­
CIA TED .
Следую щ ее выраж ение - прим ер утверждения NULLIFY:
REAL, TA R G E T:: TAR(0:50)
REAL, POINTER :: PTR_A(:), PTR_B(:)
PTR_A => TAR
PTR_B => TAR

NULLIFY(PTR_A)
П осле того как эти утверж дения выполняю тся, PTR A разъединен, в то время как
PTR B остается связанны м с переменной TAR.
Глава 6. Управление выполнением

П рограмма обы чно вы полняет утверж дения в порядке, в котором они записаны . К он­
струкции и утверждения управления вы полнением изм еняю т это норм альное вы полне­
ние, передавая управление другом у утверж дению в программе или выбирая блоки (груп ­
пы) конструкций и утверж дений для вы полнения или повторения.
В Fortran 95/90 можно дать имя конструкции контроля (CA SE, DO и IF). Имя долж но
быть уникальным идентификатором в блоке области действия и долж но появиться на н а­
чальной и конечной строках конструкции. На начальной строке имя отделено от клю че­
вого слова утверж дения двоеточием (:).
Блок может содерж ать лю бое вы полним ое утверж дение Fortran, кроме утверж дения
END. Вы можете передать управление из блока, но вы не можете передать управление в
другой блок.
Циклы DO не м о у т частично налож иться на блоки. У тверж дение DO и его конечное
утверждение долж ны появиться вместе в блоке утверж дения.

6.1. Операторы ветвления


П ереход воздействует на норм альную последовательность вы полнения, передавая
управление помеченному оператору в том же самом блоке области действия. У тверж де­
ние передачи называется оператором ветвления, в то время как утверж дение, к которому
сделана передача, называется целевым ут верж дением перехода.
Л ю бое выполнимое утверж дение м ож ет быть целевым утверж дением перехода, за ис­
клю чением таких утверждений:
- CASE,
- ELSE,
- ELSE IF.
О пределенны е ограничения прим еняю тся к утверж дениям , перечисленным в таблице.
Утверждение Ограничение
Утверждение завершения DO Переход должен быть сделан изнутри его конструкции DO-неблока1
END DO Переход должен быть сделан изнутри его конструкции DO-блока
END IF Переход должен быть сделан изнутри его конструкции IF2
END SELECT Переход должен быть сделан изнутри его конструкции CASE
1Если конечное утверждение разделяется больше чем одной конструкцией DO-неблока, переход может только быть сделан
изнутри самой внутренней конструкции DO.
2Вы можете выполнить переход к утверждению E N D IF извне конструкции IF; это удаленная возможность в Fortran 95. Intel
Fortran полностью поддерживает возможности, удаленные в Fortran 95.

Безусловное утверждение GO ТО
Безусловное утверж дение GO ТО передает управление целевому утверж дению во
время выполнения программы. Это утверж дение приним ает следую щ ую форму:
G 0 ТО labeI
где label - метка допустим ого целевого утверж дения перехода в том же блоке области
действия, что и утверж дение GO ТО.
Безусловное утверж дение GO ТО передает управление целевому утверж дению пере-
ходк, идентифицированному указанной меткой.

ámomwm 109
110 С Д Алгазин, В В К ондрат ьев П рогралш роаанив на Visual FORTRAN

Следую щ ие примеры - утверж дения GO ТО:


GO ТО 7734
G O TO 99999

Вычисляемое утверждение GO ТО
Вычисляемое утверж дение GO ТО передает управление одному из утверждений ряда
маркированной цели перехода, основанной на значении выражения. Это устареваю щ ая
возможность Fortran 95.
Вы числяемое утверж дение GO ТО принимает следую щ ую форму:
GO ТО (Iabel-list)[] ехрг
где label-list - список меток (отделенных запятыми) допустим ы х целевых утверждений
перехода в том же блоке области действия, что и вы числяемое утверждение GO ТО. (Так
называемый список перехода.) О дна и та же метка может появиться в этом списке боль­
ше, чем один раз.
ехрг является скалярным числовым выражением в диапазоне от 1 до п, где п - число
меток утверждений в списке меток. При необходимости эго выражение преобразовано в
целочисленны й тип данных.
Правила использования
Когда выполняется вы числяемое утверждение GO ТО, сначала вычисляется выраже­
ние ехрг. Значение выражения представляет порядковую позицию метки в связанном
списке меток. У правление передается утверждению , идентифицированному меткой. На­
пример, если список содерж ит (30, 20, 30, 40) и значение выражения - 2, управление пе­
редано утверждению , идентифицированном у с меткой 20.
Если значение выражения меньш е 1 или больш е, чем число меток в списке, управле­
ние передано следую щ ему выполнимому утверж дению или конструкции после вычис­
ляемого утверждения GO ТО.
С ледую щ ие примеры показы ваю т допустим ы е вычисляемы е утверждения GO ТО:
GO ТО (12,24,36), INDEX
GO ТО (320,330,340,350,360), SITU(J.K) + 1

Утверждение ASSIGN и назначенный GO ТО


Утверж дение ASSIG N назначает метку на целочисленную переменную . Впоследствии
эта переменная может быть используем а как целевое утверж дение перехода назначенным
утверждением GO ТО или как спецификатор формата в форматированном утверждении
ввода/вывода.
Утверж дения ASSIGN и назначенный GO ТО - удаленные возможности в Fortran 95;
они были устареваю щ ими возможностями в Fortran 90. Intel Fortran полностью поддер­
живает возможности, удаленные в Fortran 95.

Утверждение ASSIGN
Утверж дение A SSIGN назначает значение метки утверждения на целочисленную пе­
ременную. П рименяется следую щ ая форма:
ASSIGN labeIJO var
где label - метка цели перехода или утверж дения FO RM A T в том же блоке области дей­
ствия, что и утверждение A SSIG N ; var - скалярная целая переменная.
Гчави 6. Управление вы п от ен ием 111
Правила использования
Когда выполняется утверж дение ASSIG N , метка утверж дения назначена на целочис­
ленную переменную.
Переменная затем не определена как целая переменная и может только использовать­
ся как метка (если только она позже не переопределена с целочисленным значением).
Утверждение A SSIGN долж но быть выполнено перед утверж дениями, в которых ис­
пользуется назначенная переменная.
Следующий пример показывает утверждения A SSIGN:
INTEGER ERROR

ASSIGN 10 ТО NSTART
ASSIGN 99999 TO KSTOP
ASSIGN 250 TO ERROR.
О братите внимание, что N STA RT и KSTOP - целые переменные неявно, но ERROR
должна быть предварительно объявлена как целая переменная.
Следую щ ее утверж дение связы вает переменную N U M B E R с меткой 100 утверж де­
ния:
ASSIGN 100 ТО NUMBER
Если впоследствии выполнена арифметическая операция с переменной N U M BER (см.
ниже), поведение во время выполнения непредсказуемо:
NUMBER = NUMBER + 1
Чтобы возвратить N U M B ER к статусу целой переменной, вы можете использовать
следующ ее утверждение:
NUMBER = 10
Это утверждение отделяет N U M B ER от утверж дения 100 и назначает этой перемен­
ной целочисленное значение 10.
Как только N U M BER возвращ ена к его статусу целой переменной, эта переменная
больше не может использоваться в назначенном утверж дении GO ТО.

Назначенное утверждение GO ТО
Н азначенное утверж дение GO ТО передает управление утверждению , метка которого
была последний раз назначена на переменную. Н азначенное утверж дение GO ТО прини­
мает следую щ ую форму:
GO ТО var [[,] (label-list)]
где var - скалярная целая переменная; label-list - список меток (отделенных запятыми)
допустимых целевых утверждений перехода в том же блоке области действия, что и на­
значенное утверждение GO ТО. Та же самая метка м ож ет появиться не один раз в этом
списке.
Правила использования
Переменная долж на иметь значение метки утверждения, назначенного на это утвер­
ждением A SSIGN (неариф метический оператор присваивания) прежде, чем выполняется
утверждение GO ТО.
Если список меток задан, метка утверждения, назначенная на переменную , гллж на
быть одной из меток в этом списке.
112 C. Д А п г а з т . В В К ондрат ьев П р о гр а и и р о ва н и е на Visual FORTRAN

И назначенное утверж дение G O ТО и связанное с ним утверж дение A SSIGN должны


бы ть в ю м ж е самом блоке области действия.
С ледую щ ий пример эквивалентен GO ТО 200:
ASSIGN 200 ТО IG 0
GO ТО IG 0
С ледую щ ий пример эквивалентен G O ТО 450:
ASSIGN 450 ТО IBEG
GO ТО IBEG, (300,450,1000,25)
Следующ ий пример показывает недопустимое использование назначенной переменной:
ASSIGN 10 ТО I
J= l
GO ТО J
В этом случае перем енная J не переменная, назначенная оператором ASSIG N , таким
образом , она не м ож ет использоваться в назначенном утверж дении GO ТО.

Арифметическое утверждение IF
А риф м етическое утверж дение IF условно передает управление одному из трех утвер­
ждений, основанны х на значении ариф метического выражения. Это - устареваю щ ая воз­
м ож ность в Fortran 95 и Fortran 90.
А риф м етическое утверж дение IF принимает следую щ ую форму:
IF (ехрг) labeH, /аЬе/2, /аЬе/3
где ехрг - скалярное числовое вы раж ение типа целое или действительное числовое вы­
раж ение (заклю ченное в круглы е скобки).
label У, label2, label 3 являю тся метками допустим ы х целевых утверждений перехода,
которы е находятся в том же самом м одуле обзора, что и ариф метическое утверж дение IF.
Правила использования
Все 3 метки требую тся, но они не долж ны относиться к трем различным утверж дени­
ям. Та же самая метка м ож ет появиться не один раз в том же ариф метическом утверж де­
нии IF.
В течение вы полнения програм мы сначала вы полняется выражение ехрг. В зависим о­
сти от значения вы раж ения управление затем передается таким образом:
Если значение ехрг: Управление переходит
М еньш е, чем 0 У тверж дению label 1
Равно 0 У тверж дению label2
Больш е, чем 0 У тверж дению label3
С ледую щ ий пример передает управление утверж дению 50, если действительная пе­
ременная TETA меньш е или равна действительной переменной CHI. У правление переда­
ется утверж дению с меткой 100, только если TETA больш е чем СН1.
IF (THETA-CHI) 50,50,100
С ледую щ ий прим ер передает управление утверж дению с меткой 40, если значение
целой переменной N U M B E R является четным и передает управление утверждению
с мечкой 20, если значение нечетно.
IF (NUMBER 12*2 - NUMBER) 20,40,20
Глава 6 Управ ление выполнением 113

6.2. Утверждение CALL


У тверж дение CALL передает управление подпрограмме. Это выражение принимает
следую щ ую форму:
CALL sub [([a-arg [, a-arg] ..]) ]
где sub - имя подпрограммы или другой внеш ней процедуры, или ф орм ального парамет­
ра, связанного с подпрограммой или другой внеш ней процедурой.
a-arg является фактическим параметром, произвольно которому предш ествую т [key­
word =], где keyw ord - имя формального параметра в явном интерфейсе для подпрограм ­
мы. Клю чевому слову назначается значение, когда вы звана процедура.
Каждый фактический параметр должен быть переменной, выражением, именем про­
цедуры или указанием для альтернативною возврата. (Эти параметры не должны быть
именем внутренней процедуры, функции утверж дения или родовы м именем процедуры.)
Дополнительный спецификатор возвращ ения - звездочка (*) или амперсанд (&), со­
провождаемый меткой, - выполнимое целевое утверж дение перехода в том же самом
блоке области действия, как и утверждение CALL. (А льтернативны й возврат - устаре­
вающ ая возможность в Fortran 95 и Fortran 90.)
Правила использования
Когда выполняется утверждение CALL, лю бы е вы раж ения в фактическом списке па­
раметров выполнены, затем управление передаю т к первому вы полним ому утверждению
или конструкции в подпрограмме. Когда подпрограмм а заканчивает выполнение, управ­
ление возвращ ается к следующ ему выполнимому утверж дению после утверждения
CALL или к утверждению , идентифицированному дополнительной меткой возвращ ения
(любой).
Если появляется список параметров, каждый ф актический параметр связан с соответ­
ствую щ им формальным параметром в соответствую щ ей позиции в списке параметров
или именем его keyw ord (клю чевого слова). П араметры долж ны соответствовать в типе и
виде параметров.
Если указаны позиционные параметры и клю чевы е слова параметра, клю чевые слова
параметра должны появиться последними в фактическом списке параметров.
Если формальный параметр является дополнительны м, фактический параметр может
быть опущен.
Ф актический параметр, связанный с формальной процедурой, долж ен бы ть собствен­
ным именем процедуры или быть другой формальной процедурой. О пределенны е имена
встроенных функций не должны использоваться как ф актические параметры (см.
табл. 8.1).
П роцедура, вызванная утверждением CALL, долж на бы ть подпрограммой, а не ф унк­
цией. Вызов функции, как будто это была подпрограмм а, м ож ет вы звать непредсказуе­
мые результаты.
Следующ ий пример показывает допустимые утверж дения CALL:
CALL CURVE(BASE,3.14159+X,Y,LIMITIR(LT+2))
CALL PNTOUTfA.N/ABCD’)
CALL EXIT
CALL MULT(A,B,*10)*20,C) ! Звездочки и амперсанды обозначают
CALL БиВА^Х.&ЗО.&бО.У) \ дополнительные возвращения
Следую щий пример показывает подпрограмму с клю чевы ми словами параметра:
114 С Д. А лгап т . В. В Кондрат ьев. П рограм ирование на Visual FORTRAN

PROGRAM KEYW ORD. EXAMPLE


INTERFACE
SUBROUTINE TEST_C(I, L, J, KYWD2, D, F, KYWD1)
INTEGER I, L(20), J, KYWD1
REAL, OPTIONAL :: D, F
COMPLEX KYWD2

END SUBROUTINE TEST_C


END INTERFACE
INTEGER I, J, K
INTEGER L(20)
COMPLEX Z1
CALL TEST_C(I, L, J, KYWD1 = K, KYWD2 = Z1)

П ервы е 3 ф актических параметра связаны с их соответствую щ ими ф ормальными па­


рам етрам и в соответствую щ их позициях. К лю чевы е слова параметра связаны названием
клю чевого слова (keyw ord), таким образом, они могут появиться в лю бом порядке.
О братите вним ание, что интерфейс к подпрограмм е TEST имеет 2 дополнительны х
параметра, которы е были опущ ены в утверж дении CALL.
С ледую щ ее вы раж ение - другой пример вызова подпрограммы с клю чевыми словами
параметра:
CALL TEST(X, Y, N. EQUALITIES = Q, XSTART = XO)
П ервы е 3 парам етра связаны позицией.

6.3. Конструкции CASE


К онструкция вы бора SELEC T CA SE - END SELECT позволяет выбрать для выполне­
ния не более одного из образую щ их ее блоков операторов в зависимости от значения не­
которого вы раж ения. Н иже приведен схематический пример конструкции выбора.
SELECT CASE (N)
CASE ( :-1)
! блок выполняется, если N <= -1
CASE (0 )
! блок выполняется, если N = 0
CASE (1:)
! блок выполняется, если N >= 1
END SELECT
Т аким образом , конструкция CA SE условно вы полняет I блок конструкций или ут­
верж дений в зависим ости от значения скалярного вы раж ения в утверж дении SELECT
CA SE.
К онструкция C A SE приним ает следую щ ую форму:
[name:] SELECT CASE (ехрг)
[CASE (case-value [, case-value]..) [name]
block]...
[CASE DEFAULT [name]
block]
END SELECT [name]
где name - имя конструкции CASE.
Гтава 6 Управление вы полнением 115
ехрг является скалярным выражением типа "целое", "логическое" или "символьное"
(заклю ченного в круглые скобки). Вы числение этого вы раж ения приводит к значению ,
называемому индексом случая.
case-value является одним или более одного скалярны м целочисленны м , логическим
или символьным выражениям инициализации, заклю ченны м в круглые скобки. К аж ды й
case-value долж ен иметь тот же самый тип и вид как ехрг. Если тип вы раж ения си м воль­
ный, case-value и ехрг могут иметь различны е длины , но их парам етр вида долж ен бы ть
тем же самым.
Ц елые и сим вольные выражения могут бы ть вы раж ены как диапазон значений case,
принимая одну из следую щ их форм:
low:high
low:
:high
Значения case не долж ны наложиться.
block является пустой последовательностью или последовательностью некоторого к о ­
личества утверж дений или конструкций.
Правила использования
Если имя конструкции указано в утверж дении SEL E C T CA SE , то же самое имя д о л ж ­
но появиться в утверж дении EN D SELECT. То ж е самое имя конструкции мож ет п рои з­
вольно появиться в лю бом утверж дении CA SE в конструкции. То же самое имя кон ст­
рукции не долж но использоваться для другой названной конструкции в том же самом
блоке области действия.
Сначала выполняется выраж ение case (ехрг). П олучаю щ ийся индекс случая (case in ­
dex) сравнивается с саье-знЯчениями (case-value), чтобы найти значение соответствия
(которое может быть только одно). Когда происходит совпадение, вы полняется блок п о­
сле соответствую щ его значения case (случая), и конструкция заканчивается.
П роисходит ли совпадение, определяю т следую щ ие правила:
■ Если значение case - единственное значение (двоеточие не появляется), сравнение
происходит следую щ им образом:
Тип данных Соответствие происходит, если:
Logical case-index .EQV. case- value
Integer или character case-index = = case-value
■ Если значение case - диапазон значений (двоеточие появляется), сравнение зависит от
указанного диапазона следую щ им образом:
Диапазон Соответствие происходит, если:
low: case-index >= low
:high case-index <= high
low:high low <= case-index <= high
Следую щ ие выражения - допустим ы е значения case:
CASE (1 ,4 ,7 ,1 1 :1 4 ,2 2 ) ! Отдельные значения, как указано: 1,4, 7 ,1 1 ,1 2 ,1 3 ,1 4 ,2 2
CASE (:-1) ! Все значения меньше, чем нуль
CASE (0) ! Только нуль
CASE (1:) ! Все значения больше нуля
Если не происходит совпадения, но присутствует утверж дение C A SE D EFA U L T, вы ­
полняется блок после этого утверж дения, и конструкция заканчивается.
116 С Д А 1га т п , В. В К ондрат ьев Программирование на Visual FORTRAN

Если нс происходит совпадения и не присутствует никакое утверждение CASE


D EFA U LT, никакой блок не вы полняется, конструкция заканчивается и управление пе­
редается к следую щ ем у вы полним ому утверж дению или конструкции после утверждения
EN D SELECT.
Рис. 6.1 показы вает течение управления в конструкции CASE.

Construct Flow of Control


SELECT CASE (TEST 1) Evaluate Test 1
CASE(1)
block 1
CASE (2)
block 2
END SELECT

SELECT CASE (TEST 2)


CASE (1)
/ WelchesN ^ Yes Execute
block 1 SCA SEO L/ block 1
CASE (2)
block 2 JNo
CASE (3)
block 3 /M atches > Yes Execute
CASE DEFAULT \C A SE (2)y block 2
block 4
T ito
END SELECT

/ Matches >v Yes Execute


\C A S E (3 )/ btock3

JNO
Execute
block 4

Рис. 6.1. Управления в конструкции CASE


Вы не мож ете использовать вы полняю щ ие переход утверждения, чтобы передать
управление утверж дению CASE. О днако переход к утверждению SELECT CASE разре­
ш ается. П ереход к утверж дению EN D SELECT разреш ается только изнутри конструкции
CASE.
С ледую щ ие выраж ения - прим еры конструкций CASE:
INTEGER FUNCTION STATUS_CODE (I)
INTEGER I
Г лава 6 У правление вы п т нением 117
CHECK.STATUS: SELECT CASE (I)
CASE (:-1)
STATUS.CODE = -1
CASE (0)
STATU S_CODE = 0
CASE (1:)
STATUS_CODE = 1
END SELECT CHECK.STATUS
END FUNCTION STATUS.CODE
SELECT CASE (J)
CASE (1,3:7,9) ! Values11, 3 ,4 , 5 ,6 , 7 ,9
CALL SUB_A
CASE DEFAULT
CALL SUB_B
END SELECT
Следую щ ие 3 прим ера эквивалентны:
1. SELECT CASE (ITEST .EQ. 1)
CASE (.TRUE)
CALL SUB1 ()
CASE (.FALSE.)
CALL SUB2 ()
END SELECT
2. SELECT CASE (ITEST)
CASE DEFAULT
CALL SUB2 ()
CASE (1)
CALL SUB1 ()
END SELECT
3. IF (ITEST .E Q .1) THEN
CALL SUB1 ()
ELSE
CALL SUB2 ()
END IF

6.4. Утверждение CONTINUE


Утверж дение C O N TIN U E преж де всего используется, чтобы закончить м арки рован ­
ную конструкцию DO, которая при других условиях закончилась бы оператором G O ТО,
или арифметическим 1F, или другим запрещ енны м утверж дением управления.
Утверж дение C O N TIN U E приним ает следую щ ую форму:
CONTINUE
Утверж дение отдельно не делает ничего и не им еет никакого влияния на результаты
программы или последовательность вы полнения. С ледую щ ий пример показы вает утвер ­
ждение CON TIN U E:
DO 150 1= 1,40
40 Y = Y + 1
Z = COS(Y)
PRINT *,Z
IF (Y .LT. 30) GO TO 150
GO TO 40
150 CONTINUE
118 С Д А лгат н, В . В К ондрат ьев . П рогра мирование на Visual FO RTRAN

6 .5 . Конструкции DO
Конструкция DO управляет повторным выполнением блока утверждений или конст­
рукций (это повторное вы полнение называется циклом).
Число итераций цикла может быть указано в начальном утверждении конструкции
DO или число итераций можно оставить неопределенным простым D O -конструкции
(”DO навсегда”) или утверж дением DO WH1LE.
У тверж дения ЕХ1Т и CY C LE изм еняю т выполнение цикла. Утверж дение EXIT закан­
чивает вы полнение цикла, в то время как утверж дение CY C LE заканчивает выполнение
текущ ей итерации в цикле. Например:
D0
READ (EUNIT, IOSTAT=IOS) Y
IF (IOS /= 0) EXIT
IF (Y <0) CYCLE
CALL SUB_A(Y)
END DO
Если происходят ош ибка или конец файла, конструкция DO заканчивается. Если про­
читано отрицательное значение для Y, программа переходит к следую щ ему утверждению
READ.

Формы для конструкций DO


К онструкция DO принимает одну из следующ их форм:
Клеточный вид (блок):
[ñame:] DO [label][,] [loop-control]
Ыоск
[label] term-stmt
Неклеточный вид (неблок):
DO label[,] [loop-control]
Ыоск
[label] ex-term-stmt
где пате - имя конструкции DO; label - метка утверждения, идентифицирую щ ая конеч­
ное утверждение; loop-control - итерация DO или утверж дение (DO) W HILE; Ыоск явля­
ется пустой последовательностью или последовательностью некоторого количества ут­
верждений или конструкций; term-stmt является конечным утверждением клеточного ви­
да конструкции; ex-term-stmt является конечным утверж дением неклеточного вида кон­
струкции.
Правила использования
Конечное утверж дение (term -stm t) для конструкции D O -блока - END DO или утвер­
ждение C O N TIN U E. Если утверж дение блока DO содерж ит метку, конечное утверждение
долж но бы ть идентифицировано с той же самой меткой. Если метки нет, конечное ут­
верждение долж но быть утверждением END DO.
Если имя конструкции указано в утверждении блока DO, то же самое имя должно
появиться в конечном утверж дении END DO. Если имя конструкции не указано в утвер­
ждении блока DO, в конечном утверждении END DO имя такж е не указывается.
Конечное утверж дение (ex-term-stmt) для конструкции неблока DO - выполнимое ут­
верждение (или конструкция), которое идентифицировано меткой, указанной в утвер­
ждении неблока DO. Конструкция неблока DO может разделить конечное утверждение
Глава 6 Управление выполнением 119
с другой конструкцией неблока DO. Конструкция блока DO не может разделить конечное
утверждение.
Следующие утверж дения не м огут быть конечными утверж дениями на конструкции
неблока DO:
■ CONTINUE (допускается, если это утверж дение является разделенным конечным ут­
верждением).
- CYCLE.
■ END (для программы или подпрограммы).
- EXIT.
■ GO ТО (безусловный или назначенный).
■ А рифметический 1F.
- RETURN.
- STOP.
Конструкция неблока DO - устареваю щ ая возможность в Fortran 90 и 95.
Следующ ий пример показы вает эквивалентный блок DO конструкции неблока DO:
DO I = 1, N ! Блок DO
TOTAL = TOTAL + B(I)
END DO
DO 2 0 1= 1, N ! Неблок DO
20 TOTAL = TOTAL + B(l)
Следующий пример показы вает простую конструкцию блока DO (не содерж ит ника­
кого итеративного счета или утверж дение DO W HILE):
DO
READ *, N
IF (N ==0) STOP
CALLSUBN
END DO
Блок DO выполняется неоднократно, пока не прочитано значение нуля. Затем конст­
рукция DO заканчивается.
Следующий пример показы вает именованную конструкцию блока DO:
LO O PJ: DO I = 1, N
A(l) = С * B(l)
END DO LO O P J
Следующий пример показы вает конструкцию неблока DO с разделенным конечным
утверждением:
DO 20 I = 1, N
DO 20 J = 1 + 1, N
20 RESULT(I.J) = 1.0 / REAL(I + J)

Выполнение конструкций DO
Диапазон конструкции DO вклю чает все утверж дения и конструкции, которые сле­
дую т за утверждением DO, вклю чая конечное утверждение. П ри наличии вложенной
конструкции она долж на полностью содерж аться в пределах конструкции DO.
Выполнение конструкции DO отличается в зависимости от управления циклом таким
образом:
■ Для простой конструкции DO нет никакого контроля цикла. У тверж дения в диапазоне
DO повторены, пока цикл DO не закончен явно утверж дением в пределах диапазона.
120 С Л Ачгатн, В В К ондрат ьев Программирование на УЫш1 ГОЯТЯАИ

■ Для итерационны х утверж дений ОО контроль цикла указан, как (1о-уаг = ехрт!, ехрг2
[. ехргЗ]. И теративны й счет определяет число повторений цикла ОО (см. разд. 6.5).
■ Для утверж дений Э О \VHILE контроль цикла указан как диапазон ОО. Д иапазон 0 0
повторяется, пока указанное условие остается верным. Как только условие - ложь,
конструкция 0 0 заканчивается.

Итеративное управление циклом


У правление итерацией цикла ОО приним ает следую щ ую форму:
бо-чаг- ехрг1, ехр/2 [, ехргЗ]
где с/о - уог - имя скалярной переменной типа целое или действительной переменной. Эта
переменная не может бы ть именем элем ента м ассива или компонентом структуры.
ехрг является скалярным числовым выражением типа целое или действительным выра­
жением. Если э го не тот же тип, чп) у с/о-\>аг, выражение преобразовывается в тот же тин.
Правила использования
П еременная ОО или выражение типа теа1 - удаленная возм ож ность в Рот1тап 95 (она
была устареваю щ ей уже в РоПтап 90). РоПтап 1п1е1 полностью поддерж ивает возможно­
сти, удаленны е в Рот1тап 95.
С ледую щ ие шаги вы полнены в итеративном управлении циклом:
1. В ы раж ения ехрг! , ехрг2 и ехргЗ выполнены, чтобы определить соответственно на­
чальный параметр, конечны й параметр и параметр приращ ения. П араметр (ехргЗ) при­
ращ ения является дополнительны м и не долж ен бы ть нулем. Если параметр приращ ения
не указан, он имеет по ум олчанию тип целое число со значением 1.
2. П еременная ОО (с/о-уаг) становится определенной со значением начального пара­
м етра (ехрг1).
3. И теративны й счет определен следую щ им образом : МАХ(1ЫТ((ехрт2 - ехрт1 +
+ ехргЗ)/ехргЗ), 0). И теративны й счет - нуль, если лю бое из следую щ их утверждений
верно: ехрг1> ехрт2 и ехртЗ> 0; ехрг1 <ехрт2 и ехргЗ <0.
4. И теративны й счет проверен. Если итеративны й счет - нуль, цикл заканчивается и
ОО конструкция становится неактивной. (На это можно воздействовать опцией компиля­
тора.) Если итерация счета отлична от нуля, диапазон цикла выполняется.
5. И теративны й счет ум еньш ен на единицу и переменная ОО увеличена на значение
парам етра приращ ения. П осле заверш ения цикла переменная ОО сохраняет ее последнее
значение (то, которое она имела, когда итеративный счет был проведен и счетчик цикла
был нулем).
П еременная ОО не долж на быть переопределена или становиться неопределенной в
течение вы полнения диапазона ОО.
Если вы изм еняете переменны е в начальном значении, конечном значении или шаге в
течение выполнения конструкции ОО, это не воздействует на итеративный счет. И тера­
тивны й счет определен каждый раз, когда конструкция ОО введена.
С ледую щ ий прим ер определяет 25 итераций:
0 0 100 К=1,50,2
К = 49 в течение заклю чительной итерации, К = 51 после цикла.
С ледую щ ий пример определяет 27 итераций:
0 0 350 >50,-2,-2
Глава 6 Управление выполнением 121
J — 2 в течение заклю чительной итерации, J = -4 после цикла.
Следую щ ий пример определяет 9 итераций:
DO NUMBER=5,40,4
N U M BER = 37 в течение заклю чительной итерации, N U M B E R = 41 после цикла. За­
верш ение утверж дения этого цикла DO долж но быть EN D DO.

Вложенные конструкции DO
Конструкция DO мож ет содерж ать 1 или более полны х циклов DO. Д иапазон внут­
ренней вложенной конструкции DO долж ен находиться полностью в пределах диапазона
следующ ей внеш ней конструкции DO. В лож енны е конструкции неблока DO могут р аз­
делить м аркированное конечное утверждение.
Рис. 6.2 показы вает правильно и неправильно влож енны е конструкции DO.
D O 4 5 K -1 J 0 D 0 15 K-1.10

г- D O 351*2,50,2 D O 25 L* 1,20

L .3 5 CO NTINUE — 15 CO N TIN UE

Г- OO45M =U0 - D O 3011=1,15

_ l_ 4 5 COlSffiNUE - 25 CO N TIN UE

D O Ю t*1,2Q -3 0 CO N TIN UE

Г 0 0 »М ,5 “ D 0 10

Г DO КИ,10 - DO J M ,10

L EN D D O -1 0 CO N TIN UE

L EN D DO _ ENDOO

_ 10 CONTINUE

a 6
Рис. 6.2. Вложенные конструкции ВО:
а - правильно; б - неправильно
Во влож енной конструкции ОО вы можете передать управление от внутренней конст­
рукции до внеш ней конструкции.
О днако вы не можете передать управление от внеш ней конструкции к внутренней
конструкции.
Если две или больш е влож енных конструкций ОО разделяю т то же конечное утвер­
ждение, вы можете передать управление на утверж дение только изнутри диапазона са­
мой внутренней конструкции. Лю бая другая передача к этом у утверж дению составляет
передачу от внеш ней конструкции к внутренней конструкции, потом у что разделенное
утверждение - часть диапазона самой внутренней конструкции.

Расширенный диапазон
Конструкция ОО имеет расш иренны й диапазон, если оба из следую щ их утверж дений
верны:
■ Конструкция ОО содерж ит утверж дение управления, которое передает управление из
конструкции.
122 С Д Ачгазин, В В К ондрат ьев П рограм ирование на Visual FORTRAN

■ Д ругое утверж дение управления возвращ ает управление назад в конструкцию после
выполнения одного или более одного утверждений.
Д иапазон конструкции расш ирен, чтобы вклю чить все выполнимые утверждения м е­
жду адресатом утверж дения первой передачи и утверж дением, которое возвращ ает
управление к конструкции.
С ледую щ ие правила обращ аю тся к конструкции ОО с расш иренным диапазоном:
■ П ередача в диапазон утверж дения ОО разреш ается, только если передача сделана от
расш иренного диапазона этого утверж дения ОО.
■ Р асш иренны й диапазон утверж дения ОО не долж ен изменить переменную управле­
ния утверж дения ОО.
Рис. 6.3 иллю стрирует допустим ы е и недопустимые расш иренны е передачи управ­
ления диапазона.

20

эо
.35

40
[_4б

во то зо L 50

Рис. 6.3. Передачиуправления ирасширенный диапазон:


а допустимые передачиуправления; б - недопустимые передачиуправления
6.6. Утверждение DO WHILE
У тверж дение DO W H ILE вы полняет диапазон конструкции DO, в то время как ука­
занное условие остается верным. У тверж дение принимает следую щ ую форму:
DO [label\[] WHILE (expr)
где label - метка, определяю щ ая вы полним ое утверж дение в том же модуле программы;
е х р г - скалярное логическое вы раж ение, заклю ченное в круглые скобки.
Правила использования
Перед каждым выполнением диапазона DO выполняется логическое выражение. Если это
условие - истина, то выполняются утверждения в теле цикла. Если это условие - ложь, кон­
струкция DO заканчивается и управление переходит к утверждению после цикла.
Если нет метки в утверж дении DO W H ILE, цикл DO W H ILE долж ен быть закончен с
утверж дением EN D DO.
Вы м ож ете передать управление из цикла DO W H ILE, но не в цикл.
Глава 6 Управление выполнением 123
Следую щ ий пример показы вает утверж дение DO W HILE:
CHARACTER*!32 LINE

1= 1
DO WHILE (LINE(I:I) E Q .M)
1 = 1 + 1

END DO
Примеры требуемы х и дополнительны х утверж дений EN D DO:
Требуемые Дополнительные
DO WHILE (I .GT. J) DO 10 WHILE (I .GT. J)
ARRAY(I.J) = 1.0 ARRAY(I.J) = 1 0
1 = 1 - 1 1 = 1 - 1

END DO 10 END DO

6.7. Утверждение CYCLE


У тверж дение CY C LE преры вает текущ ий цикл вы полнения сам ого внутреннего (или
именованного) цикла DO.
У тверж дение CY C LE принимает следую щ ую форму:
CYCLE [name]
где пате - имя конструкции DO.
Правила использования
Когда выполняется утверж дение C Y C LE, происходит следую щ ее:
1. Текущ ий цикл выполнения именованной (или самой внутренней) конструкции DO
закончен. Если имя конструкции DO указано, утверж дение C Y C LE долж но бы ть в п ред е­
лах диапазона той конструкции.
2. И теративны й счет (лю бой) уменьш ен на 1.
3. П еременная DO (лю бая) увеличена значением парам етра приращ ения (лю бого).
4. Новый итеративный цикл конструкции DO начинается.
Лю бы е выполнимые утверж дения после утверж дения C Y C L E (вклю чая м арки рован ­
ное конечное утверж дение) не выполняю тся. У тверж дение C Y C L E м ож ет бы ть м арки ро­
вано, но это выражение не м ож ет использоваться, чтобы закончить конструкцию DO.
Следую щ ий пример показы вает утверж дение CY CLE:
DO 1=1,10
A(l) = С + D(l)
IF (D(l) < 0) CYCLE ! Если истинно, следующее утверждение опущено
A(l) = 0 ! от цикла и цикл проверен снова.
END DO

6.8. Утверждение EXIT


Утверж дение EX IT заканчивает вы полнение конструкции DO. Это утверж дение п р и ­
нимает следую щ ую форму:
EXIT [name]
где пате - имя конструкции DO.
124 С Д. Алгазин, В В К о н д р а т ьев . П рограм ирование на Visual FORTRAN

Правила использования
У тверж дение E X IT заканчивает вы полнение именованной (или самой внутренней)
конструкции DO.
Если имя конструкции DO указано, утверж дение EX IT долж но быть в пределах ди а­
пазона той конструкции.
Лю бая переменная DO сохраняет ее последнее определенное значение.
У тверж дение E X IT м ож ет бы ть маркировано, но это выраж ение не мож ет использо­
ваться, чтобы закончить конструкцию DO.
Следую щ ий прим ер показы вает утверж дение EXIT:
LOOP_A: DO I = 1,15
N= N+ 1
IF (N > I) EXIT LOOP.A
END DO LOOP.A

6.9. Утверждение END


У тверж дение EN D отм ечает конец програм мной единицы. П ринимает одну из сле­
дую щ их форм:
END [PROGRAM \program-name ]]
END [FUNCTION [function-name]]
END [SUBROUTINE [subroutine-name]]
END [MODULE [module-name]]
END [BLOCK DATA [block-data-name]]
Для внутренних процедур и процедур модуля вы долж ны определить клю чевые слова
FU N CTIO N и SU B R O U TIN E в утверж дении END; в остальных случаях клю чевые слова
являю тся дополнительны м и.
В основны х програм м ах, подпрограм м ах функции и подпрограмм ах утверждения
EN D выполним ы и м огут бы ть целевы м и утверж дениями перехода. Если управление
достигает утверж дения EN D в этих програм мны х единицах, происходит следую щ ее:
■ В основной програм м е вы полнение програм мы заканчивается.
■ В функции или подпрограм м е неявно выполняется утверж дение RETU RN .
У тверж дение EN D не м ож ет бы ть продолж ено в программной единице и никаком
другом утверж дении. В програм м е м одуль долж ен иметь начальную строку, которая
предш ествует утверж дению EN D модуля программы .
У тверж дения EN D в м одуле или программной единице блока данных невыполнимы.

6.10. Конструкция и утверждение IF


К онструкция 1F условно вы полняет один блок утверждений или конструкций. У твер­
ж дение 1F условно вы полняет одно утверж дение. Реш ение передавать управление или
вы полнять утверж дение или блок основано на значении логического выраж ения в преде­
лах утверж дения или конструкции 1F.

Конструкция IF
Конструкция 1F условно вы полняет один блок конструкций или утверж дений в зави­
симости от значения логического выражения. (Эта конструкция назы валась утверж дени­
ем IF блока в Fortran 77.)
Г ю в а б . Управление вы п о т ен и ем 125
Конструкция IF принимает такую форму:
[name:] IF (ехрг) THEN
block
[ELSE IF (ехрг) THEN [name]
block]...
[ELSE [name]
block]
END IF [name]
где name - имя конструкции IF; ехрг - скалярное логическое выраж ение, заклю ченное в
круглые скобки; block - пустая последовательность или последовательность некоторого
количества утверждений или конструкций.
Правила использования
Если имя конструкции указано в начале утверж дения IF TH EN , то же самое имя
долж но появиться в соответствую щ ем утверж дении END IF. Это имя конструкции не
долж но использоваться для других названных конструкций в этом же блоке области д е й ­
ствия.
В зависимости от значения логического выражения выполняется блок утверж дений.
Логические выражения вы полняю тся в порядке, в котором они появляю тся, пока и сти н ­
ное значение не найдено, или сталкиваю тся с утверж дением IF ELSE или END.
Как только истинное значение найдено или сталкиваю тся с утверж дением ELSE, блок
немедленно выполняется, и вы полнение конструкции заканчивается.
Если ни одно из логических вы раж ений не истина и никакое утверж дение E LSE не
появляется в конструкции, никакой блок в конструкции не вы полняется, и вы полнение
конструкции заканчивается.
Примечание. Никакое дополнительное утверждение не может быть помещено после утвержде­
ния IF THEN в конструкции IF-блока. Например, следующее утверждение недопустимо в блоке
конструкции IF:
IF (е) THEN I = J
Это утверждение оттранслировано как следующее логическое утверждение IF:
IF (е) THEN! = J
Вы не можете использовать вы полняю щ ие переход утверж дения, чтобы передать
управление утверж дению IF ELSE или утверж дению ELSE. О днако вы м ож ете вы п ол­
нить переход к утверж дению EN D IF изнутри конструкции IF.
Рис. 6.4 показывает поток управления в конструкциях 1F.
Вы можете вклю чить конструкцию IF в блок утверж дений другой конструкции 1F, ес­
ли вложенная IF-конструкция полностью содерж ится в пределах блока утверж дения. Эта
конструкция не м ож ет налож иться на блоки утверж дения.
Следую щ ий пример показы вает самую простую форму конструкции IF:
Формат Пример
IF (ехрг) THEN IF (ABS(ADJU) .GE. 1.0E-6) THEN
block TOTERR = TOTERR + ABS(ADJU)
QUEST = ADJU/FNDVAL
END IF END IF
Эта конструкция условно вы полняет блок меж ду утверж дениями IF THEN и EN D IF.
Следую щ ий пример показы вает конструкцию IF, содерж ащ ую утверж дение ELSE:
126 с д . Алгазин, В В Кондрат ьев. Программирование на Visual FO RTRAN

Формат Прим ер
IF (ехрг) THEN IF (NAME .LT. 'N') THEN
block 1 IFRONT = IFRONT + 1
FRLET(IFRONT) = NAME(1:2)
ELSE ELSE
block 2 IBACK = IBACK + 1
END IF END IF
Block! состоит из всех утверж дений между утверж дениями ELSE и IF THEN. В1оск2
состоит из всех утверж дений между ELSE и утверж дениями EN D IF.
Если значение сим вольного переменного N A M E - меньш е, чем 'N', block 1 выполняет­
ся. Если значение N A M E больш е или равно 'N', Ь1оск2 выполняется.

Конструкция Поток управления

IF (в) TH EN
Ыоск
EN D IF

IF (в) TH EN
Fate
ELSE
г
Ыоск2
Execute
EN D IF Ыоскз

IF Ц ) TH E N
У Т в « \ Fdae / т « \ False
bfcck1
ELSE IF <*2 ) TH EN
Т тгш T thj &
btockj
Execute Execute
EN D IF btock-j Ыоск2

IF Щ TH EN
block-j Fdfe*
ELSE IF (e2) TH EN
block 2
T t ru e Т Тгш
ELSE IF (* 3 ) TH EN
bkxk 3
Execute Execute Execute Execute
ELSE Ыоск-j block 2 btock3 btoc* 4
biock 4
EN D F

Puc. 6.4. Потокуправления в конструкцияхIF


Следую щ ий прим ер показы вает конструкцию 1F, содерж ащ ую утверж дение IF THEN
ELSE:
Ф орм ат Прим ер
IF (ехрг) THEN IF (A .GT. В) THEN
block 1 D=В
Г'ю ва 6 Управление выполнением 127
F=А- В
ELSE IF (expr) THEN ELSE IF (A GT. B/2.) THEN
block 2 D = B/2.
F = A - B/2.
END IF END IF
Если А больш е, чем В, blo ck l выполняется. Если А не больш е, чем В, но больш е чем
В/2, Ыоск2 выполняется. Если А не больш е, чем В и не больш е, чем B/2, b lo ck l и Ыоск2
не выполняются. У правление переходит непосредственно к следую щ ем у выполнимому
утверждению после утверж дения END IF.
Следующ ий пример показы вает конструкцию 1F, содерж ащ ую несколько утверж де­
ний ELSE IF THEN и утверж дения ELSE:
Формат Пример
IF (expr) THEN IF (A .GT. В)THEN
blockl D =В
F=A- В
ELSE IF (expr) THEN ELSEIF (A .GT. C) THEN
blockl D =С
F- a - С
ELSE IF (expr) THEN ELSE IF (A .GT. Z) THEN
blockZ D -Z
F = A -Z
ELSE ELSE
block4 D = 0.0
F=A
END IF END IF
Если А больш е, чем В, b lo c k l выполняется. Если А не больш е чем В, но больш е, чем
С, Ь1оск2 выполняется. Если А не больш е чем В или С, но больш е, чем Z, ЫоскЗ вы пол­
няется. Если А не больш е, чем В, С или Z, Ы оск4 выполняется.
Следующ ий пример показы вает влож енную конструкцию IF:
Формат Пример
¡F (expr) THEN IF (A .LT. 100) THEN
blockl INRAN = INRAN + 1
IF (expr2) THEN IF (ABS(A - AVG) I E . 5.) THEN
blockl a IN AVG = INAVG + 1
ELSE ELSE
blockl b OUTAVG = OUTAVG + 1
END IF END IF
ELSE ELSE
block2 OUTRAN = OUTRAN + 1
END IF END IF
Если А меньше, чем 100, код нем едленно вы полняется после 1F. Этот код содерж ит
вложенную конструкцию 1F. Если абсолю тное значение м инус A V G м еньш е или равно 5,
b lo c k la выполняется. Если абсолю тное значение минус AVG больш е, чем 5,b lo c k lb вы ­
полняется. Если А больш е или равно 100, выполняется Ы оск2 и не вы полняется влож ен­
ная конструкция 1F (в b lo c k l).
Следующ ий пример показы вает названную конструкцию IF:
BLOCK_A: IF (D > 0.0) THEN ! Начальное утверждение на названную конструкцию
RADIANS = ACOS(D) ! Это 2 утверждения
DEGREES = ACOSD(D) ! сформируйте блок
END IF BLOCK_A ! Конечное утверждение на названную конструкцию
128 С )1 Алгазин, В В К ондрат ьев. П рограм ироваиие на Visual FO RTRAN

Утверждение IF
Утверждение IF условно выполняет одно утверждение, основанное на значении логиче­
ского выражения. (Это утверждение называлось логическим утверждением IF в Fortran 77).
У тверж дение IF приним ает следую щ ую форму:
IF (expr) stmt
где ехрг - скалярное логическое выражение, заклю ченное в круглы е скобки; stm t является
лю бы м полным, непом еченны м, выполнимым утверж дением Fortran, за исклю чением
следую щ его утверж дения: CA SE, DO, IF, FO R A LL или конструкция W HERE.
Д ругое утверж дение IF - утверж дение EN D на програм му, функцию или подпро­
грамму.
При вы полнении утверж дения IF сначала вы полняется логическое выражение. Если
значение этого вы раж ения - истина, утверж дение вы полняется. Если значение - ложь,
утверж дение не вы полняется, и управление переходит к следую щ ему утверждению
в программе.
С ледую щ ие примеры показы ваю т допустим ы е утверж дения IF:
IF (J.GT.4 .OR. J.LT.1) GO TO 250
IF (REF(J.K) NE. HOLD) REF(J.K) = REF(J.K) * (-1.5D0)
IF (ENDRUN) CALL EXIT

6.11. Утверждение PAUSE


У тверж дение PA U SE временно приостанавливает програм му до выполнения резю ме
системы или пользователя. У тверж дение PA U SE - удаленная возм ож ность в Fortran 95;
это утверж дение бы ло устареваю щ им в Fortran 90. Fortran Intel полностью поддерж ивает
возм ож ности, удаленны е в Fortran 95.
У тверж дение PA U SE принимает следую щ ую форму:
PAUSE \pause-code]
где pa u se-code - дополнительное сообщ ение. О но м ож ет бы ть лю бы м из следую щ их вы­
раж ений:
■ С калярная сим вольная константа типа character по ум олчанию .
■ С трока до 6 цифр; начальны е нули игнорирую тся. (Fortran 90 и Fortran 77 допускаю т
только 5 цифр.)
IIравала и спал ъзования
Если вы определяете p au se-code, утверж дение PA U SE показы вает указанное сообщ е­
ние и затем сообщ ение по умолчанию .
Если вы не определяете pau se-code, система показы вает следую щ ее сообщ ение по
ум олчанию : FO R TRA N PAU SE.
Затем появляется сообщ ение:
■ на Linux* и М акинтош е системы OS*: PAU SE prom pt>
■ на системах W indow s*: Fortran Pause - Enter com m and<C R > or <CR > to continue.

Эффект на Linux*u Макинтоше системы OS*


Эф ф ект PA U SE отличается в зависим ости от того, является ли програм ма передним
планом или фоновы м процессом.
Глава 6. Управление выпо ш ением 129
Если программа - приоритетны й процесс, програм м а приостановлена, пока вы не
введете команду CO N TIN U E. Вы полнение возобновляется в следую щ ем выполнимом
утверждении. Лю бая другая команда заканчивает выполнение.
Если программа - второстепенный процесс, поведение зависит от stdin, таким образом:
■ Если stdin переадресован от файла, система вы водит сообщ ение (после того, как пауза
незамедлительно закодирована): Чтобы продолж ать от фона, выполните 'kill-15 п'
(/7-процесс /¿/-программы).
■ Если stdin не переадресован от файла, програм ма становится приостановленны м ф о ­
новым заданием. Вы долж ны определить fg , чтобы принести задание на передний
план. Затем можно ввести команду для возобновления или окончания обработки.

Эффект в системе Windows


П рограмма ж дет входа на стандартное устройство ввода (stdin - standard input). Если
вы вводите пустую строку - резю ме выполнения в следую щ ем вы полним ом утверж де­
нии. Если вы вводите не пустую строку, то она обрабаты вается как команда DOS и вы ­
полняется system ()cal (системный вызов). П рограм ма в цикле позволяет выполнять м но­
гократные команды DOS, пока не введена пустая строка. Затем вы полнение резю ме
в следующ ем выполнимом утверждении.
Д опустимые утверж дения PAUSE:
PAUSE 701
"PAUSE 'ОШИБОЧНЫЙ РЕЗУЛЬТАТ, ОБНАРУЖЕН'

6.12. Утверждение RETURN


Утверждение RETU RN передает управление от подпрограм м ы к модулю програм мы
вызова. У тверж дение RETU RN принимает следую щ ую форму:
RETURN [ехрг]
где ехрг - скалярное выражение, которое при необходим ости преобразовано в целочис­
ленное значение. Разреш ается только в подпрограммах. У казы вает дополнительное воз­
вращение.
Д ополнительное возвращ ение - устареваю щ ая возм ож ность в Fortran 95 и 90.
Правила использования
Когда выполняется утверж дение RETU RN в подпрограм м е функции, управление п е­
редается ссылке на утверж дение в вызываю щ ей програм мной единице.
Когда утверж дение RETU RN выполняется в подпрограм м е, управление передается
первому выполнимому утверж дению после утверж дения CA LL, которое вы звало п одпро­
грамму, или к альтернативному возврату (если вы его указали).
Следующ ие примеры показываю т, как дополнительны е возвращ ения м огут использо­
ваться в подпрограмме:
CALL СНЕСК(А, В, *10, *20, С)

Ю ...
2 0...
SUBROUTINE СНЕСК(Х, Y, *, *, С)

50 IF (X) 60, 70, 80


60 RETURN
70 RETURN 1
130 С. Д . А п'ашн. В В К ондрат ьев Программирование на Visual FO RTRAN

80 RETURN 2
END
Значение X определяет возвращ ение следую щ им образом:
Если X <0, происходит норм альное возвращ ение и управление передано первому вы­
полнимом у утверж дению , следую щ ему за CA LL C H EC K в программе вызова.
Если X = = 0, происходит первое дополнительное возвращ ение (RETURN 1) и управ­
ление передано утверж дению , идентиф ицированном у с меткой 10.
Если Х > 0, происходит второе дополнительное возвращ ение (RETURN 2) и управле­
ние передано утверж дению , идентиф ицированном у с меткой 20.
О братите вним ание, что звездочка (*) определяет дополнительное возвращ ение. А м ­
персанд (&) м ож ет такж е определить альтернативное возвращ ение в утверждении CALL,
но не в списке форм альны х параметров подпрограммы.

6.13. Утверждение STOP


У тверж дение STO P заканчивает вы полнение програм мы до окончания модуля про­
грам мы . Т ребуется такая форма:
STOP [stop-code]
где stop-code - дополнительное сообщение, может быть любым из следующих выражений:
■ скалярная сим вольная константа типа character по умолчанию ;
■ целое число, состоящ ее из 6 цифр; начальные нули игнорирую тся. (Fortran 95/90
и Fortran 77 допускаю т 5 цифр.)
Если указан stop-code, утверж дение STO P записы вает указанное сообщ ение о стан­
дартной ош ибке устройства и заканчивает вы полнение программы . Если stop-code - сим ­
вольная константа, состояние нуля возвращ ается. Если stop-code - целое число, статус,
равны й stop-code, возвращ ен. Если stop-code не указан, програм ма закончена, никакое
сообщ ение не напечатано и состояние нуль возвращ ается.

Эффект на Linux *и Макинтоше системы OS*


О болочки операционной системы (такие, как bash, sh, csh и т .д .) работаю т с 1-бай­
товы м статусом выхода. Так, если stop-code - целое число, только самый низкий байт
сущ ественен. Н априм ер, рассм отрите следую щ ие утверждение:
STOP 99999
В этом случае програм м а возвращ ает статус, равный 159, потому что целое число
99999 = Z '1869F' и самы й низкий байт равен Z '9F', который составляет 159.

Эффект в системе Windows*


В програм м ах Q uickW in в окне вы водится сообщ ение:
Program terminated with Exit Code stop-code
(П рограм м а закончилась с кодом остановки stop-code.)
Д оп устим ы е утверж дения STOP:
STOP 98
STOP 'END OF RUN'
DO
READ *, X, Y
IF (X > Y) STOP 5555
END DO
Глава 7. Программные единицы и процедуры

П рограмма Fortran 95/90 состоит из одной или более програм м ны х единиц. Есть
4 типа модулей программы:
■ Программа M ain (основная программа). П рограм мная единица, которая обозначает
начало выполнения. Эта программная единица мож ет иметь утверж дение PR O G R A M
как ее первое утверж дение или, возмож но, не иметь этого утверж дения.
■ Процедуры External (внеш ние процедуры). П рограм м ны е единицы , которы е явл яю т­
ся или написанными пользователем функциями или подпрограм м ам и.
■ М одули . П рограммные единицы, которы е содерж ат объявления, определения типов,
процедуры или интерфейсы, которы е м огут совместно использоваться другим и про­
граммными единицами.
■ Программные единицы Block data (блока данны х). П рограм м ны е единицы , кото­
рые обеспечиваю т начальные значения для перем енны х в пом еченны х общ их блоках.
Программная единица не долж на содерж ать вы полним ы е утверж дения, наприм ер м о­
дуль, содерж ащ ий блоки интерфейса для подпрограмм .
П роцедура может бы ть вы звана в течение вы полнения програм м ы , для того чтобы
выполнить определенную задачу.
Есть несколько видов процедур, определяемы х следую щ им образом :
Вид процедуры Описание
Внешняя процедура Процедура, которая не является частью любой другой программной единицы
Модульная процедура Процедура, определенная внутри модуля
Внутренняя процедура1 Процедура (кроме функции утверждения), содержащаяся внутри основной про­
граммы, функции или подпрограммы
Встроенная процедура Процедура, определенная языком Ро11гап
Формальная процедура Фактический параметр, указанный как процедура или появляющийся в обращении
к процедуре
Функция-утверждение Вычислительная процедура, определенная отдельным утверждением
1 Программная единица, которая содержит внутреннюю процедуру, называется ее хостом

Ф ункция вызывается в выражении, используя имя функции или оп ределен н ого оп е­


ратора. Этот вызов дает единственное значение (результат функции), которы й и спользу­
ется, чтобы находить значение выражения.
П одпрограм м а вызывается утверж дением C A LL или определенны м оп ератором п ри ­
сваивания. Этот вызов не дает непосредственно значений, но значения м огут бы ть воз­
вращ ены к программной единице вы зова через парам етры (или перем енны е) известны е
программе вызова. Рекурсия (прямая или косвенная) разреш ается для функций и п одп ро­
грамм.
Интерфейс процедуры относится к свойствам процедуры , которы е взаим одействую т
или представляю т интерес к програм ме вызова. И нтерф ейс процедуры м ож ет бы ть явно
определен в блоках интерфейса. Все програм мны е единицы , кроме програм м ны х единиц
данных блока, могут содерж ать блоки интерфейса.

йт от т 131
132 С Д . Алгазин, В. В. К он драт ьев П рогралш рование на Visual FORTRAN

7.1. Основная программа


П рограм ма Fortran долж на вклю чать одну основную Программу:
[PROGRAM пате]
[specification-part]
[execution-part]
[CONTAINS
internal-subprogram-part]
END [PROGRAM [name]]
где name - имя програм мы ; specification-part является одним или более описаниями, за
исклю чением следую щ их выраж ений:
■ INTEN T (или его эквивалентны й атрибут).
■ O PT IO N A L (или его эквивалентны й атрибут).
■ PU B LIC и P R IV A T E (или их эквивалентны е атрибуты).
А втом атический объект не долж ен появиться в описании. Если указано утверждение
SAV E, оно не им еет никакого эффекта.
execution-part является одной или более вы полним ы м и конструкциями или утверж де­
ниями, за исклю чением утверж дений RETURN или EN TRY .
internal-subprogram -part (внутренняя часть подпрограммы) является одной или более
внутренними подпрограм м ам и (определяю щ ими внутренние процедуры); internal-
subprogram -part предш ествует утверж дение CO N TA IN S.
Правила использования
У тверж дение PR O G R A M является дополнительны м. В пределах модуля программы
предш ествовать утверж дению PR O G R A M могут только комментарии или утверждение
O PTIO N S.
У тверж дение EN D - единственная необходим ая часть программы . Если имя следует
за утверж дением END, это долж но бы ть имя, указанное в утверждении PROGRAM .
И мя програм м ы считаю т глобальны м , и оно долж но бы ть уникальным. Это имя не
мож ет бы ть тем же именем , что и лю бое локальное имя в основной программе или имя
лю бого другого модуля програм мы , внеш ней процедуры или общ его блока в выполни­
мой программе.
О сновная програм м а не долж на ссы латься сама на себя (прямо или косвенно).
Пример основной программы :
PROGRAM TEST
INTEGER С, D, Е(20,20) ! Часть спецификаций
CALL SUB_1 ! Выполнимая часть

CONTAINS
SUBROUTINE SUB_1 I Внутренняя подпрограмма

END SUBROUTINE SUB_1


END PROGRAM TEST

7.2. Модули и процедуры модуля


В ранних версиях Fortran возм ож ности доступа к единому блоку данных из несколь­
ких програм мны х ком понентов не было. П роблема организации доступа к глобальным
данны м бы ла реш ена только в Fortran 90 с появлением в язы ке модулей.
Глава 7. П рограм м ны е единицы и проц едуры 133
М одуль содерж ит специф икации и определения, которые могут использоваться одним
или более программны ми единицами.
Чтобы модуль стал доступны м , друг ие П рограм м ны е единицы долж ны сослаться на
его имя в утверждении USE, и объекты модуля долж ны бы ть общ едоступны м и.
М одуль принимает следую щ ую форму:
MODULE пате
[specification-part]
[CONTAINS
module-subprogram
[moduie-subprogram]...]
END [MODULE [пате]]

где пате - имя модуля; sp e c ific a tio n -p a r t является одним или более описаниям и, за ис­
ключением следую щ их:
- ENTRY,
- FORM A T,
■ A U TO M A TIC (или его эквивалентног о атрибута),
■ INTENT (или его эквивалентного атрибута),
■ OPTION A L (или его эквивалентного атрибута),
■ функции утверждения.
А втоматический объект не долж ен появиться в описании модульной процедуры,
module-subprogram является функцией или подпрограмм ой, которая определяет про­
цедуру модуля. Ф ункция долж на закончиться оператором EN D FU N C T IO N , подпро­
грамма долж на закончиться оператором END SU B RO U TIN E. П одпрограм м а м одуля м о­
жет содерж ать внутренние процедуры.
Правила использования
Если имя следует за утверж дением END, это имя долж но бы ть то же самое, что и ука­
занное в утверж дении M O D ULE. Имя модуля считаю т глобальным, и оно долж но быть
уникальным. Это имя не может совпадать с лю бы м локальны м именем в основной про­
грамме или именем лю бого другого модуля програм мы , внеш ней процедуры или общ его
блока в выполнимой программе.
М одуль, ведущ ий к лю бы м процедурам модуля, которые его содерж ат, и объекты в
модуле доступны для процедуры модуля через связы вание хостом.
М одуль не долж ен ссылаться на себя (прямо или косвенно).
Вы можете использовать атрибут PR IV A TE, чтобы ограничить доступ к процедурам
или переменным в пределах модуля.
Хотя утверждениям ENTRY, утверж дениям FO R M A T и функциям утверж дения не
разреш ается входить в часть спецификации модуля, им разреш ается входить в части спе­
цификации подпрограммы модуля.
Лю бые выполнимые утверж дения в м одуле м огут бы ть только указаны в п одпро­
грамме модуля.
М одуль может содерж ать один или более блоков интерфейса процедуры, которы е по­
зволяю т вам определять явный интерфейс для внеш ней подпрограмм ы или формальной
подпрограммы.
Следую щ ий пример показы вает простой модуль, который м ож ет использоваться, что­
бы определить глобальные данные:
MODULE MOD_A
134 С. Д. Алгазин, В . В. К ондрат ьев. Программирование на Visual FO RTRAN

INTEGER:: В, С
REAL Е (25,5)
END MODULE MOD_A

SUBROUTINE SUB_Z
USE MOD_A ! Делает скалярные переменные В и С и массив
! Е доступным для этой подпрограммы
END SUBROUTINE SUB_Z
С ледую щ ий пример показы вает процедуру модуля:
MODULE RESULTS

CONTAINS
FUNCTION MOD_RESULTS (X, Y) ! Процедура модуля

END MODULE RESULTS


Следую щ ий прим ер показы вает модуль, содерж ащ ий производный тип:
MODULE EMPLOYEE_DATA
TYPE EMPLOYEE
INTEGER ID
CHARACTER(LEN=40) NAME
END TYPE EMPLOYEE
END MODULE
Следую щ ий прим ер показы вает модуль, содерж ащ ий блок интерфейса:
MODULE AR RA Y_C ALC U LAT OR
INTERFACE
FUNCTION CALC_AVERAGE(D)
R EA L:: CALC_AVERAGE
REAL, IN TEN T(IN ):: D(:)
END FUNCTION
END INTERFACE
END MODULE ARRAY.CALCULATOR
Следую щ ий пример показы вает определение производного типа, которое является
общ едоступным с компонентам и, которы е являю тся частными:
M O D U LE M A T T ER
TYPE ELEMENTS
PRIVATE
INTEGER C, D
END TYPE

END MODULE M A H E R
В этом случае компоненты С и D являю тся частными, типа ELEM ENTS, но тип
ELEM EN TS не частный к M O D U L E M A TTER . Л ю бая программная единица, которая ис­
пользует модуль M A TTER , м ож ет объявить переменны е типа ELEM EN TS и передать как
значения параметров E LEM EN TS типа. Этот проект позволяет изменять компоненты ти­
па, не воздействуя на другие програм мны е единицы, используя модуль.
Если производный тип необходим больш е, чем в одном модуле программы, опреде­
ление долж но бы ть пом ещ ено в м одуль и доступ долж ен обеспечиваться утверждением
USE всякий раз, когда это необходимо.
Глава 7 П рограм м ны е единицы и п роц едуры 135

MODULE STUDENTS
TYPE STUDENT_RECORD

END TYPE
CONTAINS
SUBROUTINE COURSE_GRADE(...)
TYPE(STUDENT_RECORD) NAME

END SUBROUTINE
END MODULE STUDENTS

PROGRAM SENIOR_CLASS
USE STUDENTS
TYPE(STUDENT_RECORD) ID

END PROGRAM
П рограмма S E N IO R C L A S S им еет доступ к типу S T U D E N T R E C O R D , потому что
этот тип использует модуль STU D EN TS. П роцедура C O U R SE G RA D E модуля такж е
имеет доступ к типу S T U D E N T R E C O R D , потому что определение производного типа
появляется в его хосте.

7.3. Ссылки модуля


П рограммная единица ссылается на модуль в утверж дении USE. Эта ссылка модуля
позволяет программе получать доступ к общ едоступны м определениям, спецификациям
и процедурам в модуле. О бъекты в модуле общ едоступны по ум олчанию , если утвержде­
ние USE не определяет иначе или если указан атрибут PR IV A T E для объектов модуля.
Ссылка модуля является причиной связывания между используем ой программной еди­
ницей и объектами в модуле.

7.4. Утверждение USE


Утверж дение USE разреш ает доступ из програм мной единицы общ едоступным объ­
ектам в модуле. П рименяется одна из следую щ их форм:
USE name [, rename-Hs(\
USE name, O N L Y : [only-lisf\
где п а т е - имя модуля; rename-list является одним или более пунктами, имеющими форму:
local-name => mod-name
где local-name - имя объекта в м одуле программы , использую щ ей модуль или
"O PERA TOR (ор-пат е)'\ в котором ор-пат е - имя определенного оператора в модуле
программы.
mod-name является именем общ едоступного объекта в м одуле или - "O PERA TOR (ор-
пате)", где ор-пате - имя общ едоступного объекта в модуле.
only-list является именем общ едоступного объекта в модуле или родовом идентифи­
каторе (родовое имя, определенны й оператор, указанны й как "O PE R A T O R (ор-пате)'\
или определенное назначение).
О бъект в единственном списке м ож ет такж е принять форму:
[local-name =>] mod-name
136 С Л А /лиан, В В Кондратьев. Прокламирование на Visual FORTRAN

Правила паю. /ьзования


Если утверж дение USE указано без опции O N LY , програм мная единица имеет доступ
ко всем общ едоступны м объектам в названном модуле.
Если утверж дение USE указано с опцией O N LY , програм мная единица имеет доступ
только к тем объектам , которые располож ены после опции.
Если более чем одно утверж дение USE появляю тся в данном модуле в блоке области
действия, прим еняю тся следую щ ие правила:
Если одно из утверж дений USE не им еет опции O N LY , все общ едоступные объекты в
м одуле доступны и лю бы е renam e-lists (переимен-списки) и only-lists (единственные спи­
ски) интерпретирую тся как отдельное, связанное renam e-lists (переимен-список).
Если все утверж дения USE им ею т опции O N LY , все only-lists (единственные списки)
интерпретирую тся как отдельны й, связанны й only-lists (единственный список). Только те
объекты , названны е в одном или более only-lists (единственных списков), доступны.
Если 2 или больш е родовы х интерфейса, доступны х в блоке области действия, имеют
го же имя, тот же оператор или оба назначения, Они интерпретирую тся как единственный
родовой интерфейс. Иначе м ногократны е доступны е объекты могут иметь то же самое
имя, только если не сделана ссы лка на имя в блоке области действия.
Л окальны е имена объектов, сделанны е доступны м и утверж дением USE, не должны
бы ть переуказаны ни с какими атрибутам и, кроме PU B LIC или PRIVATE. Локальные
имена могут появиться в списках группы nam elist, но не в утверж дении CO M M O N или
EQ U IV A LEN CE.
С ледую щ ие примеры показы ваю т утверж дения USE:
MODULE MOD_A
IN TE G E R :: В, С
REAL Е(25,5), D(100)
END MODULE MOD_A

SUBROUTINE SUB_Y
USE MOD_A, DX => D, EX => E 1 Массив D был переименован DX, массивом E
... ! был переименован EX. Скалярные переменные В
END SUBROUTINE SUB_Y ! и С также доступны для этой подпрограммы
... ! (использующей их имена модуля).
SUBROUTINE S U B .Z
USE MOD_A, ONLY* В, С ! Только скалярные переменные В и С
.. ! доступны для этой подпрограммы
END SUBROUTINE SUB_Z

М одуль, содерж ащ ий общ ие блоки: *


MODULE COLORS
COM M O N/BLO CK A /С, D(15)
COMMON /BLOCKB/ E, F

END MODULE COLORS

FUNCTION HUE(A, B)
USE COLORS

END FUNCTION HUE


Глава 7 П рограм м ны е единицы и проц едуры 137
У тверж дение USE делает все переменные в общ их блоках в модуле CO LO RS доступ ­
ными для функции HUE.
О беспечивать абстракцию данных, определенны й пользователем тип данны х и о п ера­
ции, которые будут выполнены на значениях этого типа, м огут бы ть пакетированы вм е­
сте в модуле. Следую щ ий прим ер показы вает такой модуль:
MODULE CALCULATION
TYPE ITEM
R EA L:: X, Y
END TYPE ITEM
INTERFACE OPERATOR (+)
MODULE PROCEDURE ITEM.CALC
END INTERFACE
CONTAINS
FUNCTION ITEM.CALC (A1, A2)
TYPE(ITEM) A1, A2, ITEM.CALC

END FUNCTION ITEM.CALC

END MODULE CALCULATION


PROGRAM TOTALS
USE CALCULATION
TYPE(ITEM) X, Y, Z

X=Y+Z

END
Утверж дение USE разреш ает доступ програм мы T O TA L S к типу ITEM и к расш ирен­
ному встроенному operator + , чтобы вы полнить вы числения.

7.5. Блок данных - программная единица


Программная единица блока данных обеспечивает начальны е значения для неуказа­
тельных переменных в помеченном общ ем блоке. Это вы раж ение приним ает следую щ ую
форму:
BLOCK DATA [name]
[specification-parf]
END [BLOCK DATA [name]]
где пате - имя модуля программы блока данных.
specification-part является одним или нескольким и из следую щ их утверждений:
COM M ON; INTRIN SIC; STA TIC; D ATA; PA R A M ETER ; T A R G E T; О пределение произ­
водного типа; POIN TER; О бъявление т и п а1; D IM EN SIO N ; REC O R D ; U SE2;
EQ UIV A LEN CE; О бъявление структуры записи; IM PLICIT; SAV E.
Правила использования
П рограммную единицу блока данных необязательно им еновать, но в выполнимой
программе может быть только одна неназванная програм мная единица блока данных.

1Можетсодержать только атрибуты: DIMENSION, INTRINSIC, PARAMETER, POINTER, SAVE,


STATICили TARGET
2Разрешаетдоступ только к именованнымконстантам.
138 С Д Алгазин, В В К ондрат ьев П рограм ирование на Visual FORTRAN

Если имя следует за утверж дением END, то это долж но быть то же имя, что и имя,
указанное в утверж дении BLO CK D A TA .
Блок интерф ейса не м ож ет присутствовать в модуле блока данных программной еди­
ницы, и блок данны х програм м ной единицы не долж ен содерж ать никаких выполнимых
утверж дений.
Если утверж дение D A TA инициализирует какую -нибудь переменную в помеченном
общ ем блоке, програм м ная единица блока данны х долж на иметь полный набор описа­
ний, устанавливаю щ их общ ий блок.
О днако все перем енны е в блоке не долж ны быть инициализированы.
П рограм м ная единица блока данны х м ож ет установить и определить начальные зна­
чения для более чем одного общ его блока, но данный общ ий блок может появиться толь­
ко в одном м одуле програм м ы блока данных в выполнимой программе.
Имя програм м ной единицы блока данны х, появляю щ ееся в утверждении EXTERNAL
другой програм мной единицы , вы зы вает поиск библиотек объектных модулей для про­
грам мной единицы блока данны х во время редактирования.
П рограм м ная единица блока данных:
BLOCK DATA BLKDAT
INTEGER S,X
LOGICAL T,W
DOUBLE PRECISION U
DIMENSION R(3)
COMMON /AREA1/R.S Д Т /AREA2/W.X.Y
DATA R/1.0,2*2 0/, T/.FALSE./, U/0.214537D-7/, W/.TRUE./, Y/3.5/
END

7.6. Функции, подпрограммы и функции-утверждения


Ф ункции, подпрограм м ы и ф ункции-утверж дения - написанные пользователем под­
програм мы , которы е вы полняю т вы числительны е процедуры. Вычислительная процеду­
ра может бы ть или рядом ариф м етических операций, или рядом утверждений Fortran.
О тдельная подпрограм м а м ож ет вы полнить вы числительную процедуру в нескольких
местах в програм м е, чтобы избеж ать дублирования ряда операций или утверждений в
каж дом месте.
С ледую щ ая таблица показы вает утверж дения, которые определяю т эти подпрограм­
мы, и то, как управление передается подпрограмме:
Подпрограмма Определение утверждений Метод передачи управления
Функция FUNCTION или ENTRY Ссылка функции (см. разд. 7.11)
Подпрограмма SUBROUTINE или ENTRY Утверждение CALL (см разд. 7.11)
Функция-утверждение Определение функции-утверждения Функциональная ссылка
Ссылка функции используется в выраж ении для вы зова функцйи. Это выражение со­
стоит из имени функции и ее ф актических параметров. С сы лка функции возвращ ает зна­
чение к вы раж ению вы зова, она используется для поиска значения выражения.

7.7. Общие правила для подпрограмм функции и подпрограммы


П одпрограм м а м ож ет бы ть внеш ней, модулем или внутренней подпрограммой. Ут­
верж дение EN D для внутренней подпрограммы или подпрограммы модуля долж но быть
EN D SU B R O U T IN E [имя] для подпрограмм ы , или END FUN CTIO N [имя] для функции.
Г лава 7 П рограм м ны е единицы и проц ед уры 139
Во внеш ней подпрограмме клю чевые слова S U B R O U TIN E и FU N C T IO N являю тся д о ­
полнительными.
Если имя подпрограммы появляется после утверж дения EN D , оно долж но бы ть таким
же, как и имя, указанное в утверж дении S U B R O U TIN E или FU N CTIO N .
Ф ункция и подпрограмма м огут изм енить значения их параметров, и вы званная про­
грамма может использовать измененные значения.
У тверж дениям SU B RO U TIN E или FU N CTIO N м ож ет произвольно предш ествовать
утверж дение OPTIO NS.
Ф ормальные параметры (за исклю чением форм альны х указателей или форм альны х
процедур) м огут бы ть намеренно указаны или сделаны необязательны м и.
Следую щ ие секции описы ваю т рекурсию , чистые процедуры и определенны е п ользо­
вателем элементные процедуры.

Рекурсивные процедуры
Рекурсивная процедура может сослаться на себя прям о или косвенно. Рекурсия р аз­
реш ается, если указано клю чевое слово R EC U R SIV E в утверж дении FU N C TIO N или
SU BRO U TIN E, если RECURSIV E указано как опция ком пилятора или в утверж дении
O PTIONS.
Если функция непосредственно рекурсивна и ее значение - массив, клю чевы е слова
R EC U R SIV E и RESU LT долж ны бы ть указаны в утверж дении FU N C TIO N .
И нтерф ейс процедуры явен в пределах подпрограм м ы в случаях:
■ REC U R SIV E указано для подпрограммы.
■ R EC U R SIV E и R ESU LT указаны для функции.
К лю чевое слово REC U R SIV E долж но бы ть указано, если вы полняется лю бое из со ­
бытий (непосредственно или косвенно):
■ П одпрограм м а вы зы вает себя.
■ П одпрограм м а вызы вает подпрограмму, определенную утверж дением EN TR Y в той
же самой подпрограмме.
■ П роцедура EN TRY в той же подпрограмм е вы зы вает одно из перечисленного:
■ непосредственно себя;
■ другую процедуру ENTRY в той же самой подпрограм м е;
■ подпрограмму, определенную утверж дением FU N C T IO N или SU B R O U TIN E.

Чистые процедуры
Чистая процедура - определенная пользователем процедура, которая указана при и с­
пользовании префикса PURE (или E L EM E N T A L ) в утверж дении FU N C T IO N или
SUBRO U TIN E. Чистые процедуры - возм ож ность Fortran 95.
Чистая процедура не имеет никаких побочных эфф ектов. О на не им еет никакого
влияния на состояние программы, за исклю чением событий:
■ для функций: возвращ ает значение;
■ для подпрограмм: изм еняет параметры IN TEN T (IN O U T) и IN T EN T(O U T).
Следую щ ие встроенны е процедуры неявно чисты:
■ все встроенны е функции;
■ элементная встроенная подпрограмма M V BITS;
■ встроенная подпрограмма M OVE ALLOC.
■ Ф ункция оператор чиста, только если все ф ункции, на которы е она ссы лается, чисты.
140 С Д Алгазин, В . В . К ондрат ьев П рограм ирование на Visual FO RTRAN

Правила использования
За исклю чением парам етров процедуры и параметров указателя, следую щ ее намере­
ние долж но бы ть указано для всех формальных параметров в части спецификации про­
цедуры:
■ для функций: IN T E N T (IN);
■ для подпрограмм: лю бой IN T E N T (IN, O U T или 1NOUT).
Л окальная переменная, объявленная в чистой процедуре (вклю чая переменные, объ­
явленные в лю бом внутренней процедуре), не должна:
■ иметь атрибут SAV E;
■ быть инициализирована в утверж дении объявления типа или утверждении DATA.
Следую щ ие перем енны е ограничиваю т использование чистых процедур (и лю бых
внутренних процедур):
■ глобальны е переменны е;
■ ф орм альны е параметры с IN T EN T (IN) (или с не заявленным намерением);
■ объекты, которы е являю тся пам ятью , связанной с какой-либо частью глобальной пе­
ременной.
Эти объекты не долж ны использоваться ни в каком контексте, который выполняет
лю бое из следую щ их утверж дений:
■ Заставляет их значение изм еняться. Н апример, они не долж ны использоваться как:
■ левая сторона оператора присваивания или оператора присваивания указателя;
■ фактический параметр, связанны й с формальным параметром с INTEN T(O U T),
IN TEN T (IN O U T), или атрибут POIN TER;
■ индексная переменная в утверж дении DO или FORALL, или неявном D O -цикле;
■ переменная в утверж дении A SSIG N ;
■ пункт входа в утверж дении REA D ;
■ внутренний м одуль ф айла в утверж дении W RITE;
■ объект в утверж дении A L LO C A T E, D EA LLO C A TE или N U LLIFY ;
■ IO STA T или специф икатор SIZE в утверждении ввода/вывода, или спецификатор
STA T в утверж дении A L LO C A T E или D EA LLO CA TE.
■ С оздает указатель на эту переменную . Н апример, они не долж ны использоваться как:
■ цель в операторе присваивания указателя;
■ правая сторона назначения на переменную производного типа (вклю чая указатель
на производны й тип), если производный тип имеет компонент указателя на каком-
нибудь уровне.
■ Чистая процедура не долж на содерж ать:
■ лю бого внеш него утверж дения ввода/вы вода (вклю чая утверж дение REA D или
W RITE, модуль ввода/вы вода которого - внеш ний номер устройства файла или *);
■ утверж дения PA U SE;
■ утверж дения STO P.
■ Чистая процедура м ож ет использоваться в контекстах, в которых другие процедуры
ограничены ; например:
■ м ож ет вы зы ваться непосредственно в утверждении FO R A LL или использоваться в
вы раж ении маски утверж дения FORALL;
■ м ож ет вы зы ваться из чистой процедуры (чистые процедуры м огут вызвать только
другие чистые процедуры );
■ ее мож но передать как ф актический параметр к чистой процедуре.
Глава 7. П рограм м ны е единицы и процедуры 141
Если процедура используется в лю бом из этих контекстов, ее интерфейс долж ен бы ть
явным и она долж на бы ть объявлена как pure (чистая) в этом интерфейсе.
Следую щ ие примеры - функция без побочного эффекта:
PURE INTEGER FUNCTION MANDELBROT(X)
COMPLEX, IN TENT(IN):: X
COM PLEX:: XTMP
IN TEG ER :: К
! Предположить, что SHARED_DEFS включает объявление
! INTEGER ITOL
USE SHARED_DEFS
К=0
XTMP = -X
DO WHILE (ABS(XTMP)<2,0 .AND. K<ITOL)
XTMP = XTMP**2 - X
K=K+ 1
END DO
ITER = К
END FUNCTION
П римеры предыдущ ей функции использую тся в блоке интерфейса:
INTERFACE
PURE INTEGER FUNCTION MANDELBROT(X)
COMPLEX, IN TEN T(IN ):: X
END FUNCTION MANDELBROT
END INTERFACE
Конструкция FORALL, вызываю щ ая функцию M A N D ELB R O T для обновления эл е­
ментов массива:
FORALL (I = 1:N, J = 1:M)
A(I,J) = MANDELBROT(COMPLX((I-1)*1.0/(N-1), (J-1)*1 0/(M-1))
END FORALL

Элементные процедуры
Элементная процедура - определенная пользователем процедура, которая является
ограниченной формой чистой процедуры.
Элементную процедуру можно передать массиву, и она действует на каж дый элем ент
одновременно. Элементные процедуры - возм ож ность Fortran 95.
Чтобы определить элементную процедуру, используйте преф икс E L E M E N T A L в у т­
верждении FUNCTION или SU B RO U TIN E.
Явный интерфейс долж ен бы ть видимы м к вызываю щ ей програм м е процедуры
ELEM ENTAL.
Для функций результатом долж ен бы ть скаляр; не допускается атрибут P O IN T E R или
A LLO CATA BLE.
Ф ормальные параметры им ею т ограничения:
■ долж ны быть скаляром;
■ не могут иметь атрибута A L LO C A T A B L E или POIN TER;
■ они (или их подобъекты) не м огут появиться в выражении специф икации, кроме как
параметр к одной из встроенны х функций BIT SIZE, LEN, K IND или числовы е ф ун к­
ции запроса;
■ не м о 1 ут быть *;
■ не могут быть ф ормальными процедурами.
142 С .Д Алгазин, В В. К ондрат ьев П роклам ирование на Visual FORTRAN

Если фактические параметры - скаляры, результат - скаляр. Если фактические пара­


метры м ассивы, значения лю бы х элементов результата - те же, как если бы функция или
подпрограмм а прим енялась отдельно, в лю бом порядке, к соответствую щ им элементам
каждого м ассива ф актического параметра.
Элементные процедуры - чистые процедуры и все правила, которые применимы к
чистым процедурам , такж е применимы к элем ентным процедурам.
Рассмотрите следую щ ее выражение:
MIN (А, О, В)! А и В массивы формь^Б, Т)
В этом случае элементная ссылка на встроенную функцию M1N - выражение массива,
чьи элементы им ею т следую щ ие значения:
MIN (A(I,J), О, B(I.J)). 1= 1,2 S, J = 1,2 T

Функции
П одпрограм м а функции вызывается в выраж ении и возвращ ает единственное значе­
ние (результат функции). О на используется для вычисления выражения.
У тверж дение FU N CTIO N - начальное утверж дение подпрограмм ы функции. П риме­
няется следую щ ая форма:
[prefix] FUNCTION name [([d-arg-lis(\)] [RESULT (r-name)]
где prefix - одно из следую щ их выражений: type [keyw ord] или keyw ord [type], в которых
type является спецификатором типа данных; keyw ord является одним из следующ их вы­
ражений:
Ключевое слово Смысл
RECURSIVE Допускает прямую рекурсию. Если функция непосредственно рекурсивна и значение -
массив, RESULT должен быть также указан
PURE Утверждает, что процедура не имеет никаких побочных эффектов (см. "Чистые проце­
дуры")
ELEMENTAL Ограниченный формат чистой процедуры, которая действует на 1 элемент массива од­
новременно
пате является именем функции. Если R E SU LT указан, имя функции не долж но поя­
виться ни в каком описании в блоке области действия подпрограмм ы функции.
Имя ф ункции мож ет сопровож даться длиной типа данных. Д лина указана символом
звездочка (*), сопровож даемы м лю бым целым числом, отличным от нуля, без знака, ко­
торое является допустим ой длиной для типа функции. Н апример, FUNCTION REAL
LG FU N C*8 (Y, Z) определяет результат функции как R EA L (8) (или REAL *8). Эта до­
полнительная специф икация длины не разреш ается, если длина бы ла уже указана после
клю чевого слова CH A RA CTER .
d-arg-list является списком одного или более форм альных параметров. Если нет ника­
ких форм альных параметров и переменной RESU LT, круглые скобки могу! быть опущ е­
ны. Н апример, допустим о следую щ ее выражение:
FUNCTION F
где г-пате - имя результата функции. Оно долж но отличаться от имени функции.
Результат функции может быть объявлен с атрибутом A LLOCATABLE или POINTER.
Правила использования
Тип и лю бы е параметры вида результата функции м огут бы ть определены в утвер­
ж дении FU N CTIO N или в утверж дении объявления типа в пределах подпрограммы
Г лава 7. П рограм м ны е единицы и п роц едуры 143
функции, но не одновременно. Если тип не указан, го он определяется по неявным п ра­
вилам типа для функции подпрограммы.
Выполнение начинается с первой выполнимой конструкции или утверж дения после
утверждения FU N CTIO N . У правление возвращ ается к модулю программы вызова после
выполнения утверждения END (или RETU RN ).
Если вы определяете C H A R A C T E R * (*), функция принимает длину, объявленную
для этого в программном модуле, который ее вызывает. Э тот тип сим вольной функции
может иметь другие длины , если эта функция вы звана другим и програм мны ми единица­
ми (устаревающ ая возмож ность Fortran 95). Если длина указана как целочисленная кон­
станта, значение долж но бы ть согласовано с длиной функции, определенной в м одуле
программы, который вы зы вает функцию . Если длина не указана, она принимается равной
единице.
Если функция - динамически размещ аем ы й (allocatable array) массив или указатель,
атрибуты долж ны быть объявлены в пределах функции. Спецификация ф ункциональны х
атрибутов результата, атрибутов форм альных параметров и информация в заголовке
процедуры - все вместе - определяю т интерфейс функции.
Значение переменной результата возвращ ено функцией, когда закончено выполнение.
В зависимости от того, является ли результат указателем, применяю тся определенны е
правила.
■ Если результат - указатель, его статус распределения долж ен бы ть определен прежде,
чем функция заканчивает выполнение. (Ф ункция долж на связать цель с указателем,
или заставить указатель бы ть явно разъединенны м от цели.) Вид значения, возвра­
щ енного функцией, определен видом результата переменной, когда функция заканчи­
вает выполнение.
■ Если результат не указатель, его значение долж но быть определено прежде, чем
функция заканчивает выполнение. Если результат - массив, все элементы долж ны
быть определены; если результат - структура производного типа, все компоненты
должны быть определены.
Подпрограмма функции не мож ет содерж ать утверж дение SU B RO U TIN E, утверж де­
ние BLO CK DATA, утверж дение PRO G R A M или другое утверж дение FUN CTIO N.
Утверждения EN TRY м огут быть вклю чены и обеспечивать многократны е точки входа к
подпрограмме.
Чтобы вызвать функцию , вы м ожете использовать утверж дение CA LL, но только если
функция не одного из следую щ их типов:
REAL (8)
REAL (16)
COMPLEX (8)
COMPLEX (16)
CHARACTER
Следующий пример использует метод итерации Н ью тона - Рапсона (F(X) = cosh(X ) +
+ cos(X) - А = 0), чтобы получить корень функции:
FUNCTION ROOT(A)
Х = 1.0
DO
EX = ЕХР(Х)
EMINX = 1 ./EX
ROOT = X - ((EX+EMINX)*.5+COS(X)-A)/((EX-EMINX)*.5-SIN(X))
IF (AB S((X-R 00T)/R 00T) I T . 1E-6) RETURN
144 С. Д А к а зи н , В В К он драт ьев . П р о гр а мнрование на Visual FO RTRAN

X = ROOT
END DO
END
В преды дущ ем иримере ф орм ула вы числена неоднократно до разницы между Xi
и X i+1, составляю щ им величину меньш е чем 1.0Е-6:
х = х co s(-y,.) + cos ( Х , ) - А
,и ' sinh(Ji'/ ) - s in ( A 'i )
С ледую щ ий пример показы вает сим вольную функцию предполагаемой длины:
CHARACTER^*) FUNCTION REDO(CARG)
CHARACTER*! CARG
DO 1=1 ,LEN(REDO)
REDO(hl) = CARG
END DO
RETURN
END FUNCTION
Эта функция возвращ ает значение ее параметра, повторенного для заполнения длины
функции.
В пределах лю бого данного модуля програм мы , все ссы лки на сим вольную функцию
предполагаем ой длины долж ны иметь ту же длину. В следую щ ем примере функция
RED O им еет длину 1000:
CHARACTERS ООО REDO, MANYAS, MANYZS
MANYAS = REDO('A’)
MANYZS = REDO('Z')
П рограм мная единица в пределах вы полним ой програм мы м ож ет определить другую
длину. Н априм ер, функция RED O имеет длину 2:
CHARACTER H0LD*6, RED0*2
HOLD = RED0('A')//RED0('B')//RED0('C')
Д инам ическая функция массива:
FUNCTION SUB (N)
REAL, D IM EN SIO N(N ):: SUB

END FUNCTION
Следующ ий иример показывает размещаемую функцию с размещаемыми параметрами:
MODULE АР
CONTAINS
FUNCTION ADD_VEC(P1,P2)
! Функция применяется, чтобы добавить 2 размещаемых массива
! возможно отличающихся длин.
• О массивах можно думать как полиномиальных (коэффициентах)
REAL, ALLOCATABLE :: ADD_VEC(:), Р1(:), Р2(:)
! Эта функция возвращает размещаемый массив, длина которого собирается
! из длины большего входного массива.
ALLOCATE(ADD_VEC(MAX(SIZE(P1), SIZE(P2))))
M = MIN(SIZE(P1),SIZE(P2))
! Составить в целом короче размер входного массива
ADD_VEC(:M) = Р1(:М) + Р2(:М)
!Использовать большие элементы массива на входе впоследствии (от Р1 или Р2)
IF(SIZE(P1) > М) THEN
Г чеша 7. П рограм м ны е единицы и п роц едуры 145
ADD_VEC(M+1:) = P1(M+1:)
ELSE IF(SIZE(P2) > М) THEN
ADD_VEC(M+1:) = P2(M+1:).
ENDIF
END FUNCTION
END MODULE
PROGRAM TEST
USEAP
REAL, ALLOCATABLE :: P(:), Q(:), R(:), S(:)
ALLOCATE(P(3))
ALLOCATE(Q(2))
ALLOCATE(R(3))
ALLOCATE(S(3))
! Обратить внимание, что P и Q отличаются по длине
Р = (/4,2,1/) ! Р = Х**2 + 2Х + 4
Q = (/-1,1/) ! Q = X - 1
PRINT Resuit should be: 3.000000 3.000000 1.000000'
PRINT V Coefficients are: ', ADD_VEC(P, Q) ! X**2 + 3X + 3
P = (/1,1,1/) ! P = X**2 + X + 1
R = (/2,2,2/) ! R = 2X**2 + 2X + 2
S = (/3,3,3/) ! S = 3X**2 + 3X + 3
PRINT Resuit should be: 6.000000 6.000000 6.000000'
PRINT*,' Coefficients are: ', ADD_VEC(ADD_VEC(P,R), S)
END

Ключевое слово RESULT


О бычно результат функции возвращ ен на имя функции, и все ссы лки на имя ф ун к­
ц и и - ссылки на результат функции. О днако если вы используете клю чевое слово
RESU LT в утверж дении FU N CTIO N , вы м ож ете определить локальное имя переменной
для результата функции. В этом случае все ссы лки на имя функции, рекурсивны е вызовы
и имя функции не долж ны появиться в описаниях. Имя R E SU LT долж но отличаться от
имени функции.
Следую щ ий пример показывает рекурсивную функцию , определяю щ ую переменную
RESULT:
RECURSIVE FUNCTION FACTORIAL(P) RESULT(L)
INTEGER, INTENT(IN) :: P
INTEGER L
IF (P == 1) THEN
L= 1
ELSE
L = P * FACTORIAL(P - 1)
END IF
END FUNCTION

Ссылки функции
Ф ункции вызываю тся ссылкой функции в вы раж ении или определенной операции.
Ссылка функции принимает следую щ ую форму:
fun ([a-arg [, a-arg]..])
где fun - имя подпрограммы функции; a-arg является ф актическим параметром , которо­
му произвольно предш ествует [keyworcl =], где keyw ord - имя ф орм ального параметра в
явном интерфейсе для функции. Значение keyw ord задается при вызове процедуры.
146 С. Д Алгазин, В . В. К ондрат ьев П рограм нрован ие на Visual FORTRAN

Каж дый ф актический парам етр долж ен бы ть переменной, выражением или именем
процедуры. (Он не долж ен бы ть именем внутренней процедуры, функции утверждения
или родового имени процедуры .)
Правила использования
Когда ссы лаю тся на ф ункцию , каж дый фактический параметр связан с соответст­
вую щ им форм альны м параметром его позиции в списке параметров или именем пара­
м етра keyw ord. Эти парам етры долж ны соответствовать в типе и параметрах вида.
В ы полнение ф ункции дает результат, который присваивается имени функции, или р е­
зультат присваивается другом у имени в зависим ости от того, было ли указано клю чевое
слово RESU LT. П рограм м ная единица использует значение результата, чтобы закончить
вы числение вы раж ения, содерж ащ его ссы лку на функцию .
Если позиционны е параметры и клю чевы е слова параметра указаны, клю чевые слова
парам етра долж ны появиться последним и в фактическом списке параметров. Если ф ор­
м альны й параметр является дополнительны м , фактический параметр может быть опу­
щен. Если ф орм альны й парам етр указан с атрибутом IN TEN T, его использование может
бы ть ограничено. Ф орм альны й параметр, нам ерение которого не указано, подчинен ог­
раничениям связанного с ним ф актического параметра.
Ф актический параметр, связанны й с ф орм альной процедурой, долж ен быть с собст­
венным именем процедуры или бы ть другой форм альной процедурой. О пределенны е
имена встроенной функции не долж ны использоваться как фактические параметры (см.
табл. 8.1).
Р ассм отрите пример:
X = 2.0
NEW_COS = COS (X) ! Ссылка функции
CO S встроенной ф ункции вы числяет косинус 2.0. Значение -0 .4 1 6 1 4 6 8 возвращ ено
(вместо CO S (X)) и назначено на N EW COS.

7.8. Подпрограммы
П одпрограм м а вы зы вается утверж дением CA LL или определенным оператором при­
сваивания и не возвращ ает специф ическое значение.
У тверж дение SU B R O U T IN E - начальное утверж дение подпрограммы. П рименяется
следую щ ая форма:
[prefix] SUBROUTINE name [([d-arg-list])]
где p r e f ix является одним из следую щ их выражений:
Ключевое слово Смысл
RECURSIVE Разрешает выполнить прямую рекурсию. Если функция непосредственно рекурсивна
и результат - массив, должен также быть указан RESULT (см. разд. 7.7)
PURE Говорит, что процедура не имеет никаких побочных эффектов (см. разд. 7.7).
ELEMENTAL Ограниченный формат чистой процедуры, которая действует на 1 элемент массива
одновременно (см. разд. 7.7)
п а т е - имя подпрограм м ы .
- список одного или более форм альны х параметров или дополнительны х
специф икаторов возвращ ения (*).
Глава 7. П рограм м ны е единицы и п роц едуры 147
Правила использования
П одпрограмма вызывается утверж дением CA LL или определенны м назначением . К о ­
гда вызвана подпрограмма, форм альны е параметры (если они присутствую т) становятся
связанными с фактическими параметрами, указанны ми в вызове.
В ы полнение начинается с первой вы полним ой конструкции или утверж дения после
утверждения SU BRO U TIN E.
Управление возвращ ается к м одулю програм мы вызова после вы полнения у тверж д е­
ния END (или RETU RN ).
П одпрограмма не м ож ет содерж ать утверж дение FU N C T IO N , утверж дение B L O C K
DATA, утверж дение PRO G R A M или утверж дение SU B R O U TIN E. У тверж дения EN TR Y
могут быть вклю чены, чтобы обеспечить м ногократны е точки входа к подпрограмм е.
Следую щ ий пример показы вает подпрограмму:
Основная программа Подпрограмма
CA LL H E L L O W O R L D SU BR O U TIN E H E L L O W O R L D
PRIN T *, "Hello W orld"
END EN D SU B R O U TIN E
С ледую щ ий пример использует дополнительны е специф икаторы возвращ ения, чтобы
определить, куда управление переходит после заверш ения подпрограмм ы :
Основная программа П одпрограмм а
CALL СНЕСК(А,В.*Ю,*20,С) SUBROUTINE CHECK(X,Y,*.*.Q)
TYPE *, VALUE LESS THAN ZERO'
GO TO 30 50 IF(Z) 60,70,80
10 TYPE*, VALUE EQUALS ZERO' 60 RETURN
GO TO 30 70 RETURN
20 TYPE*, VALUE MORE THAN ZERO' 80 RETURN
30 CONTINUE END

Список параметров утверж дения SU B R O U TIN E содерж ит 2 ф орм альны х до п о л н и ­


тельных параметра возвращ ения соответствую щ их ф актическим параметрам *10 и *20 в
списке параметров утверж дения CALL.
Значение Z определяет возвращ ение:
■ если Z < 0, происходит норм альное возвращ ение и управление передано первому вы ­
полнимому утверж дению , следую щ ему за C A LL C H E C K в основной програм ме;
■ если Z = = 0, возвращ ение к метке 10 утверж дения в основной програм ме;
■ если Z > 0, возвращ ение к м етке 20 утверж дения в основной программе.
Д ополнительное возвращ ение - устареваю щ ая возм ож ность в Fortran 90 и F ortran 95.

Функция-утверждение
Ф ункция-утверж дение - процедура, определенная единственны м утверж дением в той
же программной единице, в которой ссылаю тся на процедуру. Это утверж дение п ри н и ­
мает следую щ ую форму:
fun ([d-arg [, d-arg] . ]) = expr
где/wtf - имя ф ункции-утверж дения.
d-arg является формальным параметром, который м ож ет появиться только однаж ды в
лю бом списке форм альных параметров и его возм ож ности являю тся локальны м и к ф ун к­
ции утверждения.
148 С. Д. Алгазин, В. В . К ондрат ьев П рограм ирование на Visual FO RTRAN

е х р г - скалярное вы раж ение, определяю щ ее вычисление, которое будет выполнено.


И менованны е константы и переменны е, используем ы е в выражении, должны быть
объявлены предварительно в части спецификации блока области действия или сделаны
доступны м и использованием хоста.
Если выражение содерж ит ссылку функции, функция долж на быть предварительно
определена в том же модуле программы .
С сылка функции-утверж дения приним ает форму:
fun ([д-дгд [, a-arg]...])
где fun - имя ф ункции-утверж дения; a-arg - ф актический параметр.
Правила использования
Когда появляется ссы лка ф ункции-утверж дения в вы ражении, значения фактических
параметров связаны с форм альны м и параметрами на определении функции утверждения.
Вы раж ение в определении тогда выполнено. П олучаю щ ееся значение используется, что­
бы закончить вы числение вы раж ения, содерж ащ ее ссылку функции.
Тип данны х ф ункции-утверж дения м ож ет бы ть явно определен в утверждении объяв­
ления типа. Если тип не указан, он определяется по неявным правилам типа для модуля
программы.
Ф актические параметры долж ны соответствовать в числе, порядке и типе данных их
формальным параметрам.
За исклю чением типа данны х, декларативная информация, связанная с объектом, не
связана с ф орм альны ми параметрами в ф ункции-утверж дении. Например, объявление
объекта массивом или нахож дение в общ ем блоке не затрагивает формальный параметр с
тем же именем.
Имя ф ункции-утверж дения не м ож ет быть таким же именем, как и у лю бого другого
объекта в пределах того же модуля программы.
Лю бая ссылка на ф ункцию -утверж дение долж на появиться в той же программной
единице, где определена эта функция.
Ссылка ф ункции-утверж дения долж на появиться как выраж ение или быть его частью.
С сы лка не м ож ет появиться на левой стороне оператора присваивания.
Ф ункцию -утверж дение нельзя передавать как параметр процедуры.
Следую щ ие выраж ения - примеры ф ункций-утверж дений:
REAL VOLUME, RADIUS
VOLUME(RADIUS) = 4.189*RADIUS**3
CHARACTERS 0 CSF A B
CSF(A.B) = A(6:10)//B(1:5)
Ф ункция-утверж дение и некоторы е ссылки на нее:
AVG(A,B,C) = (A+B+CJ/3.

GRADE = AVG(TEST1,TEST2,XLAB)
IF (AVG(P,D,Q) .LT. AVG(X,Y,Z)) STOP
FINAL = AVG(TEST3,TEST4,LAB2) ! Недопустимая ссылка; неявный тип третьего параметра
! не соответствует неявному типу формального параметра
Проблем неявного ти п а м ож но избеж ать, если все параметры явного типа.
С ледую щ ее определение ф ункции-утверж дения недопустимо, потому что она содер­
ж ит константу, которая не м ож ет использоваться как формальный параметр:
Г ш ва 7. П рограм м ны е единицы и проц едуры 149

REAL COMP, С, D, Е
C0MP(C,D,E,3.) = (С + D - Е)/3.

7.9. Внешние процедуры


Внешние процедуры - функции или подпрограммы, написанные пользователем. Они рас­
положены вне основной программы и не могут быть частью другого модуля программы.
Внеш ние процедуры могут бы ть вызваны основной программой или лю бой п роцеду­
рой выполнимой программы.
В Fortran 95/90 внеш ние процедуры м огут вклю чить внутренние подпрограмм ы (оп ­
ределяю щ ие внутренние процедуры). В нутренняя подпрограмм а начинается с у тверж де­
ния CONTAINS.
Внеш няя процедура м ож ет сослаться на себя (прямо или косвенно).
Интерфейс внеш ней процедуры неявен, если блок интерф ейса не приводится для п ро­
цедуры.

7.10. Внутренние процедуры


Внутренние процедуры - функции или подпрограмм ы , которы е следую т за утверж де­
нием CO N TA IN S в модуле программы . П рограм мная единица, в которой появляется
внутренняя процедура, называется ее хостом.
Внутренние процедуры м огут появиться в основной программе, во внеш ней подп ро­
грамме или в подпрограмме модуля.
Внутренняя процедура приним ает форму:
CONTAINS
internal-subprogram
[internals ubprogram]...
где internal-subprogram - функция или подпрограмм а, которая определяет процедуру.
Внутренняя подпрограмма не долж на содерж ать другие внутренние подпрограмм ы .
Правила использования
Внутренние процедуры - то же самое, что и внеш ние процедуры , за исклю чением
следующ его:
■ только ведущ ая программная единица может использовать внутренню ю процедуру;
■ внутренняя процедура имеет доступ хостом к ведущ им объектам; т. е. объявленны е
имена в ведущем програм мном модуле являю тся используемыми в пределах внутрен ­
ней процедуры;
■ в Fortran 95/90 имя внутренней процедуры нельзя передать как параметр другой п ро­
цедуре. О днако Fortran Intel позволяет внутреннем у имени процедуры бы ть передан­
ным как фактический параметр другой процедуре;
■ вну тренняя процедура не долж ен содерж ать утверж дение ENTRY.
Внутренняя процедура может сослаться на себя (прямо или косвенно). На нее мож но
сослаться в части выполнения ее хоста и в части выполнения лю бой внутренней п роце­
дуры, содерж авш ейся в том же самом хосте (вклю чая себя). И нтерф ейс внутренней про­
цедуры всегда я вен.
Следую щ ий иример показы вает внутренню ю процедуру:
PROGRAM COLOR.GUIDE

CONTAINS
150 С Д Алгазин, В В. К ондрат ьев. Программирование на Visual FO RTRAN

FUNCTION HUE(BLUE) ! Внутренняя процедура

END FUNCTION HUE


END PROGRAM

7.11. Связывание параметров


П араметры процедуры обеспечиваю т способ передачи данны х для различных про­
граммных единиц. Когда на процедуру ссылаю тся в выполним ой программе, программ­
ная единица, вызываю щ ая процедуру, мож ет использовать один или более фактических
параметров, чтобы передать значения формальным параметрам процедуры. Ф ормаль­
ные параметры связаны с их соответствую щ ими фактическими параметрами, когда
управление передается подпрограмме.
Вообщ е, когда управление возвращ ено к модулю програм мы вызова, последнее зна­
чение, заданное ф орм альному параметру, назначено соответствую щ ем у фактическому
параметру.
Ф актический параметр м ож ет бы ть переменной, выраж ением или именем процедуры.
Тип и вид параметра и ранг ф актического параметра долж ны соответствовать таковым из
его связанного ф орм ального параметра.
Ф ормальный параметр является формальным объектом данны х, формальной проце­
дурой или дополнительны м возвращ ением со спецификатором (*). За исключением д о ­
полнительных специф икаторов возвращ ения, ф орм альны е параметры могут быть допол­
нительными.
Если клю чевые слова параметра не использую тся, связы вание параметров - позици­
онно. Первый форм альный параметр становится связанны м с первым фактическим пара­
метром и т. д. Если использую тся клю чевые слова параметра, параметры связаны именем
keyw ord таким образом, что фактические параметры м огут стоять в другом порядке, чем
формальные параметры.
K eyw ord требуется для параметра, только если преды дущ ий дополнительны й пара­
метр опущ ен или если последовательность параметров изменена.
Скалярный форм альны й параметр м ож ет бы ть связан только со скалярным фактиче­
ским параметром.
Если формальный параметр - массив, он не долж ен бы ть больш им по размеру, чем
массив, который является фактическим параметром.
Вы можете использовать массивы с переменными границами, чтобы обработать мас­
сивы различных размеров в отдельной подпрограмме.
Ф актический параметр, являю щ ийся размещ аем ы м параметром или указателем и свя­
занный с ф ормальным параметром, долж ен иметь такие же параметры, которые имеет
формальный параметр.
Ф ормальный параметр, на который ссылаю тся как на подпрограм м у, должен быть
связан с фактическим параметром , который был объявлен в операторах EX TERNA L или
INTRIN SIC в подпрограмм е вызова.
Если скалярный ф орм альны й параметр имеет тип character, его длина не долж на быть
больш е длины его связанного фактического параметра.
Если длина сим вольного ф орм альною параметра указана как * (*) (принятая длина),
он использует длину связанного фактического параметра.
Как только фактический параметр был связан с форм альны м параметром, он не может
косвенно переопределяться через формальный параметр. Н апример, если следую щ ее ут­
верждение указано:
Глава 7. П рограм м ны е единицы и проц едуры 151

CALL SUB_A (В(2:6), В(4:10))


В (4:6) не долж ен бы ть определен, переопределен или становится неопределенным
через лю бой формальный параметр, так как это связано с обоими параметрами. О днако
В (2:3) определимо через первый параметр и В (7:10) определим о через второй параметр.
Если какая-нибудь часть ф актического параметра определена через формальный п а­
раметр, на параметр можно сослаться только через тот формальный параметр в течение
выполнения процедуры. Н апример, если указаны следую щ ие утверждения:
MODULE M 0 D .A
REAL :: А, В, С, D
END MODULE M0D_A

PROGRAM TEST
USE M0D_A
CALL SUB_1 (B)

END PROGRAM TEST


SUBROUTINE SUB_1 (F)
USE MOD_A

WRITE (*,*) F
END SUBROUTINE SUB_1
На переменную В нельзя непосредственно сослаться в течение выполнения SUB I,
потому что она определена через формальный параметр F. О днако на В мож но косвенно
сослаться через F (и непосредственно ссылаться, когда SUB I заканчивает выполнение).

Дополнительные параметры
Ф ормальные параметры м огут бы ть указаны дополнительно, если они объявлены с
атрибутом O PTIO NA L. В этом случае ф актический параметр не долж ен подставляться
для этого формального параметра в ссылке процедуры.
Лю бые позиционные параметры долж ны появляться первыми в фактическом списке
параметров, сопровож даемом лю бы ми key w ord-парам етрам и. Если дополнительны й па­
раметр - последний позиционный параметр, он м ож ет бы ть просто опущ ен при желании.
Однако если дополнительны й параметр долж ен бы ть опущ ен, а это не последний п о­
зиционный параметр, параметры keyw ord долж ны использоваться для лю бы х последую ­
щих параметров в списке.
Д ополнительные параметры долж ны иметь явны е интерфейсы процедуры так, чтобы
могли быть сделаны соответствую щ ие связывания параметров.
Встроенная функция PR ESEN T может использоваться, чтобы определить, связан ли
фактический параметр с дополнительны м ф ормальным параметром в специфической
ссылке.
Следующий пример показы вает дополнительны е параметры:
PROGRAM RESULT
TEST.RESULT = LGFUNC(A, B=D)

CONTAINS
FUNCTION LGFUNC(G, H, B)
OPTIONAL H, В
152 С Д Алгазин, В В К ондрат ьев П р о гр а ч и р о ва н и е на Visual FO RTRAN

END FUNCTION
END
В ссы лке функции А - позиционный параметр, связанны й с необходимым форм аль­
ным параметром G. Второй ф актический параметр D связан с дополнительны м ф орм аль­
ным параметром В его keyw ord имя (В). Никакой ф актический параметр не связан с д о ­
полнительны м параметром Н.

Параметры-массивы
М ассивы - последовательности элементов. Каждый элем ент фактического массива
связан с элем ентом из форм ального массива, который им еет ту же самую позицию в по­
рядке элем ента массива.
Если ф орм альны й параметр - явная форма или массив перенимаю щ ий размер, размер
ф орм ального параметра м ассива не долж ен превы ш ать размер фактического параметра
массива.
Тип и параметры вида явной формы или форм ального параметра перенимаю щ его
разм ера долж ны соответствовать типу и параметрам вида фактического параметра, но их
ранги не долж ны соответствовать.
Если форм альны й параметр - массив, перенимаю щ ий форму, размер формального па­
рам етра м ассива равен разм еру фактического параметра массива. Связанный ф актиче­
ский параметр не долж ен бы ть массивом перенимаю щ его разм ера или скаляром (вклю ­
чая указатель для элем ента м ассива или элем ента массива).
Если ф актический параметр - секция массива с векторным нижним индексом, связан­
ный форм альны й параметр не долж ен быть определен.
О бъявление м ассива использовано, поскольку форм альны й параметр может опреде­
лить ниж ню ю границу массива.
Если форм альны й параметр - размещ аем ы й, фактический параметр долж ен бы ть раз­
м ещ аемы м и тип параметра и ранги долж ны соответствовать. Пример размещ аю щ ейся
функции с размещ аем ы м массивом появляется в "Ф ункциях".
Ф орм альны е парам етры -м ассивы , объявленны е предполагаемой формы, отложенной
формы или массивы указателя, требую т явный интерфейс, видимый в вызываю щ ей про­
грамме.

Параметры-указатели
П араметр - указатель, если он объявлен с атрибутом POIN TER.
К огда вы звана процедура, формальный указатель парам етра получает состояние свя­
зы вания указателя из ф актического параметра. Если фактический параметр в настоящ ее
время связанны й, ф орм альны й параметр становится связанны м с той же самой целью.
С остояние связы вания ф орм ального параметра м ож ет изм ениться в течение выполне­
ния процедуры , и лю бы е такие изменения отраж ены в фактическом параметре.
Если и форм альны е, и фактические параметры - указатели, требуется явный интер­
фейс.
Ф орм альны й параметр, являю щ ийся указателем, м ож ет бы ть связан только с факти­
ческим параметром , который является указателем. О днако фактический параметр, яв­
ляю щ ийся указателем, м ож ет бы ть связан с неуказательны м формальным параметром.
В этом случае ф актический параметр, связанны й с целью и ф ормальным параметром че­
рез связы вание параметра, такж е становится связанны м с той же целью.
Глава 7 П рограм м ны е единицы и п роц едуры 153
Если формальный параметр не имеет атрибута T A R G E T или PO IN TER , лю бы е указа­
тели, связанные с ф актическим параметром, не становятся связанны ми с соответствую ­
щим формальным параметром при вызове процедуры.
Если формальный параметр имеет атрибут TARGET, и он - или скаляр, или массив пере­
нимающей формы, и соответствующий фактический параметр имеет атрибут TARGET, но он
не секция массива с векторным нижним индексом, происходит следующее:
■ лю бой указатель, связанны й с фактическим параметром, становится связанным с со­
ответствую щ им формальным параметром при вызове процедуры;
■ лю бы е указатели, связанны е с формальным параметром , остаю тся связанны ми с ф ак­
тическим параметром, когда выполнение процедуры заканчивается.
Если формальный параметр имеет атрибут TA RG ET, и он - явной формы или массив
предполагаемого размера, и соответствую щ ий фактический параметр имеет атрибут
TA RG ET, но он не секция массива с векторным нижним индексом, связы вание ф актиче­
ских и соответствую щ их формальных параметров, при вы зове процедуры или когда за­
кончено выполнение, зависит от процессора.
Если формальный параметр имеет атрибут T A R G E T и соответствую щ ий фактический
параметр не имеет того же атрибута, или он - секция м ассива с векторным нижним ин­
дексом, лю бой указатель, связанны й с формальным параметром , становится неопреде­
ленным, когда заканчивается выполнение процедуры.

Символьные параметры предполагаемой длины


Символьный параметр предполагаемой длины - ф орм альны й параметр, который п ри ­
нимает атрибут длины его соответствую щ его фактического параметра. Звездочка (*) о п ­
ределяет длину формального сим вольного параметра.
Символьный формальный параметр м ассива м ож ет иметь предполагаемую длину.
Д лина каждого элемента в формальном параметре - длина элем ентов в фактическом па­
раметре. П редполагаемая длина и оператор объявления м ассива вместе определяю т раз­
мер предполагаемой длины сим вольного массива.
Следую щ ий пример показывает символьный параметр предполагаем ой длины:
INTEGER FUNCTION ICMAX(CVAR)'
CHARACTER^*) CVAR
ICMAX = 1
DO l=2,LEN(CVAR)
IF (CVAR(I:I) .GT. CVAR(ICMAX:ICMAX)) ICMAX=I
END DO
RETURN
END
Ф ункция ICM A X находит позицию сим вола с самым вы соким значением кода ASCII.
Она использует длину предполагаемой длины сим вольного параметра, чтобы управлять
итерацией. Встроенная функция LEN определяет длину параметра.
Д лина формального параметра определена каждый раз передачей управления к ф унк­
ции.
Длина фактического параметра м ож ет быть длиной сим вольной переменной, элем ен­
та массива, подстроки или выражения. Каждая из следую щ их ссы лок функции определя­
ет различную длину для форм ального параметра:
CHARACTER VAR*10, CARRAY(3,5)*20
154 С. Д Алгазин, В В К о н д р а т ьев П рограм нрован ие на Visual FORTRAN

И= ICMAX(VAR)
12 = ICMAX(CARRAY(2,2))
13 = ICMAX(VAR(3:8))
14 = ICMAX(CARRAY(1,3)(5:15))
15 = IС МАХ( VAR (3:4)//CAR RAY (3,5))

Символьные и холеритовые константы - параметры


Если ф актический параметр - сим вольная константа (например, 'ABCD'), соответст­
вую щ ий форм альны й параметр долж ен иметь тип character. Если фактический параметр -
холеритовая константа (наприм ер, 4H A B C D ), соответствую щ ий формальный параметр
долж ен иметь числовой тип данных.
С ледую щ ий пример показы вает сим вольны е и холеритовы е константы, используемые
как ф актические параметры :
SUBROUTINE S(CHARSUB, HOLLSUB, А, В)
EXTERNAL CHARSUB, HOLLSUB

CALL CHARSUB(A, •STRING')


CALL HOLLSUB(B, 6HSTRING)
П одпрограм м ы C H A R SU B и H O LLSU B - самостоятельно формальные параметры
подпрограм м ы S. П оэтом у фактическом у параметру 'STRIN G ' в вызове CH A RSU B дол­
жен соответствовать сим вольны й формальный параметр и фактический параметр
6H STR1NG в вы зове H O LL SU B долж ен соответствовать числовому формальному пара­
метру.

Альтернативные параметры возвращения


А льтернативное возвращ ение парам етра (ф ормального) м ож ет появиться в списке па­
р ам етров подпрограм м ы . О но вы зы вает переход к помеченному оператору, а не к утвер­
ж дению нем едленно после утверж дения вы зова подпрограмм ы . Д ополнительное возвра­
щ ение обозначено звездочкой (*). (А льтернативное возвращ ение - устареваю щ ая воз­
м ож ность в Fortran 90 и Fortran 95.)
М ож ет бы ть лю бое число дополнительны х возвращ ений в списке параметров подпро­
грам мы , и они м огут бы ть в лю бой позиции в списке параметров.
Ф актический параметр, связанны й с дополнительны м форм альным параметром воз­
вращ ения, назы вается специф икатором альтернативного возврата и обозначается звез­
дочкой (*) или ам персандом (&) и сопровож дается меткой оператора перехода в том же
блоке области действия, что и утверж дение CALL.
А льтернативны е возвращ ения не могут быть объявлены optional (дополнительно).
В F ortran 90 вы м ож ете такж е использовать утверж дение R ETU RN , чтобы определить
д ополнительны е возвращ ения.
С ледую щ ий прим ер показы вает альтернативны й возврат ф актических и формальных
параметров:
CALL MINN(X, Y, *300, *250, Z)

SUBROUTINE MINN(A, B, *, *, C)

Формальные параметры-процедуры
Если ф актический парам етр - процедура, ее соответствую щ ий ф ормальный пара­
м етр - форм альная процедура.
Глава 7 П рограм м ны е единицы и проц едуры 155
Ф орм альны е процедуры м огут появиться в подпрограмм ах или ф ункциях.
Ф актический параметр долж ен быть собственны м именем внеш него м одуля, встроен­
ного или другой формальной процедуры. Если собственное имя - такж е родовое имя,
только собственное имя связано с формальным параметром . Не все определенны е встро­
енные процедуры м огут появиться как фактические параметры . (Для получения доп о л ­
нительной информации см. табл. 8.1.)
Ф актический параметр и соответствую щ ая форм альная п роцедура долж ны бы ть п од­
программами или оба бы ть функциями.
Если интерфейс формальной процедуры явен, тип и парам етры вида и ран г связанной
фактической процедуры долж ны бы ть теми же, что и у ф орм альной процедуры .
Если интерфейс формальной процедуры неявен и на процедуру ссы лаю тся как на
подпрограмму, ф актический параметр долж ен бы ть подпрограм м ой или ф орм альной
процедурой.
Если интерфейс формальной процедуры неявен и на процедуру ссы лаю тся как на
функцию или интерфейс явного типа, фактический парам етр долж ен бы ть функцией или
формальной процедурой.
Ф орм альны е процедуры м огут быть объявлены дополнительно, но они не долж ны
быть объявлены IN TEN T (с намерением).
Следую щ ий пример - процедура, используем ая как параметр:
REAL FUNCTION LGFUNC(BAR)
INTERFACE
REAL FUNCTION BAR(Y)
REAL, IN TEN T(IN ):: Y
END
END INTERFACE

LGFUNC = BAR(2.0)

END FUNCTION LGFUNC

Ссылки на родовые процедуры


Родовы е процедуры - процедуры с различны м и собственны м и именами, к которым
можно получить доступ под одним родовы м именем. В Fortran 77 родовы е процедуры
были ограничены встроенны ми процедурами. В Fortran 90 вы м ож ете использовать ро до ­
вые блоки интерфейса, чтобы определить родовы е свойства для встроенны х и оп реде­
ленных пользователем процедур.
Если вы обращ аетесь к процедуре при использовании ее родового имени, выбор о п ­
ределенной подпрограмм ы базируется на числе параметров и типе парам етров вида,
а такж е ранге каж дого параметра.
Все процедуры, имею щ ие одно и то же родовое имя, долж ны бы ть подпрограм м ам и
или функциями. Д ве лю бы е процедуры долж ны отличаться так, чтобы вы зов процедуры
был однозначен.
С ледую щ ие секции описы ваю т ссылки на родовы е встроенны е ф ункции и показы ва­
ю т пример использования имен встроенной функции.

Ссылки на родовые встроенные функции


Родовая встроенная функция с именем CO S вы зы вает 6 встроенны х функций, кото­
рые вычисляю т косинусы: COS, DCOS, Q CO S, CC O S, C D C O S и C Q C O S. В зависим ости
156 СД Алгазин, В . В К он драт ьев . П рограм ирование на Visual FO RTRAN

от типа аргум ента соответственно со значением: REA L (4), REA L (8), REAL (16),
CO M PLEX (4), C O M PLE X (8) и CO M PLEX (16).
Если вы вы зы ваете функцию косинуса при использовании родового имени COS, ком­
пилятор вы бирает соответствую щ ую подпрограмму, основанную на параметрах, которые
вы определяете. Н априм ер, если параметр REA L (4), выбран COS; если - REA L (8), вы ­
бран D CO S; и если - CO M PL E X (4), выбран CCOS.
Вы можете такж е явно обратиться к специфической подпрограмме. Н апример, вы
можете вы звать ф ункцию косинуса с двойной точностью , определяя DCOS.
Вы бор процедуры происходит независимо для каждой родовой ссылки. Таким обра­
зом, чтобы получить доступ к различны м встроенны м процедурам, вы можете использо­
вать родовое имя, неоднократно ссылаясь в одном модуле программы.
Вы не м ож ете использовать родовы е имена функции, чтобы выбрать встроенны е про­
цедуры, если вы используете их таким образом:
■ имя ф ункции-утверж дения;
■ ф орм альное имя параметра, общ ее имя блока, переменная или имя массива.
Когда встроенную функцию передаю т как фактический параметр к процедуре, долж ­
но использоваться ее собственное имя, и при ее вызове параметры долж ны быть скаля­
ром. Не все определенны е встроенны е функции могут появиться как фактические пара­
метры. (Для получения дополнительной информации см. табл. 8.1.)
Родовы е имена процедуры являю тся локальны м и по отнош ению к модулю програм­
мы, который обращ ается к ним. Таким образом, они м огут использоваться для других це­
лей в других м одулях програм мы .
О бычно встроенное имя процедуры относится к библиотеке процедур Fortran 90 с тем
же именем.
О днако имя м ож ет обратиться к определенной пользователем процедуре, когда имя
появляется в утверж дении EX TER N A L.
Примечание. Если вы вызываете встроенную процедуру при использовании неправильного
числа параметров или неправильного типа параметра, компилятор предполагает, что вы обра­
щаетесь к внешней процедуре. Например, встроенная процедура SIN требует одного параметра;
если вы определяете 2 параметра, типа SIN (10,4), компилятор предполагает, что SIN является
внешним, а не встроенным.
Кроме тех случаев, когда используем ы е в утверж дении EX TE R N A L встроенны е име­
на процедуры являю тся локальны м и к модулю программы , который обращ ается к ним,
они м огут использоваться в других целях в других м одулях программы.
Тип данны х встроенной процедуры не изменяется, если вы используете утверждение
IM PLICIT и изм еняете неявны е правила типа данных.
В строенны е и определенны е пользователем процедуры не м огут иметь одинакового
имени, если они появляю тся в той же програм мной единице.
П риводим локальны е и глобальны е свойства имени встроенной функции. Пример ис­
пользует встроенную ф ункцию SIN следую щ им образом:
■ имя ф ункции-утверж дения;
■ родовое имя встроенной функции;
■ собственное имя встроенной функции;
■ имя определенной пользователем функции.
Использование и переопределение имени встроенной функции
! Сравнить способы вычисления синуса
PROGRAM SINES
Глава 7. П рограм м ны е единицы и проц едуры 157
DOUBLE PRECISION X, PI
PARAMETER (PI=3.141592653589793238D0)
COMMON V(3)
1 ! Определите SIN как функцию утверждения
SIN(X) = COS(PI/2-X)
DO X = -PI, PI, 2*PI/100
2 •Сошлитесь на SIN функции утверждения
WRITE (6,100) X, V, SIN(X)
END DO
CALL COMPUT(X)
100 FORMAT (5F10.7)
END
SUBROUTINE COMPUT(Y)
DOUBLE PRECISION Y
3 ! SIN встроенной функции - использование как фактического параметра
INTRINSIC SIN
COMMON V(3)
4 ! Определите родовую ссылку на синус с двойной точностью
V(1) = SIN(Y)
5 ! Используйте встроенный SIN как фактический параметр
CALL SUB(REAL(Y),SIN)
END
SUBROUTINE SUB(A.S)
6 ! Объявите SIN как имя функции пользователя
EXTERNAL SIN
7 ! Объявите SIN как DOUBLE PRECISION тип
DOUBLE PRECISION SIN
COMMON V(3)
8 ! Оцените SIN встроенной функции
V(2) = S(A)
9 ! Оцените определенную пользователем функцию SIN
V(3) = SIN(A)
END
10 ! Определите пользовательскую функцию SIN
DOUBLE PRECISION FUNCTION SIN(X)
INTEGER FACTOR
SIN = X - X**3/FACTOR(3) + X**5/FACTOR(5) &
-X**7/FACTOR(7)
END
1. Ф ункция-утверж дение по имени SIN определена в терминах родового им ени ф унк­
ции COS. Поскольку параметр COS удваивает точность, функция косинуса вы полнена с
двойной точностью . Ф ункция-утверж дение SIN - самостоятельно одинарная точность.
2. Вы зывается функция-утверж дение S1N.
3. Имя SIN объявлено встроенны м так, чтобы встроенная функция синуса с о ди н ар­
ной точностью могла бы ть передана как фактический параметр в и. 5.
4. И спользуется родовое имя функции SIN, чтобы обратиться к ф ункции синуса с
двойной точностью .
5. Встроенная функция синуса с одинарной точностью используется как ф актический
параметр.
6. Имя SIN объявлено как определенное пользователем имя функции.
7. Тип SIN объявлен с двойной точностью .
158 С Д Алгазин, В В. Кондрат ьев. Программирование на Visual F O RTRAN

8. Ф ункция синуса с одинарной точностью передана для вы полнения в п. 5.


9. Вы полнена определенная пользователем функция S1N.
10. О пределенная пользователем функция S1N определена как простой ряд Тейлора,
используя определенную пользователем функцию FA C TO R , чтобы вычислить функцию
факториала.

Ссылки на элементные встроенные процедуры


Элементная встроенная процедура имеет скалярны е ф орм альны е параметры, кото­
ры е м огут вызваться с фактическим параметром скаляром или массивом. Если фактиче­
ские параметры заданы массивом, они долж ны им еть ту же форму.
Есть много элементных встроенны х функций, но только одна элементная встроенная
подпрограмм а (MVB1TS).
Если фактические параметры - скаляр, результат - скаляр. Если фактические пара­
метры заданы массивом, эта скалярная процедура прим еняется элем ент к элементу к
ф актическом у параметру, приводя м ассив в вид, который им еет ту же форму, что и фак­
тический параметр.
Значения элем ентов получаю щ егося м ассива такие же, как если бы оцененная скаля­
ром процедура прим енялась отдельно к соответствую щ им элементам каждого параметра.
Н априм ер, если А и В - массивы формы (5,6), М А Х (А, 0.0, В) - выражение массива
формы (5,6), чьи элементы им ею т значение M A X ((i, j), 0.0, В (i, j)), где i = 1 ,2 , ..., 5 и
j = 1 ,2 ,..., 6.
Ссы лка на элем ентную встроенную процедуру - элем ентная ссылка, если один или
более фактических параметров являю тся массивами и все параметры массива имею т ту
же форму.

Ссылки на процедуры не Fortran


Чтобы облегчить ссылки на процедуры не Fortran, Fortran Intel обеспечивает встроен­
ные ф ункции % REF и % VA L, чтобы передать фактические параметры, и % LO C, которая
вы числяет внутренний адрес пункта памяти.

Функции списка параметров %REF и % VAL


Когда вызывается процедура, Fortran по ум олчанию передает адрес фактического па­
рам етра и длину, если этот параметр имеем шп character. Чтобы вы зы вать процедуры не
Fortran, вероятно, нужно передать фаю и1к* кис параметры в форме, отличной от исполь­
зуемой Fortran.
В строенны е функции % REF и % V A L позволяю т изменять форму фактического пара­
метра. Вы долж ны определить эти функции в фактическом списке параметров утвержде­
ния C A LL или ссылке функции. Вы не м ож ете использовать их в лю бом другом контек­
сте. Эти функции определяю т, как передать фактический параметр (например, а) к про­
цедуре не Fortran, следую щ им образом:
% REF (а) передает параметр а ссылкой.
% V A L (а) передает параметр как непосредственное значение n -bit1. Если а - целое
число (или логическое) и короче чем n-bit, оно доопределяется знаком до значения n-bit.
Д ля комплексны х типов данны х % V A L передает два n-bit параметра.
Список недостатков Fortran Intel для передачи параметров и разреш енны х использо­
ваний % V A L и % REF представлен в табл. 7.1.

1На процессорах Intel ЕМ64ТиIntel Itaniumп = 64; на процессорах IA-32 п = 32.


Г лава 7 П рограм м ны е единицы и проц едуры 159
Таблица 7.1. Значение по умолчанию для списка параметров функций
Фактический тип данных Допустимые функции
параметра Умолчание %VAL I %REF
Выражения:
Логическое REF Да1 Да
Целочисленное REF Да1 Да
REAL(4) REF Да Да
REAL(8) REF Да2 Да
REAL(16) REF Нет Да
C0MPLEX(4) REF Да Да
C0MPLEX(8) REF Да Да
C0MPLEX(16) REF Нет Да
Символьное N/A3 Нет Да
Холеритовское REF Нет No
Составное значение4 REF Нет Да
Производное REF Нет Да
Имя массива:
Числовое REF Нет Да
Символьное N/A3 Нет Да
Составное значение4 REF Нет Да
Производное REF Нет Да
Имя процедуры:
Числовое REF Нет Да
Символьное N/A3 Нет Да
1 Если логическое или целочисленное значение занимает меньше, чем 64 бита памяти на процессорах Intel ЕМ64Т и Intel
Itanium, или 32 бита памяти на процессорах IA-32, оно преобразуется к правильному размеру расширением знака. Исполь­
зуйте функцию ZEXT, если дополнение нулями желательно.
2 Только ¡64.
3 Символьный параметр передается адресом и скрытой длиной.
4 В структурах записи Intel Fortran %REF и функции %VAL отменяют параметры настройки, связанные с DEC$ A TTR IB U TE.

Функция %LOC
Встроенная функция % LO C вы числяет внутренний адрес пункта памяти. П рим еняет­
ся следую щ ая форма:
%LOC (arg)
где a r g - имя фактического параметра. Это долж на бы ть переменная, вы раж ение или имя
процедуры. (Это выражение не долж но бы ть именем внутренней процедуры или ф унк­
ции-утверждения.)
Функция % LOC производит целочисленное значение, которое представляет местопо­
ложение данного параметра.
Значение - IN TEG ER (8) на процессорах Intel® Itanium и Intel® ЕМ 64Т; INTEG ER(4)
на процессоре IA-32. Вы м ож ете использовать это целочисленное значение как пункт в
арифметическом выражении. Встроенная функция LOC удовлетворяет той ж е цели, что и
встроенная функция % LOC.
Каждая процедура имеет интерфейс, который состоит из имени и характеристики
процедуры, имени и характеристики каж дого форм ального параметра и родового иден­
тификатора (лю бого), которые позволяю т сослаться на процедуру. Х арактеристики п ро­
цедуры фиксированы, но остаток от интерф ейса м ож ет измениться в других блоках об­
ласти действия. Если все эти свойства известны в рамках программы вызова, интерфейс
160 С Д А ¡гат и, В В К ондрат ьев П р о гр а и и р о ва н и е на Visual FO RTRAN

процедуры явный; иначе - это неявный интерфейс (вы веденны й из его ссылки и объяв­
ления). Таблица показывает, какие процедуры имею т неявны е или явны е интерфейсы:
Вид процедуры Интерфейс
Внешняя процедура Неявный, если блок интерфейса не поставляется для процедуры
Процедура модуль Явный
Внутренняя процедура Явный
Встроенная процедура Явный
Формальная процедура Неявный, если блок интерфейса не поставляется для процедуры
Функция-утверждение Неявный
И нтерф ейс рекурсивной подпрограмм ы или функции явен в пределах подпрограммы,
которая определяет эту процедуру.
Явный интерфейс мож ет появиться на определении процедуры , на блоке интерфейса
или в обоих случаях. (В нутренние процедуры не долж ны появиться в блоке интерфейса.)
С ледую щ ие разделы описы ваю т, когда требую тся явны е интерфейсы, как определить
явны й интерфейс и как определять родовы е имена, операторы и назначение.

Определение, когда процедуры требуют явных интерфейсов


П роцедура долж на иметь явны й интерфейс в следую щ их случаях:
■ Если процедура имеет лю бое следую щ ее свойство:
■ ф орм альны й параметр, который имеет атрибут A LLO C A TA BLE, 0 P T 1 0 N A L ,
PO IN TER , T A R G ET, или V O LA TILE;
■ ф орм альны й параметр, которы й является м ассивом перенимаю щ ей формы;
■ результат', который является массивом, указателем или размещ аем ы м (только
функции);
■ результат, длина которого не предполагаем ая, не константа (только символьные
функции).
■ Если ссы лка на процедуру появляется следую щ им образом:
■ с параметром keyw ord;
■ как ссы лка ее родовым именем;
■ как определенное назначение (только подпрограмм ы );
■ в вы раж ении как определенны й оператор (только функции);
■ в контексте, который требует, чтобы процедура бы ла чистой;
■ если процедура является элементной.

Определение явных интерфейсов


Блоки интерфейса определяю т явны е интерфейсы для внеш них или формальных про­
цедур. О ни м огут такж е быть используем ы, чтобы определить родовое имя для процедур,
новый оператор для функций и новой формы назначения для подпрограмм.
Блок интерфейса принимает следую щ ую форму:
INTERFACE [generic-spec]
[interface-body]...
[MODULE PROCEDURE name-list].
END INTERFACE [generic-spec]
где generic-spec является одним из следую щ их выражений:
■ родовое имя;
- O PE R A T O R (ор).
Гпава 7. П рограм м ны е единицы и проц едуры 161
О пределяет родовой оператор (ор). Это м ож ет бы ть унарны й, бинарны й или встроен­
ный оператор.
ASSIGNMENT (=)
О пределяет родовое назначение.
interface-body (тело интерфейса) является одной или более функциям и или подпро­
граммами. Ф ункция долж на закончиться EN D F U N C T IO N , а подпрограм м а долж на за­
кончиться END SUBRO U TIN E.
П одпрограмма не долж на содерж ать ф ункцию -утверж дение или D A TA , EN TRY , или
утверждение FORM A T; имя входа м ож ет использоваться как имя процедуры.
П одпрограмма может содерж ать утверж дение USE.
name-list (список имен) - имя одной или более процедур модуля, которы е являю тся
доступными в хосте. У тверж дение M O D U L E PR O C E D U R E разреш ается, только если оно
определяет блок интерфейса generic-spec (родовые спецификации) и им еет хост, который
является модулем (или получает доступ к м одулю связы ванием использованием ).
Х арактеристики процедур модуля не даю тся в блоках интерф ейса, но принимаю тся от
определения подпрограммы модуля.

Правила использования
Блоки интерфейса м огут появиться в части специф икации модуля програм мы , кото­
рый вызывает внеш ню ю или ф орм альную процедуру.
Generic-spec (родовые спецификации) могут появиться только в утверж дении EN D
INTERFA CE (возможность Fortran 95), если одна из них появляется в утверж дении
INTERFA CE; они долж ны быть идентичными.
Х арактеристики, указанны е для внеш ней или ф орм альной процедуры , долж ны быть
совместимыми с теми, которые определены в определении процедуры .
Блок интерфейса не долж ен появиться в програм мной единице - блок данных.
Блок интерфейса вклю чает его собственны й блок области действия и не наследует
ничего от его хоста до связывания хостом.
П роцедура не долж на иметь больш е, чем одного явного интерф ейса в данном блоке
области действия.
Блок интерфейса, содерж ащ ий generic-spec (родовы е спецификации) определяет ро до ­
вой интерфейс для следую щ их процедур:
■ П роцедуры в пределах блока интерфейса.
■ Л ю бое родовое имя, определенны й оператор или сим вол равенства, которы й появля­
ется в родовом идентификаторе для процедуры в блоке интерфейса. П равило: лю бы е
две процедуры с тем же самым родовы м идентиф икатором долж ны отличаться.
■ П роцедуры модуля, перечисленны е в утверж дении M O D U L E PRO CED U R E.
■ П роцедуры модуля долж ны быть доступны м и утверж дениям и USE. Чтобы сделать
блок интерфейса доступны м для многих програм мны х единиц (через утверж дение
USE), поместите блок интерфейса в модуль.
Следую щ ие правила применяю тся к блокам интерф ейса, содерж ащ им чистые проце­
дуры:
■ Спецификацию интерфейса чистой процедуры долж ен объявить IN TEN T всех ф ор­
мальных параметров, кроме указателя и параметров процедуры .
162 С Д . Алгазин, В В. К ондрат ьев. П рограм ирование на Visual FORTRAN

■ П роцедура, которая объявлена как чистая по ее определению , мож ет такж е быть объ­
явлена чистой в интерф ейсном блоке. О днако если она не объявлена чистой по ее оп­
ределению , она не долж на бы ть объявлена чистой в блоке интерфейса.
С ледую щ ий прим ер показы вает простой блок интерфейса процедуры без родовой
специф икации:
SUBROUTINE SUB_B (В, FB)
REAL В

In t e r f a c e
FUNCTION FB (GN)
REAL FB, GN
END FUNCTION
END INTERFACE

Определение родовых имен для процедур


Блок интерф ейса м ож ет использоваться для определения родового имени, чтобы со­
слаться на все п роцедуры в пределах блока интерфейса.
Н ачальная строка для такого блока интерфейса приним ает следую щ ую форму:
INTERFACE generic-name
где generic-nam e - родовое имя. Это м ож ет быть то ж е имя, что и лю бое из имен проце­
дуры в блоке интерф ейса, или то ж е имя, что и лю бое доступное родовое имя (включая
родовое встроенное имя).
Э тот вид блока интерф ейса м ож ет использоваться, чтобы расш ирить или переопреде­
лить родовую встроенную процедуру.
П роцедуры , которы м даю т родовое имя, долж ны бы ть того же вида подпрограммы:
все долж ны бы ть ф ункциям и или все долж ны бы ть подпрограммами.
Л ю бая ссы лка процедуры , вовлекаю щ ая родовое имя процедуры, долж на быть разре­
ш имой к одной определенной процедуре; эта ссы лка долж на бы ть однозначной.
С ледую щ ий прим ер - блок интерф ейса процедуры, определяю щ его родовое имя:
INTERFACE GROUP.SUBS
SUBROUTINE INTEGER_SUB (A, В)
INTEGER, INTENT(INOUT) :: A, В
END SUBROUTINE INTEGER_SUB
SUBROUTINE REAL_SUB (A, B)
REAL, INTENT(INOUT) :: A, В
END SUBROUTINE REAL_SUB
SUBROUTINE COMPLEX_SUB (A, B)
COMPLEX, INTENT(INOUT) :: A, В
END SUBROUTINE COMPLEX_SUB
END INTERFACE
На эти 3 подпрограм м ы мож но сослаться их индивидуальны м и собственны ми имена­
ми или именем группы O R O U P S U B S .
С ледую щ ий прим ер показы вает ссылку на IN TEG ER SUB:
INTEGER V 1.V 2
CALL GROUP_SUBS (V1.V2)
Глава 7. П рограм м ны е единицы и п роц едуры 163
Определение родовых операторов
Блок интерфейса м ож ет использоваться, чтобы определить родовой оператор. Е ди н ­
ственные процедуры, которы е позволяю т войти в блок интерф ейса, - ф ункции, на кото­
ры е можно сослаться как на определенны е операции.
Н ачальная строка для такого блока интерфейса приним ает следую щ ую форму:
INTERFACE OPERATOR (op)
где o p является одним из следую щ их выражений:
■ определенный унарны й оператор (1 параметр);
■ определенны й бинарный оператор (2 параметра);
■ расш иренны й встроенны й оператор (число параметров долж но бы ть совм естим ы м со
встроенны м использованием этого оператора).
Ф ункции в пределах блока интерфейса долж ны им еть 1 или 2 обязательны х парам етра
с IN TEN T(IN ) (намерением), и результат функции не долж ен иметь тип character с п ред­
полагаемой длиной. О пределенная операция обработана как ссы лка на функцию .
Следую щ ие выражения показы ваю т форму и прим ер определенной унарной операции
и определенной бинарной операции:
Операция Формат Пример
Определяемая унарная .определяемый оператор, операнд1 .MINUS. С
Определяемая бинарная операнд2 .определяемый оператор, операнд3 В .MINUS. С
10перанд соответствует формальному аргументу функции.
2 Левый операнд соответствует первому формальному аргументу функции.
3 Правый операнд соответствует второму параметру.

Д ля встроенны х символов оператора родовы е свойства вклю чаю т встроенны е о п ера­


ции. О бе формы каж дого оператора отнош ения им ею т одну и ту ж е интерпретацию , та­
ким образом, расш ирение одного форм ата (такого как >=) определяет оба ф орм ата (>= и
.GE.).
Следую щ ий пример - блок интерфейса процедуры , определяю щ его новы й оператор:
INTERFACE OPERATOR(.BAR.)
FUNCTION BAR(A_1)
INTEGER, IN TEN T(IN ):: A J
IN TEG ER :: BAR
END FUNCTION BAR
END INTERFACE
С ледую щ ий пример показы вает способ сослаться на ф ункцию .BAR. при и спользова­
нии нового оператора:
INTEGER В
I = 4 + (.BAR. В)
Следую щ ее - пример блока интерфейса процедуры с определенны м оператором , р ас­
ш иряю щ им сущ ествую щ ий оператор:
INTERFACE OPERATOR^)
FUNCTION LGFUNC (A, В)
LOGICAL, IN TEN T(IN ):: A(:)f B(SIZE(A))
LOGICAL:: LGFUNC(SIZE(A))
END FUNCTION LGFUNC
END INTERFACE
164 С. Д Алгазин, В В. К ондрат ьев. П рограм ирование на Visual FORTRAN

С ледую щ ий прим ер показы вает 2 эквивалентных способа сослаться на функцию


LGFUNC:
LOGICAL, DIM ENSK)N(1:10):: С, D, Е
N = 10
E = LGFUNC(C(1:N), D(1:N))
E = C(1:N) + D(1:N)

Определение родового назначения


Блок интерф ейса м ож ет использоваться для определения родового назначения. Един­
ственны е процедуры , которы е позволяли войти в блок интерфейса, - подпрограммы, на
которые м ож но сослаться как на определенны е назначения.
Н ачальная строка для такого блока интерфейса принимает следую щ ую форму:
INTERFACE ASSIGNMENT (=)
П одпрограм м ы в пределах блока интерфейса должны иметь 2 параметра, первое с
IN TEN T(O U T) или IN O U T и второе с INTEN T(IN ).
О пределенное назначение обрабаты вается как ссылка на подпрограмму. Левая сторо­
на назначения соответствует первому формальному параметру подпрограммы, правая
сторона назначения соответствует второму параметру. Клю чевое слово A SSIG N M EN T
расш иряет или переопределяет операцию назначения, если оба выражения слева и справа
от знака равенства им ею т тот же производны й тип.
О пределенное элем ентное назначение обозначено, определяя ELEM EN TA L в утвер­
ждении SU B R O U TIN E.
Л ю бая ссы лка процедуры , вовлекаю щ ая родовое назначение, долж на быть разреш и­
мой к одной определенной процедуре; вы раж ение долж но бы ть однозначным.
С ледую щ ий прим ер - блок интерфейса процедуры, определяю щ его назначение:
INTERFACE ASSIGNMENT (=)
SUBROUTINE BIT_TO_NUMERIC (NUM, BIT)
INTEGER, INTENT(OUT) *: NUM
LOGICAL, IN TE N T(IN ):: BIT(:)
END SUBROUTINE BIT_TO_NUMERIC
SUBROUTINE CHAR_TO_STRING (STR, CHAR)
USE STRING_MODULE ! Содержит определение типа STRING
TYPE(STRING), IN TEN T(O U T):: S T R ! Строка переменной длины
CHARACTER^), IN TE N T(IN ):: CHAR
END SUBROUTINE CHAR_TO_STRING
END INTERFACE
С ледую щ ий прим ер показы вает 2 эквивалентны х способа сослаться на подпрограмму:
BIT_TO_NUMERIC:
CALL BIT_TO_NUMERIC(X, (NUM(I:J)))
X = NUM(I:J)
Следую щ ий прим ер показы вает 2 эквивалентны х способа сослаться на подпрограмму:
CHAR_TO_STRING:
CALL С НAR_TO_STR IN G (С Н, '432С')
СН = '432С'
Глава 7 П рограм м ны е единицы и проц едуры 165

7.12. Утверждение CONTAINS


Утверж дение CO N TA IN S отделяет тело основной програм мы , м одуля или внеш ней
подпрограммы от лю бой внутренней части или процедур модуля. Это невы полним ое у т­
верждение. У тверж дение CO N TA IN S приним ает форму:
CONTAINS
Любое число внутренних процедур может следовать за утверждением CONTAINS, но ут­
верждение CONTAINS не может появиться во внутренних процедурах непосредственно.

7.13. Утверждение ENTRY


У тверж дение ENTRY обеспечивает одну или более точек входа в пределах подп ро­
граммы. Это невыполнимое утверж дение, и оно долж но предш ествовать лю бом у у твер­
ждению CO N TA IN S в пределах подпрограммы.
Утверж дение ENTRY приним ает форму:
ENTRY name [([d-arg [, d-arg]...]) [RESULT (r-name)]]
где пате - имя точки входа. Если указан RESU LT, имя входа не долж но появиться ни в
каком описании в блоке области действия подпрограмм ы функции; d-arg - ф орм альны й
параметр; мож ет быть дополнительны м индикатором возвращ ения (*), если утверж дение
ENTRY - в пределах подпрограмм ы ; г-пат е - имя результата функции; не долж но бы ть
тем же, что и имя точки входа или имя лю бого другого результата функции или функции.
Этот параметр м ож ет быть указан только для подпрограмм ы функции.
Правила использования
Утверждения EN TRY м огут появиться только во внеш них процедурах или проц еду­
рах модуля.
Утверж дение EN TRY не долж но появиться в CA SE, DO, IF, FO R A LL, конструкции
W HERE или неблоковом цикле DO.
Когда утверж дение EN TRY появляется в подпрограмм е, на него ссы лаю тся у твер­
ждением CALL. Когда утверж дение EN TR Y появляется в подпрограм м е ф ункции, на не­
го ссылается ссылка функции.
Имя входа в пределах подпрограммы функции м ож ет появиться в утверж дении объ ­
явления типа.
В пределах подпрограммы, содерж ащ ей утверж дение EN TRY , имя входа не долж но
появиться как формальный параметр в FU N CTIO N или утверж дении S U B R O U TIN E ,
и оно не долж но появиться в утверж дениях E X TE R N A L или IN TR IN SIC . Н априм ер, ни
одна из следую щ их конструкций недопустимы:
(1) SUBROUTINE SUB(E)
ENTRY Е

(2) SUBROUTINE SUB


EXTERNAL E
ENTRY E

У тверж дение ENTRY мож ет сослаться на себя, если подпрограмм а ф ункции или п од­
программы бы ла определена как REC U R SIV E.
Ф ормальные параметры могут использоваться в утверж дениях EN TR Y , даж е если они
отличаю тся в числе, типе, параметрах типа и имени от форм альны х параметров, исполь­
166 С Д А 1га т и , В. В К ондрат ьев П рогралш рование на Visual FORTRAN

зуемы х в FU N CTIO N , SU B RO U TIN E и других утверж дениях ENTRY в той же подпро­


грамме. О днако каждая ссылка к функции, подпрограмм е или вход должны использовать
ф актический список параметров, который согласован в числе и типе с формальным спи­
ском парам етров в соответствую щ ем утверж дении FU N CTIO N , SUBRO U TIN E или
EN TR Y .
Ф орм альны е параметры м огут быть упом януты только в выполнимых утверждениях,
которы е следую т за первым утверж дением SU B RO U TIN E, FUN CTIO N или утверждени­
ем E N TR Y , в котором указан формальный параметр. Если формальный параметр в на­
стоящ ее время не связывается с ф актическим параметром , формальный параметр не оп­
ределен и на него нельзя сослаться. П араметры не сохраняю т свое связывание от одной
ссылки подпрограмм ы до другой.

Утверждения ENTRY в подпрограмме функции


Если утверж дение ENTRY содерж ится в подпрограмм е функции, оно определяет до­
полнительную функцию .
Имя функции - имя, указанное в утверж дении EN TR Y , и его переменная - результат
имени входа или имя, определенное в RE SU LT (лю бое).
Если переменная результата входа имеет те же характеристики, что и результат ут­
верж дения переменная FU N CTIO N , их переменны е результата идентифицирую т ту же
переменную , даж е если они им ею т другие имена.
И наче переменны е результата - связанная область памяти, и все они долж ны быть не­
указательны м и скалярами встроенного типа в одной из следую щ их групп:
Группа У. Тип - целое число по ум олчанию , действительная, двойная точность по
ум олчанию , действительны й, комплексны й по ум олчанию , комплексный двойной точно­
сти, или логический по умолчанию .
Группа 2 . Типа REA L (16) и C O M PL E X (16).
Группа 3. По умолчанию character (с идентичными длинами).
Все им ена входа в пределах подпрограмм ы функции связаны с именем функции под­
програм мы . Поэтому определение лю бого имени входа или имени подпрограммы функ­
ции определяет все связанны е имена с тем же самым типом данных. Все связанные имена
с различны м и типами данных становятся неопределенны м и. Если RESU LT указан в ут­
верж дении EN TRY и REC U R SIV E указан в утверж дении FU N CTIO N , интерфейс функ­
ции, определенной утверж дением EN TRY , явен в пределах подпрограммы функции.
Следую щ ий пример показы вает подпрограмм ы функции, которая вычисляет гипербо­
лические функции:
SINH, COSH и TANH:
REAL FUNCTION TANH(X)
TSINH(Y) = EXP(Y) - EXP(-Y)
TCOSH(Y) = EXP(Y) + EXP(-Y)
TANH = TSINH(X)/TCOSH(X)
RETURN
ENTRY SINH(X)
SINH = TSINH(X)/2.0
RETURN
ENTRY COSH(X)
COSH = TCOSH(X)/2.0
RETURN
END
Глава 7. П рограм м ны е единицы и проц едуры 167
Утверждения ENTRY в подпрограммах
Если утверждение ENTRY содерж ится в подпрограмм е, оно определяет дополнитель­
ную подпрограмму. Имя подпрограммы - имя, указанное в утверж дении ENTRY.
Если RECURSIV E указан в утверж дении SU B R O U TIN E, интерфейс подпрограммы
определенный утверждением EN TRY , явен в пределах подпрограммы.
Следующ ий пример показы вает основную програм му, вы зы ваю щ ую подпрограмму,
содержащую утверждение ENTRY:
PROGRAM TEST

CALL SUBA (А, В, С)! А, В и С - фактические параметры


... ! переданные к точке входа SUBA
END
SUBROUTINE SUB(X, Y, Z)

ENTRY SUBA (Q, R, S) ! Q, R и S - формальные параметры


... ! Выполнение начинается с этого утверждения
END SUBROUTINE
Следующ ий пример показы вает утверж дение EN TR Y , определяю щ ее дополнитель­
ные возвращения:
CALL SUBC(M, N, *100, *200, Р)
SUBROUTINE SUB(K, *, *)

ENTRY SUBC(J, К, *, *, X)

RETURN 1
RETURN 2
END
О братите внимание, что утверж дение CA LL на точку входа SUBC вклю чает фактиче­
ские дополнительные параметры возвращ ения.
Утверждение RETURN 1 передает управление утверж дению с меткой 100 и утверж де­
ние RETURN2 передает управление утверж дению с меткой 200 в програм ме вызова.
Глава 8. Встроенные процедуры

Встроенные процедуры - это функции и подпрограмм ы , которые вклю чены в библио­


теку Fortran 95/90. Есть четыре класса этих встроенны х процедур, определяемых сле­
дую щ им образом:
Элементные процедуры. Эти процедуры им ею т скалярные формальные параметры,
которы е м огут вызваться со скалярны ми ф актическим и параметрами или массивами.
Есть много элементных встроенны х функций и одна элементная встроенная подпро­
грам ма (MVB1TS).
Если все параметры являю тся скалярам и, результат - скаляр. Если фактический пара­
м етр является массивом, встроенная процедура применяется к каждому элементу факти­
ческого параметра, создавая массив, который имеет ту же самую форму что и фактиче­
ский параметр. Если есть больш е, чем 1 параметр массива, все они долж ны иметь ту же
самую форму.
Функции запроса. Эти функции имею т результаты , которые зависят от свойств их
основного параметра, а не значения парам етра (значение параметра мож ет быть неопре­
деленны м ).
Трансформационные функции (функции преобразования). Один или более ф ор­
мальны х или ф актических параметров (или оба - формальный и фактический) этой
функции - массивы, результат - массив. Встроенная функция не прим енена поэлементно
к массиву фактического параметра; вместо этого она изм еняет (преобразовы вает) массив
парам етра в другой массив.
Неэлементные процедуры. Эти процедуры долж ны вызваться только со скалярными
параметрами; они возвращ аю т скалярны е результаты . Все подпрограммы (кроме
M V BITS) являю тся неэлементны м и.
В строенны е процедуры вызы ваю тся тем же самым способом , что и другие процеду­
ры, и следую т тем же самым правилам связы вания аргументов.
В строенны е процедуры имею т родовы е (или общ ие) имена, а многие из встроенных
ф ункций имею т собственны е (специф ические) имена. (Н екоторы е встроенны е функции
являю тся и родовы м и, и собственны м и.)
В ообщ е родовы е функции приним аю т параметры более чем одного типа данных; тип
данны х результата - тот же, что и у параметров в ф ункциональной ссылке. Для элем ент­
ных функций с более чем одним параметром все параметры долж ны иметь одинаковый
тип (за исклю чением функции M ERG E).
Когда встроенную функцию передаю т как фактический параметр в процедуру, долж ­
но использоваться ее собственное имя, и когда она вызывается, ее параметры должны
бы ть скалярам и. Н екоторые собственные встроенны е функции не разреш ается передавать
как ф актические параметры при лю бы х обстоятельствах.
Функции, кот орые нельзя использовать как фактические параметры
А1МАХ0; EOF; INT8; LGE;
AIMIN0; FLOAT; INT PTR KIND; LGT;
AJMAX0; FLOAT!; IQINT; LLE;
AJMIN0; FLOATJ; IZEXT; LLT;
АКМАХО; FLOATK; JFIX; LOC;
AKMIN0; HFIX; JIDINT; MALLOC;
АМАХО; IADDR; JIFIX; MAXO;
АМАХ1; IARGC; JINT; MAX1;

ммотпт 168
Глава 8. В ст роенны е проц едуры 169
AMIN0; ICHAR; JIQINT; MINO;
AMIN1;, IDINT; JMAXO; M INI;
BADDRESS; IFIX; JMAX1; MULT HIGH;
CHAR; IIDINT; JMINO; NARGS;
CMPLX; IIFIX; JMIN1; QCMPLX;
COMMAND LINE ARGUMENT; IINT; JZEXT; QEXT;
DBLE; IIQINT; KIDINT; QEXTD;
DBLEQ; IJINT; KIFIX; QMAX1;
DCMPLX; IMAXO; KINT; QMIN1;
DFLOTI; IMAX1; KIQINT; QREAL;
DFLOTJ; IMINO; KIQNNT; RAN;
DFLOTK; IMIN1; KMAXO; REAL;
DMAX1; INT; KMAX1; SECNDS;
DMIN1; INT1; KMINO; SNGL;
DPROD; INT2; KMIN1; SNGLQ;
DREAL; INT4; KZEXT; ZEXT.

8.1. Ключевые параметры во встроенных процедурах


Для всех встроенны х процедур показанные параметры являю тся именами, которые вы
должны использовать как клю чевые слова, применяя ф орм ат с клю чевым словом для
фактических параметров. Н апример, ссы лка на функцию C M PL X (X, Y, KIN D ) может
быть записана таким образом:
■ Используя позиционные параметры: CM PLX (F, G, L).
■ Используя клю чевые параметры: CM PLX (K1ND=L, Y=G, X ^ F )1.
П риводим некоторы е из обы чно используемых необязательны х параметров:
■ BACK указывает, что просмотр строки долж ен бы ть в обратном порядке (справа на­
лево).
■ DIM указывает выбранное измерение параметра массива.
■ KIN D указывает тип родового параметра ф ункционального результата.
M ASK указывает, что к элементам параметра мож ет бы ть прим енена маска массива,
чтобы исключить элементы, которые не долж ны быть вовлечены в операцию .
Например, синтаксис для встроенной подпрограмм ы D A T E A N D T I M E дем онстри­
рует 4 необязательных позиционных параметра: DATE, T IM E, Z O N E и VA LU ES.
Следующ ий пример показывает некоторые допустим ы е способы указы вать эти пара­
метры:
! Пример ключевого слова
CALL DATE_AND_TIME (ZONE=Z)
! Следующие 2 позиционных примера эквивалентны:
CALL DATE_AND_TIME (DATE, TIME, ZONE)
CALL DATE_AND_TIME (,, ZONE)

8.2. Краткий обзор встроенных процедур


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

1Обратите внимание, что ключевые параметры могутбыть записаны влюбом порядке. Некото­
рые ключевые параметры необязательны (обозначены квадратными скобками).
170 С. Д Ачгазин, В В Кондратьев. Програмирование на Visual FORTRAN

В строенны е процедуры полностью описаны (в алфавитном порядке) в разд. 8.5.

Категории встроенных функций


Р одовы е встроенны е ф ункции м огут бы ть разделены на категории (см. табл. 8.1).

Таблица 8.1. Категории встроенных функций


Категория Подкатегория Описание
Числовая Вычисление Выполняет преобразования типа или простые числовые операции: ABS, AIMAG,
AINT, АМАХО, AMINO, ANINT, CEILING, CMPLX, CONJG, DBLE, DCMPLX, DFLOAT,
DIM, DNUM, DPROD, DREAL, FLOAT, FLOOR, IFIX, ILEN, IMAG, INT, INUM, JNUM,
MAX, MAX1, MIN, M INI, MOD, MODULO, NINT, QCMPLX, QEXT, QFLOAT, QNUM,
QREAL, RAN, REAL, RNUM, SIGN, SNGL, ZEXT
Обработка1 Возвращает значения, относящиеся к компонентам модельных значений, свя­
занных с фактическим значением параметра- EXPONENT, FRACTION, NEAREST,
RRSPACING, SCALE, SET.EXPONENT, SPACING
Запрос1 Возвращает скалярные значения из моделей, связанные с типом и родовыми па­
раметрами их параметров2: DIGITS, EPSILON, HUGE, MAXEXPONENT,
MINEXPONENT, PRECISION, RADIX, RANGE, SIZEOF, TINY
Трансформа­ Выполняет векторное и матричное умножение: DOT_PRODUCT, MATMUL
ция
Система Возвращает информацию о процессе или процессоре: MCLOCK, SECNDS
Родовой Возвращает родовые параметры типа: SELECTED INT KIND,
тип SELECTED_REAL_KIND, KIND
Математи­ Выполняет математические операции: ACOS, ACOSD, ACOSH, ASIN, ASIND,
ческая ASINH, ATAN, ATAN2, ATAN2D, ATAND, ATANH, COS, COSD, COSH, COTAN, COTAND,
EXP, LOG, LOG 10, SIN, SIND, SINH, SQRT, TAN, TAND , TANH
Битовая Обработка Выполняет однобитовую обработку, операции логические и сдвига и позволяет
ссылаться разрядным подполям: AND, BTEST, DSHIFTL, DSHIFTR, IAND,
IBCHNG, IBCLR, IBITS, IBSET, IEOR, IOR, ISHA, ISHC, ISHFT, ISHFTC, ISHL,
IXOR, LSHIFT (or LSHFT), NOT, OR, RSHIFT (or RSHFT), SHIFTL, SHIFTR, XOR
Запрос Позволяет определять параметр s (бит) в битовой (поразрядной) модели:
BIT_SIZE (см. разд. 8.4)
Представле­ Возвращает информацию относительно поразрядного представления целых чи­
ние сел: LEADZ, POPCNT, POPPAR, TRAILZ
Символь­ Сравнение Лексически сравнивает параметры строки символов и возвращает значение по
ная умолчанию - логическое: LGE, LGT, LLE, LLT
Преобразова­ Преобразует символьные параметры к целому числу, ASCII или символьным зна­
ние чениям3: ACHAR, CHAR, IACHAR, ICHAR
Обработка Выполняет операции на строках символов, возвращает длины параметров и оты­
строк скивает некоторые параметры: ADJUSTL, ADJUSTR, INDEX, LEN TRIM,
REPEAT, SCAN, TRIM, VERIFY
Запрос Возвращает длину параметра или информацию о параметрах командной строки:
COMMAND_ARGUMENT_COUNT, IARG, IARGC, LEN, NARGS, NUMARG
Массив Конструиро­ Конструирует новые массивы из элементов существующего массива: MERGE,
вание PACK, SPREAD, UNPACK
Запрос Позволяет определять, распределен ли параметр массива и возвращает размер
или форму массива и индексы нижних и верхних границ по каждому измерению:
ALLOCATED, LBOUND, SHAPE, SIZE, UBOUND
Местоположе­ Возвращает геометрические местоположения максимального и минимального
ние значений массива’ MAXLOC, MINLOC
Обработка Позволяет сдвигать массив, перемещать массив или изменять форму массива:
CSHIFT, EOSHIFT, RESHAPE, TRANSPOSE
Глава 8 В ст роенны е процедуры 171
Категория Подкатегория Описание
Сокращение Выполняет операции на массивах. Функции "сокращают" элементы всего масси­
ва, чтобы произвести скалярный результат, или они могут быть применены к
определенному измерению массива, чтобы произвести массив результата с
рангом, меньшим на единицу: ALL, ANY, COUNT, MAXVAL, MINVAL, PRODUCT
Смешанные Делают:
Проверяет связывание указателя (ASSOCIATED)
Возвращает адрес (BADDRESS)
Возвращает размер уровня кеша памяти (CACHESIZE)
Проверяет на конец файла (EOF)
Возвращают информацию об ошибке (ERF и ERFC)
Возвращает класс параметра с плавающей точкой (FP_CLASS)
Возвращает указатель на фактический список параметров для подпрограммы
(IARGPTR)
Возвращает INTEGER KIND, которое содержит адрес (INT_PTR_KIND)
Проверяет на значение Not-a-Number (ISNAN)
Возвращает внутренний адрес элемента памяти (LOC)
Возвращает логическое значение параметра (LOGICAL)
Распределяет память (MALLOC)
Возвращает старшие 64 бита 128-битового результата без знака (MULT_HIGH)
Возвращает разъединенный указатель (NULL)
Проверяет присутствие параметра (PRESENT)
Преобразовывает разрядную модель (TRANSFER)
1 Все функции числовой манипуляции и многие из функций числовых запроса определены модельными установками для
целых чисел (прил. D-1) и вещественных чисел (прил. D-2).
2 Значение параметра не должно быть определено.
3 Набор символов процессора Intel Fortran - ASCII, таким образом, ACHAR = CHAR и IACHAR = ICHAR.

Табл. 8.2 обобщает родовые встроенные функции и указывает, являются ли они элемент­
ными запроса или трансф орм ационны м и функциями. Н еобязательны е парам етры показа­
ны внутри квадратных скобок.

Таблица 8.2. Краткий обзор родовых встроенных функций


Родовая функция Класс1 Возвращаемое значение
ABS (а) E Абсолютное значение параметра
ACHAR (i) E Символ в указанной позиции набора символов ASCII
ACOS (х) E Арккосинус параметра (в радианах)
ACOSD (х) E Арккосинус параметра (в градусах)
ACOSH (х) E Гиперболический арккосинус параметра
ADJUSTL (string) E Указанная строка с удаленными начальными пробелами и помещенными
в конце строки
ADJUSTR (string) E Указанная строка с удаленными конечными пробелами и помещенными
в начале строки
AIMAG (z) E Мнимая часть комплексного параметра
AINT (a [, kind]) E Действительное значение, усеченное до целого числа
ALL (mask [, dim]) T .TRUE., если все элементы маскируемого массива истинны
ALLOCATED (array) I Состояние распределения параметра массив
AMAXO (a1,a2 [, a3,...]) E Максимальное значение в списке целых чисел (результат - действительное
значение)
AMINO (a1,a2 [, a 3 ,..]) E Минимальное значение в списке целых чисел (результат - действительное
значение)
AND (i,j) E См. IAND
172 с. д. Алгазин, В В К ондрат ьев. П рограм ирование на Visual FORTRAN

Родовая функция Класс1 Возвращаемое значение


ANINT (а [, kind]) E Действительное значение, округленное до целого числа
ANY (mask [, dim]) T .TRUE., если какие-нибудь элементы маскируемого массива истинны
ASIN (x) E Арксинус параметра (в радианах)
ASIND (x) E Арксинус параметра (в градусах)
ASINH (x) E Гиперболический арксинус параметра
ASSOCIATED (pointer I .TRUE., если параметр указатель связан или указатель, связан с опреде­
[. target]) ленным адресатом
ATAN (x) E Арктангенс параметра (в радианах)
ATAN2 (y. x) E Арктангенс параметров (в радианах)
ATA N 2 D ( y, x ) E Арктангенс параметров (в градусах)
ATAND (x) E Арктангенс параметра (в градусах)
ATANH (x) E Гиперболический арктангенс параметра
BADDRESS (x) I Адрес параметра
BIT.SIZE (i) I Число битов в поразрядной модели
BTEST (i, pos) E .TRUE., если указанная i-ая позиция параметра является единицей
CEILING (a [, kind]) E Наименьшее целое число, большее или равное значению параметра
CHAR (i [, kind]) E Символ в указанной позиции из набора символов процессора
COMMAND. I Число параметров команды
ARGUMENT COUNT ()
CONJG (z) E Сопряженное комплексного числа
COS (x) E Косинус параметра, который задан в радианах
COSD (x) E Косинус параметра, который задан в градусах
COSH (x) E Гиперболический косинус параметра
COTAN (x) E Котангенс параметра, который задан в радианах
COTAND (x) E Котангенс параметра, который задан в градусах
COUNT (mask [, dim] [, T Число элементов .TRUE, в параметре массив
kind])
CSHIFT (array, shift T Массив, состоящий из циклически сдвинутых элементов параметра массива
[.dim])
DBLE (a) E Соответствующее значение параметра с удвоенной точностью
DFLOAT (a) E Соответствующее значение с удвоенной точностью для целочисленного
параметра
DIGITS (x) I Число значащих цифр в модели для параметра
DIM (x, y) E Положительная разница между двумя параметрами
DOT.PRODUCT T Скалярное произведение двух одноранговых массивов (также называется
(vector_a, vector_b) функцией векторного умножения)
DSHIFTL (¡left, ¡right, E Старшие (крайние левые) 64 бита сдвинутого влево 128-битового целого
¡shift) числа
DSHIFTR (¡left, ¡right, E Старшие (крайние левые) 64 бита сдвинутого вправо 128-битового целого
¡shift) числа
EOSHIFT (array, shift [, T Массив, состоящий из элементов параметра массива, конечные элементы
boundary] [, dim]) которого выдвинуты и потеряны
EOF (a) I .TRUE, или .FALSE, в зависимости от того, находится ли файл после записи
конца файла
EPSILON (x) I Число, которое является почти незначащим по сравнению с единицей
ERF (x) E Интеграл вероятности ошибок параметра
ERFC (x) E Дополнительный интеграл вероятности ошибок параметра
EXP (x) E Экспонента ех для параметра х
EXPONENT (x) E Значение экспонентной части действительного параметра
FLOAT (x) E Соответствующее действительное значение целочисленного параметра
FLOOR (a [, kind]) E Наибольшее целое число, меньшее или равное значению параметра
Г лава 8. В ст роенны е процедуры 173
Родовая функция Класс1 Возвращаемое значение
FP CLASS (х) E Класс IEEE параметра с плавающей точкой
FRACTION (х) E Дробная часть действительного параметра
HUGE (х) I Наибольшее число в модели для параметра
IACHAR (с) E Позиция указанного символа в наборе символов ASCII
IADDR (х) E См BADDRESS
IAND (I, ¡) E Логическое AND двух параметров
IBCHNG (I, pos) E Обратное значение указанного бита
IBCLR (I, pos) E Очищенная позиция, указанная параметром i (установлена в нуль)
IBITS (i, pos, len) E Указанная подстрока битов параметра i
IBSET (I, pos) E Указанный бит параметра i устанавливается в единицу
ICHAR (c [, kind]) E Позиция указанного символа в наборе символов процессора
IEOR (i,j) E Логическое исключительное OR соответствующих битовых параметров
IFIX (x) E Соответствующее целочисленное значение действительного параметра ок­
ругленное, как если бы это было неявное преобразование при назначении
ILEN (i) I Длина (в битах) в двоичном дополнительном представлении целого числа
IMAG (z) E См AIMAG
INDEX (string, substring [, E Позиция указанной подстроки в символьном выражении
back] [, kind])
INT (a [, kind]) E Соответствующее целочисленное (округленное) значение параметра
lO R (i.i) E Логическое включающее OR соответствующих битовых параметров
ISHA (i, shift) E Параметр i сдвинутый влево или вправо на указанное число битов
ISHC (i, shift) E Параметр i циклически сдвинутый влево или вправо на указанное число би­
тов
ISHFT (i, shift) E Логическое выдвижение битов параметра i в конце
ISHFTC (i, shift [, size]) E Логический циклический сдвиг битов в параметре i
ISHL (i, shift) E Параметр i логически сдвинутый влево или вправо на указанное число би­
тов
ISNAN (x) E Проверка на значения Not-a-Number (NaN) (не число)
IXOR (i, j) E См. IEOR
KIND (x) I Тип родового параметра аргумента
LBOUND (array [, dim] [, I Нижние границы массива (или одного из его измерений)
kind])
LEADZ (i) E Число начальных нулевых битов в целом числе
LEN (string [, kind]) I Длина (число символов) параметра строка символов
LEN.TRIM E Длина указанной строки без конечных пробелов
(string [, kind])
LGE (string_a, string_b) E Логическое значение, определяемое сравнением параметров > =
LGT (string_a, string_b) E Логическое значение, определяемое сравнением параметров >
LLE (string_a, string_b) E Логическое значение, определяемое сравнением параметров < =
LLT (string_a, string_b) E Логическое значение, определяемое сравнением параметров <
LOC (a) I Внутренний адрес параметра
LOG (x) E Натуральный логарифм параметра
LOG 10 (x) E Десятичный логарифм (основание 10) параметра
LOGICAL (I [, kind]) E Логическое значение параметра, преобразованное в логический тип из типа
KIND
LSHIFT E Может также быть указано как LSHFT; см. ISHFT
(i, positive_shift)2
MATMUL (matrix_a, T Результат матричное умножение (также называется функцией умножения
matrix_b) матриц)
MAX (a1,a2 [, a3,...]) E Максимальное значение из множества параметров
174 С Д A ic u s u h , В В К ондрат ьев П рограм ирование на Visual FORTRAN

Родовая функция Класс1 Возвращаемое значение


МАХ1 (а1,а2 [, аЗ,...]) E Максимальное значение из множества действительных параметров (воз­
вращается как целое число)
MAXEXPONENT (х) I Максимальная экспонента в модели для параметра
MAXLOC (array [, dim] [, T Одноранговый массив, элементами которого являются местоположения
mask] [, kind]) максимальных элементов в параметре массив
MAXVAL (array [, dim] [, T Максимальное значение элементов в массиве параметра
mask])
MERGE (tsource, E Массив, который является комбинацией двух соответствующих массивов
fsource, mask) (маскируемых)
M IN (a1,a 2 [, a3,..J) E Минимальное значение в наборе параметров
M INI (a1,a2 [, a3,..J) E Минимальное значение в наборе действительных параметров (возвраща­
ется как целое число)
MINEXPONENT (x) I Минимальная экспонента в модели для параметра
MINLOC (array [, dim] T Одноранговый массив, элементами которого являются местоположения
[, mask] [, kind]) минимальных элементов в параметре массив
MINVAL (array [, dim] T Минимальное значение элементов в массиве параметра
f, mask])
MOD (a, p) E Остаток от деления параметров (имеет знак первого параметра)
MODULO (a, p) E Модуль от деления параметров (имеет знак второго параметра),
NEAREST (x, s) E Самое близкое, отличное от параметра, машинно-представимое число
в данном направлении
NINT (a [, kind]) E Действительное значение, округленное к самому близкому целому числу
NOT (i) E Логическое дополнение параметра
NULL ([mold]) T Разъединенный указатель
OR (i, i) E См. IOR
PACK (array, mask [, T Упакованный массив ранга единица (маскируемый)
vector])
POPCNT (i) E Число первых битов в целочисленном параметре
POPPAR (i) E Четность целочисленного параметра
PRECISION (x) I Десятичная точность (действительного или комплексного) параметра
PRESENT (a) I .TRUE., если фактический параметр задан для необязательного формально­
го параметра
PRODUCT (array [, dim] [, T Произведение элементов параметра массива
mask])
Q EXT(a) E Соответствующее REAL (16) значение точности параметра
QFLOAT (a) E Соответствующее REAL (16) значение точности целочисленного параметра
RADIX (x) I Основание модели для параметра
RANGE (x) I Десятичный диапазон экспоненты модели для параметра
REAL (a [, kind]) E Соответствующее действительное значение параметра
REPEAT (string, ncopies) T Конкатенация нуля или большего количества копий указанной строки
RESHAPE (source, T Массив, который имеет другую форму, чем массив параметра, но те же са­
shape [, pad] [, order]) мые элементы
RRSPACING (x) E Обратная величина относительного числа, близкого к параметру
RSHIFT (i, nega- E Может также быть указан как RSHFT; см. ISHFT
tive_shift)3
SCALE (x, I) E Значение экспонентной части (модели для параметра), измененной указан­
ным значением
SCAN (string, SET [, E Позиция указанного символа (или набора символов) внутри строки
back] [, kind])
SELECTED INT KIND T Целочисленный родовой параметр аргумента
(D
Глава 8 Вст роенны е процедуры 175
Родовая функция Класс1 Возвращаемое значение
SELECTED REAL T Действительный родовой параметр аргумента; один из необязательных
KIND ( М И ) аргументов должен быть указан
SET.EXPONENT (х. i) E Значение экспонентной части (модели для параметра), установленной
в указанном значении
SHAPE (SOURCE I Форма (ранг и степени) массива или скаляра
[, kind])
SHIFTL (¡value, ¡shift) E Параметр "ivalue", сдвинутый влево указанным числом битов
SHIFTR (¡value, ¡shift) E Параметр "ivalue", сдвинутый вправо указанным числом битов
SIGN (a, b) E Значение со знаком, взятым из его второго параметра
SIN (x) E Синус параметра, заданного в радианах
SIND (x) E Синус параметра, заданного в градусах
SINH (x) E Гиперболический синус параметра
SIZE (array [, dim] I Размер (общее количество элементов) параметра массива (или одного
[, kind]) из его измерений)
SIZEOF(x) I Число байтов памяти, используемых параметром
SNGL (x) E Соответствующее действительное значение параметра
SPACING (x) E Значение относительного интервала модельных чисел близких к параметру
SPREAD (source, dim, T Скопированный массив, который имеет добавленное измерение
ncopies)
SQRT(x) E Квадратный корень параметра
SUM (array [, dim] T Сумма элементов параметра массива
[, mask])
TAN (x) E Тангенс параметра, заданного в радианах
TAND (x) E Тангенс параметра, заданного в градусах
TANH (x) E Гиперболический тангенс параметра
TINY (x) I Наименьшее положительное число в модели параметра
TRAILZ (i) E Число конечных нулевых битов в целом числе
TRANSFER (source, T Битовая комбинация SOURCE преобразованная в тип и родовые парамет­
mold [, size]) ры MOLD
TRANSPOSE (matrix) T Матричное транспонирование для двухрангового массива
TRIM (string) T Параметр с удаленными конечными пробелами
UBOUND (array [, dim] I Верхние границы массива (или одного из его измерений)
[, kind])
UNPACK (vector, mask, T Массив распакованный (под маской) из однорангового массива
field)
VERIFY (string, set E Позиция в строке первого символа, который не находится в данном наборе
[, back] [, kind]) символов
XOR (i,j) E См IEOR
ZEXT (x [, kind]) E Расширенное нулями значение параметра
1 Ключ класса: Е - элементный: I - запрос, Т - трансформационный.
2 Или LSHFT.
зИли RSHFT.

Табл. 8.3 перечисляет собственные функции, которые не имеют никакой родовой функ­
ции, связанной с ними, и указывав!', являются ли они элементными, неэлементными или
функциями запроса. Необязательные параметры показаны внутри квадратных скобок.
176 С Д. Алгазин, В В К ондрат ьев П рограм ирование на Visual FORTRAN

Таблица 8.3. Собственные функции без родового связывания


Собственная функция Класс1 Возвращаемое значение
CACHESIZE (п)2 I Размер памяти уровня кеша
CMPLX (х [, у] [, kind]) E Соответствующее комплексное значение параметра
DCMPLX (х, у) E Соответствующее двойное комплексное значение параметра
DNUM (i) E Значение с двойной точностью, соответствующее символьной строке
DPROD (х, у) E Произведение более высокой точности двух действительных параметров
DREAL (а) E Соответствующее значение с двойной точностью вещественной части ком­
плексного параметра двойной точности
IARG ( ) I См ^ С
IARGC ( ) I Индекс последнего параметра командной строки
IARGPTR ( ) I Счетчик фактических параметров, переданных текущей подпрограмме
INUM (i) E 1МНЗЕР(2), соответствующее значению символьной строки
JNUM (i) E 1М"Е6ЕР(4), соответствующее значению символьной строки
MALLOC (i) E Начальный адрес для блока распределенной памяти
M C LO C K ( ) I Сумма (в микросекундах) пользовательского времени текущего процесса
и пользователя и системного времени всех его дочерних процессов
MULT HIGH (i, j)2 E Старшие (крайние левые) 64 бита 128-битового результата без знака.
NARGS() I Общее количество параметров командной строки, включая команду
NUMARG() I См ^ С
QCMPLX (x, y) E Соответствующее COMPLEX(16) значение параметра
QNUM (i) E REAL(16), соответствующее значению символьной строки
QREAL (a) E РЕАЦ16), соответствующее значению вещественной части параметра
COMPLEX(16)
RAN (i) N Следующее число из последовательности псевдослучайных чисел (одно­
родно распределенных в диапазоне от 0 до 1)
RNUM (i) E REAL(4), соответствующее значению символьной строки
SECNDS (x) E Системное время дня (или прошедшее время) как значение с плавающей
точкой в секундах
1 Ключ класса. Е - элементный, I - запрос; Т - трансформационный
2 Только ¡64.

8.3. Встроенные подпрограммы


Табл. 8.4 перечисляет встроенны е подпрограммы. Н еобязательны е параметры показа­
ны внутри квадратны х скобок. Все эти подпрограммы являю тся неэлементными, за ис­
клю чением М УВ1Т8.

Таблица 8.4. Встроенные подпрограммы


Подпрограмма Возвращаемое значение или результат
CPU TIME (time) Процессорное время в секундах
DATE (but) Представление АЭСII текущей даты (в формате dd-mmm-yy)
DATE_AND_TIME ([date] [, time] [, zone] Информация даты и времени от таймера
[, values])
ERRSNS ([¡o_err] [, sys_err] [, stat] [, unit] Информация о последнем обнаруженном ошибочном условии
[, cond])
EXIT ([status]) Отображение состояния выхода (необязательно возвращаемое);
завершение программы, закрытие всех файлов и возвращение
управления операционной системе
Глава Я. В ст роенны е проц едуры 177
Подпрограмма Возвращаемое значение или результат
FREE (а) Освобождение памяти, которая в настоящее время распределена
GETARG (n, buffer [.status]) Указанный параметр командной строки (где сама команда - пара­
метр 0)
GET_COMMAND ([command, length, Вся команда, которая использовалась, чтобы вызвать программу
status])
GETCO M M AND ARGUMENT (n [, value, Параметр командной строки команды, которая вызвала программу
length, status])
GET_ENVIRONMENT_VARIABLE (name Значение переменной среды
[, value, length, status, trim name])
IDATE (i,j, k) 3 целочисленных значения, представляющие текущий месяц, день
и год
MM.PREFETCH (address [, hint] [, fault] Данные из указанного адреса одной строки памяти кеша
[, exclusive])
MOVE_ALLOC (from, to) Перемещение распределения от одного распределяемого объекта
к другому
MVBITS (from, frompos, len, to, topos)1 Копирование последовательности битов (битовое поле) от одного
местоположения к другому
RANDOM_NUMBER (harvest) Псевдослучайное число, взятое из последовательности псевдослу­
чайных чисел, однородно распределенных внутри диапазона от
0.0 до 1.0
RANDOM_SEED ([ size] [, put] [, get]) Инициализация или исправление начального значения генератора
псевдослучайных чисел
RANDU (i1,i2, x) Псевдослучайное число как значение с одинарной точностью
(внутри диапазона от 0.0 до 1.0)
SYSTEM_CLOCK ([count] [, count_rate] [, Данные от часов реального времени процессора
count_max])
TIME (buf) Представление АЭСП текущего времени (в формате Ь ^ т п о з )
' Элементная подпрограмма.

8.4. Поразрядные функции


Ц елочисленные типы данны х представлены внутренне в двоичном дополнительном
представлении. П озиции двоичного разряда в двоичном представлении пронум ерованы
справа (наименьш ий значащ ий бит) налево (наибольший значимый бит); самая правая по­
зиция двоичного разряда пронум ерована как 0 (нуль).
Встроенные функции 1AND, 10R , IEO R и N O T работаю т на всех битах своего п ара­
метра (или параметров). Бит 0 является результатом прим енения указанной логической
операции к биту 0 параметра. Бит I является результатом прим енения указанной логиче­
ской операции к биту 1 параметра и т. д. для всех битов результата.
Ф ункции 1SHFT и 1SHFTC сдвигаю т двоичны е образцы.
Ф ункции 1BSET, IBCLR, BTEST и IB1TS и подпрограм м а MVB1TS работаю т на би то­
вых полях.
Битовое поле - это непрерывная группа битов внутри двоичного образца. Битовые
поля указываю тся начальной позицией двоичного разряда и длиной. Битовое поле до л ж ­
но полностью содерж аться в его исходном операнде. Н априм ер, целое число 47 пред­
ставлено следующ им образом:
Двоичный образец: 0...0101111
Позиция бита: п...6543210
где п - число битовых позиций в числовом м одуле памяти.
178 С Д Алгазин, В В К ондрат ьев. П рограм ирование на Visual FO RTRAN

Вы м ож ете обратиться к битовом у полю, содерж авш ем уся в битах 3 -6 , указывая ис­
ходную позицию 3 и длину 4.
О трицательны е целые числа представляю тся в двоичном дополнительном представ­
лении. Н априм ер, целое число -4 7 представлено следую щ им образом:
Д воичны й образец: 1...1010001
Битовая позиция: п...6543210
где п - число битовы х позиций в числовом м одуле памяти.
Значение битовой позиции п определяется следую щ им образом: 1 - для отрицатель­
ного числа; 0 - для неотрицательного числа.
Все старш ие биты в образце от последнего сущ ественного бита значения до бита п
являю тся теми же сам ы м и, что и бит п.
IBITS и MVB1TS работаю т в битовы х нолях общ его вида. Н ачальная позиция битово­
го поля и его длина являю тся параметрами для этих встроенны х подпрограмм. 1BSET,
1BCLR и BTEST работаю т на 1-битовы х полях. Они не требую т параметра длины.
Для 1BSET, 1BCLR и B T E ST диапазон битовых позиций определяется таким образом:
0 -6 3 для IN T E G E R S ) и LO G IC A L (8)
0-31 для 1NTEGER(4) и L O G lC A L (4)
0 -1 5 для 1NTEGER(2) и L O G lC A L (2)
0 -7 для BYTE, IN T E G E R (l) и L O G lC A L (l)
Д ля 1B1TS, битовая позиция м ож ет бы ть лю бым числом. Д иапазон длины - от 0 до 63
на процессорах Intel ЕМ 64Т и Intel Itanium и от 0 до 31 на процессорах 1А-32.
С ледую щ ий прим ер показы вает использование 1BSET, 1BCLR и BTEST:
1=4
J = IBSET (1,5)
PRINT *, 'J = ',J
К = IBCLR (J.2)
PRINT*, 'К = ',К
PRINT *, ’Bit 2 of К is ’,BTEST(K,2)
END
Результаты: J = 36, К = 32 и B T E ST(K ,2) равно F.
Для вы бора оптим ального выполнения и требуемы х объемов и конфигурации памяти,
Intel Fortran обеспечивает целочисленны е типы данны х, представленны е в таблице.
Тип данных Необходимая память, байт
INTEGER0) 1
INTEGER® 2
INTEGERS) 4
INTEGER® 8
Каж дая функция побитовой обработки имеет родовой формат, который работает на
всех этих целочисленны х типах, и собственны й форм ат для каж дого типа.
К огда вы указы ваете встроенны е функции, которые ссылаются к битовым позициям
или сдвигаю т двоичны е образцы внутри модуля памяти, будьте вним ательны , чтобы не
создать значения, которое находится вне диапазона целых чисел, представимых типом
данны х. Если вы сдвигаете количеством , больш им или равным размеру объекта, вы по­
лучите результат - 0.
Рассм отрите следую щ ий пример:
1ЫТЕ6ЕР(2) и
Гпава 8. В ст роенны е процедуры 179
J = 17
I = ISHFT(I.J)
П еременные 1 и J им ею т тип 1NTEGER(2). П оэтому родовая функция 1SHFT о тоб ра­
жается на собственную функцию IISH FT, которая возвращ ает результат IN T E G E R (2). Р е­
зультаты IN TEG ER(2) долж ны находиться в диапазоне от -3 2 7 6 8 до 32767, но зн аче­
ние 1, сдвинутое влево на 17 позиций, приводит к двоичном у образцу 1 соп ровож даем о­
му 17-ю нулями, который представляет целое число 131072. В этом случае результат в 1
равен 0.
П редыдущ ий пример был бы допустим ы м , если бы 1 был 1NTEGER(4), потому что
1SHFT затем отобразился бы на собственную функцию J1SHFT, которая возвращ ает зн а­
чение 1NTEGER(4).
Если 1SHFT вызовется с первым параметром - константой, то результат по ум олча­
нию будет размера целого числа или наим еньш его целочисленного размера, который
может содерж ать первый параметр, каким бы больш им он ни являлся.

8.5. Описания встроенных процедур


Этот раздел содерж ит подробную информацию о всех родовы х и собственны х встро­
енных процедур. Эти процедуры описаны в алфавитном порядке родовы х имен (если оно
имеется).
Н еобязательные параметры идентифицированы квадратны м и скобкам и в синтаксисе
и меткой "(opt)" в описательном тексте.

ABS
Описание: вы числяет абсолю тное значение.
Синтаксис: result = ABS (а)
Класс: элементная функция; родовая.
Парам етр: а долж ен им еть тип "ц ел очи слен н о е", "д ей стви тел ьн о е" или "к о м ­
плексное".
Результаты : если а имеет целое или действительное значение, значение результата
равно | а |; если а имеет комплексное значение (X, Y), результат - действительное зн аче­
ние SQRT (X ** 2 + Y ** 2).
Собственное имя Тип параметра Тип результата
BABS INTEGERO) INTEGER(I)
IIABS1 INTEGERS) INTEGER®
IABS2 INTEGERS) INTEGERS)
KIABS INTEGERS) INTEGERS)
ABS REAL(4) REAL(4)
DABS REAL(8) REAL(8)
QABS REAL(16) REAL(16)
CABS3 C0MPLEX(4) REAL(4)
CDABS4 C0MPLEX(8) REAL(8)
CQABS C0MPLEX(16) REAL(16)
1 Или HABS.
2 Или JIABS. Для совместимости со старыми версиями Fortran IABS может быть указана как родовая функция.
3 Параметры настройки опций компилятора, указывающих действительный размер могут затронуть CABS.
4 Эта функция может быть указанна как ZABS.

Примеры
ABS (-7 .4 ) имеет значение 7.4.
180 С. Д Алгазин, В В К о н д р а т ьев . П рограм ирование на Visual FO RTRAN

A BS ((6.0, 8.0)) им еет значение 10.0.

ACHAR
Описание: возвращ ает сим вол из указанной позиции набора сим волов ASCII, даже
если сим вольны й набор процессора по ум олчанию отличен от ASCII. Это - инверсия
функции 1ACHAR. В Intel F ortran A C H A R эквивалентен функции CHAR.
С ин та ксис: result = A C H A R (/)
Класс: элем ентная функция; родовая.
Параметр: / долж ен иметь тип "целочисленное".
Р езультаты . Тин результата - сим вольны й длины 1; он имеет родовое значение па­
рам етра K IN D ('А').
Если / им еет значение внутри диапазона от 0 до 127, результат - символ в позиции /
набора сим волов A SCII. A C H A R (1ACHAR (С)) имеет значение С для лю бого символа С,
который мож но представить в процессоре.
Примеры
A C H A R (71) им еет значение 'G'.
A C H A R (63) им еет значение

ACOS
Описание: вы числяет arccos jc.
С ин та ксис: result = A C O S (jc )
Класс: элем ентная функция; родовая.
Параметры: х долж ен им еть тип " действительное "; | л* | долж ен бы ть меньш е или
равным 1.
Р езультаты . Тип результата - тот же, что и у х , и выражен в радианах. Значение на­
ходится в диапазоне от 0 до я.
Собственное имя Тип параметра Тип результата
AC0S REAL(4) REAL(4)
DAC0S REAL(8) REAL(8)
QAC0S (или QARC0S) REAL(16) REAL(16)
Пример
A CO S (0.68032123) им еет значение .8225955.

ACOSD
Описание: вы числяет arccos jc.
С ин та ксис: result = A C O SD (jc )
Класс: элем ентная функция; родовая.
Параметры: jc долж ен иметь тип "действительное"; | х | долж ен бы ть меньш е или рав­
ным 1.
Р езультаты . Тип результата - тот же, что и у х , и выражен в градусах. Значение на­
ходится в диапазоне от -9 0 ° до 90°.
Собственное имя Тип параметра Тип результата
ACOSD REAL(4) REAL(4)
DACOSD REAL(8) REAL(8)
QACOSD REAL(16) REAL(16)
П ример
A C O SD (0.886579) им еет значение 27.55354.
Гпава 8. В ст роенны е п роц едуры 181
ACOSH
Описание: вы числяет гиперболический арккосинус х.
Синтаксис: result = A CO SH (jc )
Класс: Элементная функция; родовая.
Параметр: л*должен иметь тип "действительное" и должен быть больше или равным 1.
Результаты . Тип результата тот же, что и у х .
Собственное имя Тип параметра Тип результата
AC0SH REAL(4) REAL(4)
DAC0SH REAL(8) REAL(8)
QAC0SH REAL(16) REAL(16)
Пример
ACOSH (180.0) имеет значение 5.8861.

A D JU S T L
Описание: корректирует строку сим волов слева, удаляя начальны е пробелы и встав­
ляя конечные пробелы.
Синтаксис: result = A D JU STL (string)
Класс: элементная функция; родовая.
Параметр: string долж ен иметь тип "символьное".
Результаты . Тип результата - сим вольны й с той же самой длиной и родовы м п ара­
метром, что и у string.
Значение результата - та же самая ст рока, за исклю чением того, что лю бы е началь­
ные пробелы удалены и вставлены как конечны е пробелы.
Пример
A D JU STL ('ДАДД SU M M ER TIM E') имеет значение 'SUM M ERTIM EAAAA

A D JU S T R
Описание: корректирует строку сим волов справа, удаляя конечны е пробелы и встав­
ляя начальные пробелы.
Синтаксис: result = A D JU ST R (string)
Класс: Элементная функция; родовая.
Параметр: string долж ен иметь тип "символьное".
Результаты . Тип результата - сим вольны й с той же самой длиной и родовы м п ара­
метром, что и у string.
Значение результата - та же самая ст рока, за исклю чением того, что лю бы е конечны е
пробелы удалены и вставлены как начальны е пробелы.
Пример
A D JU STR ('SUMMERTIMEAAAA ') им еет значение 'АЛЛА SU M M ER TIM E'.

A IM A G
Описание: возвращ ает мнимую часть комплексного числа. Эта функция м ож ет так
же быть указана, как 1MAG.
Синтаксис: result = A IM AG (z)
Класс: элементная функция; родовая.
Параметр: z долж ен иметь комплексны й тип.
Результаты . Тип результата действителен с тем же самым родовы м параметром , что
и у z. Если z имеет значение (jc, у ), результат им еет значение у.
182 С Д Алгазин, В В К о н д р а т ьев П рограм ированне на Visual FO RTRAN

Собственное имя Тип параметра Тип результата


AIMAG1 C0MPLEX(4) REAL(4)
DIMAG COMPLEX® REAL(8)
QIMAG C0MPLEX(16) REAL(16)
1 Установка опций компилятора, указывающих размер действительного числа, может затронуть AIMAG.

Пример
A1MAG ((4.0, 5.0)) имеет значение 5.0.

A IN T
Описание: обрезает значение до целого числа.
Син та ксис: result = A IN T (а [, kind]).
Класс: элем ентная функция; родовая.
Параметры: а долж ен иметь тип "действительное"; hind долж ен быть инициализиро­
ванным скалярным целочисленны м выраж ением.
Р езультаты : имеет тип "действительное". Если hind присутствует, родовой параметр
результата указывается kind; иначе родовой параметр - это родовой параметр а.
Р езультат определяется как наибольш ее целое число, величина которого не превыш а­
ет величину а и чей знак - тот же самы й, что и у а. Если \ а \ - меньш е, чем 1, A1NT (а)
имеет значение нуль.
Собственное имя Тип параметра Тип результата
AINT REAL(4) REAL(4)
DINT REAL(8) REAL(8)
QINT REAL(16) REAL(16)
Примеры
A1NT (3.678) имеет значение 3.0.
A1NT (-1 .3 7 5 ) имеет значение -1 .0 .

A LL
Описание: определяет, все ли значения истинны во всем массиве или в указанном
измерении массива.
С ин та ксис: result = A L L (mask [, dim]).
К ласс: трансф орм ационная функция; родовая.
Параметры: mask долж ен бы ть логическим массивом; dim (opt) должен быть скаляр­
ным целым числом со значением в диапазоне от 1 до п, где п - ранг' mask.
Р езультаты : массив или скаляр логического типа.
Р езультат - скаляр, если dim опущ ен или mask им еет ранг единица. Скалярный ре­
зультат истинен, только если все элем енты mask истинны, или mask имеет размер нуль.
Р езультат им еет значения ложь, если какой-нибудь элем ент mask - ложь.
Р езультат - массив, который им еет тот же самы й тип и родовы е параметры, что и
mask, и ранг меньше, чем mask. Его форма (d h d2, ..., d DIM_|, d D1MH, ..., dn), где (d h d2, ...,
d n) является формой mask.
Каждый элем ент в массиве результата истинен, если только все элементы в одном из­
мерении м ассива, определенном mask (si, s2, s D im - i , s D iivh ь —» sn), истинны.

Примеры
A LL ((/.TRU E., .FA LSE., .TR U E./)) имеет значения лож ь, потому что некоторые эле­
менты M A SK неистинны.
Г лава 8 В ст роенны е проц едуры 183
ALL ((/.TRU E., .TRUE., .TRU E./)) имеет значения истина, потом у что все элементы
M A SK истинны.
I 57 05 7
Пусть А является массивом , а В массивом
368 269
ALL (A .EQ. В, D IM = l) проверяет, равны ли все элем енты в каждом столбце А эле­
ментам в соответствую щ ем столбце В. Результат имеет значение (ложь, истина, ложь),
потому что только второй столбец имеет элем енты , которы е являю тся все равными.
A LL (A .EQ. В, DJM =2) проверяет, равны ли все элем енты в каж дой строке А элем ен­
там в соответствую щ ей строке В. Результат имеет значение (ложь, ложь), потому что ка­
ждая строка имеет некоторы е элементы, которые неравны.

A LLO CATED
Описание: указывает, распределен ли в настоящ ее время распределяемы й массив.
Синтаксис: result = A L LO C A TED {array)
Класс: функция запроса; родовая.
Параметр: array долж ен быть распределяемы м массивом.
Р езультаты : скаляр логического типа по умолчанию .
Результат имеет значение истина, если array в настоящ ее время распределен, и ложь,
если array в настоящ ее время не распределен, или не определено, если его состояние
распределения неопределенно.
Примеры
REAL, ALLOCATABLE, DIMENSION :: Е
PRINT *, ALLOCATED (Е) ! Возвращает значение ложь
ALLOCATE (Е (12,15, 20))
PRINT *, ALLOCATED (Е) ! Возвращает значение истина

A N IN T
Описание: вычисляет самое близкое целое число.
Синтаксис: result = A N IN T (а [, kind]).
Класс: элементная функция; родовая.
Параметры: а долж ен иметь тип "действительное"; kind (opt) долж ен быть инициали­
зированным скалярным целочисленным выраж ением.
Результаты . Тип результата - "действительное". Если kind присутствует, родовой па­
раметр указывается kind; иначе родовой параметр - это родовой параметр а. Если а
больше чем нуль, A N IN T (а) имеет значение A1NT {а + 0.5); если меньш е или равно ну­
лю, AN1NT (а) имеет значение A1NT {а -0 .5 ).
Собственное имя Тип параметра Тип результата
ANINT REAL(4) REAL(4)
DNINT REAL(8) REAL(8)
QNINT REAL(16) REAL(16)
Примеры
AN1NT (3.456) имеет значение 3.0.
AN1NT (-2.798) имеет значение -3 .0 .

ANY
Описание: определяет, истинно ли какое-нибудь значение во всем массиве или в ука­
занном измерении массива.
Синтаксис: result = ANY (mask [, dim]).
184 С // Алгазин, В. В К ондрат ьев. П рограм ирование на Visual FO RTRAN

Класс: трансф орм ационная функция; родовая.


Параметры : mask долж ен бы ть логическим массивом; dim (opt) долж ен быть скаляр­
ным целочисленны м вы раж ением со значением в диапазоне 1 к п, где п - ранг mask.
Результаты : массив или скаляр логического типа. Результат - скаляр, если dim опу­
щ ен или mask имеет ранг единица. С калярны й результат истинен, если какие-нибудь
элем енты mask истинны. Результат имеет значения ложь, если никакой элем ент mask не­
истинен или mask имеет разм ер нуль.
Результат м ассив им еет тот же тип и родовы е параметры, что и mask, и ранг, который
м еньш е, чем mask. Его форма ( d i, d2, ..., dD IM -1 , dD IM +1, ..., dn), где (d h d2, dn) явля­
ется формой mask.
Каждый элем ент в м ассиве результата истинен, если лю бы е элементы в одном изме­
рении массива, определенном mask (si, S2 , s DiM~ i , s DiM+ i , s n), истинны.
Примеры
A N Y ((/.FA LSE ., .FA LSE., .TR U E./)) имеет значения истина, потому что один из эле­
м ентов истинен.
"1 5 7 “ "0 5 7 '
П усть А является массивом , а В массивом
3 68 269
A N Y (.EQ. В, DIMN1) проверяет, равны ли какие-нибудь элем енты в каждом столбце
А элем ентам в соответствую щ ем столбце В. Результат имеет значение (ложь, истина, ис­
тина), потому что вторые и третьи столбцы имею т по крайней мере 1 элемент, который
является равным.
A NY (.EQ. В, DIMN2) проверяет, равны ли какие-нибудь элем енты в каждой строке А
элем ентам в соответствую щ ей строке В. Результат им еет значение (истина, истина), по­
том у что каж дая строка имеет по крайней мере 1 элемент, которы й является равным.

A S IN
Описание: вы числяет арксинус jc.
С и н та кси с: result = ASIN (jc )
К ласс: элем ентная функция; родовая.
Параметры : jc долж ен иметь тип "действительное"; | х | долж ен быть меньш е или
равны м 1.
Р езультаты . Тип результата - тог же, что и у х, и выражен в радианах. Значение на­
ходится в диапазоне от - я/2 до я/2.
Собственное имя Тип параметра Тип результата
ASIN REAL(4) REAL(4)
DASIN REAL(8) REAL(8)
QASIN REAL(16) REAL(16)
Пример
A SIN (0.79345021) им еет значение 0.9164571.

A S IN D
Описание: вы числяет арксинус х.
С и н та кси с: result = A SIN D (jc )
Класс: элем ентная функция; родовая.
Параметры : * долж ен иметь тип "действительное"; | х | долж ен быть меньш е или
равны м 1.
Г ю в а 8 В ст роенны е п роц едуры 185
Результаты . Тип результата - тот же, что и у х, и вы раж ен в градусах. Значение на­
ходится в диапазоне от -9 0 ° до 90°.
Собственное имя Тип параметра Тип результата
ASIND REAL(4) REAL(4)
DASIND REAL(8) REAL(8)
QASIND REAL(16) REAL(16)
Пример
A SIN D (0.2467590) имеет значение 14.28581.

A S IN H
Описание: вычисляет гиперболический арксинус х.
Синтаксис: result = A SIN H (х)
Класс: элем ентная функция; родовая.
Параметр: jc долж ен иметь тип "действительное".
Результаты . Тип результата - тот же, что и у х.
Собственное имя Тип параметра Тип результата
ASINH REAL(4) REAL(4)
DASINH REAL(8) REAL(8)
QASINH REAL(16) REAL(16)
Пример
AS1NH (180.0) имеет значение 5.88611.

A S S O C IA T E D
Описание; возвращ ает состояние связы вания парам етра его указателя или указы вает,
связан ли указатель с адресатом.
Синтаксис: result = A SSO C IA T E D (pointer [, target]).
Класс: функция запроса; родовая.
Параметры: poin ter долж ен бы ть указателем (лю бого типа данны х); target (opt) до л ­
жен быть указателем или адресатом.
Р езультаты : скаляр логического типа по ум олчанию . У становка опций компилятора,
указываю щ их размер целого числа, м ож ет затронуть эту функцию .
Если присутствует параметр poin ter, результат истина, если он в настоящ ее время свя­
зан с адресатом; иначе результат - ложь.
Если такж е присутствует параметр target и является адресатом , результат истина, если
poin ter в настоящ ее время связан с target’, иначе результат - ложь.
Если target является указателем, результат истина, если и p o in ter и target в настоящ ее
время связаны с одним и тем же адресатом; иначе результат - ложь. (Если или poin ter
или target разъединен, результат - лож ь.)
Примеры
REAL, TARGET, DIMENSION (0:50):: TAR
REAL, POINTER, DIMENSION (:):: PTR
PTR =>TAR
PRINT *, ASSOCIATED (PTR, TAR) ! Возвращает значение истина
Диапазон нижнего индекса для PTR - 0:50. Рассмотрите следую щ ие операторы п ри ­
сваивания указателя:
PTR => TAR (:)
PTR =>TAR (0:50)
PTR =>TAR (0:49)
186 С. Д . Алгазин, В. В. К о н д р а т ьев . П рограм ирование на Visual FORTRAN

Д ля утверж дений 1 и 2, A SSO C IA T E D (PTR, TA R) истинен, потому что T A R не изме­


нился (диапазон нижнего индекса для PTR в обоих случаях - 1:51, по правилам для м ас­
сивов отлож енной формы). Д ля утверж дения 3, A SSO C IA T E D (PTR, TA R) - ложь, пото­
му что верхняя граница TA R изменилась.
Рассм отрите следую щ ий пример:
REAL, POINTER, DIMENSION (:):: PTR2, PTR3
ALLOCATE (PTR2 (0:15))
PTR3 => PTR2
PRINT *, ASSOCIATED (PTR2, P T R 3 )! Возвращает значение истина

NULLIFY (PTR2)
NULLIFY (PTR3)
PRINT *, ASSOCIATED (PTR2, P T R 3 )! Возвращает значение ложь

ATAN
Описание: вы числяет арктангенс х.
Си н та кси с: result = A TAN (х)
Класс: элем ентная функция; родовая.
Параметр: х долж ен иметь тип "действительное".
Р езультаты . Тип результата - тот же, что и у х, и выражен в радианах. Значение на­
ходится в диапазоне от - л/2 до тс/2.
Собственное имя Тип параметра Тип результата
ATAN REAL(4) REAL(4)
DATAN REAL(8) REAL(8)
QATAN REAL(16) REAL(16)
П ример
A TA N (1.5874993) им еет значение 1.008666.

A TAN 2
Описание: вы числяет арктангенс. Р езультат - главное значение параметра комплекс­
ного числа отличного от нуля {х,у).
С и н та кси с: result = A T A N 2 (у, х)
Класс: элем ентная функция; родовая.
Параметры : у долж ен иметь тип "действительное"; х долж ен иметь тот же тип и ро­
довы е парам етры , как у у. Если у им еет значение нуль, jc не мож ет иметь значение нуль.
Результаты . Тип результата - то г же, что и у х, и выражен в радианах. Значение на­
ходится в диапазоне - к <A TA N 2 (у, х) < к. Если х Ф нулю, результат приблизительно ра­
вен значению arctan (у/х).
Если .у > нуля, результат полож ителен.
Если у < нуля, результат отрицателен.
Если у = нулю , результат - нуль (если jc > нуля) или л (если х < нуля).
Если х = нулю , абсолю тное значение результата я/2.
Собственное имя Тип параметра Тип результата
Собственное имя Тип Параметра Тип Результата
ATAN2 REAL(4) REAL(4)
DATAN2 REAL(8) REAL(8)
QATAN2 REAL(16) REAL(16)
Примеры
A T A N 2 (2.679676, 1.0) им еет значение 1.213623.
/ и к , а Л' / н i n / j o c i i i n u c n / x ) i u ’( ) \ ¡ >hi 187
" 1 г '-1 1
Если Y им еет значение , а X им еет значение
-1 1
Ък
4
то A TAN 2 ( Y, X) -
Зл-
’ 4
A TAN 2D
Описание: вы числяет арктангенс. Р езультат - главное значение парам етра ком плекс­
ного числа, отличного от нуля (jc, у).
Синтаксис: result = A TA N 2D (у, х)
Класс: элем ентная функция; родовая.
Параметры: у долж ен иметь тип "действительное"; х долж ен им еть тот же тип и р о ­
довы е параметры, что и у. Если у им еет значение нуль значения, х не м ож ет иметь зн аче­
ние нуль.
Р езультаты . Тип результата - то же самое, что и у jc , и вы раж ен в градусах. Значение
находится в диапазоне от -1 8 0 ° до 180°. Если х Ф нулю , результат приблизительно равен
значению arctan (у/х).
Если у > 0, результат положителен.
Если у < 0, результат отрицателен.
Если у = 0, результат равен нулю (если jc > 0) или 180° (если jc < 0).
Если jc —0, абсолю тное значение результата равно 90°.
Собственное имя Тип параметра Тип результата
Собственное имя Тип Параметра Тип Результата
ATAN2D REAL(4) REAL(4)
DATAN2D REAL(8) REAL(8)
QATAN2D REAL(16) REAL(16)
Пример
A TA N 2D (2.679676, 1.0) имеет значение 69.53546.

ATAN D
Описание: вы числяет арктангенс jc.
Синтаксис: result = A TA N D ( jc )
Класс: элем ентная функция; родовая.
Параметр: jc долж ен иметь тип "действительное" и долж ен бы ть больш е или равны м
нулю.
Р езультаты . Тип результата - тот же, что и у х, и выражен в градусах.
Собственное имя Тип параметра Тип результата
Собственное имя Тип Параметра Тип Результата
ATAND REAL(4) REAL(4)
DATAND REAL(8) REAL(8)
QATAND REAL(16) REAL(16)
Пример
A TA N D (0.0874679) имеет значение 4.998819.

ATAN H
Описание: вы числяет гиперболический арктангенс х.
188 С. Д . Алгазин, В В К он драт ьев П рограм ирование на Visual FO RTRAN

С интаксис: result = A TA N H (jc)


Класс: элем ентная функция; родовая.
Параметр: х долж ен им еть тип "действительное", где х < 1.
Результаты. Тип результата - тот же, что и у х. Значение находится в диапазоне ог -1 .0
до 1.0.
Собственное имя Тип параметра Тип результата
Собственное имя Тип Параметра Тип Результата
ATANH REAL(4) REAL(4)
DATANH REAL(8) REAL(8)
QATANH REAL(16) REAL(16)
Пример
А ТА N Н (-0 .7 7 ) имеет значение -1.02033.

BADDRESS
Описание: возвращ ает адрес х. Ее нельзя передать как фактический параметр. Эта
функция мож ет такж е бы ть указанна как IADDR.
С интаксис: result = B A D D R E SS (х)
Класс: функция запроса; родовая.
Параметр: параметр х - это переменная, массив или ссы лка на поля записи, процеду­
ра или константа; он м ож ет иметь лю бой тип данных. Он не долж ен быть именем внут­
ренней процедуры или функции утверж дения. Если он - указатель, он долж ен быть оп­
ределен и связан с адресатом.
Результаты . Тип результата - 1NTEGER(4) на процессорах 1А-32 и INTEG ER(8) на
процессорах Intel Itanium и Intel ЕМ 64Т. Значение результата представляет адрес объекта
данных или, в случае указателей, адрес связанного с ним адресата. Если параметр недо­
пустим, результат неопределенны й.
Пример
PROGRAM batest
INTEGER Х(5), I
DO 1=1,5
PRINT*, BADDRESS(X(I))
END DO
END

B IT S IZ E
Описание: возвращ ает число битов в целочисленном типе.
Синтаксис: result = BIT SIZE (/')
Класс: функция запроса; родовая.
Параметр: / долж ен иметь тип "целочисленное".
Р езультаты : скалярное целое число с тем же самым родовым параметром, что и /'.
Значение результата - число битов, определенны х битовой м оделью для целых чисел с
родовым параметром параметра. Для информации относительно битовой модели (см.
прил. D-3).
Пример
BIT SIZE ( 1 2 ) имеет значение 16, потому что K IN D =2 целочисленного типа содер­
ж ит 16 бит.

BTEST
Описание: тестирует бит ц ел оч и сленною параметра.
Г ю в а 8. В ст роенны е проц едуры 189
Синтаксис: result = BTEST {i, pos)
Класс: элементная функция; родовая.
Параметры: / долж ен иметь тип "целочисленное"; p o s долж ен иметь тип "целочис­
ленное", не долж ен быть отрицательны м и долж ен быть меньш е, чем B IT S IZ E (i). Самый
правый (самый м ладш ий) бит / находится в позиции 0.
Результаты . Тип результата - логическое по умолчанию .
Результат - истина, если бит / на месте p o s имеет значение 1. Результат - ложь, если
бит /' на месте p o s им еет значение нуль. Д ля получения дополнительной информации о
битовых функциях (см. разд. 8.4).
Установка опций компилятора, указы ваю щ их размер целого числа, м ож ет затронуть
эту функцию.
Собственное имя Тип параметра Тип результата
Собственное имя Тип параметра Тип результата
BBTEST INTEGERd) L0GICAL(1)
BITEST (или HTEST) IN TE G E R ® LO G IC AL®
BTEST (или BJTEST) INTEGERS) L0GICAL(4)
BKTEST INTEGERS) L0GICAL(8)
Примеры
BTEST (9, 3) имеет значение истина.
1 2 fa ls e fa ls e
Если А им еет значение , значение B TEST (А, 2) равно и значение
3 4 fa ls e tru e

tru e false
BTEST (2, А) равно
false fa ls e

C A C H E S IZ E (то ль ко 164)
Описание: возвращ ает размер уровня кеш а памяти. Эта функция достунна только на
процессорах Intel Itanium.
Синтаксис: result = CA C H E SIZ E (/ 7 )
Класс: функция запроса; родовая.
Параметр: п долж ен быть скаляром и типа "целочисленное".
Результаты . Тип результата - тот же самы й, чго и у п. Значение результата - число
килобайт в уровне п кеш а памяти.
/7 = 1 указывает кеш первого уровня; п = 2 указы вает кеш второго уровня и т. д. Если
уровень кеш а п не сущ ествует, значение результата - 0.
Пример
CA CHESIZE (1) возвращ ает 16 для процессора с кеш ем памяти первого уровня 16 КБ.

C E IL IN G
Описание: возвращ ает наименьш ее целое число, больш ее или равное его параметру.
Синтаксис: result = C EILIN G (а [, kind]).
Класс: элементная функция; родовая.
Параметры: а долж ен иметь тип "действительное"; kind (opi) долж ен быть инициали­
зированным скалярным целочисленны м выраж ением. Этот параметр является возм ож но­
стью Fortran 95.
Результаты . Тип результата - целое число. Если kind присутствует, родовой пара­
метр результата указывается kind; иначе родовой параметр результата - родовой пара­
190 С А А и ч п и п .в В /\ 0 11()/)({III1>С(> 11/)()г/)(П111/и)(.(1111Н' IHI I l^lhl/ / ( )/\ I/\ \ \

метр целого типа по умолчанию . Если процессор не може* п р ед сгавш ь значение резуль­
тата в kind, результат неопределенный.
Значение результата равно наим еньш ем у целому числу, больш ему или равному а. Ус­
тановка опций компилятора, указы ваю щ их целочисленны й размер, мож ет затронуть эту
функцию .
Примеры
CEILIN G (4.8) имеет значение 5.
CEILIN G (-2.55) имеет значение -2 .0 .

CHAR
Описание: возвращ ает символ в указанной позиции набора символов процессора.
Ф ункция инверсная 1CHAR.
Синтаксис: result = CH A R (i [, kind]).
Класс: элементная функция; родовая.
Параметры: /' долж ен иметь тип "целочисленное" со значением в диапазоне от 0
до n - 1, где п - число сим волов в наборе сим волов процессора; kind (opt) должен быть
инициализированным скалярным целочисленны м выражением
Результаты : имеет тип "целочисленное" с длиной 1. Если kind присутствует, родовой
параметр результата указы вается kind\ иначе родовой параметр результата - родовой па­
рам етр сим вольного типа по ум олчанию . Если процессор не м ож ет представить значение
результата в k in d , результат неопределенный.
Результат - символ в позиции /' набора сим волов процессора. ICH A R (CH A R (I, KIND
(С))) имеет значение I для 0 до п - 1 и C H A R (IC H A R (С), KIN D (С)) имеет значение С
для лю бого сим вола С, представляемого в процессоре.
Собственное имя Тип параметра Тип результата
Собственное имя Тип параметра Тип результата
INTEGER(I) L0GICAL(1)
INTEGERS) LOG ICAL®
CHAR1 INTEGERS) L0GICAL(4)
IN TE G E R ® LO GICAL®
1 Эту собственную функцию нельзя передать как фактический параметр.

Примеры
CH A R (76) имеет значение 'L'.
CH A R (94) имеет значение ,Л\

CM PLX
Описание: преобразовы вает параметр в комплексны й тип. Эту функцию нельзя пере­
дать как фактический параметр.
С интаксис: result = CM PLX (х [,у ] [, kind]).
Класс: элементная функция; собственная.
Параметры: х долж ен иметь тип "целочисленное", "действительное" или "комплекс­
ное"; v (opt) долж ен иметь тип "целочисленное" или "действительное" (не должен при­
сутствовать, если х имеет комплексны й тип); kind (opt) долж ен быть инициализирован­
ным скалярным целочисленны м выраж ением.
Р езультаты . Тип результата - комплексны й. Если kind присутствует, родовой пара­
метр - указанное kind\ иначе родовой параметр - родовой параметр действительного типа
по умолчанию .
Гпава 8. В ст роенны е п роц едуры 191
Если появляется только один неком плексны й параметр, он преобразуется в вещ ест­
венную часть значения результата, и мнимой части присваивается нуль. Если у не указан
и х - комплексное, значение результата - CM PLX (REA L (х), A IM AG (х)).
Если появляются 2 не комплексны х параметра, вы числяется комплексное значение,
преобразовывая первый параметр в вещ ественную часть значения, а второй параметр -
в мнимую часть.
CM PLX(x, у , kind) имеет комплексное значение, вещ ественная часть которого равна
REAL(x, kind), а мнимая часть - REAL(y, kind).
Установка опций компилятора, указы ваю щ их размер действительного числа, м ож ет
затронуть эту функцию.
Примеры
CM PLX (-3 ) имеет значение (-3 .0 , 0.0).
CM PLX (4.1, 2.3) имеет значение (4.1, 2.3).

CO M M AN D AR G UM EN TCOUN T
Описание: возвращ ает число параметров команды.
Синтаксис: result = CO M M A N D A RG U M E N T CO U N T ()
Класс: функция запроса; родовая.
Параметры: нет.
Результаты : скаляр целого типа по умолчанию . Значение результата равно числу
доступных параметров команды. Если нет никаких доступны х параметров команды, р е­
зультат - 0.
Имя команды не считается за один из параметров команды.
Примеры
program echo_command Jine
integer i, cnt, len, status
character c*30, b*100
call get_command (b, len, status)
if (status .ne. 0) then
write (*,*) 'get_command failed with status = ', status
stop
end if
write (*,*) 'command line = b (1:len)
call get_command_argument (0, c, len, status)
if (status .ne. 0) then
write (*,*) 'Getting command name failed with status = ', status
stop
end if
write (*,*) 'command name = ', с (1 len)
cnt = command_argument_count ()
write (*,*) 'number of command arguments = ', cnt
do i = 1, cnt
all get_command_argument (i, c, len, status)
if (status .ne. 0) then
write (*,*) 'get_command_argument failed: status = ', status, ' arg = ', i
stop
end if
write (*,*) 'command arg ', i, ' = ', с (1:len)
end do
192 С Д . Алгазин, В В К он драт ьев П рограм ирование на Visual FORTRAN

write ( Y ) 'command line processed'


end
Если выш еупомянутая програм м а вызывается командной строкой "e ch o c o m m a n d
_line.exe - о 42 - a hello b", будет отображ ено следую щ ее:
command line = echo_command_line.exe -о 42 -a hello b
command name = echo_command_line.exe
number of command arguments = 5
command arg 1 = -o
command arg 2= 42
command arg 3 = -a
command arg 4 = hello command arg 5 = b
command line processed

C O N JG
Описание: вы числяет сопряж енное значение комплексного числа.
С и н та кси с: result = CO N JG (z).
К ласс: элем ентная функция; родовая.
Параметр: z долж ен иметь комплексны й тип.
Р езультаты . Тип результата - тот же, что и у z. Если z имеет значение (х, у), резуль­
тат им еет значение (х, -у ).
Собственное имя Тип параметра Тип результата
Собственное имя Тип Параметра Тип Результата
CONJG COMPLEXE) REAL(4)
DCONJG COMPLEXE) REAL(8)
QCONJG COMPLEXO 6) REAL(16)
П римеры
C O N JG ((2.0, 3.0)) имеет значение (2.0,-3.0).
C O N JG ((1.0, -4 .2 )) имеет значение (1.0, 4.2).

COS
Описание: вы числяет косинус jc.
С ин та кси с: result = CO S (jc )
К ласс: элем ентная функция; родовая.
Параметр: jc долж ен иметь тип " действительное " или "ком плексное” и быть задан в
радианах по м одулю 2 *ти. Если jc имеет комплексны й тип, его вещ ественная часть рас­
см атривается как значение в радианах.
Р езультаты . Тип результата - гот же, что и у х.
Собственное имя Тип параметра Тип результата
COS REAL(4) REAL(4)
DCOS REAL(8) REAL(8)
QCOS REAL(16) REAL(16)
CCOS1 COMPLEX(4) REAL(4)
CDCOS2 COMPLEX(8) REAL(8)
CQCOS COMPLEX(16) REAL(16)
1 Установка опций компилятора, указывающих действительный размер, может затронуть CCOS.
2 Эта функция может также быть указанна как ZCOS

Примеры
CO S (2.0) имеет значение -0.4161468.
CO S (0.567745) им еет значение 0.8431157.
Г лава 8. В ст роенны е п роц едуры 193
COSD
Описание: вычисляет косинус jc.
С интаксис: result = CO SD (jc)
Класс: элементная функция; родовая.
Параметр :х долж ен иметь тип " действительное "и задан в градусах по модулю 360.
Результаты . Тип результата - то же, что у х.
Собственное имя Тип параметра Тип результата
C0SD REAL(4) REAL(4)
DC0SD REAL(8) REAL(8)
QC0SD REAL(16) REAL(16)
Примеры
CO SD (2.0) имеет значение 0.9993908.
CO SD (30.4) имеет значение 0.8625137.

COSH
Описание: вы числяет гиперболический косинус.
Синтаксис: result = COSH (jc )
Класс: элементная функция; родовая.
Параметр: х долж ен иметь тип "действительное".
Результаты . Тип результата - тот же, что и у jc.
Собственное имя Тип параметра Тип результата
Собственное имя Тип Параметра Тип Результата
C0SH REAL(4) REAL(4)
DC0SH REAL(8) REAL(8)
QCOSH REAL(16) REAL(16)
Примеры
COSH (2.0) имеет значение 3.762196.
COSH (0.65893) имеет значение 1.225064.

С О Т AN
Описание: вычисляет котангенс х.
Синтаксис: result = CO TA N (х)
Класс: элементная функция; родовая.
Параметр: jc долж ен иметь тип " действительное "; не м ож ет бы ть нулем. Он долж ен
быть задан в радианах модулю 2 *я.
Результаты . Тип результата - тот же, что и у jc.

Собственное имя Тип параметра Тип результата


COTAN REAL(4) REAL(4)
DCOTAN REAL(8) REAL(8)
QCOTAN REAL(16) REAL(16)
Примеры
СО ТAN (2.0) имеет значение -4 .5 7 6 5 7 5 Е -0 1 .
СО ТAN (0.6) имеет значение 1.461696.

CO TAN D
Описание: вычисляет котангенс х.
Синтаксис: result = C O TA N D (х)
Класс: элементная функция; родовая.
194 СД Алгазин, В В К ондрат ьев. П рограм ирование на Visual FO RTRAN

Параметр: л: долж ен иметь тип "действительное ", долж ен быть задан в градусах по
м одулю 360.
Р езультаты . Тип результата - тот же, что и у х.
Собственное имя Тип параметра Тип результата
COTAND REAL(4) REAL(4)
DCOTAND REAL(8) REAL(8)
QCOTAND REAL(16) REAL(16)
Примеры
CO T A N D (2.0) имеет значение 0.2863625Е+02.
C O T A N D (0.6) им еет значение 0.9548947Е+02.

COUNT
Описание: считает число истинных элем ентов во всем м ассиве или в указанном из­
мерении массива.
Си н та кси с: result = CO U N T (mask [, dim ] [, kind]).
К ласс: трансф орм ационная функция; родовая.
Параметры : mask долж ен бы ть логическим массивом; dim (opt) долж ен быть скаляр­
ным целочисленны м вы раж ением со значением в диапазоне от 1 до п, где п - ранг m ask;
kind (opt) долж ен бы ть инициализированны м скалярным целочисленны м выражением.
Р езультаты : результат - м ассив или скаляр типа "целое". Если kind присутствует, р о ­
довой парам етр результата указы вается kind; иначе родовой параметр результата - родо­
вой параметр целого типа по ум олчанию . Если процессор не мож ет представить значение
результата в kind, результат неопределенны й.
Результат - скаляр, если dim опущ ен или mask имеет ранг один. Скалярны й результат
им еет значение, равное числу истинных элем ентов mask. Если mask имеет размер нуль,
результат - нуль.
Результат - массив, который имеет ранг меньш е, чем mask, и форму (d |, d 2, dD|M-i>
dpiM+ь —5 d n), где (d |, d 2, ..., dn) - ф орм а mask. Каждый элемент в массиве результата рав­
няется числу элем ентов, которые являю тся истинными в одномерном массиве, опреде­
ленном mask («|, S2 , Sdim-i, Sdim+ь •••> sn). У становка опций компилятора, указываю щ их
разм ер целого числа, м ож ет затронуть эту функцию .
Примеры
C O U N T ((/.TR U E ., .FA LSE., .TRU E./)) имеет значение 2, потому что 2 элемента ис­
тинны .
CO U N T ((/.TRUE., .TRUE., .TRUE./)) имеет значение 3, потому что 3 элемента истинны.
"15 7 ' '0 5 7 '
П усть А является массивом , а В - массивом
368 2 69
CO U N T (A .NE. В, D1M=1) проверяет, сколько элементов в каждом столбце А не равно
элементам в соответствующем столбце В. Результат имеет значение (2 ,0 , 1), потому что:
П ервы й столбец А и В имеет 2 элем ента, которы е не равны.
В торой столбец А и В имеет 0 элем ентов, которы е не равны.
Третий столбец А и В им еет 1 элемент, который не равен.
C O U N T (A .NE. В, D IM =2) проверяет, сколько элем ентов в каждой строке А не равно
элем ентам в соответствую щ ей строке В. Результат им еет значение (1 ,2 ) потому что:
П ервая строка А и В им еет 1 элемент, который не равен.
Вторая строка А и В им еет 2 элем ента, которы е не равны.
Глава 8 Встроенные процедуры 195
C P U T IM E
Описание: возвращ ает, зависим ое от процессора, приближ ение процессорного вре­
мени в секундах. Это - новая встроенная процедура в Fortran 95.
Синтаксис: CA LL CPU TIM E (time).
Класс: подпрограмма.
Параметры: time долж ен бы ть скаляром и типа "действительное". Это - параметр
INTEN T (OUT). Если значим ое время не м ож ет бы ть возвращ ено, зависим ое от п роцес­
сора отрицательное значение возвращ ается.
Пример
REAL t¡me_beg¡n, time_end

CALL CPU_TIME(time_begin)

CALL CPU_TIME(time_end)
PRINT (*,*) 'Time of operation w a s tim e _ e n d - time_begin,' seconds'

C S H IF T
Описание: вы полняет циклический сдвиг на одноранговом массиве, или вы полняет
циклические сдвиги на всех полных одноранговы х секциях (векторах) по данном у изм е­
рению м ассива ранга 2 или больше.
Элементы, выдвинуты е в одном конце, вставляю тся в другом конце. Различны е сек­
ции м огут быть выдвинуты разны ми количествами и в разны х направлениях.
Синтаксис: result = C SH IFT (array, shift [, dim]).
Класс: трансформ ационная функция; родовая.
Параметры: array долж ен быть массивом; мож ет иметь лю бой тип данны х; shift д о л ­
жен бы ть скалярным целым числом или массивом с рангом , м еньш им , чем ранг a rra y, и
формой (di, d2, d DiM_i, d DIM+i , d n), где ( db d2, d „ ) - ф орм а array.
dim (opt) долж ен быть скалярным целым числом со значением в диапазоне от 1 до п,
где п - ранг array. Если dim опущ ен, он, как предполагаю т, равен 1.
Р езультаты : массив с тем же самым типом и родовы м и парам етрам и и формой, что и
array.
Если array имеет ранг 1, элем ент i-й элемент м ассива результата равен (1 + M O D U L O
(i + shift - 1, SIZE (array))). (О динаковый сдвиг прим еняется к каж дом у элем енту.)
Если array имеет ранг больш е, чем единица, каж дая секция (si, S2, ..., sD|M- i, Sdim+ь •••>
sn) из результата выдвигается следую щ им образом:
■ значением shift, если shift - скаляр;
■ согласно соответствую щ ем у значению shift ( s b s2, ..., sDim-i,, sDim-h, •••, s„), если shift -
массив.
Значение shift определяет количество и направление циклического сдвига. П олож и­
тельное значение shift является причиной сдвига влево (в строках) или вверх (в столбцах).
О трицательное значение shift является причиной сдвига вправо (в строках) или вниз
(в столбцах). Н улевое значение shift не вы зы вает никакого сдвига.
Примеры
П усть V является массивом (1, 2, 3, 4, 5, 6).
CSH IFT (V, SHIFT=2) выдвигает элементы V циклически влево на 2 позиции, полу­
чаемые значения (3, 4, 5, 6, 1, 2). 1 и 2 вы двинуты из начала и вставлены в конце.
C SH IFT (V, SH IFT= - 2 ) вы двигает элементы V циклически вправо на 2 позиции, п о­
лучаемые значения (5, 6, 1, 2, 3, 4). 5 и 6 выдвинуты из конца и вставлены вначале.
196 С Д Алгазин, В. В. К ондрат ьев. Программирование на Visual FO RTRAN

1 23
П усть М является м ассивом 456 . CSH1FT (М, SH IFT = 1, DIM = 2) производит
789
23 1
результат 564
897
Каждый элем ент в строках 1, 2 и 3 вы двинут влево на 2 позиции. Элементы, выдвину­
ты е из начала, вставлены в конце.
"7 8 9 '
C SH IFT (М , SH IFT = - 1 , DIM = 1) производит результат 12 3
[4 5 6
Каждый элем ент в столбцах 1, 2 и 3 выдвинут вниз на 1 позицию . Элементы, выдви­
нутые снизу, вставлены вверху.
[2 3 Г
CSH IFT (М, SH IFT = (/1, - 1 , О/), D IM = 2) производит результат 64 5
[_7 8 9
Каждый элем ент в строке 1 вы двинут влево на 1 позицию ; каждый элем ент в строке 2
выдвинут вправо на 1 позицию ; никакой элем ент в строке 3 не выдвинут вообщ е.

D ATE
Описание: возвращ ает текущ ую дату, установленную внутри системы.
С интаксис: C A LL D A TE (buf).
Класс: подпрограмм а.
Параметры: b u f является 9-байтовой переменной, массивом, элементом массива или
сим вольной подстрокой. Д ата возвращ ается как 9-байтовая строка сим волов ASCII, при­
нимаю щ ая ф орм ат dd-m m m -yy, где dd - дата (2 цифры); mmm - название месяца (3 бук­
вы); у у - последние 2 цифры года.
Если b u f им еет числовой тип и м еньш е 9 байт, мож ет произойти наруш ение целостно­
сти данных.
Если b u f им еет сим вольны й тин, связанную с ним длину передаю т подпрограмме. Ес­
ли b u f меньш е 9 байт, подпрограм м а обрезает дату, чтобы соответствовать указанной
длине. Если передается массив типа сим вольное, подпрограмм а запом инает дату в пер­
вом элем енте м ассива, используя длину элем ента, а не длину всего массива.
Предостережение. В озвращ аем ое значение года с двумя цифрами мож ет явиться
причиной проблем с годом 2000 или более поздним. И спользуйте D A T E A N D T I M E
вместо нее (см. "D A TE A N D T IM E " ).
Пример
CHARACTER*! DAY(9)

CALL DATE (DAY)


Д лина первого элем ента м ассива в C H A R A C TER м ассива DAY передается подпро­
грам ме D A TE. П одпрограм м а затем обрезает дату, чтобы вписаться в односимвольный
элемент, производя неправильны й результат.

D A T E A N D T IM E
Описание: возвращ ает сим вольны е данны е реального часа и даты в формате, совмес­
тимом с представлениям и, определенны м и С тандартной м еж дународной организацией
по стандартизации 8601:1988.
Глава 8 Встроенные процедуры 197
Синтаксис: CA LL D A T E A N D T 1 M E ([date] [, time] [, zone] [, values]).
Класс: подпрограмма.
Параметры. Есть 4 необязательны х п арам етра':
date (opt) долж ен бы ть скаляром сим вольного типа по ум олчанию ; его длина долж на
быть rio крайней мере 8, чтобы содерж ать полное значение. Его крайние левы е 8 си м во­
лов содерж ат значение в ф орм ате C C Y Y M M D D , где СС - столетие; YY - год; М М - м е­
сяц года; DD - день месяца.
time (opt) долж ен бы ть скаляром сим вольного типа по ум олчанию ; его длина долж на
быть но крайней мере 10, чтобы содерж ать полное значение. Его крайние левы е 10 си м ­
волов содерж ат значение в ф орм ате hhm m ss.sss, где hh - час дня; mm - м инуты ; ss.sss -
секунды и м иллисекунды.
zone (opt) должен быть скаляром символьного типа по умолчанию; его длина должна быть
по крайней мере 5, чтобы содержать полное значение. Его крайние левые 5 символов содер­
жат значение формата hhmm, где hh и mm - разница во времени относительно Коор­
динированного среднегринвичского времени (UTC)“ в часах и минутах, соответственно.
values (opt) долж ен иметь тип "целочисленное" и ранга единица. Его разм ер долж ен
быть, по крайней мере 8. Значения, возвращ аем ы е в V A LU ES, определяю тся следую щ им
образом:
V ALUES (1) - год с 4 цифрами.
VALUES (2) - месяц.
V ALUES (3) - день месяца.
V ALUES (4) - разница во времени относительно Координированного ср едн егри н ви ч­
ского времени (UTC) в минутах.
VALUES (5) - час (диапазон от 0 до 23).
V ALUES (6) - минуты (диапазон от 0 до 59).
V ALUES (7) - секунды (диапазон от 0 до 59).
V ALUES (8) - м иллисекунды (диапазон от 0 до 999).3
П редположим, что следую щ ий прим ер выполнялся 2000 г. 28 м арта в 11:04:14.5:
IN TEG ER D A TE TIM E (8) C H A R A C T E R (LEN = 12) R E A L C L O C K (3)
CALL D A TE_ AN D T 1ME (R E A L C L O C K (1), R E A L C L O C K (2), &
REAL CLO CK (3), D A TE TIM E)
Это определяет значение "20000328" REA L C L O C K (l), значение "110414.500"
REA L_CLO CK (2) и значению "-0500" REA L_CLO CK (3). С ледую щ ие значения о п ред е­
лены на D A TE T1ME: 2000, 3, 28,-300, 11, 4, 14 и 500.

D BLE
Описание: преобразовы вает число в действительны й тип с двойной точностью .
Синтаксис: result = D BLE (а).
Класс: элементная функция; родовая.
Параметр: а должен иметь тип "целочисленное", "действительное" или "комплексное".
Результаты . Тип результата - действительное с удвоенной точностью (R E A L(8) или
REAL*8). Ф ункции, которые являю тся причиной преобразования одного типа данны х к
другому типу, имею т тот же самы й эффект, что и неявное преобразование в операторах
присваивания.

1Все - параметры INTENT(OUT).


" Определен в соответствии с Рекомендацией 460-2 CCIR.
? Часы, .минуты, секунды имиллисекунды поместному времени.
198 С Д Алгазин, В В. Кондрат ьев. П р о гр а мироваяие на Visual FO RTRAN

Если а - удвоенной точности, результат - значение а без преобразования (DBLE(a) = а).


Если а им еет тип "целочисленное" или "действительное", результат имеет большую
точность значащей части а , так как м ож ет содерж ать значение удвоенной точности.
Если а им еет комплексны й тип, результат имеет больш ую точность значащ ей части
вещ ественной части а, как м ож ет содерж ать значение удвоенной точности.
Собственное имя Тип параметра Тип результата
INTEGERd) REAL(8)
INTEGERS) REAL(8)
INTEGERS) REAL(8)
INTEGERS) REAL(8)
DBLE2 REAL(4) REAL(8)
REAL(8) REAL(8)
DBLEQ REAL(16) REAL(8)
C0MPLEX(4) REAL(8)
C0MPLEX(8) REAL(8)
C0MPLEX(16) REAL(8)
1 Эти собственные функции нельзя передавать как фактические параметры.
2 Для совместимости со старыми версиями Fortran DBLE может быть указано как собственная функция.

Примеры
DBLE (4) имеет значение 4.0.
DBLE ((3.4, 2.0)) им еет значение 3.4.

DCM PLX
Описание: преобразовы вает параметр к комплексном у типу удвоенной точности. Эту
функцию нельзя передавать как фактический параметр.
С интаксис: result = D CM PLX (jc [,>>])•
Класс: элем ентная функция; собственная.
Параметры: jc долж ен иметь тип "целочисленное", "действительное" или "комплекс­
ное"; у долж ен иметь тип "целочисленное" или "действительное". Он не долж ен присут­
ствовать, если х имеет комплексны й тип.
Результаты . Тип результата "комплексное" с удвоенной точностью (CO M PLEX (8)
или CO M PLEX * 16).
Если появляется только один неком плексны й параметр, он преобразуется в вещ ест­
венную часть значения результата, и мнимой части присваивается нуль. Если у не указан,
а л ' комплексное, значение результата - CM PLX (R EA L (х), A1MAG ( х ) ) .
Если появляю тся 2 некомплексных параметра, комплексное значение создается пре­
образованием первого параметра в вещ ественную часть и второго параметра в мнимую
часть.
D CM PLX ( jc , v ) имеет комплексное значение, вещ ественная часть которого - REAL ( jc ,
K IN D =8), а мнимая часть - REA L (у, K IN D =8).
Примеры:
D CM PLX (-3 ) имеет значение (-3 .0 , 0.0);
D CM PLX (4.1, 2.3) имеет значение (4.1, 2.3).

D FLOAT
Описание: преобразовы вает целое число в число с удвоенной точностью действи­
тельное типа (REA L (8)).
Синтаксис: result = D FLO A T (а)
Глава 8 В ст роенны е проц едуры 199
Класс: элементная функция; родовая.
Параметр: а долж ен иметь тип "целочисленное".
Результаты . Тип результата - действительное с удвоенной точностью (Я Е А Ц 8 ) или
ЯЕА Ь*8).
Ф ункции, которые служ ат для преобразования одного типа данны х в другой, имею т
тот же самый эффект, что и неявное преобразование в операторах присваивания.
Собственное имя Тип параметра Тип результата
INTEGER(1) REAL(8)
DFL0TI INTEGERS) REAL(8)
DFL0TJ INTEGERS) REAL(8)
DFL0TK INTEGERS) REAL(8)
1 Эти собственные функции нельзя передать как фактические параметры.

Пример
D FLO A T (-4 ) имеет значение -4 .0 .

D IG IT S
Описание: возвращ ает число значащ их цифр для чисел того же самого типа и родо­
вых параметров, что и аргумента.
С интаксис: result = D IG ITS (х).
Класс: функция запроса; родовая.
Параметр: * долж ен иметь тип "целочисленное" или "действительное"; он может
быть скаляром или массивом значений.
Результаты : скаляр целого типа по умолчанию . Результат имеет значение q, если jc
имеет тип "целочисленное"; он имеет значение р , если jc им еет тип "действительное". Ц е­
лочисленный параметр q определен в прил. D; действительны й параметр р определен в
прил. D-2.
Пример
Если X имеет тип REA L(4), D IG ITS (X) имеет значение 24.

D IM
Описание: возвращ ает разность между двумя числами (если разность положительна).
Синтаксис: result = DIM (jc , v )
Класс: элементная функция; родовая.
Параметры: х долж ен иметь тип "целочисленное" или "действительное"; у долж ен
иметь тот же самый тип и родовы е параметры, что и у х .
Результаты . Тип результата - тот же, что и у х . Значение результата равно х - у , если
х больше, чем у\ иначе значение результата - нуль.
Собственное имя Тип параметра Тип результата
BDIM INTEGERS) INTEGERS)
IIDIM (или HDIM) INTEGER® INTEGER®
IDIM (или JIDIM)1 INTEGERS) INTEGERS)
KIDIMW ih KDIM) INTEGERS) INTEGERS)
DIM REAL(4) REAL(4)
DDIM REAL(8) REAL(8)
QDIM REAL(16) REAL(16)
1Для совместимости IDIM может быть указана так же, как родовая функция.

Примеры
DIM (6, 2) имеет значение 4.
200 С Д Алгазин, В В К он драт ьев Программирование на Visual FORTRAN

DIM (-4 .0 , 3.0) имеет значение 0.0.

DNUM
Описание: преобразовы вает строку сим волов в действительное значение с двойной
точностью .
Син та кси с: result = DN UM (/)
Класс: элем ентная функция; собственная.
Параметр: / долж ен иметь тип "символьное".
Р езультаты . Тип результата "действительное" с удвоенной точностью . Значение ре­
зультата - действительное значение с двойной точностью , представленное строкой сим­
волов /.
Примеры
D N U M ("3.14159") имеет значение с двойной точностью 3.14159.
С ледую щ ее вы раж ение устанавливает х к 311.0:
C H A R A C TE R ® ¡
DOUBLE PRECISION x
¡ = "311"
x = DNUM(i)

D O TPRO D UCT
Описание: вы полняет скалярное ум нож ение числовы х или логических векторов (од­
норанговы х массивов).
С ин та ксис: result = D O T PR O D U C T (vector_a, vecto rjb ).
К ласс: трансф орм ационная функция; родовая.
Параметры : vector а долж ен быть одноранговы м массивом числового (целочислен­
ного, действительного или комплексного) или логического типа; vector b долж ен быть
одноранговы м массивом числового типа, если vector а им еет числовой тип, или логиче­
ского типа, если vector a имеет логический тип. Он долж ен бы ть того же самого размера,
что и vector а.
Р езультаты : скаляр, тип которого зависит от типов vector а и vector Jb.
Если vector_a им еет тип "целочисленное" или "действительное", значение результа­
та - SUM (vector _a*vector_b).
Если vector a им еет комплексны й тип, значение результата - SUM (CONJG
(vector_á) *vector_b).
Е сли vector a им еет логический тип, результат имеет значение A NY (vector a .AND.
vector_b).
Если такж е одноранговы й массив им еет нулевой размер, результат - нуль, если мас­
сив им еет числовой тип, и результат - "лож ь", если массив имеет логический тип (см.
разд. 31).
Примеры
D O T PR O D U C T ((/1, 2, 3/), (/3, 4, 5/)) им еет значение 26, вы числяемое следующим
образом:
((1 х 3) + (2 х 4) + (3 х 5)) = 26
D O T PR O D U C T ((/ (1.0, 2.0), (2.0, 3.0) /), (/ (1.0, 1.0), (1.0, 4.0) /)) имеет значение
(1 7 .0 ,4 .0 ).
D O T PR O D U C T ((/ .TRU E., .FALSE. /), (/ .FA LSE., .TRUE. /)) имеет значение ложь.
Глава 8. В ст роенны е проц едуры 201
DPROD
Описание: вы числяет произведение более вы сокой точности. Это - собственная
функция, которая не имеет никакого родового имени, связанного с ней. Ее нельзя пере­
давать как фактический параметр.
Синтаксис: result = D PROD (х ,у )
Класс: элементная функция; собственная.
Параметры: х долж ен иметь тип R EA L(4) или REA L(8); у долж ен иметь тот ж е са­
мый тип и родовы е параметры, что и х.
Результаты . Если х и у имею т тип REA L(4), тип результата действительное с двой ­
ной точностью (REA L(8) или REA L*8). Если х и у имею т тип R EA L(8), результат имеет
тип REA L(16). Значение результата равно х*у.
У становка опций компилятора, указы ваю щ их размер дей ствительного числа, может
затронуть эту функцию.
Примеры
D PROD (2.0, -4 .0 ) имеет значение -8.00D 0.
D PROD (5.0D0, 3.0D0) имеет значение 15.00Q0.
С ледую щ ее выраж ение показы вает другой пример:
REAL(4) е
REAL(8) d
е = 123456.7
d = 1234567D0! DPROD (е,е) возвращает 15241557546.4944
! DPROD (d.d) возвращает 15241556774.8899992813874268904328

D REAL
Описание: преобразовы вает вещ ественную часть ком плексного парам етра с удвоен­
ной точностью к действительном у типу с двойной точностью . Эта собственная функция
не имеет никакой родовой функции, связанной с ней. Ее нельзя передать как ф актиче­
ский параметр.
С интаксис: result = D REA L (а)
Класс: элем ентная функция; собственная.
Параметр: а долж ен иметь тип - комплексное с удвоенной точностью (CO M PLEX (8)
или CO M PLEX* 16).
Результаты . Тип результата - действительное с удвоенной точностью (REA L(8) или
REAL*8).
Пример
D REA L ((2.0d0, 3.0d0)) имеет значение 2.0d0.

D S H IF T L
Описание: вы бирает левы е 64 бита после см ещ ения 128-битового целочисленного
значения влево.
Синтаксис: result = D SH IFTL (ileft, iright, ishift)
Класс: элементная функция; собственная.
Параметры: ileft долж ен иметь тип 1NTEGER(8); iright долж ен иметь тип
1NTEGER(8); ishift долж ен иметь тип 1NTEGER(8), долж ен бы ть неотрицательны м и
меньш е или равным 64 и является счетчиком сдвига.
Результаты . Тип результата 1NTEGER(8). Значение результата - 64-битовое значе­
ние, начинаю щ ееся в бите (128 - ishift) 128-битовой конкатенации значений ileft и iright.
202 С Д Алгазин, В В К он драт ьев Программирование на Visual FO RTRAN

Пример
INTEGER(8) ILEFTI Z'111122221111222' I
INTEGER(8) IR IG H TI Z'FFFFFFFFFFFFF' /
PRINT *, DSHIFTL (ILEFT, IRIGHT, 16_8)! печатает 1306643199093243919

D S H IF T R
Описание: вы бирает левы е 64 бита после смещ ения 128-битового целочисленного
значения вправо.
Си н та кси с: result = D SH IFT R (/7eft, iright, ishift)
К ласс: элем ентная функция; собственная.
Параметры : ileft долж ен иметь тип 1NTEGER(8); iright долж ен иметь тип
1NTEGER(8); ishift долж ен иметь тип 1NTEGER(8), долж ен бы ть неотрицательным и
м еньш е или равны м 64 и является счетчиком сдвига.
Р езультаты . Тип результата 1NTEGER(8). Значение результата - 64-битовое значе­
ние, начинаю щ ееся в бите (64 + ishift) 128-битовой конкатенации значений ileft и iright.
Пример
INTEGER(8) ILEFT I Z'111122221111222' I
INTEGER(8) IRIGHT I Z'FFFFFFFFFFFFF I
PRINT *, DSHIFTR (ILEFT, IRIGHT, 16_8)i печатает 1306606910610341887

EOF
Описание: проверяет, находится ли файл в позиции в или за записью конца файла.
Эта собственная ф ункция не им еет никакой родовой функции, связанной с ней. Ее нельзя
передавать как ф актический параметр.
С и н та кси с: result = EO F (а)
К ласс: функция запроса; собственная.
Параметр: а долж ен им еть тип "целочисленное". Он представляет спецификатор уст­
ройства, соответствую щ ий откры том у файлу и не мож ет бы ть нулем, если вы не повтор­
но подклю чили устройство нуль к устройству, отличному от экрана или клавиатуры.
Результаты . Тип результата является логическим. Значение результата - .TRUE., ес­
ли файл, соединенны й с я, в или вне записи конца файла; иначе .FALSE..
Пример
! Создает файл случайных чисел и читает их назад
REAL х, total
INTEGER count
OPEN (1, FILE = 'TEST.DAT')
DO I = 1,20
CALL RANDOM_NUMBER(x)
WRITE (1 ,'(F 6 .3 )')x * 100.0
END DO CLOSE(1)
OPEN (1, FILE = 'TEST.DAT')
DO WHILE (.NOT. EOF(1))
count = count + 1
READ (1, *) value
total = total + value
END DO
100 IF ( count .GT. 0) THEN
WRITE (*,*) 'Average is:', total I count
ELSE
WRITE (*,*) 'Input file is em pty'
END IF
Г лава 8. В ст роенны е проц едуры 203
STOP
END

E O S H IF T
Описание: вы полняет сдвиг прерывания на одноранговом массиве, или вы полняет
сдвиг прерывания на всех полных одноранговы х сечениях (векторах) по данном у и зм ере­
нию массива ранга 2 или больш е.
Элементы выдвигаю тся в одном конце сечения, а копии граничной величины вдви га­
ются в другом конце. Различны е сечения могут им еть разны е граничны е величины и м о­
гут быть выдвинуты разными количествами и в разны х направлениях.
С интаксис: result = EO SH IFT (array, shift [, bou ndaiy] [, dim]).
Класс: трансформационная функция; родовая.
Параметр: array долж ен быть массивом (лю бого типа данны х).
shift долж ен быть скалярным целым числом или м ассивом с рангом , которы й является
меньш е у array, и форма (d h d2, ..., d DIM-i, d DIMH, ..., d n), где ( d h d2, ..., dn) - ф орм а array.
boundary (opt) долж ен иметь тот же самый тип и родовы е парам етры что и array. Он
долж ен быть скаляром или массивом с рангом, который является м еньш е a rra y, и формой
(di, d2, ..., doiM-ь doiM+ь —» dn).
Если boundary не указан, он, как предполагаю т, им еет следую щ ие значения по ум ол­
чанию (в зависимости от типа данны х array):
Тип ARRA Y Значение BOUNDARY
Integer 0.
Real 0.0.
Com plex (0.0,0.0).
Logical ложь.
Character(len) len пробелов.
dim (opt) долж ен быть скалярным целым числом со значением в ди ап азоне от 1 до п,
где п - ранг массива. Если dim опущ ен, он, как предполагаю т, равен 1.
Результаты : массив с тем ж е самым типом, родовы м и парам етрам и и форм ой, что и
array.
Если массив имеет ранг 1, тот ж е самый сдвиг прим еняется к каж дом у элем енту. Если
элем ент вы двинут в одном конце массива, граничная величина пом ещ ается в другом
конце массива.
Если массив имеет ранг больш е, чем 1, каждая секция (si, s2..., s Dim i -, Sdim+i —> s„) р е­
зультата выдвинута следую щ им образом:
■ Значением сдвига, если сдвиг - скаляр.
■ Согласно соответствую щ ему значению в shift (s h s2..., sDim-i, Sdim-h—, s „ ) , если shift -
массив.
■ Если элем ент выдвинут в одном конце секции, граничная величина пом ещ ается в д р у ­
гом конце секции.
Значение сдвига определяет количество и направление прерывания сдвига. П олож и ­
тельное значение сдвига является причиной сдвига влево (в строках) или вверх (в столб­
цах). О трицательное значение сдвига является причиной сдвига вправо (в строках) или
вниз (в столбцах).
Примеры
П усть V является массивом (1, 2, 3, 4, 5, 6).
204 С Д . Алгазин, В. В. К он драт ьев Программирование на Visual FORTRAN

EO SH IFT (V, SH IFT=2) вы двигает элементы V влево на 2 позиции, вычисленное зна­


чение (3, 4, 5, 6, 0, 0). 1 и 2 вы двинуты в начале и 2 элемента со значением по умолчанию
BOUNDARY помещ ены в конец.
EO SH IFT (V, SH IFT= -3, B O U N D A R Y ^ 99) выдвигает элементы V вправо на 3 пози­
ции, вы численное значение (99, 99, 99, 1, 2, 3). 4, 5 и 6 выдвинуты в конце и 3 элемента
со значением BOUNDARY - 99 пом ещ ены вначале. М является символьным масси-
"1 2 3 "
вом 4 5 6
789

23 *
EO SH IFT (М, SH IFT = 1, B O U N D A R Y = DIM = 2) производят результат 5 6 *
89*
Каждый элем ент в строках 1, 2 и 3 сдвинут влево на 1 позицию. Эта функция вы дви­
гает первый элем ент в каж дой строке из начала, а значение BOUNDARY размещ ается в
конце.
000
EO SH IFT (М, SH IFT = - 1 , D IM = 1) производят результат 1 23
456
Каждый элем ент в столбцах 1, 2 и 3 сдвинут вниз на 1 позицию. Эта функция вы дви­
гает последний элем ент в каж дом столбце из конца, а значение BO U N D A R Y разм ещ ает­
ся вначале.
E O SH IFT (М, SH IFT = (/1, - 1 , 0/), BO U N D A R Y = (/ '*', '?', '/' /), DIM = 2) производят
"2 3 *1
результат ? 4 5
789
Каждый элем ент в строке 1 сдвинут влево на 1 позицию , заставляя первый элемент
бы ть выдвинуты м из начала и значение BO U N D A R Y - *, размещ ается в конце. Каждый
элем ент в строке 2 сдвинут вправо на 1 позицию , заставляя последний элемент быть вы ­
двинуты м из конца и значение BO U N D A R Y - ? размещ ается вначале. Н икакой элем ент в
строке 3 не сдвигается вообщ е, таким образом, указанное значение BO U N DA RY не ис­
пользуется.

E P S IL O N
Описание: возвращ ает полож ительное м одельное число, которое является почти не­
значащ им по сравнению с единицей в м одели, представляю щ ей вещ ественны е чи сла1.
Синтаксис: result = E PSILO N (jt).
Класс: функция запроса; родовая.
Параметр: х долж ен им еть тип "действительное"; может бы ть скаляром или м асси­
вом значений.
Результаты : скаляр того ж е самого типа и родовы х параметров, что и jc. Результат
им еет значение Ь |_р. П арам етры b и р определены в прил. D-2.
Пример
Если X им еет тип R EA L(4), EPSILO N (X) им еет значение 2‘23.

ERF
Описание: возвращ ает интеф ал вероятности ошибок п арам етрах.

1Минимальное число с такое, что 1+с> 1.


Глава 8 В ст роенны е п роц едуры 205
Синтаксис: result = ERF (х).
Класс: элементная функция; родовая.
Параметр: х долж ен иметь тип "д ействительное”.
Результаты. Тип результата - тот же, что и у х. Результат находится в диапазоне от -1
до 1. ERF возвращ ает интеграл вероятности ошибок х, определяемы й следую щ им образом:

7Г 0J
П
Собственное имя Тип параметра Тип результата
ERF REAL(4) REAL(4)
DERF REAL(8) REAL(8)
QERF REAL(16) REAL(16)
Пример
ERF (1.0) имеет значение 0.842700794.

ERFC
Описание: возвращ ает дополнительны й интеграл вероятности ош ибок параметра.
С интаксис: result = ERFC (х).
Класс: элементная функция; родовая.
Параметр: х долж ен иметь тип "действительное".
Р езультаты . Тип результата - тот же, что и у х. Результат находится в диапазоне от 0
до 2. ERFC возвращ ает 1 - ERF (х) и определяется следую щ им образом:

Ц е ' -dt
7Г J
П 0
ERFC применяется при критической потери относительной точности, если у ERF (х)
задан больш ой х и результат вы читается из 1.
Собственное имя Тип параметра Тип результата
ERFC REAL(4) REAL(4)
DERFC REAL(8) REAL(8)
QERFC REAL(16) REAL(16)
Пример
ERFC (1.0) имеет значение 0.1572992057.

ER R SN S
Описание: возвращ ает инф орм ацию о последнем обнаруж енном ош ибочном условии
системы ввода/вывода.
Синтаксис: CALL ERR SN S ([io_err] [, sys_err] [, stat] [, unit] [, cond]).
Класс: подпрограмма.
Параметры. Есть 5 необязательны х параметров:
io err (opt) является целочисленной переменной или элем ентом м ассива, который за­
поминает последний номер ошибки библиотеки поддерж ки, произош едш ей во время вы ­
полнения программы. Н уль указы вает, что ош ибка не произош ла, начиная с последнего
вызова ERRSN S или начиная с начала выполнения программы.
sys_err (opt) является целочисленной переменной или элем ентом массива, который
запоминает наиболее свежий системный ном ер ош ибки, связанны й с io_err. Этот код -
одно из следую щ их выражений:
На Linux* и системах M ac O S * - это значение erm o. (См. erm o(2)).
206 С. Д Ачгазин, В В. Кондрат ьев. П рограм ирование на Visual FORTRAN

На системах W indows* - это возвращ аем ое значение G etL astE rror () во время ошибки.
stat (opt) является целочисленной переменной или элементом массива, который запо­
м инает значение состояния, которое произош ло во время выполнения программы. Это
значение - нуль.
unit (opt) является целочисленной переменной или элементом массива, который запо­
м инает логический номер устройства, если последняя ош ибка бы ла ош ибкой вво­
да/вывода.
cond (opt) является целочисленной переменной или элементом массива, который за­
поминает фактическое значение процессора. Это значение - всегда нуль.
Если вы указы ваете параметр 1NTEGER(2), возвращ аю тся только младш ие 16 битов
информации, или соседние данны е м огут бы ть записаны поверх. И з-за этого, лучш е ис­
пользовать параметры IN TEG ER(4).
Сохраненные сведения об ош ибке устанавливаю тся в нуль после каждого вызова
ERRSNS.
Пример
Лю бой из параметров м ож ет бы ть опущ ен. Н апример, следую щ ее допустимо:
CALL ERR SN S (SY S ERR, S T A T ,, UNIT)

E X IT
Описание: заканчивает вы полнение програм мы , закры вает все файлы и возвращ ает
управление операционной системе.
Синтаксис: CA LL EX IT ([status]).
Класс: подпрограмма.
Параметр: status (opt) является целочисленны м параметром, который вы можете ис­
пользовать, чтобы указать значение состояния выхода.
Пример
CALL EXIT (100)

EXP
Описание: вы числяет значение экспоненты.
Синтаксис: result = EX P (л)
Класс: элементная функция; родовая.
Параметр: х долж ен им еть тип "действительное" или "комплексное".
Р езультаты . Тин результата - тот же, что и у х . Значение результата ех . Если jc имеет
комплексный тип, считается, что его мнимая часть задана в радианах.
Собственное имя Тип параметра Тип результата
ЕХР REAL(4) REAL(4)
DEXP REAL(8) REAL(8)
QEXP REAL(16) REAL(16)
СЕХР1 COMPLEX(4) REAL(4)
CDEXP2 COMPLEX(8) REAL(8)
CQEXP COMPLEX(16) REAL(16)
1 Установка опций компилятора, указывающих размер действительного, может затронуть СЕХР.
2 Эта функция может быть указанна так же, как ZEXP.

Примеры
ЕХ Р (2.0) им еет значение 7.389056.
ЕХР (1.3) имеет значение 3.669297.
Гпава 8 В ст роенны е проц едуры 207
EXPONENT
Описание: возвращ ает экспонентную часть параметра, м одельного числа.
Синтаксис: result = EX PO N E N T (х)
Класс: элементная функция; родовая.
Параметр: х долж ен иметь тин "действительное".
Результаты . Тип результата - целое по умолчанию . Если х не равен нулю, значение
результата - экспонентная часть х. Экспонента долж на бы ть в пределах диапазона целого
типа по умолчанию ; иначе результат неопределенный.
Если х - нуль, экспонента х - нуль. Для получения дополнительной информации о
экспонентной части (е) в действительной модели, см. прил. D-2.
Примеры
EX PO N EN T (2.0) имеет значение 2.
Если 4.1 является значением REA L(4), EX PO N E N T (4.1) имеет значение 3.

FLOOR
Описание: возвращ ает наибольш ее целое число, м еньш ее или равное его параметру.
Синтаксис: result = FLO O R (а [, kind]).
Класс: элементная функция; родовая.
Параметры: а долж ен иметь тин "действительное"; kind (opt) долж ен бы ть инициали­
зированным скалярным целочисленны м выраж ением, является возм ож ностью Fortran 95.
Результаты . Тип результата - целое число. Если kind присутствует, родовой пара­
метр результата указы вается kind\ иначе родовой параметр результата - это родовой па­
раметр целого типа по умолчанию . Если процессор не м ож ет представить значение р е­
зультата в kind, результат неопределенный.
Значение результата равно самому больш ому целому числу, меньш ему или равному а.
Установка опций компилятора, указы ваю щ их разм ер целого числа, м ож ет затронуть эту
функцию.
Примеры
FLOOR (4.8) имеет значение 4.
FLO O R (-5 .6 ) имеет значение -6 .

FPCLASS
Описание: возвращ ает класс IEEE* (S floating, Т floating или X flo a tin g ) действи­
тельного параметра.
Синтаксис: result = FP CLA SS (х).
Класс: элементная функция; родовая.
Параметр: х долж ен иметь тип "действительное".
Результаты . Тип результата - целое по ум олчанию . В озвращ аем ое значение - одно
из следующих:
Класс параметра Возвращаемое значение
Сигнальный ИаИ FOR_K_FP_SNAN
Тихий ИаИ FOR_K_FP_QNAN
Положительная бесконечность F0R_K_FP_P0S_INF
Отрицательная бесконечность FOR К FP NEG INF
Положительное нормализованное число F0R_K FP_P0S_N0R M
Отрицательное нормализованное число FOR К FP NEG NORM
208 С Д Ачгазин, В В К ондрат ьев. П рограм ирование на Visual FO RTRAN

Класс параметра Возвращаемое значение


Положительное ненормализованное число FOR К FP POS DENORM
Отрицательное ненормализованное число FOR К FP NEG DENORM
Положительный нуль F0R_K_FP_P0S ZERO
Отрицательный нуль FOR К FP NEG ZERO
П реды дущ ие возвращ аем ы е значения определены в файле fo rd ef.f на системах Linux*
и M ac OS* и файле fordef.for на системах W indows*.
Пример
FP C LA SS (4.0 8) им еет значение 4 (FO R _K _FP_PO S_N O R M ).

F R A C T IO N
Описание: возвращает дробную часть модельного представления значения параметра.
С и н та кси с: result = FRA CTIO N (х).
К ласс: элем ентная функция; родовая.
Параметр: jc долж ен иметь тип "действительное".
Р езультаты . Тип результата - тот же, что у х. Результат имеет значение х*Ье. П ара­
м етры Ъ и е определены в прил. D-2. Если х имеет значение нуль, результат имеет значе­
ние нуль.
Примеры
Если 3.0 является значением REA L(4), FRA CTIO N (3.0) имеет значение 0.75.

FR EE
О писание: освобож дает блок пам яти, которая в настоящ ее время распределена.
С и н та кси с: C A L L FREE (а).
Класс: подпрограмма.
Параметры : а долж ен иметь тип IN TEG ER(4) на процессорах 1А-32 и 1NTEGER(8)
на процессорах Intel Itanium и Intel ЕМ 64Т. Его значение является начальным адресом
пам яти, которая будет освобож дена, пам ять предварительно долж на быть распределена
M A LLO C . Если освобож даем ы й адрес не был предварительно распределен M ALLOC
или если адрес освобож дается более одного раза, результаты непредсказуемы.
Пример
INTEGER(4) SIZE
REAL(4) STORAGE^)
POINTER (ADDR, STORAGE) ! ADDR будет указывать на STORAGE
SIZE = 1024 ! Размер в байтах
ADDR = MALLOC(SIZE) ! Распределение памяти
CALL FREE(ADDR) ! Освободить ее

G ETAR G
Описание: возвращ ает указанны й параметр командной строки (где сама команда
им еет параметр с числом нуль). Эту подпрограмм у нельзя передать как фактический па­
рам етр.
С и н та кси с: CA LL G ETA R G (л?, buffer [, status}).
К ласс: подпрограмма.
Параметры :
п долж ен быть скаляр типа "целочисленное". Это значение - позиция параметра ко­
м андной строки для поиска. С ам а команда - параметр 0.
Глава 8. В ст роенны е проц едуры 209
buffer долж ен быть скаляром символьного типа по ум олчанию . Его значение - воз­
вращ аемый параметр командной строки.
status (opt) долж ен быть скаляром типа "целочисленное". Если указан, его значение -
возвращ аемое состояние заверш ения.
Если не было никаких ош ибок, возвращ аем ое состояние - это число сим волов в най­
денном параметре командной строки, обрезанное или дополненное пробелам и. (Таким
образом, status - оригинальное число сим волов в параметре командной строки.) Ош ибки
возвращ аю т значение - 1 . Ош ибки вклю чаю т определение позиции парам етра меньше,
чем 0, или больш е, чем значение возвращ аем ое IARGC.
GETARG возвращ ает п-й параметр командной строки. Если п - нуль, возвращ ается
имя вы полняю щ егося програм много файла.
G ETARG возвращ ает параметры командной строки, после того как они были введе­
ны. Н ет никакой замены регистра.
Если параметр командной строки короче, чем buffer, буф ер G ETA R G добавляет спра­
ва пробелы. Если параметр более длинны й, чем buffer, G E TA R G обрезает параметр спра­
ва. Если обнаруж ена ош ибка, G ETA RG заполняет буф ер пробелам и.
Пример
П редположите вызов командной строки PROG1 -g -с -а и буфер длины но крайней
мере 5 символов. Следую щ ие вызовы в G ETA R G возвращ аю т соответствую щ ие пара­
метры в buffer и status.
Утверждение Строка возвращаемая в buffer Длина возвращаемая в status
CALL GETARG (0, buffer, status) PROG1 5
CALL GETARG (1, buffer) -g Неопределенная
CALL GETARG (2, buffer, status) -с 2
CALL GETARG (3, buffer) -a Неопределенная
CALL GETARG (4, buffer, status) Все пробелы -1

G ETCO M M AN D
Описание: возвращ ает всю команду, которая использовалась, чтобы вызвать п ро­
грамму.
Синтаксис: C A LL G ET C O M M A N D ([command, length, status]).
Класс: подпрограмма.
Параметры:
command (opt) долж ен быть скаляром сим вольного типа по ум олчанию . Если этот п а­
раметр указан, его значение - вся команда, которая использовалась, чтобы вызвать про­
грамму. Если команда не мож ет быть определена, ее значение - все пробелы.
length (opt) долж ен быть скаляром типа "целочисленное". Если этот парам етр указан,
его значение - значащ ая длина команды, которая использовалась, чтобы вызвать про­
грамму. Эта длина вклю чает конечны е пробелы, но она не доп ускает никакого обрезания
или удлинения используемого в команде. Если длина команды не м ож ет бы ть определе­
на, ее значение - нуль.
status (opt) долж ен быть скаляр типа "целочисленное".
Если параметр указан, его значение равно - 1 , если параметр команды присутствует и
имеет длину меньш е, чем значащ ая длина команды. Если ком анда не м ож ет быть найде­
на, ее значение полож ительно; иначе ей назначается значение нуль.
Примеры
См. "CO M M A ND A RG U M EN T CO U N T".
210 С .Д Алгазин, В. В К он драт ьев П роклам ирование на Visual FO RTRAN

G ETCO M M AN D AR G UM EN T
Описание: возвращ ает параметр командной строки команды, которая вызвала про­
грамму. Эту подпрограмм у нельзя передавать как фактический параметр.
С и н та кси с: C A L L G ET C O M M A N D A R G U M E N T (п [, value, length, status]).
К ласс: подпрограмм а.
Параметры :
п долж ен быть скаляром типа "целочисленное". Он долж ен быть неотрицательным и
меньш е или равны м значению , возвращ аем ому функцией CO M M A N D _A R G U M EN T _
CO U N T. Его значение - позиция параметра командной строки для поиска. С ама коман­
да - параметр 0.
value (opt) долж ен быть скаляром сим вольного типа по умолчанию . Если он указан,
его значение - возвращ аем ы й параметр командной строки или все пробелы, если значе­
ние - неизвестно.
length (opt) долж ен бы ть скаляром типа "целочисленное". Его значение - длина воз­
вращ аемого парам етра командной строки или нуль, если длина параметра - неизвестна.
Эта дли н а вклю чает значащ ие конечны е пробелы. О на не вклю чает никакого обрезания
или удлинения, которое происходит, когда параметр назначен параметру value.
status (opt) долж но бы ть скаляром типа "целочисленное". Если параметр указан, его
значение - возвращ аем ое состояние заверш ения. Ему назначается значение - 1 , если па­
раметр value присутствует и им еет длину меньш е, чем значащ ая длина параметра коман­
ды, у к азан н о ю п. Ему назначается зависим ое от процессора полож ительное значение, ес­
ли поиск парам етра терп ит неудачу. Иначе ему назначено значение нуль.
G ET C O M M A N D A R G U M E N T возвращ ает параметры командной строки, как они
были введены. Нет никакой замены регистра.
Примеры
См. "C O M M A N D A R G U M EN T CO U N T".

G E T E N V IR O N M E N T V A R IA B L E
Описание: получает значение переменной среды.
С и н та кси с: C A LL G ET EN V IR O N M E N T V A RIABLE (name [, value, length, status,
trim_name]).
Класс: подпрограм м а.
Параметры :
name долж ен бы ть скаляром сим вольного типа по умолчанию . Это - имя переменной
среды.
value (opt) долж ен бы ть скаляром сим вольного типа по умолчанию . Если параметр
указан, ему назначается значение переменной среды, указанной в пате. Если переменная
среды не сущ ествует, значению присваиваю тся все пробелы.
length (opt) долж ен бы ть скаляром типа "целочисленное". Если параметр указан, его
значение - длина перем енной среды , если она сущ ествует; иначе length равно 0.
status (opt) долж ен бы ть скаляром типа "целочисленное". Если параметр указан, ему
назначается значение 0, если переменная среды сущ ествует и/или не имеет никакого зна­
чения, или ее значение успеш но - назначено value. Этому параметру назначается значе­
ние 1, если переменная среды не сущ ествует. Для других ош ибочных условий ему назна­
чается зависим ое от процессора значение, больш ее чем 2.
trim_name (opt) долж ен бы ть скаляром логического типа. Если его значение - FALSE,
то конечны е пробелы имени считаю тся значащ ими. И наче их не считаю т частью имени
перем енной среды.
Глава 8. В ст роенны е проц едуры 211
Примеры
Нижеприведенная програм ма спраш ивает имя переменной среды. Если переменная
среды сущ ествует в среде програм мы , програм ма распечаты вает ее значение:
program pr¡nt_env_var
character name*20, val*40
integer len, status
write (*,*) 'введите имя переменной среды'
read ( V ) name
call get_environment_variable (name, val, len, status, .true.)
if (status .ge. 2) then
write (*,*) 'get_environment_variable терпит неудачу: состояние = ', status
stop
end if
if (status .eq 1) then
write (*,*) 'перем. окружения величина не существует'
stop
end if
if (status .eq. -1) then
write (*,*) 'длина переменной окружения = ', len,' усечена до 40'
len = 40
end if
if (len .eq. 0) then
write (*,*)' переменной окружения существует, но не имеет значения'
stop
end if
write (*,*) 'значение перем. окружения = ', val (1:len)
end
Когда вызвана выш еупомянутая програм ма, отображ ается следую щ ая строка:
enter the name of the environment variable
(введите имя переменной среды)
Следую щ ий пример показы вает то, что могло бы ть отображ ено, если вы вводите
"НОМЕ".
■ На системе Linux или M ac OS значение переменной окруж ения = /hom e/our space/
usr4.
■ Н а системе W indow s значение переменной окруж ения = С:/.
Следую щ ий пример показы вает то, что могло бы бы ть отображ ено, если бы вы ввели
"PATH".
■ В системе Linux или M ac OS длина переменной окруж ения равна 307 усечена до 40,
значение переменной окруж ения равно /site/our_space/usr4/progs/build_area.
■ В системе W indows длина переменной окруж ения равна 829, усечена до 40, значение
переменной окружения равно C :\O U R _SP A C E \B U lL D _A R E A \build_objects\.

HUGE
О п и са н и е: возвращ ает наибольш ее число в м одели, представляю щ ей то т ж е самый
тип и родовые параметры, что и параметр.
С и н т а к с и с : result = H U G E (jc).
К ласс: функция запроса; родовая.
П а р а м е тр : х долж ен иметь тип целочисленное или действительное; он м ож ет бы ть
скаляром или массивом значений.
212 С Д Алгазин, В. В. К ондрат ьев. П рограм ирование на Visual FO RTRAN

Результаты : скаляр того же самого типа и родовых параметров, что и х. Если х имеет
тип целочисленное, результат им еет значение xq - 1. Если х имеет тип действительное,
результат имеет значение (1 - b 'p) b e,,m .
Значения целочисленны х парам етров г и q определены в прил. D; действительные па­
рам етры Ь, р и етах определены в прил. D-2.
Пример
Если X им еет тип REA L (4), H U G E (X) имеет значение (1 - 2"^24) * 2 128.

IA C H A R
Описание: возвращ ает позицию сим вола в наборе сим волов A SCII, даже если набор
сим волов процессора по ум олчанию отличен от ASCII. В Intel Fortran IACH AR эквива­
лентен функции 1CHAR.
Синтаксис: result = IA C H A R (с).
Класс: элем ентная функция; родовая.
Параметр: с долж ен им еть тип "символьное" длины 1.
Р езультаты . Тип результата - целое число по умолчанию . Если с находится в после­
довательности упорядочения A SC II, результат является позицией с в этой последова­
тельности и удовлетворяет неравенству (0<lA C H A R (c)< l27).
Результаты долж ны бы ть совм естим ы м и с лексическим и функциями сравнения LGE,