Вы находитесь на странице: 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,
LG T, LLE и LLT. Н априм ер, если LLE (С, D) истинно, 1ACHAR (С) .LE. IA C H A R (D)
такж е истинно.
Примеры
IA C H A R ( ' Y ' ) им еет значение 89.
1ACHAR ( ' % ' ) им еет значение 37.

IA N D
Описание: вы полняет логическое A N D на соответствую щ их битах. Эта функция м о­
ж ет бы ть указанна так же, как A ND.
С ин та ксис: result = I AND ( i , j ) .
К л асс: элем ентная функция; родовая.
Параметры: / долж ен им еть тип "целочисленное"; / долж ен иметь тип "целочислен­
ное" с тем же самым родовы м параметром , что и /.
Р езультаты . Тип результата - ю т же, что и у и /. Значение результата получено поби­
товой комбинацией / и j согласно следую щ им правилам:
1 J 1AND(1, J)
1 1 1
1 О О
О 1 О
О О О
М одели для интерпретации целочисленного значения как последовательность битов
см. в прил. D-3.
Собственное имя Тип параметра Тип результата
BIAND INTEGER(I) INTEGERS)
HAND (или HIAND) INTEGER® INTEGER®
JIAND INTEGERS) INTEGERS)
KIAND INTEGERS) INTEGERS)
/ 'пава 8. В ст роенны е процедуры 213
Примеры
IAND (2, 3) имеет значение 2.
1AND (4, 6) имеет значение 4.

IA R G C
Описание: возвращ ает индекс последнего параметра командной строки. Ее нельзя
передать как фактический параметр. Эта функция м ож ет бы ть указанна так же, как 1ARG
или NUM ARG.
Синтаксис: result = IARGC ( ) .
Класс: функция запроса; собственная.
Параметр: нет.
Результаты . Тип результата - INTEG ER(4). Результат является индексом последнего
параметра командной строки, который является такж е числом параметров в командной
строке. Команда не вклю чается в счегчик. Н апример, IARGC возвращ ается 3 для вызова
командной строки PROG1 -g -с -a.. IARG C возвращ ает значение, которое на I меньш е,
чем значение возвращ аемое N A RG S.
Пример
integer(4) no_of_arguments
no_of_arguments = IARGC ()
print *, total command line arguments are no_of_arguments
Для вызова командной строки PROG I -g -с -а, програм ма распечатает:
total command line arguments are 3

IA R G P T R
Описание: возвращ ает указатель на фактический список параметров для текущ ей
подпрограммы.
Синтаксис: result = IA R G PTR ( ) .
Класс: функция запроса; собственная.
Параметр: нет.
Результаты . Тип результата - IN TEG ER (4) на процессорах IA-32 и IN TEG ER (8) на
процессорах Intel Itanium и Intel ЕМ 64Т. Ф актический список параметров - массив зн а­
чений того же самого тина.
Счетчик параметра не присутствует и первый элем ент им еет адрес первого параметра.
Ф ормальные параметры, которые м огут бы ть опущ ены , долж ны бы ть объявлены с
VOLATILE. Для получения дополнительной информ ации см. разд. 4.21.
Пример
WRITE (*,’(" Адрес списка параметров ".Z16.8)’) IARG PTR()

IB C H N G
Описание: реверсирует значение указанного бита в целом числе.
Синтаксис: result = IBCH N G (i, pos).
Класс: элементная функция; родовая.
Параметры: / долж ен иметь тип "целочисленное", содерж ит бит, который будет о б ­
ращен; p o s должен иметь тип "целочисленное", является позицией бита, который будет
изменен. Самый правый (самый м ладш ий) бит / находится в позиции 0.
Результаты . Тип результата - тот же, что и у /. Результат равен / с реверсированны м
битом в позиции pos.
214 С Д Алгазин, В В. К о н д р а т ьев . П рограм ирование на Visual FO RTRAN

Пример
INTEGER J, К
J = IBCHNG(10,2) ! возвращает 14 = 1110
К = IBCHNG(10,1) ! возвращает 8 = 1000

IB C L R
Описание: очищ ает 1 бит нулем.
Синтаксис: result = 1BCLR (i, pos).
Класс: элем ентная функция; родовая.
Параметры: / долж ен иметь тип "целочисленное"; p o s долж ен иметь тип "целочис­
ленное", бы ть меньше, чем B1T S1ZE (/), и не долж ен бы ть отрицательным. Самый пра­
вый (самый младш ий) бит / находится в позиции 0.
Результаты . Тип результата - тот же, что и у /. Результат имеет значение последова­
тельности битов /, за исклю чением того, что бит в позиции p o s для / установлен в нуль.
М одели для интерпретации целочисленного значения как последовательность битов
показы ваю т в прил. D-3.
Собственное имя Тип параметра Тип результата
BBCLR INTEGERd) INTEGERd)
IIBCLR1 INTEGERS) INTEGERS)
JIBCLR INTEGERS) INTEGERS)
KIBCLR IN TE G E R ® IN TE G E R ®
1 Или HBCLR

Примеры
1BCLR (18, 1) имеет значение 16.
Если V имеет значение (1, 2, 3 ,4 ), значение IBCLR (POS = V, 1 = 1 5 ) равно (13, 11, 7, 15).

IB IT S
Описание: извлекает последовательность битов (битовое поле).
Синтаксис: result = 1B1TS (i, p os, len).
Класс: элем ентная функция; родовая.
Параметры: / долж ен иметь тип "целочисленное"; p o s долж ен иметь тип "целочис­
ленное", не долж ен бы ть отрицательны м и p o s + len долж ен бы ть меньш е или равным
BIT SIZE (/’). Самы й правый (самый м ладш ий) бит / находится в позиции 0. len должен
иметь тип "целочисленное", не долж ен бы ть отрицательным.
Результаты . Тип результата - тот же, что и у /. Результат последовательности len би­
тов в /, начинаю щ ейся в откорректированной правой позиции p o s и со всеми другими ну­
левы ми битами.
М одели для интерпретации целочисленного значения как последовательность битов
показываю т в прил. D-3.
Собственное имя Тип параметра Тип результата
BBITS INTEGER(I) INTEG ERS)
IIB IT S (^ h HBITS) IN TE G E R ® IN TE G E R ®
JIBITS INTEGERS) INTEGERS)
KIBITS IN TE G E R ® IN TE G E R ®
Примеры
1B1TS (12, 1, 4) им еет значение 6.
IBITS (10, 1, 7) им еет значение 5.
Глава 8 В ст роенны е процедуры 215
IB S E T
Описание: устанавливает 1 бит в единице.
Синтаксис: result = IBSET (i, pos).
Класс: элементная функция; родовая.
Параметры: / долж ен иметь тип "целочисленное"; p o s долж ен иметь тип "целочис­
ленное", не долж ен бы ть отрицательны м и долж ен бы ть меньш е, чем BIT SIZE (/). С а­
мый правый (самый младш ий) бит / находится в позиции 0.
Результаты . Тип результата - тот же, что и у /. Результат имеет значение последова­
тельности битов /, за исклю чением того бита, который находится позиции p o s /, установ­
ленный в 1.
М одели для интерпретации целочисленного значения как последовательность битов
показывают в прил. D-3.
Собственное имя Тип параметра Тип результата
BBSET INTEGER(I) INTEG ERS)
МВЭЕКили HBSET) IN TE G E R ® IN TE G E R ®
JIBSET INTEGERS) INTEGERS)
KIBSET INTEGERS) INTEGERS)
Примеры
IBSET (8, 1) имеет значение 10.
Если V имеет значение (1, 2, 3, 4), значение IBSET (POS = V, 1 = 2) равно (2, 6, 10, 18).

IC H A R
Описание: возвращ ает позицию сим вола в наборе сим волов процессора.
Syntax: result = ICH A R (с [, kind]).
Класс: элементная функция; родовая.
Параметры: с долж ен иметь тип "символьное" длины 1; kind (opt) долж ен бы ть ини­
циализированным скалярным целочисленны м выраж ением.
Р езультаты . Тип результата - целое число. Если kind присутствует, родовой пара­
метр результата указывается kind; иначе родовой параметр результата - родовой п ара­
метр целого типа по умолчанию .
Значение результата - позиция сим вола с в наборе сим волов процессора. П араметр с
находится в диапазоне от 0 до п - 1, где п - число сим волов в наборе символов.
Для лю бых сим волов С и D (способных к представлению в процессоре), С .LE. D и с­
тина только, если 1CHAR (С) .LE. IC H A R (D) истина, и С .EQ. D истина, только если
1CHAR (С) .EQ. ICHAR (D) истина.
Собственное имя Тип параметра Тип результата
CHARACTER IN TE G E R ®
ICHAR1 CHARACTER INTEGERS)
CHARACTER IN TE G E R ®
1 Эту собственную функцию нельзя передавать как фактический параметр.

Примеры
ICHAR ( ' W ' ) имеет значение 87.
1CHAR ( ' # ' ) имеет значение 35.

ID A T E
Описание: возвращ ения 3 целочисленны х значений, представляю щ их текущ ий м е­
сяц, день и год.
Синтаксис: CA LL 1DATE (/,_/, к).
216 С Д. Алгсиин, В В К ондрат ьев. П рограм ирование на Visual FO RTRAN

Класс: подпрограмм а.
Параметры: / должен иметь тип INTEGER(4) (текущий месяц); j должен иметь тип
INTEGER(4) (текущий день); к должен иметь тип 1NTEGER(4) (текущий год). Текущий ме­
сяц возвращен в /; текущ ий день в j . Последние 2 цифры текущего года возвращаются в к .
П р едост ереж ен и е. В озвращ аем ое значение года с двумя цифрами может явиться
причиной проблем с годом 2000 или более поздним. И спользуйте D A TE AND TIM E
вместо нее (см. "D A TE A N D TIM E").
П ример
Если текущая дата - 16 сентября 1996, значения целых переменных по возвращении: 1 = 9,
J = 1 6 и К = 96.

IE O R
Описание: вы полняет исклю чительное O R на соответствую щ их битах. Эта функция
м ож ет бы ть указанна гак же, как X O R или 1XOR.
С и н та кси с: result = IEOR ( i j ) .
Класс: элем ентная функция; родовая.
Параметры : / долж ен иметь тип "целочисленное"; j долж ен иметь тип "целочислен­
ное" с тем же самы м родовым параметром , что и /.
Р езультаты . Тип результата - тот же, что и у /. Значения результата получаю тся, по­
битовой комбинацией / и j согласно следую щ ей таблице:
I J lE O R (l, J)
1 1 0
1 0 1
0 1 1
О О О
М одели для интерпретации целого значения как последовательность битов показаны
в прил. D-3.
Собственное имя Тип параметра Тип результата
B IE0R (или BIX0R) INTEGERS) INTEG ERS)
IIEOR (HIEOR, H IX 0R или IIX0R) INTEGERS) INTEGERS)
ЛЕ(Ж (или JIX0R) INTEGERS) INTEGERS)
K IE 0R 1 INTEGERS) IN TE G E R ®
1 Для совместимости эта собственная функция может быть указанна как IX0R .

Пример
1EOR (12, 7) им еет значение 11; двоичное 1100 исклю чительное O R с двоичными
0111 дает двоичное 1011.

IL E N
Описание: возвращ ает длину (в битах) двоичного представления дополнения целого
числа.
С и н та кси с: result = 1LEN (/).
К ла сс: элем ентная функция; родовая.
Параметр: / долж ен им еть тип "целочисленное".
Р езультаты . Тип результата - тот же, что и у /. Значение результата - (LOG2 (/ + 1)),
если / не отрицателен; иначе значение результата (LO G 2( - I )).
Примеры
1LEN (4) им еет значение 3.
1LEN (-4) имеет значение 2.
IN D E X
Описание: возвращ ает исходную позицию подстроки внутри строки.
Синтаксис: result = IN D EX (string, substring [, back ] [, kind]).
Класс: элементная функция; родовая.
Параметры: string долж ен иметь тип "символьное"; substring долж ен иметь тип
"символьное"; back (opt) долж ен иметь логический тип; kind (opt) долж ен бы ть инициали­
зированным скалярным целочисленны м выражением.
Результаты . Тип результата - целое число. Если параметр kind присутствует, р о д о ­
вой параметр результата указывается kind\ иначе родовой параметр результата - родовой
параметр целого типа по умолчанию . Если процессор не м ож ет представить значение р е ­
зультата в kind, результат неопределенный.
Если back не присутствует (или присутствует со значением лож ь), возвращ аем ое зн а­
чение - м инимальное значение 1 такое, что string ( 1 : 1 + LEN (substring) - 1) = substring
(или нуль, если нет такого значения). Если LEN (string) <LEN (substring ), возвращ ается
нуль. Если LEN (substring) - нуль, возвращ ается 1.
Если back присутствует со значением истина, возвращ аем ое значение - м аксим альное
значение 1 такое, что string ( 1 : 1 + LEN (substring) ~ 1) = substring (или нуль, если нет т а ­
кого значения). Если LEN (string) <LEN (substring), возвращ ается нуль. Если LEN (sub­
string) - нуль, возвращ ается LEN (string) + 1.
Собственное имя Тип параметра Тип результата
INDEX1 CHARACTER INTEGERS)
CHARACTER INTEGERS)
1 Установка опций компилятора, указывающих размер целого числа, может затронуть эту функцию.

Примеры
INDEX ('FO RTRA N ', 'O', BA CK - .TRUE.) имеет значение 2.
INDEX ('X X X X '," " , BA CK - .TRU E.) имеет значение 5.

IN T
Описание: преобразовы вает значение в целочисленны й тип.
Синтаксис: result = 1NT (а [, kind]).
Класс: элементная функция; родовая.
Параметры: а должен иметь тип "целочисленное", "действительное" или "комплексное";
kind (opt) должен быть инициализированным скалярным целочисленным выражением.
Результаты . Тип результата - целое число. Если параметр kind присутствует, р о д о ­
вой параметр результата указывается kind\ иначе родовой парам етр результата такой, как
показано в следую щ ей таблице. Если процессор не м ож ет представить значение р езу ль­
тата в kind, результат неопределенный.
Ф ункции преобразования одного типа данных в другой тип им ею т тот ж е самы й эф ­
фект, что и неявное преобразование в операторах присваивания.
Значение результата зависит от типа и абсолю тного значения а следую щ им образом:
■ Если а имеет тип "целочисленное", INT (а) = а.
■ Если а имеет тип "действительное" и | а | < 1, 1NT (а) им еет значение нуль.
■ Если а имеет тип " действительное " и | а \ > 1 , 1NT (а) является целым числом, вели­
чина которого - наибольш ее целое число, которое не превы ш ает величину а и чей
знак - тот же, что и знак а.
218 С Д . Алгазин, В. В К ондрат ьев. Программирование на Visual FORTRAN

■ Если а имеет комплексный тип, 1NT (а) = а является значением, полученным применени­
ем предыдущих правил (для действительного параметра) к вещественной части а.
Собственное имя1 Тип параметра Тип результата
INTEGERd), INTEGERS), INTEGER(4) INTEGER(4)
INTEGER(I), INTEGER®, INTEGER(4), INTEGER(8) INTEGER(8)
IJINT INTEGER(4) INTEGERS)
IIFIX2 REAL(4) INTEGER(2)
IINT REAL(4) INTEGER(2)
IFIX3-4 REAL(4) INTEGER(4)
JFIX INTEGER(1), INTEGER(2), INTEGER(4), INTEGER(8), REAL(4), INTEGER(4)
REAL(8), REAL(16), COMPLEX(4), COMPLEX(8), COMPLEX(16)
INT5-6-7 REAL(4) INTEGERS)
KIFIX REAL(4) INTEGER(8)
KINT REAL(4) INTEGER(8)
IIDINT REAL(8) INTEGER(2)
IDINT6-8 REAL(8) INTEGER(4)
KIDINT REAL(8) INTEGERS)
IIQINT REAL(16) INTEGER(2)
IQINT6-9 REAL(16) INTEGER(4)
KIQINT REAL(16) INTEGER(8)
INT110 INTEGER(1), INTEGER(2), INTEGER(4), INTEGER(8), REAL(4), INTEGER(1)
REAL(8), REAL(16), COMPLEX(4), COMPLEX(8), COMPLEX(16)
INT210 INTEGER(1), INTEGER(2), INTEGER(4), INTEGER(8), REAL(4), INTEGER(2)
REAL(8), REAL(16), COMPLEX(4), COMPLEX(8), COMPLEX(16)
INT410 INTEGER(1), INTEGER(2), INTEGER(4), INTEGER(8), REAL(4), INTEGER(4)
REAL(8), REAL(16), COMPLEX(4), COMPLEX(8), COMPLEX(16)
INT810 INTEGER(1), INTEGER(2), INTEGER(4), INTEGER(8), REAL(4), INTEGER(8)
REAL(8), REAL(16), COMPLEX(4), COMPLEX(8), COMPLEX(16)
1 Эти собственные функции нельзя передавать как фактические параметры.
2 Эта функция может быть указанна как HFIX
3 Установка опций компилятора, указывающих размер целого или действительного числа, может затронуть IFIX.
4 Для совместимости со старыми версиями Fortran, IFIX может быть указана как родовая функция
5 Или JINT.
6 Установка опций компилятора, указывающих размер целого числа, может затронуть INT, IDINT и IQINT.
7 Или JIFIX.
8 Или JIDINT Для совместимости со старыми версиями Fortran IDINT может быть указана как родовая функция.
9 Или JIQINT. Для совместимости со старыми версиями Fortran IQINT может быть указана как родовая функция.
10 Для совместимости, эти функции могут быть указаны как родовые функции.

П римеры
IN T (-4 .2 ) им еет значение -4 .
1NT (7.8) им еет значение 7.

INT pTR KIND


Описание: возвращ ает K IN D IN TEG ER , которое будет содерж ать адрес. Это - собст­
венная функция, которая не им еет никакой родовой функции, связанной с ней. Ее нельзя
передавать как ф актический параметр.
С ин та кси с: result = 1NT PTR K1ND ( ) .
К ла сс: функция запроса; собственная.
Параметры : нет.
Глава 8. В ст роенны е проц едуры 219
Результаты . Тип результата - целое, принимаем ое по ум олчанию . Результат - скаляр
со значением, равным значению родового параметра целочисленного типа данны х, кото­
рый может представлять адрес на платф орме хоста. Значение результата равно 4 на п р о ­
цессорах 1А-32 и 8 на процессорах Intel Itanium и Intel ЕМ 64Т.
Пример
REAL А(100)
POINTER (P. А)
INTEGER (KIND=INT_PTR_KIND()) SAVE_P
P = MALLOC (400)
SAVE_P = P

IN U M
Описание: преобразовы вает строку сим волов в значение 1NTEGER(2).
Синтаксис: result = 1NUM (/).
Класс: элементная функция; собственная.
Параметр: / долж ен иметь тип "символьное".
Р езультаты . Тип результата - 1NTEGER(2). Значение результата - IN T E G E R (2) зн а­
чение, представленное строкой сим волов /.
Пример
1NUM ("451.92") имеет значение 451 типа 1NTEGER(2).

IO R
Описание: вы полняет вклю чаю щ ее ИЛИ на соответствую щ их битах. Эта ф ункция
мож ет быть указанна как OR.
Синтаксис: result = IO R ( i j ) .
Класс: элементная функция; родовая.
Параметры: / долж ен иметь тип "целочисленное"; j долж ен им еть тип "целочи слен ­
ное" с тем же самым родовым параметром , что и у /.
Р езультаты . Тип результата - тот же, что и у /. Значение результата получено п о би ­
товой комбинацией / и j согласно следую щ ей таблице истинности:
1 J к
1 1 1
1 0 1
0 1 1
0 0 0
М одели для интерпретации целого значения как последовательность битов показаны
в прил. Э-3.
Собственное имя Тип параметра Тип результата
BIOR INTEGER0) INTEGER(I)
IIOR (или HIOR) INTEGER® INTEGER®
JIOR INTEGERS) INTEGERS)
KIOR INTEGERS) INTEGERS)
Примеры
10R (1 ,4 ) имеет значение 5.
10R (1 ,2 ) имеет значение 3.
220 С. Д Алгазин, В. В К ондрат ьев. П рограм ирование на Visual FO RTRAN

IS H A
Описание: ариф м етически сдвигает целое число, влево или вправо на указанное чис­
ло битов.
Синтаксис: result = 1SHA (/, shift).
Класс: элем ентная функция; родовая.
Параметры: / долж ен иметь тип "целочисленное", является параметром, значение ко­
торого будет сдвинуто; shift долж ен иметь тип "целочисленное", является параметром
направления и величины сдвига. П олож ительны е сдвиги влево (к наиболее значимому
биту); отрицательны е сдвиги вправо (к наименее значим ому биту).
Результаты . Тип результата - тот же, что и у /. Результат равен / ариф метически
сдвинутому на shift бит. Если shift положителен, сдвиг - влево; если shift отрицателен,
сдвиг - вправо. Если shift - нуль, никакого сдвига не выполняется.
Биты, вы двинуты е влево или вправо, соответственно, потеряны. Если сдвиг - влево,
справа вставлены нули. Если сдвиг - вправо, копии знакового разряда (0 для неотрица­
тельного /; 1 для отрицательного /) вставлены слева.
Вид целого числа важен в ариф метическом сдвиге, потому что знак изменяется среди
целочисленны х представлений (см. следую щ ий пример). Если вы хотите сдвигать 1-бай­
товы й или 2-байтовы й параметр, вы долж ны объявить его как IN T E G E R (l) или
1NTEGER(2).
Пример
INTEGER(1)i,res1
IN TE G E R ® j,res2
¡ = -128 ! равно 10000000
j = -32768 ! равно 10000000 00000000
res1 = ISHA (i, -4) ! возвращает 11111000 = -8
res2 = ISHA (j, -4) ! возвращает 11111000 00000000 = -2048

IS H C
Описание: циклически сдвигает целое число влево или вправо на указанное число
битов. Биты, вы двинуты е в одном конце, вдвигаю тся в другом конце. Никакие биты не
теряю тся.
Синтаксис: result = 1SHC (/', shift).
Класс: элем ентная функция; родовая.
Параметры: / долж ен иметь тип "целочисленное", является параметром, значение ко­
торого будет циклически сдвинуто; shift долж ен иметь тип "целочисленное", является па­
раметром направления и величины вращ ения. П олож ительны е циклические сдвиги влево
(к наиболее значим ом у биту); отрицательны е циклические сдвиги вправо (к наименее
значимому биту).
Результаты . Т ип результата - тот же, что и у /. Р езультат равен /' циклически сдвину­
том у на shift бит.
Вид целого числа важен при циклическом смещ ении. С параметром 1NTEGER(4),
сдвигаю тся все 32 бита. Если вы хотите циклически сдвинуть 1-байтовый или 2-бай-
товый параметр, вы долж ны объявить его как IN T E G E R (l) или 1NTEGER(2).
Пример
INTEGER(1)i,res1
IN TE G E R ® j,res2
i = 10 ! равно 00001010
Г лава 8 В ст роенны е проц едуры 221
j = 10 ! равно 00000000 00001010
res1 = ISHC (i, -3) ! возвращает 01000001 = 65
res2 = ISHC (j, -3) ! возвращает 01000000 00000001 = 16385

IS H F T
Описание: вы полняет логический сдвиг.
Синтаксис: result = 1SHFT (/', shift)
Класс: элементная функция; родовая.
Параметры: i долж ен иметь тип "целочисленное"; shift долж ен иметь тип "целочис­
ленное". А бсолю тное значение для shift долж но б ь п ь меньш е или равным B 1 T S 1 Z E (/).
Результаты . Тип результата - гот же, что и у /. Результат получает значение / битами,
сдвинутыми на shift позиций. Если shift полож ителен, сдвиг - влево; если shift отри ц ате­
лен, сдвиг - вправо. Если shift - нуль, никакого сдвига не вы полняется. Биты, вы дви н у­
тые слева или справа, соответственно, потеряны. Нули вдвигаю тся с противополож ного
конца. 1SHFT с положительны м сдвигом м ож ет быть указан как LSH1FT (или LSH FT).
ISHFT с отрицательным сдвигом м ож ет бы ть указан как RSH1FT (или RSH FT) с | shift |.
М одели для интерпретации ц ел оч ислен ною значения как последовательность битов
показаны в прил. D-3.
Собственное имя Тип параметра Тип результата
BSHFT INTEGER(I) INTEGER(I)
IIS H F T M n HSHFT) IN TE G E R ® INTEGERS)
JISHFT INTEGERS) INTEGERS)
KISHFT INTEGERS) IN TE G E R ®
Примеры
1SHFT (2, 1) имеет значение 4.
1SHFT (2, - 1 ) имеет значение 1.

IS H F T C
Описание: Вы полняет циклический сдвиг самых правых битов.
Синтаксис: result = ISHFTC (/, shift [, size]).
Класс: элементная функция; родовая.
Параметры: /' долж ен иметь тип "целочисленное"; shift долж ен иметь тип "целочис­
ленное". А бсолю тное значение для shift долж но бы ть меньш е или равным size\ size (opt)
должен иметь тип "целочисленное". Значение size долж но быть полож ительны м и не
долж но превыш ать BIT_SIZE(/'). Если size опущ ен, он, как предполагаю т, им еет значение
BIT_SIZE(/).
Результаты . Тип результата - тот же, что и у /. Значение результата получено цикличе­
ским сдвигом size самых правых битов / на shift позиций. Если shift полож ителен, сдвиг -
влево; если shift отрицателен, сдвиг - вправо. Если shift - нуль, никакой сдвиг не вы п ол­
няется.
Н икакие биты не теряю тся. Биты в i вне значения, указанного size не затрагиваю тся.
М одели для интерпретации целочисленного значения как последовательность битов
показаны в прил. D-3.
Собственное имя Тип параметра Тип результата
BSHFTC INTEGER(1) INTEGER(I)
1ISHFTC (или HSHFTC) INTEGERS) IN TE G E R ®
J ISHFTC INTEGERS) INTEGERS)
KISHFTC INTEGERS) INTEGERS)
222 С Д А лгазин, В В К ондрат ьев. П рограм ирование на Visual FO RTRAN

Примеры
1SHFTC (4, 2, 4) имеет значение 1.
1SHFTC (3, 1, 3) им еет значение 6.

HL
Описание: логически сдвигает целое число влево или вправо на указанное число би­
тов. Нули вдвигаю тся с противополож ного конца.
Синтаксис: result = 1SHL (/, shift).
Класс: элем ентная функция; родовая.
Параметры: / долж ен иметь тип "целочисленное", является параметром, значение ко­
торое будет сдвинуто; shift долж ен иметь тип "целочисленное", является параметром на­
правления и величины сдвига. Если shift полож ительно, / сдвигается влево (к наиболее
значимому биту). Если shift отрицательно, / сдвигается вправо (к наименее значимому
биту).
Результаты . Тип результата - тот же, что и у /. Результат равен / логически сдвину­
тому на shift бит. Нули вдвигаю тся с противополож ного конца.
В отличие от циклических или ариф метических сдвигов, которые могут вдвигать вы­
двигаемые биты, логический сдвиг вдвигает только нули, независимо от направления или
размера сдвига. Вид целого числа, однако, все ещ е определяет конец, из которого выдви­
гаю тся биты, что может привести к различиям в результате (см. следую щ ий пример).
Пример
INTEGER(1)i,res1
INTEGER(2)j,res2
i = 10 ! равно 00001010
j = 10 ! равно 00000000 00001010
res1 = ISHL (i, 5)! возвращает 01000000 = 64
res2 = ISHL (j, 5)! возвращает 00000001 01000000 = 320

IS N A N
Описание: проверяет, является ли действительное IEEE (S floating, Т floating и
X iloating) числом со значением H e-Число (NaN).
Синтаксис: result = ISNAN (jc ) .
Класс: элем ентная функция; родовая.
Параметр: jc долж ен иметь тип "действительное".
Результаты . Тип результата - логическое по умолчанию . Результат - .TRUE., если
х - IEEE NaN; иначе, результат - .FALSE..
Пример
LOGICAL А
DOUBLE PRECISION В

А = ISNAN(B)
А назначается значение .TRU E., если В - IEEE NaN; иначе назначаемое значение -
.FALSE.

JN U M
Описание: преобразовы вает строку символов в значение 1NTEGER(4).
Синтаксис: result = JN U M (/)
Класс: элем ентная функция; собственная.
Параметр: / долж ен иметь тип "символьное".
Гпава 8. В ст роенны е процедуры 223
Результаты . Тип результата - 1NTEGER(4). Значение результата - целочисленное
значение, представленное строкой сим волов /.
Пример
JNUM ("4 6 6 16.725м) им еет значение 46616 типа 1NTEGER(4).

K IN D
Описание: возвращ ает значение типа родового параметра для параметра. (Для полу­
чения дополнительной информации о родовы х параметрах тина см. разд. 2.1.)
Синтаксис: result = K IN D (jc).
Класс: функция запроса; родовая.
Параметр: х м ож ет иметь лю бой встроенны й тип.
Результаты : скаляр целого тина по умолчанию . Результат имеет значение, равное
значению типа родового параметра для х.
Примеры
KIND (0.0) имеет родовое значение действительного типа по умолчанию .
KIND (12) имеет родовое значение целого типа по умолчанию .

LBOUND
Описание: возвращ ает нижние границы для всех измерений м ассива или нижню ю
границу для указанного измерения.
Синтаксис: result = L B O U N D (array [, dim] [, kind]).
Класс: функция запроса; родовая.
Параметры: array долж ен бы ть массивом (лю бого типа данны х), не долж ен быть
распределяемым массивом, который не распределен, или разъединенны м указателем; dim
(opt) должен бы ть скалярным целым числом со значением в диапазоне от 1 до п, где п -
ранг array:; hind (opt) долж ен бы ть инициализированны м скалярным целочисленны м вы ­
ражением.
Результаты . Тип результата - целое число. Если kind присутствует, родовой пара­
метр результата указывается kind; иначе родовой параметр результата - родовой пара­
метр целого типа по умолчанию . Если процессор не м ож ет представить значение резуль­
тата в kind результата, результат неопределенный.
Если dim присутствует, результат - скаляр. И наче результат - одноранговы й массив с
одним элементом для каж дого измерения array. Каждый элем ент в результате соответст­
вует измерению array.
Если array - секция массива или выраж ение м ассив, которое не является целым м ас­
сивом или компонент структуры массив, каждый элем ент результата имеет значение 1.
Если array - целый массив или компонент структуры массив, LBO U N D (array, dim)
имеет значение, равное нижней границе для нижнего индекса для dim из array (если dim
отличен от нуля, или array - массив предполагаемого разм ера ранга dim). И наче соответ­
ствующ ий элем ент результата им еет значение 1.
Установка опций компилятора, указы ваю щ их размер целого числа, м ож ет затронуть
эту функцию.
Примеры
REAL A RRAY A (1:3, 5:8)
REAL ARRAY B (2:8, -3:20)
LBOUND (ARRA Y A) равно (1 ,5 ). L B O U N D (A R RA Y A, D1M=2) равно 5.
224 С. Д. A ic o пт, В В К ондрат ьев. П рограм ирование на Visual FO RTRAN

L B O U N D ( A R R A Y B ) равно (2, -3 ). LBO U N D ( A R R A Y B (5:8, :)) равно (1,1), потому


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

LEAD Z
Описание: возвращ ает число начальных нулевых битов в целом числе.
С ин та кси с: result = L EA D Z (/).
К ласс: элем ентная функция; родовая.
Параметр: / долж ен иметь тип "целочисленное" или "логическое".
Р езультаты . Тип результата - тот же, что и у /. Значение результата - число началь­
ных нулей в двоичном представлении целого числа /.
М одели для интерпретации целочисленного значения как последовательность битов
показаны в ирил. D-3.
Пример
INTEGEFT8 J, TWO
PARAMETER (TW 0=2)
DO J = -1 ,4 0
TYPE *, LEADZ(TW O**J)! Печатает с 64 вниз до 23 (начальные нули)
ENDDO
END

LEN
Описание: возвращ ает длину сим вольного выражения.
С ин та ксис: result = LEN (string [, kind]).
Класс: функция запроса; родовая.
Параметры : string долж ен иметь тип "символьное"; он м ож ет быть скаляром или
м ассивом значений; kind (opt) долж ен бы ть инициализированны м скалярным целочис­
ленны м выраж ением.
Р езультаты . Тип результата - целое число. Если kind присутствует, родовой пара­
м етр результата указы вается kind\ иначе родовой параметр результата - родовой пара­
м етр целого типа по ум олчанию . Если процессор не м ож ет представить значение резуль­
тата в kind, результат неопределенный.
Результат им еет значение, равное числу сим волов в string (если это - скаляр), или в
элем енте string (если это - массив значений).
Собственное имя Тип параметра Тип результата
LEN1 CHARACTER INTEGERS)
CHARACTER INTEGERS)
1Установка опций компилятора, указывающих размер целого числа, может затронуть эту функцию.
Пример
C H A R A C T E R (15) С (50)
C H A R A C T E R (25) D
LEN (С) им еет значение 15, а LEN (D) имеет значение 25.

L E N T R IM
Описание: возвращ ает длину сим вольного параметра, не считая конечных знаков
пробела.
С ин та ксис: result = LEN TRIM (string [, kind]).
К ласс: элем ентная функция; родовая.
Параметры : string долж ен иметь тип "символьное"; kind (opt) долж ен быть инициа­
лизированны м скалярны м целочисленны м выражением.
Г лава 8 В ст роенны е проц едуры 225
Результаты . Тип результата - целое число. Если kind присутствует, родовой пара­
метр результата указы вается kind; иначе родовой парам етр результата - родовой пара­
метр целого числа по умолчанию . Если процессор не м ож ет представить значение р е­
зультата в kind, результат неопределенный.
Результат имеет значение, равное числу сим волов, остаю щ ем уся после того, как л ю ­
бые конечные пробелы в string удалены. Если параметр содерж ит только знаки пробела,
результат - нуль.
Установка опций компилятора, указы ваю щ их разм ер целого числа, м ож ет затронуть
эту функцию.
Примеры
LEN TR1M ('ДДД СДД ЭДДД ') имеет значение 7.
LEN TRIM ('ДДДДД ') имеет значение 0.

LG E
Описание: определяет, больш е или равна одна строка другой строке лексически, о с­
новываясь на A SCII, сопоставляю щ ей последовательности, даж е если принимаемая по
умолчанию сопоставляю щ ая последовательность процессора отлична от нее. В Intel For­
tran LGE эквивалентен оператору > (.GE.).
Синтаксис: result = LGE (strin gja, string_b).
Класс: элементная функция; родовая.
Параметры: siring a долж ен иметь тип "символьное"; string_b долж ен иметь тип
"символьное".
Р езультаты . Тип результата - логическое по ум олчанию . Если строки имею т нерав­
ную длину, сравнение делается так, как будто более короткая строка бы ла расш ирена
справа пробелами до длины более длинной строки. Результат - истина, если строки р ав­
ны, обе строки имею т нулевую длину или если siring a следует за string_b в сопостав­
ляю щ ей последовательности A SCII; иначе результат - ложь.
Собственное имя Тип параметра Тип результата
LGE1 CHARACTER L0GICAL(4)
1Эту собственную функцию нельзя передавать как фактический параметр.
Примеры
LGE ( 'ONE', 'S I X ') имеет значение ложь.
LGE ( 'TW O', 'T H R E E ') имеет значение истина.

LGT
Описание: определяет, больш е ли строка, чем другая строка лексически, основываясь
на сопоставляю щ ей последовательности A SC II, даж е если приним аем ая по умолчанию -
сопоставляю щ ая последовательность процессора отлична от нее. В Intel Fortran, LG T эк­
вивалентен оператору > (.GT.).
Синтаксис: result = LGT (siring a, stringJb).
Класс: элементная функция; родовая.
Параметры: siring a долж ен иметь тип "символьное"; string b долж ен иметь тип
"символьное".
Результаты . Тип результата - логическое по ум олчанию . Е сли строки им ею т нерав­
ную длину, сравнение делается, как будто более короткая строка бы ла расш ирена справа
пробелами до длины более длинной строки.
226 С Д Алгазин, В. В К ондрат ьев П рограм ирование на Visual FORTRAN

Результат - истина, если string_а следует за stringJb в сопоставляю щ ей последова­


тельности A SCII; иначе результат - ложь. Если обе строки имею т нулевую длину, ре­
зультат - ложь.
Собственное имя Тип параметра Тип результата
LGT1 CHARACTER L0GICAL(4)
1 Эту собственную функцию нельзя передавать как фактический параметр.
Примеры
LGT ( 'TW O ', 'TH R EE ' ) имеет значение истина.
LGT ( 'ON E', 'FO U R ' ) им еет значение истина.

LLE
Описание: определяет, м еньш е или равна строка другой строке лексически, основы­
ваясь на сопоставляю щ ей последовательности ASCII, даж е если последовательность
упорядочения но ум олчанию процессора отлична от ASCII. В Intel Fortran LGT эквива­
лентен оператору < (.LE).
С и н та кси с: result = LLE (string_a, string Jb).
Класс: элем ентная ф ункция; родовая.
Параметры : string_a долж ен иметь тин "символьное"; string_b долж ен иметь тип
"символьное".
Результаты . Тип результата - лог ическое по умолчанию . Если строки имею т нерав­
ную длину, сравнение делается, как будто более короткая строка бы ла расш ирена справа
пробелам и до длины более длинной строки.
Результат - истина, если строки равны, или обе строки имею т нулевую длину или ес­
ли siring a предш ествует string_b в сопоставляю щ ей последовательности ASCII; иначе
результат - ложь.
Собственное имя Тип параметра Тип результата
LLE1 CHARACTER L0GICAL(4)
1 Эту собственную функцию нельзя передавать как фактический параметр
Примеры
LLE ( 'TW O ', 'T H R E E ') им еет значение ложь.
LLE ( 'ON E', 'F O U R ') им еет значение ложь.

LLT
Описание: определяет, является ли строка меньш е, чем другая строка лексически,
основы ваясь на сопоставляю щ ей последовательности A SCII, даже если сопоставляю щ ая
п оследовательность процессора по ум олчанию отлична. В Intel Fortran LG T эквивалентен
оператору < (.LT).
Си н та кси с: result = LLT (string_a, string b)
Класс: элем ентная функция; родовая.
Параметры : str in g jx долж ен иметь тип "символьное"; string_b долж ен иметь тип
"символьное".
Р езультаты . Тип результата - логическое по умолчанию . Если строки имеют нерав­
ную длину, сравнение делается, как будто более короткая строка была расш ирена справа
пробелам и до длины более длинной строки.
Результат' - истина, если strin g jx предш ествует string Jb в сопоставляю щ ей последова­
тельности A SC II; иначе результат - ложь. Если обе строки имею т нулевую длину, ре­
зультат - ложь.
Глава 8. В ст роенны е проц едуры 227

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


LLT1 CHARACTER L0GICAL(4)
1 Эту собственную функцию нельзя передавать как фактический параметр.
Примеры
LLT ( 'ONE', 'S I X ') имеет значение истина.
LLT ( 'ONE', 'F O U R ') имеет значение ложь.

LO C
Описание: возвращ ает внутренний адрес элем ента памяти. Эту ф ункцию нельзя п е­
редавать как фактический параметр.
Синтаксис: result = LOC (х).
Класс: функция запроса; родовая.
Параметр: х является переменной, массивом или ссы лкой на поле записи, п роцеду­
рой или константой; он может иметь лю бой тип данны х, не долж ен бы ть именем внут­
ренней процедуры или функции утверж дения. Если этот парам етр - указатель, он долж ен
быть определенным и связанным с адресатом.
Результаты . Тип результата - 1NTEGER(4) на процессорах 1А-32 и 1NTEGER(8) на
процессорах Intel Itanium и Intel ЕМ 64Т. Значение результата представляет адрес объекта
данных или, в случае указателей, адрес связанного с ним адресата. Если параметр недо­
пустим, результат неопределенный.
Эта функция удовлетворяет той же самой цели, что и встроенная ф ункция % LO C.

LOG
Описание: возвращ ает натуральный логариф м параметра.
Синтаксис: result = LOG (х).
Класс: элементная функция; родовая.
Параметр: х долж ен иметь тип "действительное" или "ком плексное". Если х дей стви ­
тельное, его значение долж но бы ть больш е, чем нуль. Если х ком плексное, его значение
не долж но бы ть нулем.
Р езультаты . Тип результата - тот же, что и y i . Значение результата приблизительно
равно loggX.
Если параметры комплексны е, результат - главное значение м нимой части омеги в
диапазоне -к < с о < п . М нимая часть результата п , если вещ ественная часть парам етра -
меньше, чем 0, а мнимая часть параметра - 0.
Собственное имя Тип параметра Тип результата
A L0G 1’2 REAL(4) REAL(4)
DL0G REAL(8) REAL(8)
QL0G REAL(16) REAL(16)
CLOG C0MPLEX(4) C0MPLEX(4)
CDL0G3 C O M P LEX ® C0MPLEX(8)
CQL0G C0MPLEX(16) C0MPLEX(16)
1Эта функция может быть указанна как LOG.
2 Установка опций компилятора, указывающих размер действительного, может затронуть ALOG, LOG и CLOG.
3 Эта функция может быть указанна как ZL0G.
Примеры
LOG (8.0) имеет значение 2.079442.
LOG (25.0) имеет значение 3.218876.
228 С Д. Ачгазин, В. В. К ондрат ьев. П рограм ирование на Visual FORTRAN

L O G IO
Описание: возвращ ает десятичны й логарифм параметра.
Синтаксис: result = LO G 10 (х).
Класс: элем ентная функция; родовая.
Параметр: х долж ен им еть тип "действительное". Значение х долж но бы ть больше,
чем нуль.
Результаты . Тип результата - такой же, как у х. Значение результата приблизительно
равно logio*.
Собственное имя Тип параметра Тип результата
ALOGIO1 REAL(4) REAL(4)
DLOGIO REAL(8) REAL(8)
QL0G1Q REAL(16) REAL(16)
1 Эта функция может также быть указанна как LOGIO. Установка опций компилятора, указывающих размер действительного
числа может затронуть ALOGIO и LOG 10.
Примеры
LOGIO (8.0) им еет значение 0.9030900.
LOG 10 (15.0) им еет значение 1.176091.

L O G IC A L
Описание: преобразовы вает логическое значение параметра к логическому же значе­
нию, но с другим и родовы м и параметрами.
Синтаксис: result = L O G IC A L (/ [, kind]).
Класс: элем ентная ф ункция; родовая.
Параметры: / долж ен им еть логический тип; kind (opt) долж ен быть инициализиро­
ванным скалярным целочисленны м выражением.
Результаты . Тип результата является логическим. Если kind присутствует, родовой
параметр результата указы вается kind\ иначе родовой параметр результата - родовой па­
рам етр логического ти па по ум олчанию . Значение результата - значение /.
У становка опций ком пилятора, указы ваю щ их размер целого числа, м ож ег затронуть
эту функцию.
Примеры
LO G ICA L (L .OR. .NOT. L) им еет значение истина и имеет тип логического типа по
умолчанию независим о от родового парам етра логической переменной L.
LO G ICA L (.FA LSE., 2) им еет значение ложь, с параметром вида 1NTEGER(K1ND=2).

M ALLO C
Описание: распределяет блок памяти. Эту собственную функцию нельзя передавать
как фактический параметр.
С интаксис: result = M A L L O C (/).
Класс: элем ентная функция; собственная.
Параметр: / долж ен им еть тип "целочисленное", размер (в байтах) памяти, которая
будет р асп редел ен а.
Результаты . Тип результата - 1NTEGER(4) на процессорах 1А-32 и IN TEG ER (8) на
процессорах Intel Itanium и Intel ЕМ 64Т. Результат - начальный адрес распределенной
памяти. Распределенная пам ять м ож ет бы ть освобож дена использованием встроенной
функции FREE.
Глава 8 В ст роенны е процедуры 229
Пример
INTEGER(4) SIZE
REAL(4) STORAGE(*)
POINTER (ADDR, STORAGE) ! ADDR указывает на STORAGE
SIZE = 1024! Размер в байтах
ADDR = MALLOC(SIZE) • Распределяет память
CALL FREE(ADDR) ! Освобождает ее

M ATM UL
Описание: вы полняет м атричное ум нож ение числовых или логических матриц.
Синтаксис: result = M A T M U L (m a tr ix a , m a tr ix b )
Класс: трансф орм ационная функция; родовая.
Параметры: matrix a долж ен бы ть массивом ранга 1 или 2, долж ен им еть числовой
(целочисленное, действительное или комплексное) или логический тип; m atrix_Ь долж ен
быть массивом ранга I или 2, долж ен иметь числовой тип, если matrix a им еет числовой
тип или логический тип, если matrix а им еет логический тип. По крайней мере 1 п ара­
метр должен иметь ранг 2. Размер первого измерения matrix b долж ен равняться разм еру
последнего измерения matrix a.
Результаты . Результат - массив, тип которого зависит от типа данны х параметров,
согласно правилам, описанным в "Тип данны х числовых вы ражений". Ранг и ф орм а р е ­
зультата зависят от ранг а и форм параметров следую щ им образом:
■ Если matrix a имеет форму (n, m), a matrix b им еет форму ( т , к), результат - д в у х ­
ранговый массив с формой (п, к).
■ Если matrix a им еет форму (m), a matrix b имеет форму ( т , к), результат - о дн о р ан ­
говый массив с формой (к).
■ Если matrix a имеет форму (n, m), a matrix b имеет форму ( т ) , результат - одн о р ан ­
говый массив с формой (п).
Если параметры имеют числовой тип, элем ент (i, j) результата им еет значение SUM
((строка i из matrix a) * (столбец j matrix b)). Если параметры им ею т логический тип,
элемент (i, j) результата имеет значение ANY ((строка i из matrix a) .AND. (столбец j
matrix_b)).
Примеры
"2 3"
"2 3 4 “
А является матрицей , В является матрицей 34 X является вектором ( 1, 2) ,
_3 4 5_
_4 5_
a Y является вектором (1, 2 3). Результат M A T M U L (А, В) является м атрично-
29 38
матричным произведением AB со значением
38 50
Результат M A TM U L (X, А) является векторно-м атричны м произведением ХА о зн а­
чением (8, 11, 14). Результат M A T M U L (A, Y) является м атрично-векторны м п рои зведе­
нием AY со значением (20, 26).

М АХ
Описание: возвращ ает м аксим альное значение параметров.
Синтаксис: result = М А Х (<а ! , а2 [, а З ,...]).
Класс: элементная функция; родовая.
230 С Д А 1газип, В В К ондрат ьев Программирование на Visual FORTRAN

П а р а м е т р ы : a l, а2 и аЗ (opt) все долж ны им еть одинаковы й тип (целочисленный или


действительны й) и одинаковы е родовы е параметры.
Р е зу л ь т а т ы . Д ля МАХО, А М А Х 1, D M A X1, Q M A X 1, 1МАХ0, JM A X 0 и КМАХО тип
результата - тот же, что и у параметров. Для M A X I, 1МАХ1, JMAX1 и КМ АХ1 тип ре­
зультата - "целочисленное". Для АМАХО, А1МАХ0, A JM A X 0 и АКМАХО результат
им еет тип "действительное". Значение результата - значение наибольш его параметра.
Собственное имя1 Тип параметра Тип результата
INTEGER0) INTEGER(1)
INTEGERd) REAL(4)
IMAXO INTEGERS) INTEGER®
AIMAXO INTEGERS) REAL(4)
MAXO2 INTEGERS) INTEGER(4)
AMAXO3’4 INTEGERS) REAL(4)
KMAXO INTEGERS) INTEGERS)
AKMAXO INTEGERS) REAL(4)
IMAX1 REAL(4) INTEGER(2)
MAX14-5-6 REAL(4) INTEGER(4)
KMAX1 REAL(4) INTEGER(8)
AMAX17 REAL(4) REAL(4)
DMAX1 REAL(8) REAL(8)
QMAX1 REAL(16) REAL(16)
1Эти собственные функции нельзя передавать как фактические параметры
2 Или JMAX0.
3 Или AJMAX0. АМАХО - то же самое, что и REAL(MAX).
4 В Fortran 95/90 АМАХО и МАХ1 - собственные функции без родового имени. Для совместимости со старыми версиями For­
tran эти функции могут также быть указаны как родовые функции
5 Или JMAX1. МАХ1 - то же самое, что и INT(MAX).
6 Установка опций компилятора, указывающих размер целого числа, может затронуть МАХ1.
7 Установка опций компилятора, указывающих размер действительного числа, может затронуть АМАХ1.
Примеры
М А Х (2.0, -8 .0 , 6.0) имеет значение 6.0.
М А Х (14, 32, -5 0 ) им еет значение 32.

M A XEXPONENT
Описание: возвращ ает максим альную экспоненту в модели, представляю щ ей тот же
самый тип и родовы е параметры, что и параметр.
С ин та ксис: result = M A X EX PO N E N T (jc).
Класс: функция запроса; родовая.
Параметр: х долж ен иметь тип "действительное"; он мож ет быть скаляром или мас­
сивом значений.
Р езультаты : скаляр целого типа по умолчанию . Результат имеет значение етах> как
определено в прил. D-2.
Пример
Если X имеет тип REA L(4), M A X E X PO N EN T (X) имеет значение 128.

M AXLOC
Описание: возвращ ает местополож ение м аксим ального значения всех элементов в
массиве, ряда элем ентов в м ассиве или элем ентов в указанном измерении массива.
Син та ксис: result = M A X LO C (array [, dim] [, mask] [, kind]).
Гпава 8 Встроенные процедуры 231
Класс: трансформ ационная функция; родовая.
Параметры: array долж ен быть массивом тина "целочисленное" или "действитель­
ное"; dim (opt) долж ен бы ть скалярным целочисленны м со значением в диапазоне от 1 до
п, где п - ранг array, является возм ож ностью Fortran 95. mask (opt) долж ен быть логи че­
ским массивом, который соответствует array.
kind (opt) долж ен бы ть инициализированны м скалярным целочисленны м выражением.
Результаты . Тип результата - целое число. Если kind присутствует, родовой п ара­
метр результата указы вается kind', иначе родовой параметр результата - родовой пара­
метр целого типа по умолчанию . Если процессор не мож ет представить значение резуль­
тата в kind результата, результат неопределенный.
П рименяются следую щ ие правила, если опущ ен dim :
■ Результат массива имеет ранг единица и размер, равны й рангу array.
■ Если M AXLOC (array) указано, элементы в м ассиве результата форм ирую т нижний
индекс м естоположения элем ента с м аксимальны м значением в array. /-й нижний ин­
декс возвращ ает лож ь в диапазоне от 1 до е„ где е, - предел /-го измерения array.
Если M AXLOC (array, M A SK ^m ask) указано, элементы в массиве результата ф орм и­
рую т нижний индекс местополож ения элем ента с м аксим альны м значением, соответст­
вующим условию, указанному mask.
Если указан dim, применяю тся такие правила:
■ Результат массива имеет ранг, который на единицу м еньш е, чем у array, и форму (d |,
d2, d D|M i, dD|M+1, ..., d„), где (d,, d2, d n) является формой array.
■ Если array имеет ранг единица, M A X LO C (array, dim [,mask]) имеет значение, равное
M AXLOC (array [,M A SK = mask]). И наче значение элем ента (s b s2, s D im i , s D i m + i , •••,

sn) из M AXLOC (array, dim [,mask]) равно M A X LO C (array (si, s2, ..., S d i m - i , •, S d i m m , •••,
sn) [,M ASK = mask (s,, s2, ..., sDllvI- i , s D i m + i , sn)]).
■ Если больш е чем 1 элем ент им еет максим альное значение, элемент, нижние индексы
которого возвращ аю тся, является первым таким элем ентом, взятый в порядке элем ен­
тов массива. Если array имеет нулевой размер или каж дый элем ент array имеет зна­
чение .FALSE., значение результата не определено.
Установка опций компилятора, указы ваю щ их размер целого числа, м ож ет затронуть
эту функцию.
Примеры
Значение M A X LO C ((/3, 7, 4, 7/)) равно (2), которое является нижним индексом м е­
стоположения первого возникновения м аксим ального значения в одноранговом массиве.
4 0 -3 2 “
Пусть А является массивом 3 1-26
-1 -4 5 -5
М АХЬОС (А, М А 5К=А ХТ. 5) имеет значение (1, 1), потому что они являются нижними
индексами местоположения максимального значения (4), которое является меньше, чем 5.
М АХЕОС (А, 01М =1) имеет значение (1, 2, 3, 2). 1 является нижним индексом м есто­
положения м аксимального значения (4) в столбце 1; 2 является нижним индексом м есто­
положения м аксимального значения (1) в столбце 2; и т. д.
М АХЕОС (А, 01М =2) имеет значение (1, 4, 3). 1 является нижним индексом местопо­
ложения максимального значения в строке 1; 4 является нижним индексом м естополож е­
ния максимального значения в строке 2; и т. д.
232 С Д Аъ'азии, В В Кондратьев Програмирование на Visual FORTRAN

MAXVAL
Описание: возвращ ает максим альное значение всех элем ентов в массиве, ряда эле­
ментов в массиве или элем ентов в указанном измерении массива.
С ин та ксис: result = M A X V A L (array [, dim] [, mask]).
Класс: трансф орм ационная функция; родовая.
Параметры: array должен быть массив типа "целочисленное" или "действительное"; dim
(opt) должен быть скалярным целочисленным со значением в диапазоне от 1 до п, где п - ранг
array\ mask (opt) должен быть логическим массивом, который соответствует array.
Р езультаты : является м ассивом или скаляром того же самого типа данных, что и ar­
ray. Результат - скаляр, если dim опущ ен или array им еет ранг 1.
П рименяю тся следую щ ие правила, если опущ ен dim:
■ Если M A X V A L (array) указано, результат им еет значение, равное максимальному
значению всех элем ентов в array.
■ Если M A X V A L (array, MASK=was&) указано, результат имеет значение, равное мак­
сим альном у значению элементов в array, соответствую щ ем у условию , указанному
mask.
П рименяю тся следую щ ие правила, если указан dim :
■ Результат м ассива им еет ранг, который на единицу меньш е чем у array, и форму (d h
d[)|M i, d DIM, i, ..., dn), где (d,, d2, d n) является формой array.
■ Если array имеет ранг единица, M A X V A L (array, dim [,mask]) имеет значение, кото­
рое равно M A X V A L (array [,M A SK = mask]). И наче значение элемента (s b s2, ...,
S d i m - i > Sd i m m , sn) из M A X LO C (array, dim [,mask]) равно M A X LO C (array (s b s2, ...,
Sdim ь sD|m+i, sn) [,M A SK = mask (s b s2, ..., sD|M- 1, sD|M+ i , s n)]).
■ Если array им еет разм ер нуль или если нет никаких истинных элем ентов в mask, ре­
зультат (если dim опущ ен), или каж дый элем ент в массиве результата (если dim ука­
зан), им еет значение отрицательного числа наибольш ей величины, поддерж иваемой
процессором для чисел типа и родовых парам етров array.
Примеры
Значение M A X V A L ((/2, 3, 4/)) равно 4, потом у что это - максим альное значение в
одноранговом массиве.
M A X V A L (В, MASKHB .LT. 0.0), находит м аксим альное значение отрицательных
элем ентов В.
"2 3 4 '
П усть С является массивом
_5 6 7 _

M A X V A L (С, D IM =1) имеет значение (5, 6, 7). 5 - максим альное значение в столб­
це 1; 6 - м аксим альное значение в столбце 2; и т. д.
M A X VA L (С, D1M=2) имеет значение (4, 7). 4 - максимальное значение в строке 1; 7 -
м аксим альное значение в строке 2.

M CLOCK
Описание: возвращ ает время, подсчитанное для программы .
С ин та ксис: result = M C LO C K ( ) .
Класс: функция запроса; собственная.
Параметры : нет.
Глава 8 Встроенные процедуры 233
Результаты . Тип результата - целое число. Результат - сум м а (в м икросекундах)
пользовательского времени текущ его процесса и пользователя и системного времени
всех его дочерних процессов.

M ERGE
Описание: выбирает между двум я значениям и или м еж ду соответствую щ им и эл е­
ментами в двух массивах, согласно условию , указанному логической маской.
С интаксис: result = M ERG E (tsou rce,/source, mask)
Класс: элем ентная функция; родовая.
Параметры: tsource долж ен бы ть скаляром или м ассивом (лю бого ти п а данных).
/so u rce долж ен быть скаляром или м ассивом того же самого ти п а и парам етров типа, что
и tsource; mask долж ен быть логическим м ассивом.
Результаты . Тип результата - тот же, что и у tsource. Значение mask определяет, б е­
рется ли значение результата из tsource (если mask - истинна) или /so u rc e (если mask -
ложь).
Примеры
Д ля R = - 3 M ERG E (1.0, 0.0, R <0) имеет значение 1.0, а для R = 7 им еет значение 0.0.
"13 5 “ "8 9 0"
П усть TSO U RC E является м ассивом , FSO U R C E является м ассивом
_2 4 6 _
! 23
FTT
a M A SK является массивом
TTF
835
M ERG E (TSO U RCE, FSO U RCE, M A SK ) производит результат:
243

M IN
Описание: возвращ ает минимальное значение параметров.
С интаксис: result = MIN (a l , а2 [, а З,...]).
Класс: элементная функция; родовая.
Параметры: a l, а2 и аЗ (opt) все долж ны им еть один и тот ж е тип (целочисленное
или действительное) и одинаковы е родовы е параметры.
Результаты : для MINO, AM1N1, DM1N1, QM 1N1,1M 1N0, JM1N0 и KM1N0 тип резуль­
тата - тот же, что и у параметров. Д ля MI NI , 1M1N1, JM IN1 и KM IN1 тип результата -
"целочисленное". Для AM1N0, A1M1N0, AJM1N0 и AKM1N0 результат им еет тип "дейст­
вительное". Значение результата - значение наим еньш его параметра.
Собственное имя1 Тип параметра Тип результата
INTEGERd) INTEGERd)
INTEGERd) REAL(4)
IMIN0 INTEGER® INTEGER®
AIMIN0 INTEGER® REAL(4)
MINO2 INTEGERS) INTEGERS)
AMINO3-4 INTEGERS) REAL(4)
KMINO INTEGERS) INTEGER®
AKMINO INTEGER® REAL(4)
IMIN1 REAL(4) INTEGER®
MINI4-5-6 REAL(4) INTEGERS)
234 С. Д Алгашн, В В. Кондратьев. Программирование на Visual FORTRAN

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


KMIN1 REAL(4) INTEGERS)
AMIN17 REAL(4) REAL(4)
DMIN1 REAL(8) REAL(8)
QMIN1 REAL(16) REAL(16)
1 Эти собственные функции нельзя передать как фактические параметры,
г Или JMIN0
3 Или AJMINO. AMIN0 - то же, что и REAL (MIN).
4 В Fortran 95/90 AMINO и M IN I - собственные функции без родового имени. Для совместимости со старыми версиями For­
tran, эти функции могут быть указанны как родовые функции.
5 Или JMIN1. MIN1 - то же, что и INT (MIN)
6 Установка опций компилятора, указывающих размер целого числа, может затронуть MIN1.
7 Установка опций компилятора, указывающих размер действительного числа, может затронуть AMIN1.

Примеры
MIN (2.0, -8 .0 , 6.0) им еет значение -8 .0 .
M IN (14, 32, -5 0 ) им еет значение -5 0 .

M IN E X P O N E N T
Описание: возвращ ает м иним альную экспоненту в модели, представляю щ ей гот же
самый тип и родовы е парам етры , что и параметр.
Си н та кси с: result = M IN EX PO N E N T (.v).
Класс: функция запроса; родовая.
Параметр: х долж ен им еть тип "действительное"; м ож ет бы ть скаляром или м асси­
вом значений.
Р езультаты . Р езультат - скаляр целого типа по умолчанию . Результат имеет значение
emin, как определяется в прил. D-2.
Пример
Если X имеет тип R E A L (4), M IN EX PO N E N T (X) им еет значение -125.

M IN L O C
Описание: возвращ ает м естополож ение минимального значения всех элементов в
м ассиве, ряде элем ентов в м ассиве или элем ентов в указанном измерении массива.
С ин та ксис: result = M IN LO C (array [, dim] [, mask] [, kind]).
Класс: трансф орм ационная функция; родовая.
Параметры : array должен быть массивом типа "целочисленное" или "действительное";
dim (opt) должен быть скалярны м целочисленны м со значением в диапазоне от 1 до п, где
п - ранг а\тау\ является возм ож ностью Fortran 95. mask (opt) должен бы ть логическим мас­
сивом, который соответствует' airay. kind (opt) долж ен б ь п ь инициализированным скаляр­
ным целочисленны м вы раж ением .
Р езультаты . Результат - массив т ипа "целочисленное". Если параметр kind присутст­
вует, родовой параметр результата указы вается kind\ иначе родовой параметр результа­
та - родовой парам етр целого типа по умолчанию . Если процессор не может представить
значение результата в kind, результат неопределенны й.
П рименяю тся следую щ ие иравила, если опущ ен dim :
■ Результат м ассива им еет ранг единица и размер, равный рангу array.
■ Если M IN LO C (array) указано, элем енты в м ассиве результата формирую т нижний
индекс м естополож ения элем ента с минимальны м значением в array. /-й нижний ин­
декс возвращ ает лож ь в диапазоне от 1 д о г,, где е} - предел /-го измерения array.
Г iaea 8 Встроенные процедуры 235
■ Если M 1N L 0C (array, M ASK=/m s&) указано, элем енты в м ассиве результата ф орм и ­
рую т нижний индекс м естополож ения элем ента с м иним альны м значением , соответ­
ствую щ им условию , указанному mask.
Применяю тся следую щ ие правила, если указан dim:
■ Результат массив им еет ранг, который на единицу м еньш е, чем у a rra y, и ф орм у (d b
d2, ..., d D|M-i, d D|M+ i , d „ ) , где ( d h d2, d n) является форм ой array.
■ Если array имеет ранг единица, M1NLOC (array, dim [,mask]) им еет значение, равное
M1NLOC (array [,M A SK = mask]). И наче значение элем ента ( s h s2, ..., sD|M-i, Sdim+i, •••,
sn) из M1NLOC (array, dim [,mask]) равно M IN LO C (array (si, s2, ..., sD|M-i, sD|M+i,
sn) [,M ASK = mask (si, s2, s Dim-i, sDim+i? •••, sn)]).
■ Если больш е чем 1 элем ент им еет минимальное значение, элем ент, ниж ние индексы
которого возвращ аю тся, является первым таким элем ентом , взятым в порядке эле­
ментов массива. Если array имеет нулевой разм ер или каж ды й элем ент array им еет
значение .FA LSE., значение результата не определено.
У становка опций компилятора, указы ваю щ их разм ер целого числа, м ож ет затронуть
эту функцию.
Примеры
Значение M IN LO C ((/3, 1, 4, 1/)) равно (2), которое является нижним индексом м есто­
положения первого появления минимального значения в одноранговом массиве.
" 4 0 -3 2
П усть А является массивом 3 1 -2 6
УП

-1
1
1

M IN LO C (A, M A SK =A .GT. - 5 ) им еет значение (3, 2), потому что они являю тся н иж ­
ними индексами м естополож ения минимального значения (-4 ), которое больш е, чем - 5 .
M IN LO C (A, D IM =1) имеет значение (3, 3, 1, 3). 3 является нижним индексом м есто­
положения м инимального значения (-1 ) в столбце 1; 3 является нижним индексом м есто­
положения м инимального значения (-4 ) в столбце 2; и т. д.
M IN LO C (A, D1M=2) имеет значение (3, 3, 4). 3 является ниж ним индексом м естоп о­
ложения минимального значения (-3 ) в строке 1; 3 является ниж ним индексом м естопо­
ложения минимального значения (-2 ) в строке 2; и т. д.

M IN V A L
О п и сан и е: возвращ ает минимальное значение всех элем ентов в м ассиве, ряде эле­
ментов в массиве или элем ентов в указанном измерении м ассива.
С и н т а к с и с : result = M IN V A L (array [, dim] [, mask]).
К л асс: трансф орм ационная функция; родовая.
П а р а м е т р ы : array долж ен бы ть массивом типа "целочисленное" или "действитель­
ное"; dim (opt) долж ен бы ть скалярным целочисленны м со значением в диапазоне от 1 до
п, где п - ранг array, mask (opt) долж ен бы ть логический массив, которы й является со о т­
ветствую щ им с array.
Р е зу л ь та т ы . Результат - массив или скаляр того же самого типа данны х, что и array.
Результат - скаляр, если dim опущ ен, или array имеет ранг единица.
Применяю тся следую щ ие правила, если опущ ен dim :
■ Если M INVAL (array) указано, результат имеет значение, равное м иним альном у зн а­
чению всех элементов в array.
236 С. Д. Алгазин, В. В. Кондратьев. Программирование на Visual FORTRAN

■ Если M 1NVAL (array, M A SK =mask) указано, результат имеет значение, равное мини­
м альному значению элем ентов в array, соответствую щ ем условию , указанному mask.
П рименяю тся следую щ ие правила, если указан dim :
■ Результат м ассив им еет ранг, которы й на единицу меньш е, чем у array, и форму (d|,
d2, d D|M_,, d D|M+ i , d n), где ( d h d2, d n) является формой array.
■ Если array имеет ранг единица, M 1NVAL (array, dim [,mask]) имеет значение, равное
M1NVAL (array [,M A SK = mask И наче, значение элем ента (si, s2, ..., Sdim-i» sD|M+i,
sn) из M 1NVAL (array, dim [,mask]) равно M 1NVAL (array (si, s2, ..., sDim-i, Sdim+i, —,
sn) [,M A SK = mask (si, s2, ..., sD|M- i , s Dim+i, sn)]).
■ Если array имеет разм ер нуль или если нет никаких истинных элементов в mask, ре­
зультат (если dim опущ ен) или каж дый элем ент в м ассиве результата (если dim ука­
зан) им еет значение полож ительного числа наибольш ей величины, поддержанной
процессором для чисел типа и родовы х параметров array.
Примеры
Значение M 1NVAL ((/2, 3, 4/)) равно 2, потому что оно является минимальным значе­
нием в одноранговом массиве.
Значение M 1NVAL (В, M A SK =В .GT. 0.0), находит м инимальное значение положи-
'2 3 4"
тельны х элем ентов В. С является массивом
567
M1NVAL (С, D1M=1) имеет значение (2, 3, 4). 2 является минимальным значением
в столбце 1; 3 является м инимальны м значением в столбце 2; и т. д.
M1NVAL (С, D IM =2) им еет значение (2, 5). 2 является минимальным значением
в строке 1 и 5 является м инимальны м значением в строке 2.

MMPREFETCH
О п и са н и е: данны е предвы борок из указанного адреса на одной строке кеш а памяти.
С и н т а к с и с : C A LL M M _PR EFET C H (address [, hint] [, fault] [, exclusive]).
К л асс: подпрограмма.
П а р а м е т р ы : address является именем скаляра или массива; мож ет иметь любой тип
или ранг; указы вает адрес данны х в строке кеш а для предварительной выборки; hint (opt)
является необязательной константой целого типа по ум олчанию с одним из следующ их
значений:
Значение Константа предвыборки Описание
0 f o r _ k _ p r e f e t c h _ to Предвыборки в кеше И (и 12 и 1.3 кеше). Используйте это для цело­
численных данных
1 FOR_K_PREFETCH_T 1 Предвыборки в кеше 12 (и кеше 1.3); данные с плавающей точкой ис­
пользуются из кеша 12, но не кеша И . Используйте это для действи­
тельных данных
2 F0R_K_PREFETCH_T2 Предвыборки в кеше 12 (и кеше 1.3); эта линия будет отмечена для
раннего смещения. Используйте ее, если вы не собираетесь часто
повторно использовать строку кеша
3 f o r _k_p r e f e t c h _n ta Предвыборки в кеше 12 (но не кеше 1.3); эта линия будет отмечена
для раннего смещения. Используйте ее, если вы не собираетесь по­
вторно использовать строку кеша
П реды дущ ие возвращ аем ы е значения определены в файле fordef.f на системах Linux*
и M ac OS* и файле fordef.for на системах W indows*.
Гпава Н. Встроенные процедуры 237
Если параметр hint опущ ен, предполагается значение 0.
fa u lt (opt) является необязательной константой логического типа по ум олчанию . Если
.TRUE, указано, отсутствие страницы допускается в случае необходим ости; если .FALSE,
указано, отсутствие страницы не допускается. Если fa u lt опущ ен, .FALSE, предполагает­
ся. Этот параметр игнорируется на процессорах Intel ЕМ 64Т и 1А-32.
exclusive (opt) является необязательной константой логического типа по ум олчанию .
Если .TRUE, указано, вы получаете исклю чительное монопольное использование строки
кеша, потому что вы предполагаете назначить ей значение; если .FA LSE, указан, нет ни­
какого исклю чительного м онопольного использования. Если exclusive опущ ен, .FALSE,
предполагается. Этот параметр игнорируется на процессорах Intel ЕМ 64Т и 1А-32.
Пример
subroutine spread J f (a, b)
PARAMETER (n = 1025)
real*8 a(n,n), b(n,n), c(n)
do j = 1,n
do i = 1,100
a(i,j) = b(i-1, j) + b(i+1, j)
call mm_prefetch (a(i+20, j), 1))
call mm_prefetch (b(i+21, j), 1))
enddo
enddo
print *, a(2, 567)
stop
end

MOD
Описание: возвращ ает остаток от деления первого параметра на второй.
Синтаксис: result = M O D (а , р ).
Класс: элементная функция; родовая.
Параметры: а долж ен иметь тип "целочисленное” или "действительное"; р долж ен
иметь тот же самый тип и родовы е параметры , что и а.
Результаты . Тип результата - тот же, что и у а. Если р не равен нулю , значение р е­
зультата а - lN T (a/p) х р. Если р равен нулю, результат неопределенны й.
Собственное имя Тип параметра Тип результата
BMOD INTEGERd) INTEGER(1)
IMOD ((или HMOD) IN TE G E R ® IN TE G E R ®
MOD (или JMOD) INTEGERS) INTEGERS)
KMOD INTEGERS) INTEGERS)
AMOD1 REAL(4) REAL(4)
DMOD REAL(8) REAL(8)
QMOD REAL(16) REAL(16)
1 Установка опций компилятора, указывающих размер действительного числа, может затронуть AMOD.

Примеры
MOD (7, 3) - значение 1.
M OD (9, -6 ) - значение 3.
M OD (-9 , 6) - значение - 3 .
238___________ с д А чгат н .В В Кондратьев Программирование на Visual FORTRAN

M ODULO
Описание: возвращ ает м одуль параметров.
Синтаксис: result = M O D U LO (а ,р ).
Класс: элем ентная функция; родовая.
Параметры: а долж ен иметь тип "целочисленное” или "действительное"; р должен
бы ть инициализированным скалярным целочисленны м выраж ением а.
Результаты . Тин результата - тот же, что и у а. Значение результата зависит от типа
а следую щ им образом:
■ Если тип "целочисленное" и р не равен нулю, значение результата а - FLOOR(REAL(¿z)/
REAL(p)) * p.
■ Если типа "действительное" и р не равен нулю, значение результата а - FLOOR(a/p) * р.
■ Если р равен нулю (независим о от типа а), результат неопределенный.
Примеры
M O D ULO (7, 3) - значение 1.
M O D ULO (9, - 6 ) - значение - 3 .
M O D ULO (-9 , 6) - значение 3.

M OVEALLOC
Описание: перем ещ ает распределение из одного распределяем ого объекта в другой.
S yntax: CA LL M O V E _A L L O C (from, to).
Класс: подпрограмма.
Параметры: from м ож ет иметь лю бой тип и ранг; долж ен бы ть распределяемы м; to
долж ен быть совместим с типом from и иметь тот ж е самый ранг; долж ен быть распреде­
ляемым.
■ Если to в настоящ ее время распределен, он освобож дается.
■ Если from распределен, to распределяется с тем ж е самым типом, параметрами типа,
границами м ассива и значением , что и from . Потом fro m освобож дается.
■ Если to им еет атрибут T A R G ET, лю бой указатель, связанны й с fro m во время вызова,
M OVE A LLO C становится соответственно связанны м с to. Если to не имеет атрибута
TA RG ET, состояние связывания лю бого указателя, связанного с from на входе, стано­
вится неопределенным.
Во время реализации M O V E A LLO C , внутреннее дескрипторное содерж имое кото­
рой копируется т fro m в to так, чтобы память, указанная to , бы ла той же самой.
Как правило, M O V E A L LO C используется, чтобы обеспечить эффективный способ
перераспределить переменную к больш ем у размеру, не копируя данны е дважды.
Примеры
Пример того, как увеличивать распределенны й разм ер А и сохранить старые значения
только в одной копии:
integer,allocatable::a(:),b(:)
п=2
allocate (a(n), Ь(п*2))
a=(/(i,i=1,n)/)
b=-1
print *,' Old а = ',а
print * ,' Old b = \b
print * ,' Allocated(a), allocated(b) = allocated(a), allocated(b)
Глава <У Встроенные процедуры 239

Ь(1:п)=а! Копирует все из а в нижний конец b (одна копия)


print * ,' New b = ',b

call move_alloc(b,a)! Делает а контейнером, освобождает b (НЕТ копии!)


print * ,' New a = ',a
print * ,' Allocated(a), allocated(b) = allocated(a), allocated(b)
end
Следую щ ий пример дем онстрирует другое выраж ение:
! Эта программа использует MOVE_ALLOC, чтобы сделать распределенный
! массив X больше и сохранить старые значения X, делая только одну
! копию старых значений X
integer:: п = 2
real, allocatable:: х(:), у(:)
allocate (x(n), y(2*n))! Y больше чем X
х = (/(¡,¡=1 ,п)/) ! помещает "старые значения" в X
Y = -1 ! помещает другие "старые значения" в Y
print * ,' распределен X — allocated (X)
print * ,' распределен Y - ' , allocated (Y)
print * ,' старый X - X print * ,' старый Y - Y

у (1:n) = x ! копирует все X в первые местоположения Y только


! это единственное копирование значений требуется
print * ,' новый Y - ' , у

call move_alloc (у, х) ! X является теперь в 2 раза большим, чем


! был, Y освобожден, значения не были скопированы

print * ,' распределен X — allocated (X)


print * ,' распределен Y - ' , allocated (Y)
print * ,' новый X - x

end
Вывод для предыдущ его примера:
распределен X - Т
распределен Y - Т
старый X - 1.0000002.000000
старый Y - -1.000000 -1.000000 -1.000000 -1.000000
новый Y -1 .0 0 0 0 0 0 2.000000 -1.000000 -1.000000
распределен X - Т
распределен Y - F
новый X - 1.000000 2 000000 -1.000000 -1.000000

M U L T H I G H (то ль ко ¡64)
Описание: ум нож ает два 64-битовы х целых числа без знака. Эта собственная ф унк­
ция не имеет никакой родовой ф ункции, связанной с ней и доступна только на п роцессо­
рах Intel Itanium. Ее нельзя передавать как фактический параметр.
Синтаксис: result = M U LT HIGH (/,_/).
Класс: элементная функция; собственная.
Параметры: I долж ен иметь тип IN TEG ER(8); j долж ен иметь тип IN TEG ER(8).
240 С. Д Алгазин, В. В. Кондратьев Программирование на Visual FORTRAN

Р езультаты . Тип результата - 1NTEGER(8). Значение результата - старш ие (крайние


левы е) 64 бита 128-битового результата без знака.
Пример
IN TE G E R ® Ц К
1=2_8**53
J=2_8**51
К = MULTJHIGH (I.J)
PRINT M.J.K WRITE (6,1000)I,J,K
1000 FORMAT (", 3(Z,1X))
END
Этот прим ер печатает:
9007199254740992 2251799813685248 1099511627776
20000000000000 8000000000000 10000000000

M V B IT S
Описание: копирует последовательность битов (битовое поле) из одного м естополо­
жения в другое.
С ин та кси с: C A L L M V BITS (from, from pos, len, to, topos).
Класс: элем ентная подпрограмма.
Параметры. И меет 5 парам етров':
from мож ет иметь лю бой целочисленны й тип, представляет местополож ение, из кото­
рого передается битовое поле.
frompos м ож ет иметь лю бой целочисленны й тип; не долж ен бы ть отрицательным. Он
идентиф ицирует первую битовую позицию в поле, переданном из from, frompos + len
долж но бы ть м еньш е или равным B1T S1ZE (from).
len м ож ет иметь лю бой целочисленны й тип; не долж ен бы ть отрицательным. Он
идентиф ицирует длину поля, переданного из from.
to мож ет иметь лю бой целочисленны й тип, но долж ен иметь тот же родовой пара­
метр, что vi from . Он представляет м естополож ение, в которое передается битовое поле;
to устанавливается копированием последовательности битов длины len , начинаю щ ейся в
позиции from pos from , в позицию topos to. Н икакие другие биты to не изменяю тся. По
возвращ ении len битов, to (начинаю щ ихся в topos) равны значению , которое биты len
from (начинаю щ иеся в frompos) имели на входе. (М одели для интерпретации целочис­
ленного значения как последовательности битов показаны в прил. D-3.)
topos м ож ет иметь лю бой целочисленны й тип; он не долж ен бы ть отрицательным. Он
идентиф ицирует исходную позицию (внутри to) для передаваем ы х битов, topos + len
долж но бы ть м еньш е или равным B1T S1ZE (to).
Вы м ож ете такж е использовать следую щ ие собственны е подпрограммы:
BM VB1TS - парам етры from и to долж ны бы ть IN T E G E R (l).
HM VB1TS - параметры from и to долж ны бы ть 1NTEGER(2).
1MVB1TS - все парам етры долж ны бы ть 1NTEGER(2).
JM VB1TS - парам етры могут бы ть 1NTEGER(2) или IN TEG ER(4); по крайней мере
один долж ен бы ть ÍN TEG ER(4).
KMVB1TS - параметры могут бы ть 1NTEGER(2), 1NTEGER(4) или INTEGER(8); rio
крайней мере один долж ен бы ть 1NTEGER(8).

1FROM; FROMPOS, LENи TOPOS - параметры INTENT (IN); TO - параметр INTENT (INOUT).
Для получения дополнительной информации о INTENTсм. разд. 4.11.
Глава 8. Встроенные процедуры 241
Пример
Если ТО имеет начальное значение 6, его значение после того, как вы зов в MVB1TS
(7, 2, 2, ТО, 0) равно 5.

NARGS
Описание: возвращ ает общ ее количество параметров ком андной строки, вклю чая
команду. Эту функцию нельзя передавать как ф актический параметр.
Синтаксис: result = NA RG S ( ) .
Класс: функция запроса; собственная.
Параметры: нет.
Результаты . Тип результата - 1NTEGER(4). Результат - число парам етров командной
строки, включая команду. Н априм ер, N A RG S возвращ ается 4 для вы зова командной
строки PROG 1 -g -с -а.
Пример
IN TE G ER ® result
result = RUNQQCmyprog', '-с -г')
END
! MYPROG F90 отвечает на переключатели команды -г, -с, и/или -d
INTEGER(4) count, num, i, status
C H A R A C TE R S ) buf
REAL r1 10 .0 1
COMPLEX c1 / (0.0,0 .0 )/
REAL(8) d1 / 0 .0 1
num = 5
count = NARGS()
DO i = 1, count-1
CALL GETARG(i, buf, status)
IF (status .It. 0) THEN
WRITE (*,*) 'GETARG error - exiting*
EXIT
END IF
IF (buf(2:status) .EQ.'r') THEN
r1 = REAL(num)
WRITE (*,*) Y1 = \r1
ELSE IF (buf(2:status) .EQ.'c') THEN
c1 = CMPLX(num)
WRITE (*,*) *c1 = ', c1
ELSE IF (buf(2:status) .EQ.'d') THEN
d1 = DBLE(num)
WRITE (*,*)'d1 = ', d1
ELSE
W R ITE (Y ) 'Invalid command switch:', buf (1:status)
END IF
END DO
END

NEAREST
Описание: возвращ ает самое близкое число (представим ое на процессоре) в данном
направлении.
Синтаксис: result = N E A R EST (х, s).
Класс: элементная функция; родовая.
242 С Д Ачгатн, В В. Кондратьев. Програмирование на Visual FORTRAN

Параметры : jc долж ен иметь тип "действительное"; s долж ен иметь тип "действи­


тельное" и отличное от нуля.
Р езультаты . Тип результата - тот же, что и у jc . Результат имеет значение, равное
маш инному представим ом у числу, которое отличается о т * и самое близкое к нему в на­
правлении бесконечности с тем же самым знаком, что и у s.
Пример
Если 3.0 и 2.0 - значения R E A L (4), N E A R EST (3.0, 2.0) имеет значение 3 + 2~22, кото­
рое равняется приблизительно 3.0000002. (Для получения дополнительной информации о
модели для REA L (4), см. прил. D-2.)

N IN T
Описание: возвращ ает сам ое близкое целое число к параметру.
С и н та кси с: result = N IN T (а [, kind]).
К ласс: элементная функция; родовая.
Параметры : а долж ен иметь тип "действительное", kind (opt) долж ен быть инициали­
зированны м скалярны м целочисленны м выражением.
Р езультаты . Тип результата - целое число. Если kind присутствует, родовой пара­
метр результата указы вается kind; иначе родовой параметр результата - родовой пара­
метр целого типа по ум олчанию . Если процессор не мож ет представить значение резуль­
тата в kind, результат неопределенны й.
Если а больш е, чем нуль, N IN T (а) имеет значение INT (а + 0.5); если а м еньш е или
равно нулю , N IN T (а) имеет значение INT (а - 0.5).
Собственное имя Тип параметра Tun результата
ININT REAL(4) INTEGER®
NINT1-2 REAL(4) INTEGER(4)
KNINT REAL(4) INTEGER(8)
IIDNNT REAL(8) INTEGER(2)
IDNINT2-3 REAL(8) INTEGER(4)
KIDNNT REAL(8) INTEGER(8)
IIQNNT REALO 6) INTEGER(2)
IQNINT2-4 REAL(16) INTEGER(4)
KIQNNT5 REALO 6) INTEGER(8)
1 Или JNINT
2 Установка опций компилятора, указывающих размер целого числа, может затронуть NINT, IDNINT и IQNINT.
3 Или JIDNNT. Для совместимости со старыми версиями Fortran, IDNINT может быть указана как родовая функция
4 Или JIQNNT. Для совместимости со старыми версиями Fortran, IQNINT может быть указана как родовая функция.
5 Эту собственную функцию нельзя передавать как фактический параметр.

Примеры
N1NT (3.879) им еет значение 4.
N1NT (-2 .7 8 9 ) имее '1 зн а ч е н и е - 3 .

NOT
Описание: возвращ ает логическое отрицание параметра.
С и н та кси с: result = N O T (/).
К ласс: элем ентная ф ункция; родовая.
Параметр: / долж ен им еть тин "целочисленное".
Р езультаты . Т ип результата - тот же, что и у /. Значение результата получается поби­
товы м дополнением / согласно следую щ ей таблице истинности:
Глава 8 Встроенные процедуры 243
1 N01(1)
1 О
О 1
М одели для интерпретации целочисленного значения как п оследовательность битов
показаны в прил. 0 -3 .
Собственное имя Тип параметра Тип результата
B N0T INTEGER(I) IN TEG ER 0)
IN 0T (или HN0T) IN TE G E R ® IN T E G E R ®
JN 0T INTEGERS) INTEGERS)
KNOT IN TE G E R ® IN TE G E R ®
Пример
Если 1 им еет значение, равное 10101010 (основание 2), N O T (l) им еет значение
01010101 (основание 2).

NULL
Описание: инициализирует указатель как разъединенны й, когда он заявляется. Это -
новая встроенная процедура в Fortran 95.
Синтаксис: result = N U LL ([mold]).
Класс: трансф орм ационная функция; родовая.
Параметр: m old (opt) долж ен бы ть указателем; он м ож ет им еть лю бой тип. Его со ­
стояние связывания м ож ет быть: связанны й, разъединенны й или неопределенны й. Если
его состояние - связанны й, адресат не долж ен бы ть определен со значением .
Результаты . Тип результата - тот же, что и у m old (если он присутствует); иначе он
определяется так, как показано в таблице.
Если появляется NULLQ: Тип определяется из'
На правой стороне назначения указателя Указателя на левой стороне
Объект
Как инициализация для объекта в объявлении
Компонент
Как инициализация по умолчанию для компонента соответст­ Соответствующий компонент
вующий макет Соответствующий формальный аргумент
В конструкторе структуры
Как фактический параметр Соответствующий указатель объекта
В утверждении DATA
Результат - указатель с разъединенны м состоянием связы вания.
Пример
INTEGER, PO IN TER :: P0INT1 => NULL()
Это утверж дение определяет начальное состояние связы вания для PO IN T 1, которы й
будет разъединенным.

PACK
Описание: берет элементы из массива и упаковы вает их в одноранговы й массив под
управлением маски.
Синтаксис: result = PACK (array, mask [, vector]).
Класс: трансформ ационная функция; родовая.
Параметры: array долж ен бы ть массивом (лю бого типа данны х); m ask долж ен им еть
логический тип и соответствовать array, определяет, какие элем енты взяты из a rra y; vec­
tor (opt) долж ен бы гь одноранговым массивом с тем и же сам ы м и параметрами ти п а и ти ­
244 С. Д. А казни, В. В Кондратьев Програмирование на Visual FORTRAN

пом что и array. Его разм ер долж ен бы ть по крайней мере t, где t - число истинных эле­
ментов в mask. Если mask - скаляр со значением истина, vector долж ен иметь по крайней
мере столько элем ентов, сколько есть в array. Элементы в vector использую тся, чтобы
заполнить м ассив результата, если в нем недостаточно м ного элем ентов для отобранных
mask.
Р езультаты . Результат - одноранговы й массив с теми же самы ми параметрами типа и
того же типа что и у array. Если vector присутствует, размер результата - размер vector.
И наче, размер результата - число истинных элем ентов в mask или число элементов в ar­
ray (если mask - скаляр со значением истина).
Элементы в array обрабаты ваю тся в порядке элем ентов массива, чтобы сф ормировать
массив результата. Э лем ент / результата является элементом array , который соответству­
ет i-му истинному элем енту mask. Если vector присутствует и имеет больш е элементов,
чем в mask есть истинны х значений, лю бы е элементы результата, которые являю тся пус­
ты м и (потому что они не бы ли истинны согласно mask), собираю тся в соответствую щ ие
значения vector.
Примеры
080
П усть N является массивом ООО
700
PACK (N, M A SK EN .NE. 0, V E C T O R ^ /l, 3, 5, 9, 11, 13/)) производит результат (7, 8,
5 ,9 , 11, 13).
PACK (N, M A SK EN .NE. 0) производит результат (7, 8).

POPCNT
Описание: возвращ ает число единичны х битов в целочисленном параметре.
С ин та ксис: result = PO PC N T (/).
Класс: элем ентная ф ункция; родовая.
Параметры : / долж ен им еть тип "целочисленное" или "логическое".
Р езультаты . Тип результата - тот же, что и у /. Значение результата - число первых
битов в двоичном представлении целого числа /.
М одели для интерпретации целочисленного значения как последовательность битов
показаны в прил. D-3.
Пример
Если значение 1 - В '0 ...0 0 0 1 1010110', значение PO PCN T (1) равно 5.

POPPAR
Описание: возвращ ает четность целочисленного параметра.
С ин та ксис: result = PO PPA R (/).
К ласс: элем ентная ф ункция; родовая.
Параметр: / долж ен им еть тип "целочисленное" или "логическое".
Р езультаты . Тип результата - гот же, что и у /. Если число единичны х битов в двоич­
ном представлении целого числа / - нечетное, значение результата равно 1. Если четное
число, значение результата равно нулю.
PO PPA R (/) является тем же самым что и 1 .AND. POPCN T(/).
М одели для интерпретации целочисленного значения как последовательность битов
показаны в прил. D-3.
Глава 8 Встроенные процедуры 245
Пример
Если значение I - В '0...00011010110', значение PO PPA R (I) равно 1.

P R E C IS IO N
Описание: возвращ ает десятичную точность в модели, представляю щ ей вещ ествен ­
ные числа с тем же самым родовы м параметром, что и исходный параметр.
Синтаксис: result = PRECISIO N (л).
Класс: функция запроса; родовая.
Параметр: х долж ен иметь тип "действительное" или "ком плексное"; м ож ет бы ть
скаляром или массивом значений.
Результаты . Результат - скаляр целого типа по умолчанию . Результат им еет значение
INT((D IG ITS(X ) - 1) * LOG 10(RAD1X(X))). Если RA D IX(X ) является интегральной сте­
пенью 10, единица добавляется к результату.
Пример
Если X - значение REA L(4), PRECISIO N (X) имеет значение 6. Значение 6 получено
из 1NT ((24-1) * LOGIO (2.)) = 1NT (6.92 ...). Для получения дополнительной информ ации
о модели для REAL (4) см. прил. D-2.

PRESENT
Описание: возвращ ает, действительно ли необязательный ф орм альны й параметр
присутствует, т. е. имеет ли он связанны й фактический параметр.
Синтаксис: resu lt = PR E SE N T (¿7 ).
Класс: функция запроса; родовая.
Параметр: а долж ен бы ть параметром текущ ей процедуры и долж ен иметь атрибут
OPTIONAL. Явный интерфейс для текущ ей процедуры долж ен бы ть видимы м для вы зы ­
вающей ее программы (см. разд. 7.11).
Результаты . Результат является скаляром логического типа по ум олчанию . Результат
равен .TRUE., если ф орм альны й параметр присутствует; иначе - .FALSE.
Пример
MODULE MYM0D
CONTAINS
SUBROUTINE CHECK (X, Y)
REAL X ,Z
REAL, OPTIONAL:: Y

¡F (PRESENT (Y)) THEN


Z=Y
ELSE
Z = X *2
END IF
END SUBROUTINE CHECK
END MODULE MYMOD

USE MYMOD
CALL CHECK (15.0,12.0)! Устанавливает Z равным 12 0
CALL CHECK (15.0) ! Устанавливает Z равным 30.0

PRODUCT
Описание: возвращ ает произведение всех элементов во всем массиве или в указан ­
ном измерении массива.
246 С Д А чгазии, В В Кондратьев. Програмировануе на Visual FORTRAN

С ин та ксис: result = PR O D U C T (array [, dim] [, mask]).


Класс: трансф орм ационная функция; родовая.
Параметры: array долж ен бы ть массивом типа "целочисленное" или "действитель­
ное"; dim (opt) долж но бы ть скалярны м целым числом со значением в диапазоне от 1 до
п, где п - ранг array ; mask (opt) долж ен иметь логический тип и соответствовать array.
Результаты . Результат - массив или скаляр того же самого ти п а данных, что и array.
Результат - скаляр, если dim опущ ен или array имеет ранг единица.
П рименяю тся следую щ ие правила, если опущ ен dim :
■ Если P R O D U C T {array) указано, результат - произведение всех элементов array. Если
array им еет размер нуль, результат равен 1.
■ Если указано PR O D U C T {array, M A SK ^mask), результат - произведение всех элем ен­
тов array , соответствую щ их истинным элементам mask. Если array имеет размер нуль
или каж дый элем ент mask им еет значение .FA LSE., результат равен 1.
П рименяю тся следую щ ие правила, если указан dim :
■ Если array имеет ранг единица, значение является тем же самым что и PRO DU CT
(array [,MASK=way&]).
■ Результат массива им еет ранг, который является меньш е чем array и форму (d |, d2,
dpiM-h d DiM+b •••> dn), где (d |, d2, d n) является формой array.
■ Значение элем ента (S|, s2, ..., sDiM_i, sD|M+i, ..., sn) из PR O D U C T (array, dim [,mask]) яв­
ляется равны м PR O D U C T (array (S|, s2, ..., sDim-i5 sDim+i5 •••* sn) [,M ASK = mask (S|, s2,
..., Sdim-i, sDim+i, s„)]).
Примеры
PR O D U C T ((/2, 3, 4/)) возвращ ает значение 24 (произведение 2 * 3 * 4 ) . PRO DU CT
((/2, 3, 4/), D lM ^ l) возвращ ает тот же самы й результат.
PRODUCT (С, M ASK=C .LT. 0.0) возвращ ает произведение отрицательных элементов С.
"1 4 7 '
П усть А является массивом
235
PR O D U C T (A, D IM ^ l) возвращ ает значение (2, 12, 35), которое является произведе­
нием всех элем ентов в каж дом столбце. 2 - произведение 1 * 2 в столбце 1 . 1 2 - произве­
дение 4 * 3 в столбце 2 и т. д.
PR O D U C T (A, D I M ^ ) возвращ ает значение (28, 30), которое является произведением
всех элем ентов в каж дой строке. 28 - произведение 1 * 4 * 7 в строке 1. 30 - произведе­
ние 2 * 3 * 5 в строке 2.

Q CM PLX
Описание: преобразовы вает параметр в тип CO M PL E X (16). Эту функцию нельзя пе­
редавать как фактический параметр.
С ин та кси с: result = Q C M PL X (х [,у]).
Класс: элем ентная функция; собственная.
Параметры : х долж ен иметь тип "целочисленное", "действительное" или "комплекс­
ное"; v (opt) долж ен иметь тип "целочисленное" или "действительное", не должен при­
сутствовать, если х им еет комплексны й тип.
Р езультаты . Тип результата - CO M PL E X (16) (или C O M PLEX *32).
Если появляется только один не комплексны й параметр, он преобразовывается в ве­
щ ественную часть значения результата и нуль присваивается мнимой части. Если у не
указано, а х комплексное, значение результата равно C M PL X (R E A L (X ), A IM AG(X)).
Гпава 8 Встроенные процедуры 247
Если появляю тся 2 не комплексны х параметра, создается комплексное число, преоб­
разовывая первый параметр в вещ ественную часть значения, а второй параметр в м ни­
мую часть.
QCM PLX (X, Y) имеет комплексное значение, вещ ественная часть которого равна
REA L(X , KIN D =16), а мнимая часть - REA L(Y , K IN D =16).
Примеры
Q CM PLX (-3 ) имеет значение (-3 .0 Q 0 , 0.0Q0).
QCM PLX (4.1, 2.3) им еет значение (4.1Q 0, 2.3Q0).

QEXT
Описание: преобразовы вает число в действительны й тип учетверенной точности
(REA L (16)).
Синтаксис: result = Q EX T (а).
Класс: элем ентная функция; родовая.
Параметр: ¿/должен иметь тип "целочисленное", "действительное" или "комплексное".
Результаты . Тип результата - REA L(16) (REA L* 16). Ф ункции, которы е применяю тся
для преобразования одного типа данны х в другой тип, им ею т гот же эффект, что и неяв­
ное преобразование в операторах присваивания.
Если а имеет тип REAL( 16), результат имеет значение без преобразования (QEXT (а) - а).
Если а имеет тип "целочисленное" или "действительное", результат имеет такую
больш ую точность значащ ей части а , какую мож ет содерж ать значение REA L(16).
Если а имеет комплексны й тип, результат имеет такую больш ую точность значащ ей
части вещ ественной части а , какую значение RE A L (16) может содерж ать.
Собственное имя1 Тип параметра Тип результата
INTEGER(I) REAL(16)
INTEGER® REAL(16)
INTEGERS) REAL(16)
INTEGERS) REAL(16)
QEXT REAL(4) REAL(16)
QEXTD REAL(8) REAL(16)
REAL(16) REAL(16)
COMPLEX(4) REAL(16)
C0MPLEX(8) REAL(16)
C0MPLEX(16) REAL(16)
1 Эти собственные функции нельзя передавать как фактические параметры.

Примеры
Q EX T (4) имеет значение 4.0 (округленно; имеется 32 места справа ог десятичной
точки).
Q EX T ((3.4, 2.0)) имеет значение 3.4 (округленно; имеется 32 места справа от деся­
тичной точки).

Q FLO AT
Описание: преобразовы вает целое число в действительны й тип учетверенной точно­
сти (REAL (16)).
Синтаксис: result = Q FLO A T (а).
Класс: элементная функция; родовая.
Параметр: о д о л ж ен иметь тип "целочисленное".
Результаты . Тип результата REA L(16) (REA L* 16).
248 С Д A ’U'cHiifi, В В Кондратьев Програмированне на Visual FORTRAN

Ф ункции, которы е преобразовы ваю т один тип данны х в другой тип, имею т тог же
эффект, что и неявное преобразование в операторах присваивания.
Пример
Q FL O A T (-4 ) им еет значение-4.0 (округленно; им еется 32 знака справа от десятичной
точки).

QNUM
Описание: преобразовы вает строку сим волов в значение R EA L (16).
Син та ксис: result = Q N U M (/).
Класс: элем ентная функция; собственная.
Параметр: / долж ен иметь тип "символьное".
Р езультаты . Тип результата R EA L(16). Значение результата является действитель­
ным значением , представленны м строкой сим волов /.
Пример
Q N U M ("-174.23") им еет зн ач ен и е-174.23 типа R EA L(16).

QREAL
Описание: преобразовы вает вещ ественную часть параметра CO M PLEX (16) в тип
REA L(16). Это - собственная функция, которая не им еет никакой родовой функции, свя­
занной с ней. Ее нельзя передавать как фактический параметр.
С и н та кси с: result = Q R E A L (а).
Класс: элем ентная функция; собственная.
Параметр: а долж ен иметь тип C O M PL EX (16) (или CO M PL E X *32).
Р езультаты . Т ип результата - действительное учетверенной точности (REAL(16) или
REAL* 16).
Пример
Q RE A L ((2.0q0, 3.0q0)) имеет значение 2.0q0.

R A D IX
Описание: возвращ ает основание м одели, представляю щ ей числа того же самого ти ­
па и родовы х параметров, что и параметр.
С ин та ксис: result = RA D IX (х).
К ласс: функция запроса; родовая.
Параметр: х долж ен иметь тип "целочисленное" или "действительное"; он может
быть скаляром или массивом значений.
Результаты . Результат - скаляр целого типа по ум олчанию . Д ля целочисленного па­
рам етра, результат им еет значение г (как определено в прил. D). Д ля действительного па­
рам етра результат имеет значение b (как определено в прил. D-2).
Пример
Если X - значение REA L(4), RA D IX (X) имеет значение 2.

RA N
Описание: возвращ ает следую щ ее число из последовательности псевдослучайных
чисел однородного распределения в диапазоне от 0 до 1. Это - собственная функция, ко­
торая не имеет никакой родовой функции, связанной с ней. Ее нельзя передавать как
ф актический параметр.
RAN не является функцией без побочного эффекта.
Си н та кси с: result = RAN (/).
Глава 8. Встроенные процедуры 249
Класс: неэлементная функция; собственная.
Параметры: / является начальным числом, долж ен бы ть перем енной или элем ентом
м ассива IN TEG ER(4). Значение / первоначально устанавливается в больш ое, нечетное
целочисленное значение. Ф ункция RAN запом инает значение в параметре, который поз­
же используется, чтобы вычислить следую щ ее случайное число. Н ет никаких огран и че­
ний на начальное число, хотя оно долж но бы ть инициализировано разны ми значениями
при различных выполнениях, для того чтобы получить другие случайны е числа.
Результаты . Т ип результата - REA L(4). Р езультат - число с плаваю щ ей точкой, ко ­
торое однородно распределено в диапазоне между 0.0 вклю чая и 1.0 исклю чая. О но уста­
навливается равным значению , связанном у с параметром /.
Пример
В RAN (I), если переменная / имеет значение 3, RAN им еет значение 4 .8 2 2 0 158Е-05.

RANDOM NUM BER


Описание: возвращ ает одно псевдослучайное число или массив таких чисел.
Синтаксис: CA LL RA N D O M N U M B ER (harvest).
Класс: подпрограмма.
Параметры: harvest долж ен иметь тип "действительное". Это - параметр
INTEN T(O U T) (см. разд. 4.11) и м ож ет быть скаляром или перем енной типа массив. Он
будет содерж ать псевдослучайны е числа из однородного распределения внутри ди ап азо­
на 0 < х <1.
Н ачальное число для генератора псевдослучайны х чисел, используем ого
RA N D OM N U M BER, м ож ет быть установлено или м ож ет бы ть сделан запрос при п о­
мощи "R A N D O M S E E D ". Если R A N D O M S E E D не используется, процессор устанавли­
вает начальное число для RA N D O M N U M B ER к зависим ом у от процессора значению .
Генератор RA N D O M N U M B ER использует 2 отдельны х соответствую щ их генерато­
ра вместе, чтобы произвести период приблизительно 10**18, и вычисляет дей стви тель­
ные псевдослучайны е результаты с однородны м распределением в (0,1)..Он приним ает 2
целочисленны х начальных числа, первое из которы х уменьшено до диапазона [1,
2147483562]. Второе начальное число уменьшено до диапазона [1, 2147483398]. Это о зн а­
чает, что генератор эффективно использует два 31-битовых начальны х числа.
Для получения дополнительной информации об алгоритм е см. Pierre L'ecuyer "Э ф­
фективные и м обильны е объединенны е генераторы случайны х чисел" (C om m unications o f
the ACM , Том 31, 1988) и Bratley P., Fox В. L. и Schräge L. Е. "Руководство по м оделиро­
ванию" (Н ью -Й орк: Springer-V erlag, 1987).
Пример
REAL Y, Z (5, 5)
! Инициализирует Y псевдослучайным числом
CALL RANDOM.NUMBER (HARVEST = Y)
CALL RANDOM.NUMBER (Z)
Y и Z содерж ат однородно распределенны е случайны е числа. С ледую щ ее показы вает
другой пример:
REAL X, arrayl (5, 5)
CALL RANDOM_SEED()
CALL RANDOM_NUMBER(x)
CALL RAND0M_NUMBER(array1 )
Еще пример:
program testrand
250 С. Д Алгазин, В В Кондратьев. Програмирование на Visual FORTRAN

intrinsic random_seed, random_number


integer size, seed(2), gseed(2), hiseed(2), zseed(2)
real harvest(10)
data seed /123456789, 987654321/
data hiseed /-1, -1/
data zseed /0, 0/
call random_seed(SIZE=size)
print V'size ".size
call random_seed(PUT=hiseed(1:size))
call random_seed(GET=gseed(1*size))
print V'hiseed gseed", hiseed, gseed
call random_seed(PUT=zseed(1:size))
call random_seed(GET=gseed(1*size))
print *,"zseed gseed", zseed, gseed
call random_seed(PUT=seed(1:size))
call random_seed(GET=gseed(1:size))
call random_number(HARVEST=harvest)
print *, "seed gseed", seed, gseed
print *, "harvest" print *, harvest
call random_seed(GET=gseed(1:size))
print *,"gseed after harvest", gseed
end program testrand

RANDOM SEED
Описание: изм еняет или запраш ивает начальное число (отправную точку) для гене­
ратора псевдослучайны х чисел, используем ого R A N D O M N U M B E R .
С и н та кси с: C A LL R A N D O M S E E D ([size] I put] I get]).
К ласс: подпрограмм а.
Параметры : м ож ет бы ть указано не более одного параметра. Если никакой параметр
не указан, назначается случайное число, основанное на дате и времени как начальном
числе. И меется 3 необязательны х п арам етра':
■ size (opt) долж ен бы ть скаляром типа "целочисленное". Он устанавливает число целых
чисел (N), которые процессор использует, чтобы п о д д е р ж и в а в значение начального
числа.
■ p u t (opt) долж ен бы ть целочисленны м массивом ранга единица и размера > N. Он ис­
пользуется, чтобы сбросить значение н ачальн ою числа.
■ g e t (opt) долж ен бы ть целочисленны м массивом ранга единица и размера > N. Он ус­
танавливает текущее значение начального числа.
Вы м ож ете определить размер массива, используем ого процессором, чтобы запом­
нить начальное число, вызывая RA N D O M SEED с параметром size (см. второй пример
ниже).
Пример
CALL RANDOM_SEED ! Процессор инициализирует начальное число
1беспорядочно из даты и времени
CALL RANDOM.SEED (SIZE = М) ! Устанавливает М в N
CALL RANDOM.SEED (PUT = SEED (1 : M)) ! Устанавливает начальное число пользователя
CALL RANDOM_SEED (GET = OLD (1 : M)) ! Читает текущее начальное число
Рассм отрим другой пример:
INTEGER I

1SIZEи GETявляются параметрами INTENT(OUT), PUTявляются параметрами INTENT(IN).


Гт аа 8 Встроенные процедуры 251
INTEGER, ALLOCATABLE :• new (:), old(:)
CALL RANDOM.SEED () ! Процессор повторно инициализирует начальное
! число беспорядочно из даты и времени
CALL RANDOM.SEED (SIZE = I) ! и устанавливает размер массива начального числа
ALLOCATE (new(l))
ALLOCATE (old(l))
CALL RANDOM.SEED (GET=old(11)) ! Получает текущее начальное число WRITE(*,*) old
new = 5
CALL RANDOM.SEED (PUT=new(1:l)) ! Устанавливает начальное число из массива new
END

RANDU
Описание: вы числяет псевдослучайное число как значение с одинарной точностью .
Синтаксис: C A LL RANDU (/7, i2 ,x ).
Класс: подпрограмма.
Параметры: /7, ¡2 - переменные или элементы массива 1NTEGER(2), которы е сод ер­
жал начальное число (seed) для того, чтобы вы числить случайное число. Эти значения о б ­
новляю тся во время вычислений так, чтобы они содерж али обновленное начальное чис­
ло; х - переменная или элем ент массива R EA L(4), в котором вы численное случайное
число будет возвращ ено. Результат возвращ ается в jc, который долж ен иметь тип
REAL(4). Значение результата - псевдослучайное число в ди ап азоне от 0.0 к 1.0. А лго­
ритм для того, чтобы вычислять значение случайного числа, основы вается на значениях
для /7 и 12.
Если /7=0 и /2=0, база генератора устанавливается следую щ им образом:
Х(п + 1) = 2**16 + 3
И наче она устанавливается следую щ им образом:
Х(п + 1) = (2**16 + 3) * X(n) mod 2**32
База генератора X(n + 1) запоминается в /7, /2. Р езультат X (n + 1) м асш табируется к
действительном у значению Y(n + 1), для 0.0 < Y(n + 1) < 1.
Пример
REALX
INTEGER® I, J
CALL RANDU (I, J, X)
Если 1 и J имею т значения 4 и 6, в X запоминается значение 5.4932479Е-04.

RANGE
Описание: возвращ ает десятичны й диапазон экспоненты в модели, представляю щ ей
числа с тем же самым родовым параметром, что и исходный параметр.
Синтаксис: result = RA N G E (х)
Класс: функция запроса; родовая.
Параметры: х долж ен иметь тип "целочисленное", "действительное" или "ком плекс­
ное"; он может быть скаляром или массивом значений.
Результаты . Результат - скаляр целого типа по ум олчанию .
Для целочисленного параметра результат имеет значение 1NT (LO G 10 (H U G E (X))).
Для информации относительно целочисленной модели см. прил. D.
Для действительного или комплексного параметра результат им еет значение 1NT
(M IN (LOGIO (HU G E (X )),-LO G 10 (TINY (X)))). Для информ ации относительно дей стви ­
тельной модели см. прил. D-2.
252 С Д Алгазин, В В. Кондратьев Програмированис на Visual FORTRAN

Пример
Если X - значение REA L (4), RANGE (X) им еет значение 37. (H U G E (X) = (1 - 2“
24)*2 128 и t i n y (X) = 2~126).
REAL
Описание: преобразовы вает значение в действительны й тип.
Син та кси с: result = R EA L (а [, kind]).
К ласс: элем ентная ф ункция; родовая.
Параметры : а долж ен иметь тип "целочисленное", "действительное" или "комплекс­
ное"; kind (opt) долж ен бы ть инициализированны м скалярным целочисленны м вы раж е­
нием.
Результаты . Тип результата "действительное". Если параметр kind присутствует, ро­
довой парам етр результата указы вается kind\ иначе родовой параметр результата - родо­
вой параметр дей стви тельн ого типа по умолчанию . Если процессор не мож ет предста­
вить значение результата в kind, результат неопределенный.
Ф ункции, которы е преобразовы ваю ! один тип данных в другой тип, имею т тот же
эффект, что и неявное преобразование в операторах присваивания.
Если а является целочисленным или действительным, результат равен приблизительно а.
Если а является комплексным, результат равен приблизительно вещественной части а.
Собственное имя1 Тип параметра Тип результата
INTEGER(I) REAL(4)
FL0ATI INTEGER® REAL(4)
FLOAT2-3 INTEGERS) REAL(4)
REAL2 INTEGERS) REAL(4)
FL0ATK INTEGERS) REAL(4)
REAL(4) REAL(4)
SNGL2-4 REAL(8) REAL(4)
SNGLQ REAL(16) REAL(4)
C0MPLEX(4) REAL(4)
C0MPLEX(8) REAL(8)
1 Эти собственные функции нельзя передавать как фактические параметры.
2 Задание опций компилятора, указывающих размер действительного числа, может затронуть FLOAT, REAL и SNGL.
3 Или FLOATJ. Для совместимости со старыми версиями Fortran FLOAT может быть указана как родовая функция
4 Для совместимости со старыми версиями Fortran SNGL может быть указана как родовая функция Родовая SNGL включа­
ет собственную функцию REAL, которая берет параметр REAL(4) и вычисляет результат REAL(4).

Примеры
REA L (-4 ) им еет значение -4 .0 .
REA L (Y) им еет тот же самый родовой параметр и значение, что и вещ ественная
часть ком плексной переменной Y.

REPEAT
Описание: конкатенирует несколько копий строки.
С ин та кси с: result = R E PE A T (strin g, ncopies).
Класс: трансф орм ационная функция; родовая.
Параметры : string долж ен быть скаляром типа "символьное"; ncopies долж ен быть
скаляром тип а "целочисленное", не долж ен быть отрицательным.
Результаты ю Результат - скаляр типа "символьное" и длнны ncopies * LEN (string).
Родовой параметр - гот же, что и у string. Значение результата - конкатенация ncopies
КТИ 1И И с t r in < r
Глава 8. Встроенные процедуры 253
Примеры
REPEA T ('S', 3) имеет значение SSS.
R EPEA T ('ABC', 0) им еет значение строки нулевой длины .

RESHAPE
Описание: конструирует массивы с различны м и формами.
Синтаксис: result = RESH A PE (source, shape [,p a d ] [, order]).
Класс: трансформ ационная функция; родовая.
Параметры:
source долж ен быть массивом (лю б о ю типа данны х). Он поставляет элем енты для
массива результата. Его размер долж ен быть больш е или равны м ?R O D \JC T (shape), если
p a d оиуихън или иметь размер нуль.
shape долж ен быть целочисленны м массивом до 7 элем ентов, с рангом единица и п о­
стоянным размером. Он определяет форму м ассива результата. Его размер долж ен быть
положительным; е ю элемент ы не долж ны иметь отрицательны х значений.
p a d (opt) долж ен быть массивом с тем же самым типом и родовы м и парам етрам и, чго
и source. Он используется, чтобы запомнить дополнительны е значения, если массив р е­
зультата больш е чем source.
order (opt) должен быть целочисленны й массив с той же форм ой, чго и shape. Его
элементы должны быть перестановкой (1,2, ..., п), где п - размер shape. Если order оп у ­
щен, он, как предполагаю т, равен (1,2..., п).
Результаты . М ассив формы shape с тем же типом и родовы м и параметрами, что и
source. Размер результата - произведение значений элем ентов shape.
В массиве результата, элементы массива source помещ ены в порядке изм ерений, у к а­
занных в соответствии с order. Если order опущ ен, элементы массива помещ аю тся
в обычном порядке элем ентов массива.
Элементы массива source (источника) сопровож даю тся (в случае необходим ости)
элементами массива p a d (т клавиатуры) в порядке элем ентов массива. В случае необхо­
димости дополнительны е копии p a d (клавиатуры) не следую т, пока все элемент ы м асси­
ва р е з у л ь т а т не получат значения.
Примеры
"3 5 7]
RESH APE ((/3, 4, 5, 6, 7, 8/), (/2, 3/)) имеет значение
4(3 8
34 56
RESH A PE ((/3, 4, 5, 6, 7, 8/), (/2, 4/), (/1, 1/), (/2, 1/)) имеет значение
7 8 11

RNUM
Описание: преобразовывает строку сим волов в значение REA L(4).
Синтаксис: result = RNUM (/).
Класс: элементная функция; собственная.
Параметр: / долж ен иметь тин "символьное".
Результаты . Тин результата - R £A L (4). Значение результата - действительное зн аче­
ние, представленное строкой сим волов /.
Пример
RNUM ("821.003") имеет значение 821.003 типа REA L(4)
254 С Д Алгазин, В В Кондратьев Програмированне на Visual FORTRAN

R R S P A C IN G
Описание: возвращ ает обратную величину относительного интервала модельных чи­
сел около значения параметра.
С интаксис: result = R R SPA C IN G (х).
Класс: элементная функция; родовая.
Параметр: х долж ен им еть тип "действительное".
Р езультаты . Тип результата - тот же, что и у х. Результат имеет значение | х*Ь~е |*ЬР.
П араметры Ь ,е н р определены в прил. D-2.
Пример
Если - 3 .0 является значением одинарной точности, т.е. REA L(4), RRSPA CING (-3.0)
им еет значение 0.75*224.

SCA LE
Описание: возвращ ает значение экспонентной части (модели для параметра), изме­
ненное при помощ и указанного значения.
Синтаксис: result = SCA LE (х, /)
Класс: элем ентная функция; родовая.
Параметры: х долж ен иметь тип "действительное"; / долж ен иметь тип "целочислен­
ное".
Результаты . Тип результата - тот же, что и у х. Результат имеет значение х*Ь'. П ара­
метр b определен в прил. D-2.
Пример
Если 3.0 является значением одинарной точности, т. е. REA L(4), SCALE (3.0, 2) имеет
значение 12.0, a SCALE (3.0, 3) им еет значение 24.0.

SCAN
Описание: просм атривает строку для поиска лю бого сим вола в ряде символов.
Син та ксис: result = SCAN (string, set [, back] [, kind]).
Класс: элем ентная функция; родовая.
Параметры: string долж ен иметь тип "символьное"; set долж ен иметь тип "символь­
ное" с тем ж е самым родовы м параметром что и strin g; back (opt) долж ен иметь тип "ло­
гическое"; kind (opt) долж ен бы ть инициализированны м скалярным целочисленным вы­
раж ением.
Р езультаты . Тип результата - целое число. Если параметр kind присутствует, родо­
вой параметр результата указы вается kind\ иначе родовой параметр результата - родовой
параметр ц ел о ю типа по ум олчанию . Если процессор не м ож ет представить значение ре­
зультата в kind, результат неопределенны й.
Если back опущ ен (или присутствует со значением ложь), a string имеет по крайней
мере 1 символ, который находится в se t, значение результата - это позиция крайнего ле­
вого сим вола string, который находится в set.
Если back присутствует со значением истина, a string имеет по крайней мере 1 сим ­
вол, который находится в se t, значение результата - это позиция сам о ю правого символа
strin g, который находится в set.
Если никакой символ string не находится в set или длине строки, или set - нуль, зна­
чение результата - нуль.
Установка опций компилятора, указы ваю щ их разм ер целого числа, может затронуть
эту функцию .
Глава 8 Встроенные процедуры 255
Примеры
SCAN ('A STRIN G ', 'ST') им еет значение 2.
SCAN ('A STRIN G ', 'ST', B A C K =.TR U E .) им еет значение 3.
SCAN ('A STRIN G ', 'CD') им еет значение нуль.

S EC N D S
Описание: обеспечивает системное время дня или прош едш ее время, как значение с
плавающей точкой в секундах. Эго - собственная функция, которая не имеет никакой ро­
довой функции, связанной с ней. Ее нельзя передавать как фактический параметр.
SECNDS не является функцией без побочного эффекта, таким образом , на нее нельзя
ссылаться в конструкции FORALL.
Синтаксис: result = SECN DS (х).
Класс: элементная функция; собственная.
Параметр: х долж ен иметь тип REA L(4).
Результаты . Тип результата - тот же, что и у х. Значение результата равно времени в
секундах с полуночи - х . (Ф ункция такж е вычисляет правильны е результаты для интерва­
лов времени, которые охватывают полночь.)
Значение SECNDS имеет точность равную 0.01 секундам , которая являю тся разре­
ш ающей способностью системны х часов. В течение приблизительно одного дня точность
для разреш аю щ ей способности системны х часов обеспечиваю т 24 бита. О днако мож ет
произойти потеря точности, если вы пы таетесь вычислит ь очень м аленькие прош едш ие
времена в конце дня.
Пример
Демонстрирует как использовать SEC N D S, чтобы выполнить вычисления п рош едш е­
го времени:
С НАЧАЛО ВРЕМЕННОЙ ПОСЛЕДОВАТЕЛЬНОСТИ
Т1 = SECNDS(O.O)
С КОД ДЛЯ ПОДСЧЕТА ВРЕМЕНИ

DELTA = SECNDS(T1) ! DELTA содержит прошедшее время

S E L E C T E D IN T K IN D
Описание: возвращает значение родового параметра целочисленного типа данных.
Синтаксис: result = SELECTED INT K IN D (/;)
Класс: трансформационная функция; родовая.
Параметры: р должен быть скаляром типа "целочисленное".
Результаты : скаляр целого типа но умолчанию . Результат имеет значение, равное
значению родового параметра ц ел оч ислен ною типа данны х, который представляв! все
значения п в диапазоне значений п с - 1 0 р < п < 10р.
Если никакой такой тип родового параметра не доступен на процессоре, результат р а­
вен -1 . Если больш е чем 1 тип р о д о в о ю параметра удовлетворяет критериям, возвращ ае­
мое значение - тип родового параметра с наим еньш им десятичны м диапазоном экспо­
ненты (см. прил. D).
Пример
SELECTEDJNTKIND (6) = 4

S E L E C T E D R E A L K IN D
Описание: возвращ ает значение родового парам етра действительного типа данных.
Синтаксис: result = SELECTED REA L KIN D ([р] [, г]).
256 г д л.,.’азин . 5 # К он драт ьев . П роклам ирование на Visual FORTRAN

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


Параметры: р (opt) долж ен бы ть скаляром типа "целочисленное"; г (opt) долж ен быть
скаляром типа "целочисленное".
Р езультаты : скаляр целого типа но умолчанию . Если оба параметра отсутствую т, ре­
зультат - нуль. И наче результат им еет значение, равное значению родового параметра
действительного типа данны х с десятичной точностью , которая возвращ ается функцией
PR E C ISIO N , по крайней мере р цифр и десятичны м диапазоном экспоненты, который
возвращ ается функцией RA N G E, по крайней мере г.
Если такой тип родового параметра недоступен на процессоре, результат определяет­
ся следую щ им образом:
-1 если точность недоступна;
- 2 если диапазон экспоненты недоступен;
- 3 если ни то ни другое недоступно.
Если больш е чем одно значение типа родового параметра удовлетворяет критериям,
возвращ аем ое значение - тип родового параметра с наим еньш ей десятичной точностью
(см. ирил. D-2).
Пример
SELECTED_REAL_KIND (6, 70) = 8

SETEX PO N EN T
Описание: возвращ ает значение экспонентной части (модели для параметра) уста­
новленной к указанном у значению .
Син та ксис: result = SET E X PO N E N T (jc, /').
Класс: элем ентная функция; родовая.
Параметры: jc долж ен иметь тип "действительное"; / долж ен иметь тип "целочислен­
ное".
Р езультаты . Тип результата - то т же, что и у х. Результат имеет значение jc*b,_e. П а­
рам етры b и е определены в прил. D-2. Если л* имеет значение нуль, результат - нуль.
Пример
Если 3.0 - значение R EA L(4), SET EX PO N EN T (3.0, 1) им еет значение 1.5.

SHAPE
Описание: возвращ ает форму м ассива или скалярного параметра.
С ин та кси с: result = SH A PE (source [, kind]).
Класс: функция запроса; родовая.
Параметры:
source - скаляр или массив лю бого типа данных. Он не долж ен быть массивом пере­
ним аю щ его размера, разъединенны м указателем или м ассивом, который не размещен.
kind (opt) долж ен бы ть инициализированны м скалярным целочисленны м выражением.
Результаты : одноранговы й целочисленны й м ассив, разм ер которого равен рангу
source.
Если параметр kind присутствует, родовой параметр результата указывается kind\
иначе родовой параметр результата - родовой параметр целого типа по умолчанию . Если
процессор не может' представить значение результата в kind, результат неопределенный.
Значение результата - форм а source.
У становка опций компилятора, указы ваю щ их размер целого числа, может затронуть
эту функцию .
Глава 8 Встроенные процедуры 257
Пример
SHA PE (2) имеет значение однорангового м ассива нулевого размера.
Если В объявлен как В (2 :4 -3 :1 ), то SH A PE (В) им еет значение (3, 5).

S H IF T L
Описание: логически сдвигает целое число влево на указанное число битов.
С интаксис: result = SHIFTL (ivalue, ishift).
Класс: элементная функция; собственная.
Параметры: ivalue долж ен иметь тип 1NTEGER(4), значение которого будет сдвину­
то. ishift долж ен иметь тип 1NTEGER(4) и бы ть полож ительны м ; его значение равно чис­
лу позиций для сдвига.
Результаты . Тип результата - 1NTEGER(4). Результат - значение ivalue, сдвинутое
влево на ishift битовых позиций. Биты, вы двинуты е в левом конце, потеряны ; нули вдви­
гаю тся с противополож ного конца. SH IFTL (i, j) является тем же, что и 1SHA (i, j).

S H IF T R
Описание: логически сдвигает целое число вправо на указанное число битов.
С интаксис: result = SH IFTR (ivalue, ishift).
Класс: элементная функция; собственная.
Параметры: ivalue долж ен иметь тип 1NTEGER(4), значение которого будет сдвину­
то; ishift долж ен иметь тип IN TEG ER(4) и бы ть полож ительны м ; его значение равно чис­
лу позиций для сдвига.
Результаты . Т ип результата - 1NTEGER(4). Результат - значение ivalue, сдвинутое
вправо на ishift битовых позиций. Биты, вы двинуты е в правом конце, потеряны; нули
вдвигаю тся с противополож ного конца.
SH IFTR (i, j) является тем же, что и 1SHA (i, -j).

S IG N
Описание: возвращ ает абсолю тное значение а со знаком Ь.
С интаксис: result = SIGN (а , b).
Класс: элементная функция; родовая.
Параметры: а долж ен иметь тип "целочисленное" или "действительное"; b долж ен
иметь тот же тип и родовы е параметры, что и а.
Результаты . Тип результата - тот же, что и у а. Значение результата | а |, если b > О
и - | а |, если b < 0.
Если b имеет тип "действительное" и значение нуль, значение результата равно | а |.
О днако если процессор мож ет различить полож ительны й и отрицательны й дей стви тель­
ные нули, и указана соответствую щ ая опция компилятора, происходит следую щ ее:
Если b является положительны й действительны й нуль, значение результата | а |.
Если b является отрицательный действительны й нуль, значение результата - \ а \ .
Собственное имя Тип параметра Тип результата
BSIGN INTEGER(I) INTEGER(I)
IISIGN (или HSIGN) INTEGER® INTEGER®
ISIGN1 INTEGERS) INTEGERS)
KISIGN INTEGER® INTEGER®
SIGN REAL(4) REAL(4)
DSIGN REAL® REAL®
QSIGN REAL(16) REAL(16)
1Или ЛБЮМ. Для совместимости со старыми версиями Ро11гап 1БЮМ может быть указана как родовая функция.
258 С Д. Ачгспии, В В Кондратьев Програмированые на Visual FORTRAN

Примеры
SIGN (4.0, -6 .0 ) им еет значение -4 .0 .
SIGN (-5 .0 , 2.0) им еет значение 5.0.

SIN
Описание: вы числяет синус х.
С и н та кси с: result = SIN {.v).
Класс: элем ентная функция; родовая.
Параметры : х долж ен иметь тип "действительное" или "комплексное", долж ен быть
задан в радианах и обработан по модулю 2 *ти. Если jc имеет комплексны й тип, его вещ е­
ственная часть расценивается как значение в радианах.
Результаты . Тип результата - гот же, что и у х.
Собственное имя Tun параметра Tun результата
SIN REAL(4) REAL(4)
DSIN REAL(8) REAL(8)
QSIN REAL(16) REAL(16)
CSIN1 C0MPLEX(4) C0MPLEX(4)
CDSIN2 COMPLEX® COMPLEX®
CQSIN C0MPLEX(16) C0MPLEX(16)
1 Установка опций компилятора, указывающих размер действительного, может затронуть CSIN.
2 Эта функция может быть указанна как ZSIN

Примеры
SIN (2.0) им еет значение 0.9092974.
S1N (0.8) им еет значение 0.7173561.

S IN D
Описание: вы числяет синус .y.
С и н та кси с: result = SIN D (.y).
Класс: элем ентная функция; родовая.
Параметры : х долж ен иметь тип "действительное"; долж ен бы ть задан в градусах и
обработан по м одулю 360.
Р езультаты . Тип результата - тот же, что и у jc .
Собственное имя Tun параметра Tun результата
SIND REAL(4) REAL(4)
DSIND REAL® REAL®
QSIND REAL(16) REAL(16)
Примеры
SIN D (2.0) им еет значение 3.4899496Е -02.
SIN D (0.8) им еет значение 1.3962180Е-02.

S IN H
Описание: вы числяет гиперболический синус.
С и н та кси с: result = SIN H (*).
Класс: элем ентная функция; родовая.
Параметр: х долж ен иметь тип "действительное".
Результаты . Тип результата - тот же, что и у х.
Глава 8 Встроенные процедуры 259

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


SINH REAL(4) REAL(4)
DSINH REAL(8) REAL(8)
QSINH REAL(16) REAL(16)
Примеры
SINH (2.0) имеет значение 3.626860.
S1NH (0.8) имеет значение 0.8881060.

S IZ E
Описание: возвращ ает общ ее количество элем ентов в м ассиве или предел м ассива по
указанному измерению.
Синтаксис: result = SIZE ( a r r a y [, d im ] [, k in d ] ).
Класс: ф ункция запроса; родовая.
Параметры:
array долж ен бы ть массивом (лю бого типа данны х); не долж ен бы ть разъединенны м
указателем или распределяемы м м ассивом, который не распределен. Он м ож ет бы ть м ас­
сивом предполагаемого размера, если присутствует d im со значением м еньш им , чем ранг
array.
d im (opt) долж ен бы ть скалярным целым числом со значением в диапазоне от 1 к п,
где п - ранг array.
k in d (opt) долж ен быть инициализированны м скалярны м целочисленны м вы раж ением .
Результаты . Тип результата - целое число. Если k i n d присутствует, родовой п ара­
метр результата указы вается k in d \ иначе родовой параметр результата - родовой п ара­
метр целого тина по умолчанию . Если процессор не м ож ет представить значение р езу ль­
тата в k in d результата, результат неопределенный.
Если d im присутствует, результат - предел изм ерения d im в a rra y; иначе результат -
общ ее количество элементов в array.
У становка опций компилятора, указы ваю щ их разм ер целого числа, м ож ет затронуть
эту функцию.
Пример
Если В объявлен как В (2:4,-3:1), то SIZE (В, D IM =2) им еет значение 5, a SIZE (В)
имеет значение 15.

S IZ E O F
Описание: возвращ ает число байтов памяти, используем ой параметром . Его нельзя
передавать как фактический параметр.
Синтаксис: result = SIZEO F (л).
Класс: функция запроса; родовая.
Параметр: jc является скаляром или массивом (лю бого типа данны х); не долж ен бы ть
массивом предполагаемого размера.
Результаты. Тип результата - 1NTEGER(4) на процессорах 1А-32 и INTEG ER (8) на про­
цессорах Intel Itanium. Значение результата равно числу байтов памяти, используемой jc .
Примеры
S1ZEOF (3.44) имеет значение 4.
SIZEO F ('SIZE') имеет значение 4.
260 С .Д Алгсичн, В В. Кондратьев. Програмирование на Visual FORTRAN

S P A C IN G
Описание: возвращ ает обратную величину из относительного интервала модельных
чисел около значения параметра.
Син та ксис: result = SPA CIN G (л).
Класс: элем ентная ф ункция; родовая.
Параметр: х долж ен им еть тип "действительное".
Результаты . Тин результата - тот же, что и у х. Результат имеет значение Ье р. П ара­
метры Ь ,е и р определены в прил. D-2.
Если значение результата - вне действительного модельного диапазона, то результат
равен TIN Y (X).
Пример
Если 3.0 - значение RE A L (4), SPACING (3.0) имеет значение 2 -2 2 .

SPREAD
Описание: создает копию м ассива с добавленны м измерением, делая копии сущ ест­
вую щ их элем ентов по указанном у измерению .
С ин та ксис: result = SPR E A D (source, dim , ncopies).
Класс: трансф орм ационная функция; родовая.
Параметры: source долж ен бы ть скаляром или массивом (лю бого типа данных); его
ранг долж ен бы ть м еньш е чем 7.
dim долж ен бы ть скаляром типа "целочисленное"; долж ен иметь значение в диапазоне
от 1 до n + 1 (вклю чая), где п - ранг source.
ncopies долж ен бы ть скаляром типа "целочисленное"; становится пределом дополни­
тельного изм ерения результата.
Результаты . М ассив того же типа, что и sou rce, и ранга, который на единицу больш е,
чем у source.
Если source - массив, каж дый элем ент массива в измерении, dim результата равен со ­
ответствую щ ем у элем енту м ассива source.
Если source - скаляр, результат - одноранговы й массив с ncopies элементами, каждый
со значением source.
Если ncopies < нуля, результат - массив нулевого размера.
Примеры
SPREA D ("В", 1, 4) является сим вольны м массивом (/"В", "В", "В", "В"/).
П усть В является массивом (3, 4, 5) и NC им еет значение 4.
"3 4 5
3 4 5
SPREA D (В, D1M=1, N C O P IE S ^N C ) производит массив
3 4 5
3 4 5
3333
SPREA D (В, D I M ^ , N C O P IE S ^N C ) производит массив 4444
5555
SQRT
Описание: вы числяет квадратны й корень параметра.
С ин та ксис: result = SQ R T (х).
Класс: элем ентная ф ункция; родовая.
Гит а 8 Встроенные процедуры 261
П а р а м е тр : х д олж ен иметь ти п "действительное" или "ком пл ексное". Е сли х им еет
ти и "действительное", то его значение д о л ж н о быть больш е или равным нулю .
Р е зу л ь т а т ы . Т и п результата - то т ж е, что и у х . Результат имеет значение, равное
квадратному ко р ню х . Результат ко м п л екс н о го ти п а равен главном у зн ач ению , с в ещ ест­
венной частью , больш ей или равной нулю . К о гд а вещ ественная часть результата - нуль,
мнимая часть больш е или равна нулю .
Собственное имя Тип параметра Тип результата
SQRT REAL(4) REAL(4)
DSQRT REAL(8) REAL(8)
QSQRT REAL(16) REAL(16)
CSQRT1 C0MPLEX(4) C0MPLEX(4)
CDSQRT2 COMPLEX® C0MPLEX(8)
CQSQRT C0MPLEX(16) C0MPLEX(16)
1 Установка опций компилятора, указывающих размер действительного числа, может затронуть CSQRT.
2 Эта функция может быть указанна как ZSQRT

Примеры
SQRT (16.0) имеет значение 4.0.
SQRT (3.0) имеет значение 1.732051.

SUM
Описание: возвращ ает сумму всех элем ентов во всем м ассиве или в указанном изм е­
рении массива.
Синтаксис: result = SUM (array [, dim] [, mask]).
Класс: трансформ ационная функция; родовая.
Параметры: array долж ен бы ть м ассив типа "целочисленное", "действительное" или
"комплексное"; dim (opt) долж но бы ть скалярное целое число со значением в диапазоне
от 1 до п, где п - ранг array; mask (opt) долж ен иметь логический тип и соответствовать
array.
Результаты . М ассив или скаляр того же самого типа, что и array. Результат - скаляр,
если dim опущ ен или array имеет ранг 1.
Если dim опущ ен, прим еняю тся такие правила:
■ Если SUM (array) указано, результат - сум м а всех элем ентов array. Если array имеет
размер нуль, результат равен нулю.
■ Если SUM (array, M A SK =rnask) указано, результат - сум м а всех элем ентов array, со ­
ответствую щ их истинным элем ентам mask. Если array имеет размер нуль или каждый
элемент mask имеет значение .FA LSE., результат равен нулю.
Если dim указан, применяю тся такие правила:
■ Если array имеет ранг 1, значение является тем же, что и SUM (array [,MASK=/was&]).
■ Результат м ассива имеет ранг, который меньш е, чем arra y, и имеет форму (d |, d 2, ...,
^DiM-h dniM+ь •••> dn)> где (d |, d 2, d n) —форма array.
Значение элемента (si, S2, Sdim-i> Sqimh. ..., sn) из SUM (array, dim [,mask]) является
равным SUM (array ( s h s2, ..., sD|M^i, sD|M+i, sn) [,M A SK = mask (s h s2, ..., Soim-i,
Sdimh» —» s„)]).
Примеры
SUM ((12, 3, 4/)) возвращ ает значение 9 (сумма 2 + 3 + 4).
SUM ((/2, 3, 4/), D IM -1 ) возвращ ает тот ж е самый результат.
SUM (В, M A SK =B .LT. 0.0) возвращ ает ариф метическую сум м у отрицательны х эле­
ментов В.
262 С Д А'¡газин. В В Кондратьев Програмирование па Visual FORTRAN

'1 2 3 "
П усть С является массивом
456
SUM (С, D1M =1) возвращ ает значение (5, 7, 9), которое является суммой всех элемен­
тов в каж дом столбце: 5 - сумма 1 + 4 в столбце 1; 7 - сумма 2 + 5 в столбце 2 и т. д.
SUM (С, D IM :=2) возвращ ает значение (6, 15), которое является суммой всех элементов в
каж дой строке: 6 - сумма 1 + 2 + 3 в строке 1; 15 - сумма 4 + 5 + 6 в строке 2.
SYSTEM C L O C K
Описание: возвращ ает целочисленны е данны е из реальны х часов. S Y S T E M C L O C K
возвращ ает число секунд ирош едш их от 00:00 К оординированного среднегринвичского
времени (CU T) 1 января 1970. Число возвращ ается без смещ ения. Чтобы иолучить про­
ш едш ее время, надо вызвать SYSTEM C LO CK дваж ды и вычесть начальное значение
времени из конечного значения.
Син та ксис: CA LL SY ST E M _C L O C K ([count] [, count rate] [, count max]).
Класс: подпрограмма.
Параметры. Есть 3 необязательны х п арам етра1:
count (opt) долж ен бы ть скаляром типа "целочисленное". Он устанавливает значение,
основанное на текущ ем значении часов процессора. Значение увеличивается на единицу
для каж дого счетчика часов, пока значение count max не будет достигнуто и сбрасывает­
ся к нулю в следую щ ем счетчике (count находиться в диапазоне от 0 до count max).
count rate (opt) долж ен бы ть скаляром типа "целочисленное", устанавливает число
отсчетов времени часов процессора в секунду. Если тип IN TEG ER(2), conut_rate равен
1000. Если тип 1NTEGER(4), conut rate равен 10000. Если тип 1NTEGER(8), conut rate
равен 1000000.
count max (opt) долж ен бы ть скаляром типа "целочисленное"; устанавливает м акси­
м альное значение, которое conut м ож ет иметь, HUGE (0).
Все используем ы е параметры долж ны иметь одинаковый целочисленны й родовой па­
раметр.
Пример
¡nteger(2):: ic2, crate2, cmax2
¡nteger(4) ic4, crate4, cmax4
cali system_clock(count=ic2, count_rate=crate2, count_max=cmax2)
cali system_clock(count=ic4, count_rate=crate4, count_max=cmax4)
print *, ¡c2, crate2, cmax2
print *, ic4, crate4, cmax4
end
Эта програм ма бы ла вы полнена в четверг 11 декабря 1997 в 14:23:55 по восточному
стандартном у времени и произведенный вывод следую щ ий:
13880 1000 32767
112949880710000 2147483647
TAN
Описание: вычисляет тангенс х.
С ин та ксис: result = TAN (x).
Класс: элем ентная функция; родовая.
Параметр: х долж ен иметь тип "действительное" или "комплексное"; долж но быть
задан в радианах и обработан по модулю 2 *тг. Если х имеет комплексны й тип, его вещ е­
ственная час ib расценивается как значение в радианах.
Р езультаты . Тип результата - гот же, что и у л\

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


Г шва (V. Встроенные процедуры 263

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


TAN REAL(4) REAL(4)
DTAN REAL(8) REAL(8)
QTAN REAL(16) REAL(16)
CTAN1 C0MPLEX(4) C0MPLEX(4)
CDTAN2 C O M P LEX ® C O M P LEX ®
CQTAN C0MPLEX(16) C0MPLEX(16)
1 Установка опций компилятора, указывающих размер действительного числа, может затронуть CTAN.
2 Эта функция может быть указанна как ZTAN.

Примеры
TAN (2.0) имеет значение -2.185040.
TAN (0.8) имеет значение 1.029639.
TA N D
Описание: вычисляет тангенс х.
Синтаксис: result = TA N D (.г)
Класс: элементная функция; родовая.
Параметр: х долж ен иметь тип "действительное". Он долж ен бы ть задан в градусах и
обработан по модулю 360.
Результаты . Тип результата - тот же, что и у л.
Собственное имя Тип параметра Тип результата
TAND REAL(4) REAL(4)
DTAND REAL® ¡R E A L®
QTAND REAL(16) REAL(16)
Примеры
TAND (2.0) имеет значение 3.4920771 Е -02.
TA ND (0.8) имеет значение 1.3963542Е-02.
TAN H
Описание: вычисляет гиперболический тангенс.
Синтаксис: result = TANH (х).
Класс: элементная функция; родовая.
Параметр: х долж ен иметь тип "действительное".
Результаты . Тип результата - тот же, что и у х.
Собственное имя Тип параметра Тип результата
TANH REAL(4) REAL(4)
DTANH REAL(8) REAL®
QTANH REAL(16) REAL(16)
Примеры
TANH (2.0) имеет значение 0.9640276.
TANH (0.8) имеет значение 0.6640368.
T IM E
Описание: возвращ ает текущ ее время, как установлено внутри системы.
Синтаксис: C A LL TIM E ( h u f).
Класс: подпрограмма.
Параметр: bu f является 8-байтовой переменной, массивом, элем ентом массива или
символьной подстрокой. Д ата возвращ ается как 8-байтовая строка сим волов ASCII,
имеющая формат hh:m m :ss, где: hh - час (2 цифры); m m - минуты (2 цифры); ss - секун­
ды (2 цифры).
264 С Д А ¡гати, В В Кондратьев Програлтрованне на Visual FORTRAN

Если b u f имеет числовой тип и меньш е, чем 8 байт, мож ет возникнуть наруш ение це­
лостности данных.
Если b u f им еет сим вольны й тип, связанная с ним длина передается подпрограмме. Ес­
ли buf меньш е, чем 8 байт, подпрограмм а обрезает дату, чтобы соответствовать указан­
ной длине. Если передается м ассив типа C H A RA CTER , подпрограмм а запоминает дату в
первом элем енте массива, используя длину элемента, а не длину всего массива.
Примеры
П ример возвращ аем ого значения из вызова TIM E - 13:45:23 (24-часовы е часы исполь­
зую тся). 1
CHARACTERS H0UR(8)

CALL TIME (HOUR)


Д лина первого элем ента в м ассиве H OUR C H A R A C T E R передается в подпрограмму
TIM E. П одпрограм м а затем обрезает время, чтобы вписаться в 1-символьный элемент,
вычисляя неправильны й результат.
T IN Y
Описание: возвращ ает наим еньш ее число в модели, представляю щ ей тот же самый
тип и родовы е параметры, что и параметр.
С ин та ксис: result = TIN Y (х)
Класс: функция запроса; родовая.
Параметр: х долж ен иметь тип "действительное"; он м ож ет бы ть скаляром или мас­
сивом значений.
Р езультаты . Результат является скаляром с тем же самым типом и родовыми пара­
м етрами, что и х. Результат им еет значение Ь0'11111"1. П араметры b и етт определены в
прил. D-2.
Пример
Если X им еет тип REA L(4), то TINY (X) имеет значение 2 126.
T R A IL Z
Описание: возвращ ает число конечны х нулевых битов в целом числе.
С ин та ксис: result = TRA ILZ (/).
Класс: элем ентная функция; родовая.
Параметр: / долж ен иметь тип "целочисленное" или "логическое".
Р езультаты . Тип результата - чот же, что и у /. Значение результата - число конеч­
ных нулей в двоичном представлении целого числа /.
М одели для интерпретации целочисленного значения как последовательности битов
показана в прил. D-3.
Пример
INTEGER*8 J, TWO
PARAMETER (TW 0=2)
DO J= -1,4 0
TYPE *, TRAILZ(TWO**J) i Печатает 64, затем 0 до ENDDO
! 40 (конечные нули)
END

TR AN SFER
Описание: преобразовы вает битовую комбинацию source согласно типу и родовым
параметрам wold.
С и н та кси с: result = T R A N SFER {source, m old [, size]).
Класс: трансформационная функция; родовая.
Гит а 8 Встроенные процедуры 265
Параметры: source долж ен бы ть скаляром или м ассивом (лю бого типа данны х); m old
должен бы ть скаляром или массивом (лю бого типа данны х), обеспечивает характеристи­
ки типа (не значение) для результата.
size (opt) долж ен быть скаляром типа "целочисленное". Он обеспечивает число эл е­
ментов для результата вывода.
Результаты . Имеет те же самы е тип и параметры типа, что и mold.
Если m old - скаляр и size опущ ен, результат - скаляр.
Если m old - массив и size опущ ен, результат - одноранговы й массив. Его размер явл я­
ется наименьш им, который м ож ет содерж ать весь source.
Если size присутствует, результат - одноранговы й массив разм ера size.
Если ф изическое представление результата больш е, чем sou rce, результат содерж ит
битовую комбинацию source в своих крайних правых битах; крайние левы е биты резуль­
тата неопределенные.
Если физическое представление результата меньш е, чем sou rce, результат содерж ит
крайние правые биты битовой комбинации source.
Примеры
T R A N SFE R (1082130432, 0.0) им еет значение 4.0 (на процессорах, которы е представ­
л яю т значения 4.0 и 1082130432, как строку двоичны х знаков 0100 0000 1000 0000 0000
0000 0000 0000).
TRANSFER ((/2.2, 3.3,4.4/), ((0.0, 0.0))) приводит к скаляру, значение которого (2.2, 3.3).
TR A N SFE R ((/2.2, 3.3, 4.4/), (/(0.0, 0.0)/)) приводит к ком плексном у одноранговом у
массиву длины 2. Его первый элем ент - (2.2, 3.3) и его второй элем ент им еет вещ ествен­
ную часть со значением 4.4 и неопределенной мнимой частью .
TR A N SFE R ((/2.2, 3.3, 4.4/), (/(0.0, 0.0)/), 1) приводит к ком плексном у одноранговом у
массиву, имею щ ему 1 элем ент со значением (2.2, 3.3).
TRA N SPO SE
Описание: транспонирует массив ранга два.
Синтаксис: result = T R A N SPO SE (matrix).
Класс: трансформ ационная функция; родовая.
Параметры: matrix долж ен бы ть двухранговы м массивом (лю бого типа данных).
Р езультаты . Д вухранговы й массив с тем же самы м типом и родовы м и параметрами
что и matrix. Его форма - (n, т ) , где ( т . , п) - форма matrix. Н априм ер, если форма
matrix - (4,6), форма результата - (6,4).
Элемент (i, j) результата имеет значение matrix (j, i), где i находится в диапазоне от 1
до п, ау в диапазоне от 1 до т .
Примеры
[2 3 4] Г2 5 8]
П усть В является массивом 5 6 7 . T R A N SPO SE (В) им еет значение 3 6 9
89 1 47 1
T R IM
Описание: возвращ ает параметр с удаленны м и конечны ми пробелам и.
Синтаксис: result - TRIM (string).
Класс: трансформ ационная функция; родовая.
Параметры: string долж ен бы ть скаляр ш п а "символьное".
Р езультаты . Тип результата - сим вольное с тем же самы м родовы м параметром , что
и у string. Его длина равна длине string минус число конечны х пробелов в string.
Значение результата - та же самая ст рока, кроме лю бы х удаленны х конечны х пробе­
лов. Если string содержит только знаки пробела, результат им еет нулевую длину.
266 С Д Алгсиин, В В Кондратьев. Програмирование на Visual FORTRAN

Примеры
TRIM ('ДА NAMEAAAA ') имеет значение 'ДА NAM E'.
TRIM ('ДА САД DAAAAA ') имеет значение 'АД CAA D'.
UBOUND
Описание: возвращ ает верхние границы для всех измерений массива или верхнюю
границу для указанного измерения.
С ин та кси с: result = U BO U N D (array [, dim] [, kind]).
К ласс: функция запроса; родовая.
Параметры :
array долж ен бы ть м ассив (лю бого типа данны х); не долж ен быть размещ аемым м ас­
сивом, которы й не разм ещ ен или разъединенны м указателем. Он может быть массивом
перенимаю щ ег о размера, если присутствует dim со значением меньшим, чем ранг array.
dim (opt) долж но бы ть скалярны м целым числом со значением в диапазоне от 1 до п,
где п - ранг array.
kind (opt) долж ен бы ть инициализированны м скалярным целочисленным выражением.
Р езультаты . Тип результата - целое число. Если kind присутствует, родовой пара­
метр результата указы вается kind; иначе родовой параметр результата - родовой пара­
метр целого типа но ум олчанию . Если процессор не может представить значение резуль­
тата в kind, результат неопределенны й.
Если dim присутствует, результат - скаляр. И наче результат - одноранг овый массив с
одним элем ентом для каж дого изм ерения array. Каждый элем ент в результате соответст­
вует изм ерению array.
Если array - секция массива или вы раж ение массив, которое не является целым мас­
сивом или ком понент структуры массив, U B O U N D (array, dim) имеет значение, равное
числу элем ентов в данном измерении.
Если array является целым массивом или компонент структуры массив, U BOUND
(array, dim) им еет значение, равное верхней границе для нижнего индекса dim из array, если
изм ерение dim отлично от нуля. Если изм ерение dim имеет размер нуль, соответствую ­
щ ий элем ент результата им еет значение нуль.
У становка оггций ком пилятора, указы ваю щ их размер целого числа, может затронуть
эту функцию .
Примеры
REA L A R R A Y A (1 :3, 5:8)
REA L A R R A Y B (2:8, -3:20)
U B O U N D (A R RA Y A) равно (3, 8). U B O U N D (A R RA Y A, DIM =2) равно 8.
U B O U N D (A R R A Y В) равно (8, 20). U BO U N D (A RRA Y B (5:8, :)) равно (4,24) пото­
му что число элем ентов является значащ им для параметров секции массива.

UNPACK
Описание: берет элементы из однорангового массива и распаковы вает их в другой
(возм ож но больш ий) м ассив под уггравлением маски.
С и н та кси с: result = U N PA C K (vector, mask, field).
Класс: трансф орм ационная функция; родовая.
Парам етры : vector долж ен бы ть одноранговы м массивом (лю бого типа данных); е ю
разм ер долж ен бы ть 1, г де t - число истинных элем ентов в mask; mask долж ен бы ть логи­
ческим массивом ; определяет куда помещ аю тся элементы vector, когда они распаковы ­
ваю тся.
Гпава 8. Встроенные процедуры 267
field долж ен иметь те же самы е тип и параметры типа, что и vector и соответствовать
mask. Элементы в fie ld вставляю тся в массив результата, когда соответствую щ ий элем ент
mask имеет значение ложь.
Результаты : массив с той ж е самой формой, что и mask , и тем же самы м типом и п а­
раметрами типа, что и vector.
Элементы в м ассиве результата заполняю тся в порядке элем ентов массива. Если i-й
элемент из mask истина, соответствую щ ий элем ент результата заполняется следую щ им
элементом vector. И наче он заполняется fie ld (если fie ld - скаляр), или i-м элем ентом field
(если f i e l d - массив).
Примеры
Го о Г
Пусть N является массивом 1 0 1 , Р является м ассивом (2, 3, 4, 5), a Q является мас-
100
TFF 20 1
сивом F T F U N PA CK (Р, M A S K -Q , F IE L D ^N ) п роизводит результат 14 1
TTF 3 50
2 11
U N PA CK (Р, M A SK ^Q , FIELD =1) производит результат 14 1
3 5 1

V E R IF Y
Описание: проверяет, что ряд сим волов содерж ит все сим волы в строке, иден ти ф и ­
цируя первый символ в строке, который не находится в наборе.
Синтаксис: result = V ERIFY (string, set [, back ] [, kind]).
Класс: элементная функция; родовая.
Параметры: string долж ен иметь тип "символьное"; set долж ен им еть тип "си м воль­
ное" с тем же самым родовы м параметром , что и у string ; back (opt) долж ен им еть л о ги ­
ческий тип; kind (opt) долж ен быть инициализированны м скалярны м целочисленны м вы ­
ражением.
Результаты . Тип результата - целое число. Если kind присутствует, родовой пара­
метр результата указы вается kind ; иначе родовой парам етр результата - родовой п ара­
метр целого типа по умолчанию . Если процессор не мож ет представить значение р езу ль­
тата в kind результата, результат неопределенный.
Если back опущ ен (или присутствует со значением лож ь) и string им еет по крайней
мере 1 символ, который не находится в set , значение результата - позиция крайнего л ев о ­
го символа string , который не находится в set.
Если back присутствует со значением истина и string им еет по крайней мере 1 сим вол,
который не находится в set , значение результата - позиция самого правого сим вола
string , которая не находится в set.
Если каждый символ string находится в set , или длина string - нуль, значение резуль­
тата - нуль.
У становка опций компилятора, указы ваю щ их разм ер целого числа, м ож ет затронуть
эту функцию.
Примеры
VERIFY ('CDD D C', 'С') имеет значение 2.
VERIFY ('CDD D C', 'С', BA C K =.TR U E.) имеет значение 4.
VERIFY ('CDD D C', 'CD') им еет значение нуль.
268 С. Д. Алгазин, В В Кондратьев. Програмирование на Visual FORTRAN

ZEXT
, О писание: расш иряет параметр нулями. И спользуется преж де всего для бит-
ориентированны х операций. Ее нельзя передавать как фактический параметр.
С и н т а к с и с : result = Z E X T (х [, k in d ]).
К л а с с : элем ентная ф ункция; родовая.
П а р а м е т р ы : х долж ен им еть логический или целочисленны й тип; k in d (opt) должен
бы ть инициализированны м скалярны м целочисленны м выражением.
Р е з у л ь т а т ы . Тип результата - целое число. Если k in d присутствует, родовой пара­
метр результата указы вается k in d ; иначе родовой параметр результата - родовой пара­
м етр целого типа по ум олчанию . Если процессор не мож ет представить значение резуль­
тата в k in d , результат неопределенны й.
Значение результата - х , расш иренное нулями и обработанное как значение без знака.
Требования памяти для целочисленны х констант никогда не меньш е чем 2 байта. Ц е­
лочисленны е константы внутри диапазона констант, которы е могут бы ть представлены
1 байтом все ещ е требую т 2 байта памяти.
У становка опций ком пилятора, указы ваю щ их размер ц ел о ю числа, может затронуть
эту функцию .
Собственное имя1 Тип параметра Тип результата
IZEXT LOGICAL0) IN TE G E R ®
LO G IC AL® IN TE G E R ®
INTEGER(1) I IN TE G E R ®
IN TE G E R ® IN TE G E R ®
JZEXT L0GICAL(1) INTEGERS)
LO G IC AL® INTEGER(4)
L0GICAL(4) INTEGER(4)
INTEG ER(I) INTEGER(4)
IN T E G E R ® INTEGER(4)
INTEGERS) INTEGER(4)
KZEXT LOGICAL(l) INTEGER(8)
LO G IC AL® INTEGER(8)
L0GICAL(4) INTEGER(8)
LO G IC A L® IN TE G E R ®
INTEG ER(l) IN TE G E R ®
IN TE G E R ® IN TE G E R ®
INTEGERS) IN TE G E R ®
INTEGER(8) IN TE G E R ®
1 Эти собственные функции нельзя передавать как фактические параметры.

Пример
11МТЕ6ЕР(2) \ZV_VAR Г???Р)Ц
11МТЕ6ЕР(4) Ц/АР
1__УАР = 1ЕХТ(^УЩ
Э тот пример запом инает величину 1МТЕСЕЯ(2) в младш их 16 битах величины
11^ТЕСЕЕ1(4), со значением результата Ь У А Я равным 'ООООРРТР'Х. Если бы функция
Z EX T не использовалась, то получаю щ ееся значение бы ло бы Т РР РР Р РР 'Х , потому чго
\V _V A R бы ло бы преобразовано в тип данны х левого операнда расш ирением знака.
Глава 9. Утверждения ввода/вывода
передачи данных

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

9.1. Записи и файлы


Записью является последовательность значений или последовательность символов.
Есть 3 вида записей Fortran, определяемы х следую щ им образом:
Ф орматные. Запись, содерж ащ ая форм атны е данны е, которые требую т трансляции
из внутреннего к внеш нему формату. Ф орм атны е утверж дения ввода/вы вода им ею т яв­
ные спецификаторы форм ата (которы е м огут указать список управления форматировани­
ем), пли спецификаторы списка имен (для списка имен форматирования). Только ф орм ат­
ные ут верждения ввода/вы вода могут п р о ч и т а в форм атны е данные.
Н еф орм ат ны е. Запись, содерж ащ ая неф орматны е данны е, которы е не оттран сли ро­
ваны из внутреннего формата. Н еформатная запись может также не содерж ать никаких
данных. Внутреннее представление неф орматны х данны х зависит от процессора. Т олько
неформатные утверж дения ввода/вы вода могу i прочитать неф орматны е данные.
Записи конца файла. П оследняя запись файла. Запись записи конца ф айла м ож ет
быть явно записана в последовательный файл утверж дением ENDF1LE (см. разд. 11.4).
Файл является последовательностью записей. Е а ь 2 in n a файлов Fortran, определяем ы х
следую щ им образом:
Внеш ние. Файл, который сущ ествует в среде (типа ком пью терны х дисков) внеш ней
по отнош ению к выполняемой программе. Записи во внеш нем файле долж ны бы ть или
все форматные, или все неф орматные. Есть 2 способа получить доступ к записям во
внеш них файлах: последовательный и прямой доступ.
При последовательном доступе записи обрабаты ваю тся в порядке, в котором они п о­
являю тся в файле. При прямом доступе записи обрабаты ваю тся по номеру записи, таким
образом, они могут быт ь обработаны в лю бом порядке.
Внут ренние. П амять (внутренняя память), которая ведет себя, как файл. Этот тип
файла обеспечивает способ передачи и преобразования данны х в памяти из одного ф ор­
м а м к другому. С одерж имое этих файлов запоминается как скалярны е сим вольны е пе­
ременные.

9.2. Компоненты утверждений передачи данных


Утверждения передачи данны х принимаю т один из следую щ их форматов:
io-keyword ( io-control-list) [io-list]
io-keyword format [, io-list]

1де io-keyword - одно из следую щ их утверж дений: A CC EPT, PRIN T (или TY PE), REA D ,
REW RITE или WRITE.
io-control-list является одним или нескольким из следую щ их специф икаторов у п рав­
ления ввода/вывода:
[U N IT = ]/o -w 7 /i [Ш 1=]дгоир END ERR REC
[m i= ]fo rm a t ADVANCE EOR IO S T A T S IZ E _______________________________ ___________________________________

йтотпт 269
270 С Д Алгал/н. В В Кондратьев. Програмирование на Visual FORTRAN

где io -lis t - список ввода/вы вода, который м ож ет содерж ать переменные (за исклю чени­
ем массивов, перенимаю щ их размер) или неявные D O -списки. Утверж дения вывода мо­
гут содерж ать константы или вы раж ения; f o r m a t является неклю чевой формой специфи­
катора форм ата списка управления (нет FM T=).
Если присутствует специф икатор форм ата ( [ ¥ M T = ] f o r m a t ) или спецификатор списка
имен ([NML=]grow/?), утверж дение передачи данны х называется форматным утверж дени­
ем ввода/вы вода; иначе, это - неф орматное утверж дение ввода/вывода.
Если присутствует специф икатор записи (REC), утверж дение передачи данных - ут­
верж дение ввода/вы вода с прямым доступом ; иначе, оно является утверждением вво­
да/вы вода с последовательны м доступом.
Если во время передачи данны х происходят ош ибки конца записи или конца файла,
позиционирование файла и выполнение повреждены, и вы полняю тся некоторы е специ­
фикаторы списка управления (если они представлены) (Для получения дополнительной
информации см. разд. 9.9.)

9.3. Список управления ввода/вывода


С писок управления ввода/вы вода состоит из одного или нескольких следую щ их ут­
верждений:
■ У стройство ввода/вы вода для вы полнения действия ввода/вы вода ([UNIT=]/o-w/7/Y),
т. е. долж ен быть задан канал ввода/вы вода. Этот специф икатор должен присутство­
вать; остальны е необязательны.
■ Ф орм ат (явный или управляем ы й списком), используем ый для редактирования дан ­
ных; если ф орм ат - явны й, долж на использоваться форм а с клю чевым словом:
( [ F M T = ] f o r m a t ).
■ Имя группы списка имен для вы полнения действия ввода/вы вода ([NML=]grow/?).
■ Н омер записи для доступа (REC).
■ Имя переменной, которая содерж ит состояние заверш ения операции ввода/вывода
(10STA T).
■ М етку утверж дения, которое получает управление, если происходит условие ошибки
(ERR), конца файла (EN D ) или конца записи (EOR).
■ Хотите ли вы использовать усовершенствованный или неусовершенствованный ввод/вы­
вод (ADVANCE).
■ Число символов читаемых из записи (SIZE) при помощи неусовершенствованного утвер­
ждения READ.
Ни один специф икатор управления не м ож ет появиться более одного раза, а список не
долж ен содерж ать и специф икатор формата, и специф икатор имени группы списка имен
одновременно.
С пециф икаторы управления м огут принимать лю бой из следую щ их форматов:
Ф ормат с клю чевы м словом. При использвании форм ата с клю чевым словом (на­
пример, UNIT=/<?-z//7/7) для всех специф икаторов списка управления в утверждении вво­
да/вы вода специф икаторы могу г появиться в лю бом порядке.
Неключевой формат. При использвании неклю чевой формы (например, io -u n it) для
всех специф икаторов списка управления в утверж дении ввода/вы вода спецификатор уст­
ройства ввода/вы вода долж ен быть первым элементом в списке управления. Если ис­
пользую тся специф икатор ф орм ата или специф икатор имени группы списка имен, они
долж ны нем едленно следовать за специф икатором io -u n it.
Глава 9. Утверждения ввода/вывода передачи данных 271
Смешанный формат. При см еш ивании ф орматов клю чевого слова и неклю чевого
слова для спецификаторов списка управления в утверж дении ввода/вы вода неключевые
значения долж ны появляться первыми. Когда используется только ф орм ат с клю чевым
словом спецификатора, все спецификаторы справа от него такж е долж ны быть ф орм ата­
ми с ключевым словом.

9.4. Спецификатор устройства


С пецификатор устройства идентиф ицирует устройство ввода/вы вода, к которому бу­
дет получен доступ. Он имеет следую щ ий формат:
[UNIT=]/o-an/f
io-unit для внеш них файлов идентиф ицирует логическое устройство и является одним
из следую щ их выражений:
■ Скалярным целочисленны м выраж ением, которое относи 1ся собственно к файлу, уст­
ройству ввода/вы вода или каналу. В случае необходим ости, перед использованием ,
значение преобразуется в целочисленны й тип данных. Ц елое число находится в ди а­
пазоне от 0 до 2**31-7. О братите внимание, что предопределенны е параметры FOR_
K P R IN T U N I T N O , F O R J K T Y P E U N I T N O , FO R _K _A C C E PT _U N IT N O и FO R _K _
READ UN1TNO, возможно, находятся не в этом диапазоне.
■ Устройства 5, 6 и 0 ассоциирую тся с предварительно связанны ми у стр о й с 1 вами.
■ Звездочкой (*). П ринимаем ое но ум олчанию (или неявное) внеш нее устройство, кото­
рое предварительно связано для ф орм атного последовательного доступа. Вы м ожете
такж е предварительно связать файлы , используя переменную среды.
Для внутренних файлов io-unit идентиф ицирует скалярную сим вольную переменную
или символьный массив, которая является внутренним файлом. Внутренний файл опре­
деляет внутренню ю область пам яти (перем енны й буфер), используем ы й с форм атны ми
(вклю чая управляю щ ий список) последовательны м и утверж дениями REA D и W RITE, io-
unit долж но быть указанно в управляющем списке. Если клю чевое слово U N IT опущ ено,
io-unit долж ен быть первым в управляющем списке.
Н омер устройства назначается или явно через утверж дение O PEN или неявно систе­
мой. Если утверж дение READ неявно откры вает файл, состояние файла - STA TU S =
= 'OLD'. Если утверж дение W RITE неявно откры вает файл, состояние файла - STA TU S =
= 'UNKNOW N'.
Если внутренний файл - скалярная символьная переменная, файл имеет только одну
запись; ее длина равна длине этой переменной.
Если внутренний файл - массив сим вольны х переменны х, файл имеет запись в каж­
дом элементе в массиве; длина каждой записи равна длине одного элем ента массива.
Внутренний файл м ож ет быть доступным только для чтения, если переменная была
определена и значение назначено каждой записи в файле. Если переменная, представ­
ляю щ ая внутренний файл, - указатель, он долж ен быть связанны м; если переменная -
динамически размещ аем ы й м ассив, он долж ен быть в настоящ ее время размещ ен.
П еред передачей данных внутренний файл всегда позиционируется в начало первого
символа первой записи.

9.5. Спецификатор формата


Спецификатор формата указы вает формат, который используется для редактирования
данных. Он имеет следую щ ий формат:
[FMT=]/brmaf
272 С Д А ъ ’азип, В В Кондратьев Програмироваиие на Visual FORTRAN

form at является одним из следую щ их выражений:


■ М еткой утверж дения FORM AT.
■ У тверж дение FO R M A T долж но быть в том же самом блоке области действия, что и
утверж дение передачи данных.
■ Звездочкой (*), указываю щ ей список управления форматированием.
■ Скалярной принимаем ой по ум олчанию целочисленной переменной, которая была на­
значена меткой утверж дения FO R M A T (через утверж дение A SSIG N ). Утверж дение
FO R M A T долж но быть в том же самом блоке области действия, что и утверждение
передачи данных.
■ Сим вольны м выражением (которое м ож ет быть массивом или символьной констан­
той), содерж ащ им ф орм ат во время вы полнения. П ринимаемое по ум олчанию сим­
вольное выраж ение долж но вы числяться к допустим ой спецификации формата. Если
вы раж ение - массив, он обрабаты вается, как будто все элементы массива были ука­
занны в порядке элементов массива и были связаны.
■ И менем ч и сл овою массива (или элем енга м ассива), содерж ащ его формат. Если клю ­
чевое слово FM T опущ ено, специф икатор ф орм ата долж ен быть вторым специфика­
тором в управляю щ ем списке; специф икатор ¡о-устройства долж ен быть первым. Ес­
ли специф икатор формата появляется в управляю щ ем списке, специф икатор группы
списка имен не долж ен появляться.

9.6. Спецификатор списка имен


С пециф икатор списка имен указывает список имен ф орм атирования и идентифициру­
ет группу списка имен для передачи данных. Он имеет следую щ ий формат:
[N M L =]group

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


N A M ELIST.
Если клю чевое слово NM L опущ ено, специф икатор списка имен долж ен быть вторым
специф икатором в управляю щ ем списке; специф икатор io-yстройства долж ен быть пер­
вым.
Если специф икатор списка имен появляется в управляю щ ем списке, спецификатор
ф орм ата не долж ен появиться.

9.7. Спецификатор записи


С пециф икатор записи идентиф ицирует номер записи для передачи данных в файл,
связанны й (откры ты й) для прямого доступа. Он имеет следую щ ий формат:
REC=r

где г - скалярное числовое выражение, указы ваю щ ее номер записи. Значение выражения
долж но бы ть больш е или равным 1 и меньш е или равным м аксимальному номеру записи,
допустим ом в файле.
В случае необходим ости значение преобразовы вается в целочисленны й тип данных
перед использованием.
Если REC присутствует, никакой специф икатор END, спецификатор формата * или
имя группы списка имен не мож ет появиться в том же самом управляю щ ем списке.
Г лава 9. У т верж дения вво д а /вы во д а передачи данны х 273

9.8. Спецификатор состояния ввода/вывода


Спецификатор состояния ввода/вы вода определяет перем енную , чтобы запомнить
значение, указы ваю щ ее состояние операции передачи данны х. Он им еет следую щ ий
формат:
IOSTAT=/-var
где i-var - скалярная целочисленная переменная. Когда утверж дение передачи данных
выполняется, i-var принимает одно из следую щ их значений:
■ П олож ительное целое число - указание условия ош ибки.
■ Отрицательное целое число - указание условия конца файла или конца записи. О трица­
тельные целые числа отличаются в зависимости от того, какое условие произошло.
■ Нуль указывает, что нет никакого условия ошибки, конца файла или конца записи.
Вы полнение продолж ается с утверж дения, следую щ его за утверж дением передачи
данных, или с утверж дения, идентиф ицированного специф икатором перехода (если он
есть).
Условие конца файла происходит только во время вы полнения последовательного у т­
верждения REA D ; условие конца записи происходит только во время вы полнения неусо­
верш енствованного утверж дения READ.

9.9. Спецификаторы перехода


Спецификатор перехода идентиф ицирует утверж дение адресата перехода, которое
получает управление, если происходит условие ош ибки: конца файла или конца записи.
Есть 3 спецификатора перехода, которые приним аю т следую щ ие форматы:
ERR=/аЬе/
END=label
EOR=label
где label является меткой утверж дения адресата перехода, которое получает управление,
когда происходит указанное условие.
У тверж дение адресата перехода долж но бы ть в том же самом блоке области действия,
что и утверж дение передачи данных.
К этим спецификаторам прим еняю тся следую щ ие правила:
ERR
■ Спецификатор ош ибки м ож ет появиться в утверж дении R EA D или W R IT E последо­
вательного доступа, в утверж дении R EA D с прямым доступом или утверж дении
REW RITE.
■ Если происходит ош ибочное условие, позиция файла не определена, а выполнение
утверждения заканчивается.
■ Если был указан 10STAT, переменная 10STA T становится определенной как положи­
тельное целочисленное значение. Если был указан SIZE (в неусовершенствованом утвер­
ждении READ), переменная SIZE становится определенной как целочисленное значение.
Если было указано ERR=label, выполнение продолжается с помеченного оператора.
EN D
■ Спецификатор конца файла, который м ож ет появиться только в утверж дении READ
последовательного доступа.
274 С Д Алгазин, В В. К ондрат ьев П рограм ирование на Visual FORTRAN

■ У словие конца ф айла происходит, когда в файле не сущ ествует больш е записей во
время последовательного чтения или когда сталкиваю тся с записью "конец ф айла”,
созданной утверж дением EN DFILE.
■ У словия конца файла не возникаю т в утверж дениях READ с прямым доступом.
■ Если возникает условие конца файла, файл позиционируется после записи конца ф ай­
ла, и вы полнение утверж дения заканчивается.
■ Если был указан IO STA T, переменная 10STA T становится определенной как отрица­
тельное целочисленное значение.
■ Если бы ло указано E N D = label, вы полнение продолж ается с помеченного оператора.

EOR
■ С пециф икатор конца записи м ож ет появиться только в форматном утверждении
REA D последовательного доступа, которое имеет спецификатор A D V A N C E -N O '
(неусоверш енствованны й ввод).
■ У словие конца записи возникает, когда неусоверш енствованное утверж дение READ
пробует передать данны е от позиции с конца записи.
■ Если возникает условие конца записи, файл позиционируется после текущ ей записи, и
выполнение утверж дения заканчивается.
■ Если был указан 10STA T , переменная 10STA T становится определенной как отрица­
тельное целочисленное значение.
■ Если бы ло указано PAD - YES' при соединении с файлом, запись дополняется пробе­
лами (по мере необходим ости), чтобы удовлетворить входной список элементов и со ­
ответствую щ ий описатель редактирования данных. Если был указан SIZE, перемен­
ная SIZE становится определенной как целочисленное значение. Если было указано
E O R = label, вы полнение продолж ается с пом еченного оператора.
■ Если возникает одно из условий и никакой специф икатор перехода не был указан в
управляю щ ем списке, но появляется специф икатор 10STA T, вы полнение продолж а­
ется с утверж дения, следую щ его за утверж дением ввода/вывода. Если не указан ни
специф икатор перехода, ни специф икатор IO STA T, программа заканчивается.

9.10. Спецификатор усовершенствования


С пециф икатор усоверш енствования определяет, возникает ли условие неусоверш ен­
ствования ввода/вы вода для утверж дения передачи данных. Он имеет следую щ ий ф ор­
мат:
ADVANCE=с-ехрг

где с-ехрг - скалярное сим вольное выражение, которое задается 'YES' для того, чтобы
у соверш енствовать ввод/вы вод, или 'N 0 ' для того, чтобы не усоверш енствовать ввод/вы­
вод. Значение по ум олчанию - 'YES'. К онечны е пробелы в выражении игнорирую тся.
С пециф икатор A D V A N C E м ож ет появиться только в форм атном , последовательном
утверж дении передачи данны х, которое указы вает внеш нее устройство. Он не должен
бы ть указан для передачи данны х списком имен или управляю щ его списка.
У соверш енствованны й ввод/вы вод всегда позиционирует файл в конце обработанной
записи, если не возникает ош ибочное условие. Н еусоверш енствованны й ввод/вывод м о­
ж ет позиционировать файл в позицию сим вола внутри текущ ей записи.
Гчава 9 У т верж дении вво д а /вы во д а п ередачи данны х 275

9.11. Спецификатор счетчика символов


С пецификатор счетчика сим волов определяет перем енную , которая содерж ит счетчик
количества прочитанных символов, когда заканчивается не усоверш енствованное у твер­
ждение READ. Он имеет следую щ ий формат:
S\ZE=i-var
где i-var - скалярная целочисленная переменная.
Если было указано PAD - YES' при соединении с файлом , вставленны е пробелы не
подсчитываю тся, поскольку файл был заполнен.
Спецификатор SIZE м ож ет появиться только в ф орм атном , последовательном утвер­
ждении REA D , которое им еет спецификатор A D V A N C E -N 0 ' (неусоверш енствованны й
ввод). Он не долж ен бы ть указан для передачи данны х списком имен или путем уп р ав­
ляю щ его списка.

9.12. Списки ввода/вывода


В утверж дении передачи данных список ввода/вы вода указы вает объекты , значения
которых будут переданы. Список ввода/вы вода является или неявным D O -списком или
простым списком переменных (за исклю чением м ассивов переним аю щ его размера).
Во входных утверж дениях список ввода/вы вода не м ож ет содерж ать константы и вы ­
раж ения, потому что они не указы ваю т им енованны е м естополож ения пам яти, на кото­
рые можно сослаться позже в программе.
О днако константы и выраж ения м огут появиться в списках ввода/вы вода для утвер­
ждений вывода, потому что компилятор м ож ет использовать врем енны е м естополож ения
памяти, чтобы поддерж ивать эти значения во время вы полнения утверж дения вво­
да/вывода.
Если входной элем ент - указатель, он долж ен в настоящ ее время связы ваться с оп ре­
делимы м адресатом; данны е передаю тся йз файла в связанны й адресат. Если элем ент вы ­
вода - указатель, он долж ен в настоящ ее время связы ваться с адресатом ; данны е п ереда­
ю тся от адресата в файл.
Если элем ент ввода или вывода - массив, он обрабаты вается, как будто элем енты (ес­
ли они есть) были указаны в порядке элем ентов массива. Н априм ер, если A R R A Y A -
массив формы (2,1), следую щ ие входные утверж дения эквивалентны :
READ *, ARRAY.A
READ *, ARRAY_A(1,1), ARRAY_A(2,1)
О днако никакой элем ент этого м ассива не м ож ет затронуть значение какого-либо вы ­
ражения во входном списке и при этом лю бой элем ент не м ож ет появиться во входном
списке более одного раза. Н апример, следую щ ие входны е утверж дения недопустимы :
INTEGER В(50)

READ *, В(В)
READ *, В(В(1):В(10))
Если элем ент ввода или вывода - динам ически разм ещ аем ы й м ассив, он долж ен бы ть
в настоящ ее время размещ енным. Если элем ент ввода или вы вода им еет производны й
тип, применяю тся следую щ ие правила:
Л ю бой компонент производного типа долж ен бы ть в блоке области действия, содер­
жащ ем утверж дение ввода/вывода.
276 С. Д А 1га ш н , В В К ондрат ьев. Программирование на Visual FO RTRAN

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


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

9.13. Простые элементы списка в списках ввода/вывода


В утверждении передачи данных простой список элементов имеет следующий формат:
item [, item] . . .
где item - одно из следую щ их выражений:
■ Д ля входных утверж дений - именем переменной. П еременная не долж на быть м асси­
вом перенимаю щ его разм ера, пока в последнем измерении не появляется одно из сле­
дую щ их выражений: ниж ний индекс, векторный нижний индекс или нижний индекс
секции, устанавливающий верхню ю границу.
■ Д ля утверж дений вы вода - именем переменной, выраж ением или константой. Лю бое
выражение не долж но пы таться выполнять дальнейш ие операции ввода/вывода на
том же самом логическом устройстве. Н апример, оно не долж но обращ аться к под­
програм ме функции, которая вы полняет ввод/вы вод на том же самом логическом уст­
ройстве.
■ Утверждение передачи данных задает значения (или передает значения из внешнего но­
сителя) элементам списка в порядке, в котором элементы появляются слева направо.
■ Когда м ногократны е имена м ассива использую тся в списке ввода/вы вода неф ормат­
ного утверж дения ввода или вывода, только одна запись прочитывается или записы ­
вается, независим о от того, сколько ссылок к имени массива появляется в списке.
Примеры
С ледую щ ий прим ер показы вает простой список ввода/вывода:
WRITE (6,10) J, К(3), 4, (L+4J/2, N
П ри использовании ссы лки к имени массива в списке ввода/вывода, входное утвер­
ж дение читает достаточно много данны х, чтобы заполнить каждый элем ент массива. У т­
верждение вывода записывает все значения из массива.
П ередача данны х начинается с начального элем ента м ассива и продолж ается в поряд­
ке прогрессии ниж него индекса с наиболее бы стро изменяю щ имся крайним левым ниж­
ним индексом. С ледую щ ее утверж дение определяет двумерны й массив:
DIMENSION ARRAY(3,3)
Если имя A RR A Y появляется без нижних индексов в утверж дении REA D , то утвер­
ж дение назначает значения из входной записи(ей) в A RR A Y (1,1), A RRA Y (2,1), ARRAY
(3,1), A RR A Y (1,2) и т. д. до A R R A Y (3,3).
Входная заиись содерж ит значения:
1,3,721.73
Следую щ ий прим ер показы вает, как переменные в списке ввода/вывода могут ис­
пользоваться в ниж них индексах массива позж е в этом же списке:
DIMENSION ARRAY(3,3)

READ (1,30) J, К, ARRAY(J,K)


Г iста 9 У т верж дении вво д а /вы во д а передачи данных 277
Когда утверж дение REA D выполняется, первое входное значение назначено на J, а
второе К, устанавливая значения нижнего индекса для A RR A Y (J, К). Значение 721.73
затем назначается A RRAY (1,3)- О братите внимание, что переменны е долж ны появиться
перед их использованием как значения нижних индексов массива.
Рассмотрите следую щ ее определение производно! о т ипа и объявление структуры:
TYPE EMPLOYEE
INTEGER ID
CHARACTER(LEN=40) NAME
END TYPE EMPLOYEE

TYPE(EMPLOYEE):: CONTRACT ! Объявление структуры типа EMPLOYEE


Следую щ ие утверж дения эквивалентны:
READ *, CONTRACT
READ *, CO NTRACTED, CONTRACT%NAME

9.14. Неявные DO-списки в списках ввода/вывода


В утверждении передачи данны х неявный D O -список действует, так как если бы
часть утверж дения ввода/вы вода находилась внутри цикла DO. Он имеет следую щ ий
формат:
(list, do-var = expr1, expr2 [, ехргЗ]).
где list - список переменных, выраж ений или констант (см. разд. 9.13).
do-var является именем скалярной целочисленной или действительной переменной.
П еременная не долж на быть одним из входных элем ентов в /ist.
ехрг являю тся скалярны ми числовы м и выражениями типа "целочисленное" или "дей­
ствительное". Все они не долж ны быть одного типа или иметь тог ж е тип, что и перем ен ­
ная DO.
Неявный D O -цикл инициализируется, выполняется и заканчивается таким же обр а­
зом, что и конструкция DO.
list является диапазоном неявного-DO цикла. Элементы в этом списке м огут о бр а­
щаться к do-var, но они пе долж ны изменять значение do-var.
Два влож енных неявных D O -списка не долж ны иметь одну и ту же (или связанную )
переменную DO. И спользуйте неявный D O -список, чтобы сделать следую щ ее:
■ Указать итерацию части списка ввода/вывода.
■ Передать часть массива.
■ П ередать элементы м ассива в последовательности, отличной от порядка прогрессии
нижнего индекса.
Если утверж дение ввода/вы вода, содерж ащ ее неявный D O -список, заканчивается н е­
правильно (с переходом END, EOR или ERR или со значением 10STA T , отличны м от ну­
ля), переменная DO становится неопределенной.
Следую щ ие 2 утверж дения вывода эквивалентны:
WRITE (3,200) (А,В,С, 1=1,3) i Неявный DO-список
WRITE (3,200) А,В,С,А,В,С,А,В,С 1 Простой список элементов
Следую щ ий пример показы вает 2 влож енных неявных D O -списка. Вы полнение сам о ­
го внутреннего списка повторяется чащ е всего:
WRITE (6,150) ((FORM(K,L), L=1,10), К=1,10,2)
Внутренний цикл DO выполняется 10 раз для каждой итерации внешнего цикла; второй
нижний индекс (L) продвигается от 1 до 10 для каждого приращения первого ниж нею индек­
278 С Д Ачгазин, В В. К ондрат ьев Программирование на Visual FO RTRAN

са (К). Это нормальный порядок элементов массива. Обратите внимание, что К увеличивает­
ся на 2, таким образом, выводятся только строки с нечетным номером массива.
В следую щ ем примере будет прочитан весь список неявного D O -списка (Р (1), Q (1,1),
О (1,2) . . . , Q (1,10)) преж де, чем 1 увеличивается на 2:
READ (5,999) (P(l), (Q(l,J), J=1,10), 1=1,5)
Следую щ ий пример использует ф иксированны е нижние индексы и нижние индексы,
которые изменяю тся согласно неявному D O -списку:
READ (3,5555) (B0X(1,J), J=1,10)
Входные значения назначаю тся BOX (1,1) до BO X (1,10), но другие элементы массива
не изменяю тся.
С ледую щ ий прим ер показывает, как переменная DO м ож ет сама непосредственно вы ­
водиться:
WRITE (6,1111) (1,1=1,20)
Ц елые числа 1-20 записываю тся.

9.15. Утверждения READ


У тверж дение REA D - это утверж дение ввода передачи данных. Д анны е могут быть
введены из внеш них записей последовательны м , прямым доступом или из внутренних
записей.

Форматы для последовательных утверждений READ


П оследовательны е утверж дения READ передаю т входные данны е из внеш них запи­
сей с последовательны м доступом . У тверж дения м огут быть форматны ми со специфика­
торами форм ата (которы е м огут использовать список управления форматированием) или
со специф икаторам и списка имен (для ф орм атирования списком имен), или они могут
бы ть неф орматны м и.
П оследовательны е утверж дения REA D имею т один из следую щ их форматов:
Форматный:
READ (eunit, format [, advance] [, size] [, iostat] [, err] [, end] [, eor]) [io-list]
READ form [, io-list]
Форматный - управляющий список:
READ (eunit, * [, iostat] [, err] [, end]) [io-list]
READ * [, io-list]
Форматный - список имен:
READ (eunit, nml-group [, iostat] [, err] [, end])
READ nml
Неформатный:
READ (eunit [, iostat] [, err] [, end]) [io-list]
где eunit - внеш ний специф икатор устройство ([UN1T=]/c>-?7/7/7); fo rm a t - спецификатор
ф ормата ([F M T ^J/orw a/).
advance является специф икатором усоверш енствования (ADVANCE^c-e.vpr). Если
значение с -expr равно 'YES', использую тся утверж дения, усоверш енствуваю щ ее ввод; ес­
ли значение равно 'N 0 ', использую тся неусоверш енствую щ ие утверждения. Значение по
ум олчанию - 'YES'.
size является специф икатором счетчика сим волов (SIZ E =i-var). Он мож ет быть указан
только для не усоверш енствованного утверж дения READ.
Глава 9 У т верж дения вв о д а /вы во д а передачи данных 279
io s ta t- специф икатор состояния (lOSTAT^Z-var).
err, end, еог являю тся специф икаторами перехода, если возникает условие ош ибки
(ERR=label), конца файла (E N D =label) или конца записи (E O R =label). EO R м ож ет быть
указан только для неусоверш енствованного утверж дения READ.
io-list - список ввода/вывода.
form - клю чевая ф орм а специф икатора ф орм ата (нет FM T=).
* является спецификатором формата, указы ваю щ им список управления ф орм атирова­
нием. (Он может такж е быть указан как FM T =*.)
nml-group является специф икатором списка имен ([N M L ^ g ro u p ), указы ваю щ им ф ор­
матирование списком имен.
nml является неклю чевой формой специф икатора списка имен (нет N M L=), указы ­
вающим ф орм атирование списком имен.
Правила для форматных последовательных ут верж дений READ
Ф орматные, последовательны е утверж дения REA D преобразовы ваю 1 данны е из си м ­
вольного в бинарный формат, используя спецификации ф орм ата для редактирования (ес­
ли она есть). Преобразованные данны е назначаю тся объектам в списке ввода/вы вода в п о­
рядке, в котором объекты появляю тся, слева направо.
Значения могут быть переданы объектам встроенны х или производны х типов. Для
производных типов значения встроенны х типов передаю тся компонентам встроенны х
типов, которые и составляю т эти структурированны е объекты.
Для передачи данны х файл долж ен бы ть позиционирован так, чтобы прочитанная за­
пись была форматной записью или записью конца файла.
Если число элем ентов списка ввода/вы вода меньше, чем число полей во входной запи­
си, утверждение игнорирует лиш ние поля.
Если число элем ентов списка ввода/вы вода больш е, чем число полей во входной за­
писи, входная запись дополняется пробелами. О днако если было указано PAD = 'NO' при
соединении с файлом, то входной список и спецификация файла не долж ны требовать
больш его количества сим волов из записи, чем она содерж ит. Если требуется больш е
символов и применяется неусоверш енствованны й ввод, возникает условие конца записи.
Если файл связан для неф орматного ввода/вывода, форматная передача данны х за­
прещена.
Следую щ ий пример показывает 2 форм атны х последовательны х утверж дения READ:
READ (*, '(В)', A DVANCE-NO') С
READ (FMT="(E2.4)", UNIT=6, IOSTAT=IO_STATUS) А, В, С
Правила для управляемых списком последовательных ут верж дений READ
П оследовательные утверж дения REA D , управляемые списком , используя типы дан ­
ных, преобразовы ваю т данны е из сим вольного в бинарны й формат, соответствую щ ие
элементам списка ввода/вы вода, чтобы определить ф орм ат данных. П реобразованны е
данные затем назначаю тся на объекты в списке ввода/вы вода в порядке, в котором они
появляю тся, слева направо.
Если появляется слеш (/) во время выполнения ввода, утверж дение R EA D заканчива­
ется и лю бы е оставш иеся входны е элементы списка не изменяю тся.
Если файл связан для неф орматного ввода/вывода, управляем ая списком передача
данных запрещена.
280 С Д A icasun , В В К ондрат ьев П рограм ирование на Visual FORTRAN

Управляемые списком записи


У правляем ая списком внеш няя запись состоит из последовательности значений и раз­
делителей значений. Значение мож ет быть лю бы м из перечисленны х ниже выражений.
Константа
К аж дая константа долж на бы ть литеральной константой типа "целочисленное", "дей­
ствительное", "ком плексное", "логическое" или "символьное; или не разграниченной
строкой символов. Д воичные, восьм еричны е, ш естнадцатеричны е, холеритовые и имено­
ванны е константы не разреш аю тся.
В ообщ е ф орм ат константы долж ен бы ть прием лем ы м для типа элем ента списка. Тип
данны х константы определяет тип данных значения и трансляцию из внеш него во внут­
ренний формат. Такж е применяю тся следую щ ие правила:
Числовой элем ент списка м ож ет соответствовать только числовой константе, а сим ­
вольный элем ент списка м ож ет соответствовать только символьной константе. Если ти ­
пы данны х числового элем ента списка и соответствую щ ей ему числовой константы не
соответствую т, преобразование выполняется согласно правилам для арифметического
назначения (см. табл. 4.2).
Ком плексная константа имеет ф орм ат пары действительны х или целочисленных кон­
стант, отделенны х запятой и заклю ченны х в круглые скобки. П робелы могут появиться
между открывающейся круглой скобкой и первой константой, до и после отделяю щ ей за­
пятой и между второй константой и закры ваю щ ейся круглой скобкой.
Л огическая константа представляет истинные значения (.TRU E, или лю бое значение,
начинаю щ ееся Т, . Т, t или .t) или лож ны е значения (.FALSE, или лю бое значение, начи­
наю щ ееся F, . F, f или . 0.
С трока сим волов не нуждается в разграничиваю щ их апострофах или кавычках, если
соответствую щ ий элем ент списка ввода/вы вода является сим вольны м типом по ум олча­
нию и выполнены условия:
■ С трока сим волов не содерж ит пробела, запятой или слеш а.
■ С трока сим волов не продолж ена за границу записи.
■ П ервы й знак не пробел в строке не является апострофом или кавычкой.
■ Л идирую щ ий символ не является строкой цифр, сопровож даемы х звездочкой. Нераз-
граниченная строка сим волов заканчивается первым пробелом, запятой, слешем или
концом записи, с которым сталкиваю тся. А построф ы и кавычки внутри неразграни-
ченных строк сим волов переданы, как есть.
Н улевое значенне
Н улевое значение указы вается двумя последовательны м и разделителями значений
[наприм ер, запятым и („)] или непустым начальным разделителем значений. Разделитель
значений перед концом записи не показывает нулевое значение. Н улевое значение ука­
зы вает, что соответствую щ ий элем ент списка остается неизменным. Н улевое значение
м ож ет представить всю комплексную константу, но не мож ет использоваться ни для од­
ной из частей ком плексной константы.
П овторением нулевого значения (г*) или константы (r*conslant), где г - целочислен­
ная литеральная константа, отличная от нуля, без знака, без родового параметра и без
встроенны х пробелов.
Разделитель значений - это лю бое число пробелов или запяты х или слеш ей, которым
п редш ествую т или за которым следую т лю бое число пробелов. Когда лю бой из них по­
является в сим вольной константе, их считаю т частью константы и не принимаю т за раз­
делители.
Г и т а 9 У т верж дения вво д а /вы во д а передачи данны х 281
Конец заииси эквивалентен знаку пробела, кроме тех случаев, когда он возникает в
символьной константе. В этом случае конец записи игнорируется, и сим вольная констан­
та продолж ается в следую щ ей записи (последний символ в преды дущ ей записи нем ед­
ленно сопровож дается первым сим волом следую щ ей записи).
П робелы в начале записи игнорирую тся, если они не часть сим вольной константы ,
продолженной от предыдущ ей записи. В этом случае пробелы в начале записи считаю т
частью константы.
П редположим, что следую щ ие утверж дения указаны:
CHARACTERS С
DOUBLE PRECISION Т
COMPLEX D,E
LOGICAL L.M
READ (1,*) I.R.D.E.L.M.J.K.S.T.CAB
Затем предположим, что следую щ ая внеш няя запись прочитана:
4 6.3 (3.4.4.2), (3, 2 ) , T,F„3*14.6 /ABC.DEF/GHrJKV
Значения элементов списка ввода/вывода:
Элемент списка ввода/вывода Назначенное значение
I 4
R 6.3
D (3.4.4.2)
Е (3.0.2.0)
L .TRUE.
М .FALSE.
J Неизменен
К 14
S 14.6
т 14.6D0
с ABC.DEF/GHI' JK
А Неизменен
В Неизменен
Правила для управляемых списком имен последовательных ут верж дений READ
Список имен последовательных утверж дений REA D п реобразовы вает данны е из
внеш него во внутренний формат, используя тип данны х объектов в соответствую щ ем у т­
верждении N A M ELIST, для определения форм ата данны х. П реобразованны е данны е на­
значаю тся указанным объектам в группе списка имен в порядке, в котором они появля­
ются, слева направо.
Если во время выполнения сталкиваю тся со слеш ем (/), утверж дение REA D закан чи ­
вается и лю бы е остаю щ иеся входные элементы списка не изм еняю тся.
Если файл связан для неф орматного ввода/вывода, передача данны х списком имен за­
прещена.
Записи списка имен (NAMELIST)
N A M ELIST - внеш няя запись, приним ает следую щ ую форму:
&group-name object = value [, object = value] . . . I
где group-пате является именем группы, содерж ащ ей объекты , которым будут п рисвое­
ны значения. Имя, долж но быть, было предварительно определено в утверж дении
N A M ELIST в блоке области действия. Имя не м ож ет содерж ать пробелы и долж но со ­
держаться внутри отдельной заииси.
282 С. Д Ачгсиин , В. В К ондрат ьев П р о гр а чнрование на Visual FO RTRAN

object является именем (или указателем подобъекта) объекта, определенного в объяв­


лении имени группы N A M ELIST. Имя объекта не долж но содерж ать пробелы кроме как
внутри круглых скобок специф икатора подстроки или нижнего индекса. Каждый объект
долж ен содерж аться в отдельной записи.
value м ож ет являться лю бы м из ниж еприведенны х выражений.
Константа
Каж дая константа долж на бы ть литеральной константой типа "целочисленное", "дей­
ствительное", "ком плексное", "логическое", "символьное" или неразграниченной строкой
символов. Д воичны е, восьм еричны е, ш естнадцатеричны е, холеритовы е и именованные
константы не разреш аю тся.
В ообщ е ф орм ат константы долж ен бы ть приемлемым для типа элем ента списка. Тип
данны х константы определяет тип данны х значения и трансляцию из внеш него во внут­
ренний формат. Такж е прим еняю тся следую щ ие правила:
Числовой элем ент списка может соответствовать только числовой константе, а сим ­
вольный элемен! списка м ож ет соответствовать только символьной константе. Если ти ­
пы данны х числового элем ента списка и соответствую щ ей ему числовой константы не
соответствую т, преобразование выполняется согласно правилам ариф метического назна­
чения (см. табл. 3.2).
Ком плексная к о н с т а н т имеет форм ат нары действительны х или целочисленных кон­
стант, отделенны х занятой и заклю ченны х в круглые скобки. П робелы м огут появиться
между открывающейся круглой скобкой и первой константой, до и после отделяю щ ей за­
пятой и между второй константой и закры ваю щ ейся круглой скобкой.
Л огическая константа представляет истинные значения (.TRU E, или лю бое значение,
начинаю щ ееся Т, . Т, t или .t) или лож ны е значения (.FALSE, или лю бое значение, начи­
наю щ ееся F, . F, f или . О-
С трока сим волов не нуж дается в разграничиваю щ их апострофах или кавычках, если
соответствую щ ий элем ент N A M ELIST им еет символьный тип но ум олчанию и следую ­
щ ее утверж дение истинно:
■ С трока сим волов не содерж ит пробела, запятой (,), слеш а (/), восклицательного знака
(!), ам персанда (&), знака доллара ($), левой круглой скобки ( ( ) , знака равенства (=),
знака процента (%) или точки ( . ) .
■ С трока сим волов не продолж ена за границу записи.
■ П ервы й знак в строке не пробел, не является апострофом или кавычкой.
■ Л идирую щ ий сим вол не является строкой цифр, сопровож даемы х звездочкой.
■ Н еразграниченная строка сим волов заканчивается первым пробелом, запятой, слешем
или концом записи. А построф ы и кавычки внутри неразграниченны х строк символов
переданы , как есть.
Если сталкиваю тся со знаком равенства, знаком процента или точкой, просматривая
неразграниченную строку сим волов, строка (или ее часть) обрабаты вается как имя пере­
менной, а не как неразграниченная строка символов.
Нулеве значение
Н улевое значение указы вается двумя последовательны м и разделителям и значений
[наприм ер, запяты м и („)] или непустым начальным разделителем значений. (Разделитель
значений перед концом записи не показы вает нулевое значение.) Нулевое значение ука­
зы вает, что соответствую щ ий элем ент списка остается неизменным. Н улевое значение
Гпава 9 Утверж дения вво д а /вы во д а передачи данны х 283
может представить всю комплексную константу, но не м ож ет использоваться ни для о д ­
ной из частей комплексной константы.
Повторением нулевого значения (г*) или константы (r*constant), где г - целочислен­
ная литеральная константа отличная от нуля, без знака, без родового парам етра и без
внедренных пробелов.
Пробелы м огут предш ествовать или следовать за начальным ам персандом (&), следо­
вать за именем группы, предш ествовать или следовать за знаком равенства или п редш е­
ствовать конечному слешу.
Комментарии, начинающиеся только с восклицательного знака (!), могут появиться где-
нибудь в вводном списке имен. Комментарий простирается до конца исходной строки.
Если объект появляется более 1 раза внутри входной записи для передачи данны х
списком имен, последнее значение является тем, которое используется. Если есть боль­
ше чем 1 пара o bject^ valu e, они долж ны бы ть разделены разделителям и значений.
Разделитель значений - это лю бое число пробелов, запяты х или слеш ей, которым
предш ествую т или за которым следует лю бое число пробелов. К огда лю бой из них п ояв­
ляется в символьной константе, их считаю т частью константы и не рассм атриваю т как
разделители.
Конец записи эквивалентен знаку пробела, кроме тех случаев, когда он возникает в
символьной константе. В этом случае конец записи игнорируется и сим вольная констан­
та продолж ается в следую щ ей записи (последний сим вол в предыдущ ей записи н ем ед­
ленно сопровождался первым символом следую щ ей записи).
Пробелы в начале записи игнорирую тся, если они не часть сим вольной константы ,
продолженной от предыдущ ей записи. В этом случае пробелы в начале записи считаю т
частью константы.

Запрос информации группы списка имен


Для получения информации о группе списка имен при вы полнении програм м ы , со­
держащ ей утверж дение REA D со списком имен, за одним или более пробелам и надо у к а­
зать символ вопросительного знака (?) или комбинацию сим волов (=?).
Если указано устройство, способное к вводу и выводу, знак (?) служ ит для о тображ е­
ния имен группы и объектов в этой группе. Комбинация сим волов (=?) служ ит для ото­
бражения имен группы, объектов в этой группе и текущ их значений для этих объектов (в
формате вывода списком имен). Если эти знаки указаны для другого канала (unit), си м во­
лы игнорируются.
Рассмотрите следую щ ие утверж дения:
NAMELIST /NLIST/ А.В.С
REAL А /1.5/
INTEGER В /2/
CHARACTER*5 С /'ABCDE7
READ (5,NML=NLIST)
WRITE (6,NML=NLIST)
END
Если во время выполнения с терм инала вводятся пробел со знаком (?), отображ аю тся
такие значения:
&NLIST
д
284 С Д. Алгазин, В В К о н д р а т ьев Программирование на Visual FORTRAN

Если вводится пробел и комбинация сим волов (=?), отображ аю тся такие значения:
&NLIST
А = 1.500000 ,
В = 2,
С = ABCDE
/
П редполож им , что указаны утверж дения:
NAMELIST /CONTROL/ TITLE, RESET, START, STOP, INTERVAL
CHARACTER*! 0 TITLE
REAL(KIND=8) START, STOP
LOGICAL(KIND=4) RESET
INTEGER(KIND=4) INTERVAL
READ (UNIT=1, NML=CONTROL)
У тверж дение N A M E LIST ассоциируется с именем группы C O N TR O L со списком из
5 объектов. У тверж дение R EA D читает входные данны е с устройства 1:
&CONTROL
TITLE-TESTT002AA',
INTERVALS,
RESET=.TRUE.,
START=10.2,
STOP =14.5
I
С ледую щ ие значения заданы объектам в группе CO N TRO L:
Объект списка имен Назначенное значение
TITLE TESTT002AA
RESET T
START 102
STOP 14.5
INTERVAL 1
Нет необходим ости определять значения всем объектам, объявленны м в соответст­
вую щ ей группе N A M E LIST. Если объект списка имен не появляется во входном утвер­
ждении, его значение (если оно есть) не изменяется.
Точно так же, когда указаны сим вольны е подстроки и элементы массива, изменяю тся
только значения указанны х переменны х подстрок и элем ентов массива. П редположим,
что прочитан следую щ ий ввод:
&CONTROL TITLE(9:10)='BB'/
Н овым значением для T IT L E является T E STT002B B ; изменяю тся только последние
2 сим вола в переменной. С ледую щ ий прим ер показы вает массив как объект:
DIMENSION ARRAY_A(20)
NAMELIST/ELEM/ARRAY_A
READ (UNIT=1,NML=ELEM)
П редполож им , что ввод прочитан:
&ELEM
ARRAY_A=1.1,1.2,, 1.4
I
С ледую щ ие значения задаю тся элементам A RR A Y А:
Г лава 9 Утверж дения вво д а /вы в о д а передачи данных 285

Элемент массива Назначенное значение


ARRAY_A(1) 1.1
ARRAY_A(2) 1.2
ARRAY_A(3) Неизменен
ARRAY A(4) 1.4
ARRAY A(5)...ARRAY A(20) Неизменен
Когда список значений определяется элем ентам массива, назначение начинается с
указанного элем ента массива, а не с первого элемента. П редполож им , что прочитан сле­
дую щ ий ввод:
&ELEM
ARRAY_A(3)=34.54, 45.34, 87.63, 3*20.00
/
Н овые значения даны только элементам 3 -8 м ассива A RR A Y А. Д ругие значения
элемента не изменяю тся.
Не разграниченные строки сим волов, которы е записы ваю тся при пом ощ и N A M E ­
LIST, могут бы ть не прочитаны, как ож идается, соответствую щ им N A M E L IST для чте­
ния. Рассмотрите следую щ ий пример:
NAMELIST/TEST/ CHARR
CHARACTER*3 CHARR(4)
DATA CHARR/'AAA', 'BBB', 'CCC, 'DDDV
OPEN (UNIT=1, FILE-NMLTEST.DAT')
WRITE (1, NML=TEST)
END
Выходной файл NMLTEST.DAT будет содержать:
&TEST
CHARR = AAABBBCCCDDD
I
Если затем сделана попытка прочитать данны е из N M L T E ST .D A T соответствую щ им
NA M ELIST для чтения, го используйте неразграниченны е строки символов:
NAMELIST/TEST/ CHARR
CHARACTER*3 CHARR(4)
DATA CHARR/4*' 7
OPEN (UNIT=1, FILE='NMLTEST.DAT')
READ (1, NML=TEST)
PRINT *, 'CHARR read in >', CHARR(1),'< >',CHARR(2),'< >',
1 CHARR(3), '< >', CHARR(4), '<’
END
Результат:
CHARR read in >AAA< > < > < > <
Правила для неформатных последовательных ут верж дений READ
Н еформатные последовательны е утверж дения REA D передаю т двоичны е данны е (без
преобразования) между текущ ей записью и объектам и, указанны ми в списке вво­
да/вывода. Читается только одна запись.
М огут быть переданы объекты встроенны х или производны х типов. Д ля передачи
данных файл долж ен бы ть позиционирован гак, чтобы прочитанная запись бы ла неф ор­
матной записью или записью конца файла.
286 С. Д Аъ'азин, В В К ондрат ьев Программирование на Visual FO RTRAN

Н еформатное последовательное утверж дение READ читает отдельную запись. Каж­


дое значение в записи долж но иметь тог же самый тип, что и соответствую щ ий объект во
входном списке, если значение недействительное или комплексное.
Если значение действительное или комплексное, одно комплексное значение может
соответствовать 2 действительны м объектам списка или 2 действительны х значения мо­
гут соответствовать 1 комплексном у объекту списка. С оответствую щ ие значения и объ­
екты долж ны иметь одинаковы й родовой параметр.
Если число элементов списка ввода/вы вода м е н ь ш е , чем число полей во входной за­
писи, утверж дение игнорирует лиш ние поля. Если число элем ентов списка ввода/вывода
бол ь ш е , чем число полей во входной записи, возникает ош ибка.
Если утверж дение не содерж ит списка ввода/вы вода, оно пропускает одну полную за­
пись, позиционируя файл, для того чтобы прочитать следую щ ую запись при следующ ем
выполнении утверж дения READ.
Если файл связан для форм атного, управляем ого списком или списком имен вво­
да/вы вода, неф орматная передача данных запрещ ена.
Следую щ ий пример показы вает неф орматное, последовательное утверждение READ:
READ (UNIT=6,1OSTAT=10_STATUS) А, В, С

Форматы для утверждений READ с прямым доступом


У тверж дения READ с прямым доступом передают входные данны е из внеш них запи­
сей с прямым доступом . (А трибуты файла с прямым доступом устанавливаю тся утвер­
ждением O PEN .)
У тверж дение REA D с прямым доступом может быть форм атны м или неформатным и
иметь один из форматов:
Форм ат ны й:
READ (eunit, format, rec [, iostat] [, err]) [io-list]
Неф орм ат ны й:
READ (eunit, rec [, iostat] [, err]) [io-list]
где eunit - специф икатор внеш него устройства ([U N IT =]io-unit)\ form at - спецификатор
формата ([FM T=]format), не долж ен быть звездочкой (*); rec - спецификатор записи
(REC=r); iostat - специф икатор состояния (IO S T A T -i-v a r)\ err - спецификатор перехода
( ERR=label), если возникает ош ибочное условие; io-list - список ввода/вывода.
П р а в и л а для ф о р м а т н ы х у т в е р ж д е н и й R E A D с п р я м ы м д о с т у п о м
Ф орматные утверж дения REA D с прямым доступом преобразовы ваю т данные из сим ­
вольного в бинарный формат, используя специф икации форм ата (если она есть) для ре­
дактирования. П реобразованны е данны е назначаю тся объектам в списке ввода/вывода в
порядке, в котором объекты появляю тся, слева направо.
Значения могут быть переданы объектам встроенного или производного типа. Для
производных типов, значения встроенны х типов передаю тся компонентам встроенных
типов, которые, в конечном счете, составляю т эти структурированны е объекты.
Для передачи данны х файл долж ен бы ть позиционирован так, чтобы прочитанная за­
пись была форм атной записью или записью конца файла.
Если число элем ентов списка ввода/вы вода м е н ь ш е , чем число полей во входной за­
писи, утверж дение игнорирует лиш ние поля.
Если число элем ентов списка ввода/вы вода б о л ь ш е , чем число гголей во входной за­
писи, входная запись дополняется пробелами. О днако если бы PAD - NO' был указан при
Гпава 9 У т верж дении вво д а /вы во д а передачи данных 287
соединении с файлом, то входной список и специф икация файла не долж ны требовать
больш его количества сим волов от записи, чем она содерж ит. Если требуется больш е
символов и применяется неусоверш енствованны й ввод, возникает условие конца записи.
Если спецификация ф орм ата указы вает другую запись, номер записи увеличивается
на 1, поскольку каждая последую щ ая запись читается этим утверж дением ввода.
Следующий пример показы вает форм атное утверж дение REA D с прямым доступом:
READ (2, REC=35, FMT=10) (NUM(K), K=1,10)
П равш а для неформатных ут верж дений READ с прямым доступом
Н еформатные утверж дения REA D с прямым доступом передаю т двоичны е данные
(без преобразования) между текущ ей записью и объектам и, указанны ми в списке вво­
да/вывода. Читается только одна запись.
М огут быть переданы объекты встроенною или производного типа. Для передачи дан ­
ных файл долж ен бы ть позиционирован так, чтобы прочитанная запись бы ла форматной
записью или записью конца файла.
Н еформатное утверж дение REA D с прямым доступом читает отдельную запись. К аж ­
дое значение в записи долж но иметь тот же тип, что и соответствую щ ий объект во вход­
ном списке, если значение недействительное или комплексное.
Если значение действительное или комплексное, одно комплексное значение мож ет
соответствовать 2 действительны м объектам списка или 2 действительны х значения м о­
гут соответствовать 1 ком плексном у объекту списка. С оответствую щ ие значения и о б ъ ­
екты долж ны иметь одинаковы й родовой параметр.
Если число элем ентов списка ввода/вы вода меньш е, чем число полей во входной за­
писи, утверждение игнорирует лиш ние ноля. Если число элем ентов списка ввода/вы вода
больше, чем число полей во входной записи, возникает ош ибка.
Если файл связан для ф орм атного, управляем ого списком или списком имен вво­
да/вывода, неформатная передача данны х запрещ ена.
П ример неформатных утверж дения READ с прямым доступом:
READ (1, REC=10) UST(1), LIST(8)
READ (4, REC=58, IOSTAT=K, ERR=500) (RHO(N), N=1,5)

Форматы и правила для внутренних утверждений READ


Внутренние утверж дения REA D передаю т входные данны е из внутреннего файла.
Внутреннее утверж дение REA D мож ет быть только форматны м. О но долж но вклю ­
чать спецификаторы форм ата (которы е могут использовать список управления ф орм ати­
рованием). Список имен форм атирования (N am elist) не разреш ается.
Внутреннее утверж дение R EA D имеет следую щ ий формат:
READ (¡unit, format [, iostat] [, err] [, end]) [io-list]
limit является специф икатором внутреннего устройства ([UNlT=]/o-z/w/Y). Он долж ен
быть символьной переменной. Он не долж ен быть секцией м ассива с векторным нижним
индексом.
form at является спецификатором форм ата ([FM T^Yorm at). Звездочка (*) указы вает
список управления форм атированием.
iostat является спецификатором состояния (IO STA T =i-var).
err, end являю тся специф икаторам и перехода, если возникает условие ош ибки
(ERR elabel) или конца файла (END=labef).
io-list является списком ввода/вывода.
288 С Д Атгапш, В В К ондрат ьев П рограм ирование на Visual FORTRAN

Ф орм атны е, внутренние утверж дения READ преобразовы ваю т данны е из сим вольно­
го в бинарны й форм ат, используя спецификации ф орм ата (если они есть), для редактиро­
вания. П реобразованны е данны е назначаю тся объектам в списке ввода/вывода в порядке,
в котором объекты появляю тся, слева направо.
Этот форма! утверж дения READ ведет себя так, как будто ф орм ат начинается с опи­
сателя редактирования BN. М ожно отменить это поведение, явно указав описатель ре­
дактирования BZ.
Значения м огут бы ть переданы объектам встроенного или производного типа. Для
производны х типов, значения встроенны х типов передаю тся компонентам встроенных
типов, которые, в конечном счете, составляю т эти структурированны е объекты.
П реж де чем происходит передача данны х, файл позиционируется в начало первой за­
писи. Эта запись становится текущ ей записью.
Если число элем ентов списка ввода/вы вода меньш е, чем число полей во входной за­
писи, утверж дение игнорирует лиш ние ноля.
Если число элем ентов списка ввода/вы вода больш е, чем число нолей во входной за­
писи, входная запись дополняется пробелами. О днако если бы PAD - NO' было указано
при соединении с файлом, то входной список и спецификация файла не долж ны требо­
вать больш его количества сим волов из записи, чем она содерж ит.
В списке управления форм атированием строки сим волов не имею т никаких раздели­
телей.
С ледую щ ий сегмент программы читает' запись и исследует первый символ, чтобы оп­
ределить, долж ны ли остаю щ иеся данны е интерпретироваться как десятичны е, восьме­
ричны е или ш естнадцатеричны е. Затем это использую т внутренние утверж дения READ,
чтобы сделать соответствую щ ие преобразования из представлений строки символов к
двоичном у.
INTEGER IVAL
CHARACTER TYPE, RECC)RD*80
CHARACTERS*) AFMT, IFMT, OFMT, ZFMT
PARAMETER (AFM T-fQ .A)', IFMT= '(110)', OFMT= '(011)', &
ZFMT= '(Z8)')
ACCEPT AFMT, ILEN, RECORD
TYPE = REC0RD(1:1)
IF (TYPE .EQ. 'D') THEN
READ (REC0RD(2:MIN(ILEN, 11)), IFMT) IVAL
ELSE IF (TYPE .EQ *0') THEN
READ (REC0RD(2:MIN(ILEN, 12)), OFMT) IVAL
ELSE IF (TYPE EQ. 'X') THEN
READ (REC0RD(2 MIN(ILEN, 9)),ZFMT) IVAL
ELSE
PRINT*, 'ERROR*
END IF
END

9.16. Утверждение ACCEPT


У тверж дение A C C E PT является утверж дением ввода передачи данных. Это утвер­
ж дение вы полняет то же самое, что и форм атное, последовательное утверж дение READ,
за исклю чением того, что утверж дение A C C EPT никогда не долж но связываться с опре­
деляемыми пользователем устройствам и ввода/вывода. Вы м ож ете отменить это ограни­
чение, используя переменную среды.
У тверж дение A C C EPT имеет один из следую щ их форматов:
Гпава 9. У т верж дения вво д а /вы во д а передачи данны х 289
Ф ормат ны й:
ACCEPT form [, io-lisf]
Форматный -управляю щ ий список:
ACCEPT * [, M ist]
Форматный - список имен:
ACCEPT пш/
где form - неклю чевая форма спецификатора ф орм ата (нет FM T=); io-list - список вво­
да/вывода; символ (*) является спецификатором формата, указы ваю щ им список управле­
ния форматированием; n m l - неклю чевая форма специф икатора списка имен (нет NM L=),
указываю щ ая список имен форматирования.
В следую щ ем примере символьные данны е читаю тся из неявного устройства и дво­
ичные значения назначаю тся каж дому из 5 элем ентов м ассива C H A RA R:
CHARACTER*! О CHARAR(5)
ACCEPT 200, CHARAR
200 FORMAT (5А10)

9.17. Утверждения WRITE


У тверж дение W R ITE является утверж дением вы вода передачи данны х. Д анны е могут
выводиться во внеш ние записи последовательны м или прям ы м доступом или во внут­
ренние записи.

Форматы для последовательных утверждений WRITE


П оследовательные утверж дения W R ITE передаю т вы ходны е данны е внеш ним запи­
сям последовательного доступа. Утверж дения м огут быть ф орм атны м и при использова­
нии спецификаторов ф ормата (которы е м огут использовать список управления форм ати­
рованием), или спецификаторов списка имен (для ф орм атирования списком имен), или
они м огут быть неформатными.
П оследовательное утверж дение W R ITE имеет один из следую щ их форматов:
Форматный:
WRITE (eunit, format [, advance] [, iostaf] [, err]) [io-list]
Форматный -управляю щ ий список:
WRITE (eunit, * [, iostaf] [, err]) [io-//sf]
Форматный - список имен:
WRITE (eunit, nml-group [, iostat] [, err]).
Неформатный:
WRITE (eunit [, iostat] [, err]) [io-lisf]
где eunit —спецификатор внеш него устройства ([U N IT =\io-unit).
fo rm a t - спецификатор форм ата ([FM T =]format).
advance является спецификатором продвиж ения (ADVANCE=c-ejt/?r). Если значение
c-expr равно 'YES', утверж дения использую т усоверш енствованны й вы вод; если значение
равно ’N 0 ’, утверж дения использую т неусоверш енствованны й вывод. Значение по ум ол­
ч а н и ю - ’Y ES’. #
iostat - спецификатор состояния (10ST A T =/-var).
err - спецификатор перехода (ERR=labef), если возникает ош ибочное условие.
io-list - список ввода/вывода.
290 С Д Лъ'азин, В. В К ондрат ьев П рограм ирование на Visual FO RTRAN

Символ (*) является специф икатором формата, указы ваю щ им форматирование управ­
ляю щ им списком. (Он мож ет бы ть такж е указан как FM T =*.)
nml-group - специф икатор списка имен ([NML=]gr<w/?), указываю щ ий ф орм атирова­
ние списком имен.
Правила для форматных последовательных ут верж дений WRITE
Ф орм атны е, последовательны е утверж дения W RITE преобразовы ваю т данные из
двоичного в сим вольны й ф орм ат, используя специф икации форм ата (если они есть) для
редактирования. П реобразованны е данны е записы ваю тся во внеш ний файл, который свя­
зан для последовательного доступа.
Значения могут бы ть переданы из объектов встроенного или производного типа. Для
производны х типов, значения встроенны х типов передаю тся из компонентов встроенных
типов, которые, в конечном счете, составляют эти структурированны е объекты.
С писок вывода и специф икация формата не долж ны указы вать больш е символов для
записи, чем размер записи. (Размер записи указы вается спецификатором RECL в утвер­
ж дении O PEN .)
Если файл связан для неф орматного ввода/вы вода, форматная передача данных за­
прещ ена.
С ледую щ ее прим еры показы ваю т примеры форматны х, последовательных утверж де­
ний W RITE:
WRITE (UNIT=8, FM T-(B )', A D V A N C E -N0') С
WRITE (*, &quot;(F6 5)&quot;, ERR=25,10STAT=I0_STATUS) А, В, С
Правила для управляемых списком последовательных ут верж дений WRITE
У правляем ы е списком последовательны е утверж дения W RITE передаю т данные из
двоичного в сим вольны й ф орм ат, используя тип данны х соответствую щ его элемента
списка ввода/вы вода, чтобы определить ф орм ат данных. П реобразованные данные затем
записы ваю тся во внеш ний файл.
Значения передаваем ы е как вывод, имею т те же форматы , что и значения, передавае­
мые как ввод. Табл. 9.1 показы вает значения по ум олчанию выходных форматов для ка­
ж дого встроенного тип а данных.

Таблица 9.1. Значения форматов по умолчанию


для управляемого списком вывода
Тип данных Выходной формат
BYTE 15
L0GICAL(1) L2
LO G IC AL® L2
L0GICAL(4) L2
INTEGER(1) 15
IN TE G E R ® 17
INTEGERS) 112
IN T E G E R ® I22
REAL(4) 1PG15 7E2
REAL® 1PG24.15E3
REAL(16) 1PG43 33E4
C0MPLEX(4) '(',1PG14 7E2,7,1PG14 7E2,')'
C O M P LE X ® Ч', 1PG23 15 E 3 , 1PG23.15E3,7
C0MPLEX(16) Ч',1 PG42 33E4//.1PG 42 33E4/)'
CHARACTER Aw (w - длина символьного выражения)
T ia e a 9 У т верж дения вво д а /вы во д а передачи данны х 291
По умолчанию сим вольны е константы не разграничиваю тся апостроф ам и или кавы ч­
ками и каждый внутренний апостроф или кавы чка внеш не представляю тся одним ап ост­
рофом или кавычкой.
Это поведение может быть изменено спецификатором D ELIM (в утверж дении O PEN )
следую щ им образом:
■ Если файл откры т со спецификатором D E L IM -Q U O T E ', сим вольны е константы р аз­
граничиваю тся кавы чками, и каждая внутренняя кавы чка внеш не представляется
двумя последовательным и кавычками.
■ Если файл откры т со спецификатором D E L IM -A P O S T R O P H E ', сим вольны е констан­
ты разграничиваю тся апострофами, и каждый внутренний апостроф внеш не пред­
ставляется 2 последовательны м и апострофами.
Каждое утверж дение вывода записы вает одну или более полны х записей.
Литеральная сим вольная константа' или комплексная константа м огут бы ть более
длинными, чем вся запись. Для комплексны х констант конец записи м ож ет появиться
между запятой и мнимой частью, если мнимая часть и закры ваю щ ая круглая скобка не
могут соответствовать текущ ей записи. Д ля литеральны х констант, более длинны х, чем
вся запись, константа продолж ается на столько записей на сколько необходимо.
Каждая запись вывода для управления кареткой начинается со знака пробела. Слеши,
восьмеричные значения, нулевые значения и повторяемые формат ы значений не выводятся.
Если файл связан для неф орматного ввода/вы вода, управляем ая списком передача
данных запрещ ена.
П редположим, что следую щ ие утверж дения указаны:
DIMENSION А(4)
DATA А/4*3.4/
WRITE (1,*) 'ARRAY VALUES FOLLOW
WRITE (1,*) A,4
Следую щ ие записи будут записаны на внеш нее усгройст во 1:
ARRAY VALUES FOLLOW
3.400000 3.400000 3.400000 3.400000 4
Правила для последовательных ут верж дений WRITE со списком имен
П оследовательны е утверж дения W RITE со списком имен преобразовы ваю т данны е из
внутреннего во внеш ний формат, используя типы данны х объектов в соответствую щ ем
утверждении N A M ELIST, чтобы определить формат данны х. П реобразованны е данны е
затем записываю тся во внеш ний файл.
Значения, переданные как вывод, имею т те же форм аты , что и значения, переданны е
как ввод.
По умолчанию сим вольны е константы не разграничиваю тся апостроф ам и или кавы ч­
ками, и каждый внутренний апостроф или кавы чка представляю тся внеш не одним ап ост­
рофом или кавычкой.
Это поведение может быть изменено спецификатором D ELIM (в утверж дении O PEN )
следую щ им образом:
■ Если файл откры т со спецификатором D E L IM -Q U O T E ', сим вольны е константы раз­
граничиваю тся кавычками и каждая внутренняя кавы чка внеш не представляется д в у ­
мя последовательными кавычками.

1LITERAL CONSTANT (литеральная константа) - константа без имени. Заметим, что в языке
Фортран 77 это называлось прост о константой.
292 С. Д Алгазин, В В К ондрат ьев. П рограм ирование на Visual FO RTRAN

■ Если файл откры т со специф икатором D E L I M - A PO STR O PH E', символьные констан­


ты разграничиваю тся апостроф ам и, и каж дый внутренний апостроф внеш не пред­
ставляется 2 последовательны м и апострофами.
Каж дое утверж дение вы вода записы вает одну или более полных записей.
Л итеральная сим вольная константа или комплексная константа могут быть более
длинны м и, чем вся запись. В случае комплексны х констант мож ет возникнуть конец за­
писи между запятой и м ним ой частью , если мнимая часть и заклю чительная правая круг­
лая скобка не м огут точно подходить в текущ ей записи.
Каждая запись вы вода начинается со знака пробела для управления кареткой, за ис­
клю чением литеральны х сим вольны х констант, которы е являю тся продолж ением преды ­
дущ ей записи.
Слеш и, восьм еричны е значения, нулевые значения и повторяем ы е форматы значений
не выводятся. Если файл связан для неф орматного ввода/вывода, передача данных спи­
ском имен запрещ ена.
Рассмотрите следую щ ие утверж дения:
CHARACTERS9 NAME(2)/2*' 7
REAL PITCH, ROLL, YAW, P O S IT IO N ®
LOGICAL DIAGNOSTICS
INTEGER ITERATIONS
NAMELIST /PARAM/ NAME, PITCH, ROLL, YAW, POSITION, &
DIAGNOSTICS, ITERATIONS

READ (UNIT=1 ,NML=PARAM)


WRITE (UNIT=2,NML=PARAM)
П редполож им , что нрочитан следую щ ий ввод:
&PARAM
NAME(2)(10:)='HEISENBERG',
PITCH=5.0, YAW=0.0, ROLL=5.0,
DIAGNOSTICS=.TRUE.
ITERATI0NS=1()
I
Следую щ ая инф орм ация записы вается затем в файл, связанны й с устройством 2:
&PARAM
NAME = 1 HEISENBERG',
PITCH = 5.000000,
ROLL = 5.000000,
YAW = 0.0000000E+00,
POSITION = ЗЧ Ш 00000Е +00.
DIAGNOSTICS = T,
ITERATIONS = 10
I
О братите вним ание, что сим вольны е значения не заклю чаю тся в апострофы , если вы­
ходной файл не откры т с DEL1M = 'A PO STR O PH E'. Значение POSITIO N не определено
во входном списке имен, таким образом , текущ ее значение POSITIO N записывается.
Правила для неформатных последовательных утверо/сдений WRITE
Н еф орм атны е последовательны е утверж дения W R ITE передаю т двоичны е данные
(без преобразования) м еж ду объектам и, указанными в списке ввода/вы вода и текущ ей
записью . Записы вается только одна запись.
М огут бы ть переданы объекты встроенного или производного типа.
Гчава 9 У т верж дения вво д а /вы во д а передачи данных 293
Эта форма утверж дения W R ITE записы вает точно одну запись. Если нет списка эл е­
мента ввода/вывода, утверж дение записы вает одну нулевую запись.
Если файл связан для форм атного управляем ого списком или списком имен вво­
да/вывода, неформатная передача данны х запрещ ена.
Следую щ ий пример показы вает неф орматное последовательное утверж дение W RITE:
WRITE (UNIT=6, IOSTAT=IO_STATUS) А, В, С

Форматы для утверждений WRITE с прямым доступом


Утверждения W R ITE с прямым доступом передаю т вы ходны е данны е во внеш ние за­
писи с прямым доступом. (А трибуты файла с прямым доступом устанавливаю тся утвер­
ждением OPEN .)
У тверж дение W R ITE с прямым доступом м ож ет быть форм атны м или неф орм атны м
и имеет один из следую щ их форматов:
Форматный:
WRITE [eunit, format, rec [, iostat] [, err]) [io-list]
Неформатн ый:
WRITE (eunit, rec [, iostaf] [, err]) [io-lisf\
где eunit - спецификатор внеш него устройства ([UNlT=]/c>-wtf//); fo rm a t - специф икатор
формата {[V M Y -Y orm at), не долж ен бы ть звездочкой (*); гес - специф икатор записи
(REC=r); iostat - специф икатор состояния (IO S T A T =i-var); err - специф икатор перехода
(ERR=labeI), если возникает условие ош ибки; io-list - список ввода/вы вода.
Правила для форматных ут верж дений WRITE с прямым доступом
Ф орматные утверж дения W R ITE с прямым доступом преобразовы ваю т данны е из
двоичного в сим вольны й формат, используя специф икации ф орм ата (если они есть) для
редактирования. П реобразованны е данны е записы ваю тся во внеш ний файл, которы й свя­
зан для прямого доступа.
Значения могут быть переданы из объектов встроенного или производного типа. Д ля
производных типов значения встроенны х типов передаю тся из ком понентов встроенны х
типов, которые, в конечном счете, составляю т эти структурированны е объекты.
Если значения, указанны е списком ввода/вы вода не заполняю т запись, добавляю тся
знаки пробела для заполнения записи. Если список ввода/вы вода указы вает слиш ком
много символов для записи, выдается сообщ ение об ош ибке. Е сли специф икация ф орм а­
та указывает другую запись, номер записи увеличивается на единицу, поскольку каж дая
последующ ая запись записы вается этим утверж дением вывода.
Пример показы вает ф орм атное утверж дение W R ITE с прямым доступом:
WRITE (2, REC=35, FMT=10) (NUM(K), K=1,10)
Правила для неформатных ут верж дений WRITE с прямым доступом
Н еформатные утверж дения W R ITE с прямым доступом передаю т двоичны е данны е
(без преобразования) между объектам и, указанны ми в списке ввода/вы вода и текущ ей
записью. Записывается только 1 запись.
М огут быть переданы объекты встроенного или производного типа.
Если значения, указанны е списком ввода/вы вода не заполняю т всю запись, доб авля­
ются знаки пробела, чтобы заполнить запись. Если список ввода/вы вода указы вает сли ш ­
ком много символов для записи, выдается сообщ ение об ош ибке.
Если файл связан для форм атного управляем ого списком или списком имен вво­
да/вывода, неформатная передача данны х запрещ ена.
294___________ с д А л г/Зин, В В К ондрат ьев Программирование на Visual FORTRAN

Н еф орм атны е утверж дения W R ITE с прямым доступом:


WRITE (1, REC=10) LIST(1), LIST(8)
WRITE (4, REC=58, IOSTAT=K, ERR=500) (RHO(N), N=1,5)

Форматы и правила для внутренних утверждений WRITE


Внутреннее утверж дение W R ITE передает вы ходны е данны е внутреннему файлу. Оно
м ож ет бы ть только форм атны м и долж но вклю чать спецификаторы формата, которые
м огут использовать список управления форм атированием. С писок имен форматирования
не разреш ается.
В нутреннее утверж дение W R ITE им еет формат:
WRITE (¡unit, format [, iostat] [, err]) [io-list]
iunit является специф икатором внутреннего устройства ([UNlT=]/0-w?/7). Он должен
быть сим вольной переменной по умолчанию . Он не долж ен бы ть секцией массива с век­
торны м нижним индексом.
fo rm a t является специф икатором форм ата ([FMT=]/b/77?<7/). Звездочка (*) указывает
список управления форм атированием.
iostat является специф икатором состояния (IO STA T =i-var).
err является специф икатором перехода (E R R -la b e l), если происходит ошибка.
io-list является списком ввода/вывода.
Ф орм атны е внутренние утверж дения W RITE преобразовы ваю т данны е из двоичного
в сим вольны й ф орм ат, используя спецификации форм ата (если они есть) для редактиро­
вания. П реобразованны е данны е записы ваю тся во внутренний файл.
Значения м огут бы ть переданы из объектов встроенного или производного типа. Для
производны х типов значения встроенны х типов передаю тся из компонентов встроенных
типов, которы е и составляю т эти структурированны е объекты.
Если число сим волов в записи меньш е, чем длина записи, остальная часть заполняет­
ся пробелами. Число дополнительны х сим волов не долж но превыш ать длину записи.
С им вольны е константы не разграничиваю тся апострофами или кавы чками и каждый
внутренний апостроф или кавы чка представляю тся внеш не 1 апострофом или кавычкой.
Внутреннее утверж дение W RITE:
INTEGER J, К, STAT_VALUE
CHARACTER*50 CHAR_50

WRITE (FMT=*, UNIT=CHAR_50, IOSTAT=STAT_VALUE) J, К

9.18. Утверждения PRINT и TYPE


У тверж дение PR IN T является утверж дением вы вода передачи данных. TY PE - это
синоним PRINT. Все ф орм аты и правила для утверж дения PRINT применимы к утвер­
ж дению TY PE.
У тверж дение PR IN T соответствует форм атном у последовательном у утверждению
W RITE, за исклю чением того, что утверж дение PRIN T никогда не долж но передавать
данны е устройству ввода/вы вода, определяемом у пользователем. Это ограничение мож­
но отм енить, используя переменную среды.
У тверж дение PRIN T им еет один из следую щ их форматов:
Форматный:
PRINT form [, io-list]
Глава 9 Ут верж дения вво д а /вы во д а передачи данны х 295
Ф о р м а т н ы й - уп р ав л я ю щ и й с п и с о к :
PRINT * [ / ю Щ
Ф орм ат ны й - список имен:
PRINT пш/
где form - неключевая форма специф икатора форм ата (нет FM T=); io-list - список вво­
да/вывода; Символ (*) является спецификатором формата, указы ваю щ им список управ­
ления форматированием; nml - неклю чевая форма специф икатора списка имен (нет
NM L=), указывающ ая список имен форм атирования.
В примере одна запись (содерж ащ ая 4 поля данны х) печатается на неявное устройство
вывода:
CHARACTERS6 NAME, JOB
PRINT 400, NAME, JOB
400 FORMAT ('N AM E-. A, 'JOB=', A)

9.19. Утверждение REWRITE


У тверж дение REW RITE является утверж дением вывода передачи данны х, которое
перезаписывает текущ ую запись. У тверж дение REW RITE м ож ет бы ть ф о р м аш ы м или
неформатным и имеет один из следую щ их форматов:
Ф орм ат ны й:
REWRITE (eunit, format [, iostat] [, err]) [io-list]
Неф орм ат ны й:
REWRITE (eunit [, iostat] [, err]) [io-list]
где eunit - спецификатор внеш него устройства ([UNIT=]/o-wtf/7); fo rm a t - специф икатор
формата ([FMT=]f'ormat); iostat - специф икатор состояния (IO STA T =i-var); err - специ­
фикатор перехода (ER R =Iabel)< если условие ош ибки возникает; io-list - список вво­
да/вывода.
В утверждении R EW RITE данны е (преобразованны е, если задан форм атны й вывод;
не преобразованные, если задан неф орматный вывод), записы ваю тся в текущ ую (сущ ест­
вующ ую) запись в файле с прямым доступом .
Текущ ая запись - последняя запись, к которой получает доступ предш ествую щ ее ус­
пешное утверждение REA D с последовательны м или с прямым доступом.
М ежду утверждением REA D и R EW R ITE нельзя указать никакое другое у тверждение
ввода/вывода на этом логическом устройстве (кроме INQ U IRE). Вы полнение лю бого
другого утверждения ввода/вы вода на логическом устройстве разруш ает контекст теку­
щей записи и делает текущую запись неопределенной.
Только одна запись можеч бы ть перезаписана отдельной операцией утверж дения
REW RITE. Список вывода (и специф икация формата, если она есть) не долж ен указывать
больш е символов для записи, чем разм ер записи. (Размер записи указы вается специф ика­
тором RECL в утверждении O PEN .)
Если число символов, указанное списком ввода/вы вода (и форм атом , если он есть) не
заполняет запись, для ее заполнения добавляю тся знаки пробела.
В следую щ ем примере текущ ая запись (содерж ащ аяся в файле относительной органи­
зации, связанном с логическим устройством 3) обновляется значениями, представленны ­
ми NAM E, AGE и BIRTH:
REWRITE (3,10, ERR=99) NAME, AGE, BIRTH
10 FORMAT (A16 , 12,A8)
Глава 10. Форматирование ввода/вывода

С пециф икатор формата, появляю щ ийся в утверж дении ввода или вывода, указывает
ф орм ат передаваем ы х данны х и необходим ое преобразование данных (редактирование)
в соответствии с этим форматом. У казанный ф орм ат мож ет быть явным или неявным.
Я вны й ф орм ат обозначен в спецификации формата, которая появляется в утверж де­
нии F O R M A T или сим вольном выражении. В ы раж ение долж но быть допустимой специ­
фикацией формата.
С пециф икация форм ата содерж ит описатели редактирования, которые могут быть
описателям и редактирования данны х, описателями редактирования управления или опи­
сатели редактирования строк символов.
Н еявный ф орм ат определяется процессором и указы вается при помощ и управляю щ е­
го списка или списка имен форматирования.
С писок управления ф орм атированием указы вается звездочкой (*); список имен ф ор­
м атирования (N am elist) указывается именем группы списка имен (Namelist).
С писок управления ф орм атированием м ож ет бы ть указан для того, чтобы перемес­
тить последовательны е файлы и внутренние файлы. С писок имен форматирования может
бы ть указан только для того, чтобы переместить последовательны е файлы.

10.1. Спецификации формата


С пециф икация форм ата мож ет появиться в утверж дении FO R M A T или символьном
вы раж ении. В утверж дении FO R M A T специф икации форм ата предш ествует клю чевое
слово FO R M A T. Специф икация форм ата имеет вид:
(format-Hst)

где form at-H st - список с одним или больш им количеством описателей редактирования,
разделенны х запяты м и или слеш ами (/):
О писатели редактирования данных: I, В, О, Z, F, Е, EN, ES, D, G, L и А..
О писатели редактирования управления: Т, TL, TR, X, S, SP, SS, BN, BZ, Р , :, /, $, \ и Q.
О писатели редактирования строки: Н, 'с' и "с", где с - сим вольная константа.
Запятая м ож ет бы ть опущ ена в случаях:
■ М ежду описателем редактирования Р и нем едленно после описателя редактирования
F, Е, EN, ES, D или G.
■ П еред описателем редактирования слеш (/), когда не присутствует необязательная
специф икация повторения.
■ П осле описателя редактирования слеш (/).
■ П еред или после описателя редактирования двоеточие (:).
О писатели редактирования м огут быть влож ены и спецификация повторения может
предш ествовать описателям редактирования данны х, описателю редактирования слеш
или заклю ченном у в скобки списку описателей редактирования.
Правила использования
У тверж дение FO R M A T долж но быть помечено.
И м енованны е константы не разреш аю тся в специф икациях формата.
Если связанное утверж дение ввода/вы вода содерж ит список ввода/вывода, специфи­
кация форм ата долж на содерж ать по крайней мере 1 описатель редактирования данных
или описатель редактирования управления Q.____________________________________________
йш от \т 296
Глава 10 Ф орм ат ирование вво д а /вы во д а 297
Знаки пробела м огут п ред ш ествовать о тк ры ваю щ ей круглой ско б ке, и д о п о л н и ­
тельны е пробелы м огут появиться где-н и б удь внутри сп ец и ф и к ац и и ф орм ата. Эти
пробелы не им ею т н икакого см ы сла, если они не вн утри о п и сателя р ед ак ти р о в ан и я
строки сим волов.
Когда выполняется форматное утверж дение ввода, установка специф икатора BLA N K
(для соответствую щ его логического устройства) определяет интерпретацию пробелов в
пределах спецификации. Если указаны описатели редактирования BN или BZ для ф ор­
матного утверждения ввода, они заменяю т принимаем ую по ум олчанию интерпретацию
пробелов. (О принимаемых по умолчанию специф икаторах B LA N K см. разд. 11.5.)
Для форматного ввода используйте запятую как внеш ний разделитель поля. Запятая
заканчивает ввод полей (для несимвольных типов данны х), которы е короче, чем ож идае­
мое число символов. Он мож ет такж е определять пустой указатель (нулевая длина) поля.
Первый символ записи, переданной на устройство построчной печати или терминал,
обычно используется для управления кареткой; он не печатается. П ервы й символ такой
записи долж ен быть пробелом, нулем, единицей, знаком доллара, плю сом или A SC II
NUL. Лю бой другой символ обрабаты вается как пробел.
Спецификация формата не м ож ет указать больш е сим волов вывода, чем может со ­
держать внеш няя запись. Н апример, запись устройства построчной печати не может со ­
держать больш е, чем 133 символа, вклю чая сим вол управления кареткой.
Табл. 10.1 обобщ ает описатели редактирования, которые м огут использоваться в сп е­
цификациях формата.

Таблица 10.1.Краткое изложение описателей редактирования


Код Формат Эффект
А A[w] Передает символьные или холеритовые значения
В Bw[.m] Передает двоичные значения
BN BN Игнорирует встроенные и конечные пробелы в числовом входном поле
BZ BZ Обрабатывает встроенные и конечные пробелы в числовом входном поле, как нули
D Dw.d Передает действительные значения при помощи экспоненты Р
Е Ew d[Ee] Передает действительные значения при помощи экспоненты Е
EN ENw.d[Ee] Передает действительные значения при помощи технического представления
ES ESw.dfEe] Передает действительные значения при помощи экспоненциального представления
F Fw.d Передает действительные значения без экспоненты
G Gw.d[Ee] Передает значения всех встроенных типов
H nHch[ch...] Передает символы после описателя редактирования Н в выходную запись
1 Iw[.m] Передает значение десятичного целого числа
L Lw Передает логические значения* при вводе передает символы;^и выводе передает Т или Р
0 Ow[.m] Передает восьмеричные значения
P kP Интерпретирует некоторые вещественные числа с указанным коэффициентом масштаби­
рования
Q Q Возвращает число символов, оставшееся во входной записи
S S Повторно вызывает необязательный знак плюс (+) в числовых полях вывода; противосто­
ит действию 5Р и 5 5
SP SP Записывает необязательный знак плюс (+) в числовые поля вывода
SS SS Подавляет необязательный знак плюс (+) в числовых полях вывода
T Tn Табулирует к указанной позиции
TL TLn Табулирует влево на указанное число позиций
TR TRn Табулирует вправо на указанное число позиций
X nX Пропускает указанное число позиций
298 С. Д Алгсиин, В В К ондрат ьев П рограм ирование на Visual FORTRAN

Код Формат Эффект


Z Zw[ m] Передает шестнадцатеричные значения
$ $ Подавляет перемещение перевода каретки во время интерактивного (диалогового) вво­
да/вывода
Заканчивает управляющий формат, если нет больше элементов в списке ввода/вывода
/ [r]/ Заканчивает текущую запись и переходит к следующей записи
\ \ Продолжает ту же самую запись; то же, что и $
'c'1 'c' Передает символьную литеральную константу (между разделителями) в выходную запись
1 Эти разделители могут быть также кавычками (").

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


В утверж дениях ввода/вы вода передачи данны х спецификатор формата ([FM T = ]for-
m at) м ож ет быть сим вольны м вы раж ением , которое является символьным массивом,
элементом сим вольного м ассива или сим вольной константой. Этот тип формата также
назы вается динам ическим форм атом , потому что он может быть сконструирован или из­
менен во время вы полнения программы .
В ы раж ение долж но иметь вид строки символов, главная часть которой является до­
пустимой специф икацией ф орм ата (вклю чая заклю чаю щ ие круглые скобки).
Если вы раж ение является элем ентом сим вольного массива, спецификация формата
полностью долж на находиться внутри этого элемента.
Если вы раж ение я в л я й с я сим вольны м м ассивом, спецификация форм ата может про­
долж иться за первый элемент в следую щ ие последовательны е элементы.
Если вы раж ение является сим вольной константой, разграниченной апострофами, ис­
пользуйте 2 апостроф а подряд (") для представления сим вола апострофа в спецификации
формата. Н апример:
PRINT '("NUM can"t be a real number")'
Точно так же, если вы раж ение является символьной константой, разграниченной ка­
вы чкам и, используйте 2 последовательны е кавычки ("") для представления символа ка­
вычки в специф икации формата.
Чтобы аннулировать использование последовательных апострофов или кавычек,
м ож но пом естить сим вольную константу в список ввода/вывода вместо спецификации
ф орм ата таким образом:
PRINT "(A)", "NUM can't be a real number"
П риводим другую сим вольную специф икацию формата:
WRITE (6, '(112,14,112)') l,J ,K .
В следующем примере спецификация формата меняется с каждой итерацией цикла DO:
SUBROUTINE PRINT(TABLE)
REAL TABLE(10,5)
CHARACTER*5 FORCHR(0:5), RPAR*1, FBIG, FMED, FSML
DATA FORCHR(()),RPAR /'(',')'/
DATA FBIG,FMED,FSML /'F8.2,','F9.4,','F9.6,'/
DO 1=1,10
DO J=1,5
IF (TABLE(U) .GE 100.) THEN
FORCHR(J) = FBIG
ELSE IF (TABLE(I.J) .GT. 0.1) THEN
FORCHR(J) = FMED
ELSE
FORCHR(J) = FSML
Гпава 10 Ф орм ат ирование вво д а /вы во д а 299
END IF
END DO
FORCHR(5)(5:5) = RPAR
WRITE (6.FORCHR) (TABLE(U), J=1,5)
END DO
END
Утверж дение D ATA назначает откры ваю щ ую круглую скобку элем енту сим вольного
массива FORCHR(O), закры ваю щ ую круглую скобку - для более позднего использования
и 3 описателя редактирования F - сим вольны м переменным.
Затем надлеж ащ ие описатели редактирования F вы бираю тся для вклю чения в сп ец и ­
фикацию формата. Выбор основы вается на величине индивидуальны х элем ентов м ассива
TABLE.
О кткрываю щ ая круглая скобка добавляется к специф икации ф орм ата непосредствен ­
но перед тем, как утверж дение W RITE использует его.
Примечание. С пециф икации формата, записанные в массивах, перетранслирую тся во время
выполнения каждый раз при использовании. Если в утверждении R E A D для чтения данных не­
посредственно в формат используется холеритовый или символьный формат, эти данные не копи ­
руются назад в оригинальный массив. Массив недоступен для последующего использования как
спецификация формата во время выполнения.

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


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

10.3. Форматы для описателей редактирования данных


О писатель редактирования данны х принимает одну из следую щ их форм:

[r\cw
[r]cw.m
[f[ON.d
[i]cw.d[Ee]

где г - спецификация повторения. Д иапазон г от 1 до 2147483647 (2**31—1). Если г оп у ­


щен, он предполагается равным 1.
с является одним из следую щ их кодов формата: 1, В, О, Z, F, Е, EN, ES, D, G, L или А.
w является общ им количеством цифр в поле (ш ирина поля). Если w опущ ено, система
применяет значения по ум олчанию (см. "П риним аемы е но ум олчанию разм еры для о п и ­
сателей редактирования данных"). Д иапазон w от 1 до 2147483647 (2 * * 3 1 -1 ) на п роцес­
сорах Intel ЕМ 64Т и Intel Itanium ; от 1 до 32767 (2** 15-1) на процессорах 1А-32. Д ля 1, В,
О, Z и F, диапазон может начинаться с нуля.
т является м инимальным числом цифр, которы е долж ны бы ть в поле (вклю чая на­
чальные нули). Д иапазон т от 0 до 32767 (2** 15-1) на процессорах Intel Е М 64Т и Intel
Itanium; от 0 до 255 (2**8—1) на процессорах IA-32.
300 С Д A iraзин, В В К ондрат ьев Программирование на Visual FORTRAN

ci является числом цифр справа от десятичной точки (значащ ие цифры). Д иапазон d от


0 до 32767 (2** 15-1) на процессорах Intel ЕМ 64Т и Intel Itanium; от 0 до 255 (2**8-1) на
процессорах 1А-32. На число значащ их цифр воздействует коэффициент масш табирова­
ния, если он указан для описателя редактирования данных.
Е идентиф ицирует поле экспоненты.
е - число цифр в экспоненте. Д иапазон е от 1 до 32767 (2** 15-1) на процессорах Intel
Е М 64Т и Intel Itanium; от 1 до 255 (2**8—1) на процессорах 1А-32.
Правила использования
Fortran 95/90 (и преды дущ ий стандарт) разреш ает опускать ширину ноля только для
описателя А. О днако Intel Fortran разреш ает опускать ш ирину поля для лю бого описателя
редактирования данных.
О писатели г, н», т, d n e долж ны все быть полож ительны ми, целочисленны ми сим ­
вольными константам и без знака; или вы раж ениям и переменного формата; родовой пара­
метр не мож ет быть указан. Они не могут быть именованными константами.
Ф актически полезны е диапазоны для г, и\ т , d и е могут быть ограничены размерами
записи (RECL) и файловой системой.
О писатели редактирования данны х имеют следую щ ие собственны е форматы:
■ Ц елочисленный: Iw[.m ], B w [.m ], Ow[.m ] и Zw[.m].
■ Д ействительны й и комплексны й: Fw.d, Evv.d[Ee], ENw.d[Ee], ESw .d[Ee], Dw.d и
G w .d[Ee].
■ Л огический: Lw.
■ Сим вольны й: A[w].
О писатель d должен бы ть указан с описателями поля F, Е, D и G, даж е если ¿/равен
нулю. Такж е требуется десятичная точка. Вы долж ны указать w и d или опустить их оба.
С пециф икация повторения мож ет упростить форматирование. Н апример, следую щ ие
2 утверж дения эквивалентны :
20 FORMAT (Е12 4,E12.4IE12.41I5,I51I5,I5)
20 FORMAT (3E12.4.4I5)
Общие правила для числового редактирования
Для числового редактирования (к данным ввода и вывода) применяю тся следую щ ие
правила (описатели редактирования данны х I, В, О, Z, F, Е, EN, ES, D и G).
Правила для обработки ввода
Н ачальные пробелы во внеш нем поле игнорирую тся.. Если задан BLANK = 'NULL'
(или был указан описатель редактирования BN), встроенны е и конечны е пробелы игно­
рирую тся; в противном случае они обрабаты ваю тся, как нули. П олностью пустое поле
обрабаты вается, как нулевое значение.
Следую щ ая таблица показы вает, как но ум олчанию интерпретирую тся пробелы:
Тип устройства файла Назначенное значение
Явно открытое устройство BLANK-NULL'
Внутренний файл BLANK-NULL'
Предварительно связанный файл1 BLANK-NULL'
1 Для интерактивного ввода из предварительно связанных файлов вы должны явно указать описатель редактирования ВЫ
или В1, чтобы гарантировать желательное поведение.

Знак минус долж ен предш ествовать отрицательному значению во внеш нем поле; знак
плю с необязателен перед полож ительны м значением.
Во входных записях константы могут вклю чать лю бой допустимый родовой пара­
метр. Именованные константы не разреш аю тся.
Гчааа 10. Ф орм ат ирование вво д а /вы во д а 301
Если иоле данных в записи будет содерж ать м еньш е, чем и* сим волов, то утверж дение
ввода прочитает символы из следую щ его поля данных в записи. Вы м ож ете п редотвра­
тить эго, дополняя короткое поле пробелами или нулями или используя запяты е, чтобы
разделить входные данные. Запятая заканчивает поле данны х и мож ет такж е использо­
ваться для определения пустого указателя (нулевая длина) поля.
Правила для обработки вы вода
Ш ирина поля и' долж на быть достаточно больш ой, чтобы вклю чать лю бой ведущ ий
знак плюс или минус и лю бую десятичную точку или эксп о н еш у . Н апример, ш ирина по­
ля для описателя редактирования данных Е долж на быть д о стаю ч н о больш ой, чтобы со ­
держать следую щ ее:
■ Для положительны х чисел: ¿/+5 или ¿/4 е+ 3 символов.
■ Для отрицательных чисел: с/4 6 или с!+е+4 символов.
П оложительное или нулевое значение (нуль допускается для описателей I, В, О, Z и Р)
может иметь знак плюс, в зависим ости от того, какой описатель редактирования знака
действует. Если значение отрицательно, крайний левый не знак пробела является знаком
минус. Если значение меньше, чем указанная ш ирина поля, вставляю тся начальны е про­
белы (значение выравнивается по правому краю). Если значение является слиш ком
больш им для указанной ширины поля, все поле вывода заполняется звездочками (*).
Когда значение ширины поля - нуль, ком пилятор выбирает наим еньш ую полож и­
тельную ф актическую ширину поля, которая не приводит к полю , заполненном у звездоч­
ками.
Редактирование целых чисел. Редактированием целых чисел управляю т: I (десяти ч­
ный), В (двоичный), О (восьмеричны й) и Ъ (ш естнадцатеричны й) описатели редакти ро­
вания даных.
Редактирование /. О писатель редактирования 1 передает десятичны е целочисленны е
значения. Он имеет следую щ ий формат:
Щ.т]
Значение т (миним альное число цифр в константе) не долж но превыш ать значение IV
(ш ирина поля) и игнорируется при вводе (применяется только при выводе).
Указанный элемент списка ввода/вы вода долж ен иметь тип целочисленное или ло ги ­
ческое. О писатель редактирования в может использоваться, чтобы редактировать ц ело­
численные данные; он следует тем ж е самым правилам, что и 1и\
Правила д. ¡я обработки ввода
При вводе описатель редактирования данных 1 передает и* сим волов из внеш него поля
и определяет их целочисленное значение соответствую щ ем у элем енту списка вво­
да/вывода. Внеш ние эксплуатационны е данные долж ны быть целочисленной коне I ант ой.
Если значение превы ш ает диапазон соответствую щ его входного элем ента списка,
возникает ошибка.

Таблица использования описателя редактирования I


Формат Ввод Значение
14 2788 2788
13 -26 -26
19 АААААА 312 312
Правила для обработки вывода
При выводе описатель редактирования данных I передает значение соответствую щ его
элемента списка ввода/вывода, вы ровненного по правому краю, во внеш нее поле длиной
302 С Д Ачгазин, В В К ондрат ьев П рограм ировайие на Visual FORTRAN

Поле состоит из нуля или больш ого количества пробелов, сопровождаемых знаком
(знак плюс необязателен, а знак минус для отрицательны х требуется) и целочисленной
константой без знака и начальны х нулей.
Если /77 указан, целочисленная константа без знака долж на иметь минимум т цифр.
В случае необходим ости она дополняется начальными нулями. Если т равен нулю и
элемент списка вывода имеет нулевое значение, внеш нее поле заполняется пробелами.
Следую щ ая таблица показы вает вывод, использую щ ий описатель редактирования I
(символ А представляет непечатаем ы й знак пробела):
Формат Значение Вывод
13 284 284
14 -284 -284
14 0 ДАЛО
15 174 АА174
12 3274 **
13 -473 ***
17 29.812 Ошибка; десятичная точка недопустима
14.0 01 АААА
14.2 АА01
144 1 0001
Редактирование В. О писатель редактирования данных В передает двоичные (по ос­
нованию 2) значения. Он имеет следую щ ий формат:
В1л/[т]
Значение т (миним альное число цифр в константе) не долж но превысить значение
(ш ирина поля); т игнорируется при вводе (применяется только при выводе). Указанный
элем ент списка ввода/вы вода м ож ет иметь тип целочисленное, действительное или логи ­
ческое.
Правила для обработки ввода
При вводе описатель редактирования данных В передает символов из внеш него по­
ля и назначает их двоичное значение соответствую щ ем у элементу списка ввода/вывода.
Внеш нее поле долж но содерж ать только двоичны е знаки (0 или 1) или пробелы.
Если значение превы ш ает диапазон соответствую щ его входного элемента списка,
возникает ош ибка.

Ввод, использующий описатель редактирования В


Формат Ввод Значение
В4 1001 9
В1 1 1
В2 0 0
Правила для обработки вы вода
При выводе описатель редактирования данных В передает двоичное значение соот­
ветствую щ его элем ента списка ввода/вы вода, вы ровненного по правому краю, во внеш ­
нее поле длины и’ символов.
Поле состоит из нуля или больш его количества пробелов, сопровождаемых целочис­
ленной константой без знака (состоящ ей из двоичны х знаков) и начальных нулей. О три­
цательное значение передается во внутреннем формате.
Если указан т , целочисленная константа без знака долж на иметь по крайней мере т
цифр. При необходим ости она дополняется начальными нулями.
Если т - нуль и элем ент списка вы вода имеет нулевое значение, внеш нее поле запол­
няется пробелами.
Глава К) Ф орм ат ирование вво д а /вы во д а 303
Вывод, использующий описатель редактирования В
Формат Значение Вывод
В4 9 1001
В2 0 АО
Редактирование О. О писатель редактирования данных О передает восьм еричны е (по
основанию 8) значения. Он имеет следую щ ий формат:
О\м[.т]
Значение т (миним альное число цифр в константе) не долж но превыш ать значение и>
(ш ирина поля); т игнорируется при вводе (применяется только при выводе).
Указанный элем ент списка ввода/вывода м ож ет иметь тип целочисленное, дей стви ­
тельное или логическое.
Правила для обработки ввода
При вводе описатель редактирования данных О передает и> символы из внеш него поля
и назначает их восьм еричное значение соответствую щ ем у элементу списка ввода/вывода.
Внешнее поле долж но содерж ать только восьм еричны е цифры (0 до 7) или пробелы.
Если значение превы ш ает диапазон соответствую щ его входного элем ента списка,
возникает ошибка.

Ввод, использующий описатель редактирования О


Формат Ввод Значение
05 32767 32767
04 16234 1623
03 97А Ошибка; 9 недопустима в восьмеричной нотации
Правила для обработки вывода
При выводе описатель редактирования данны х О передает восьм еричное значение со­
ответствую щ его элемента списка ввода/вы вода, вы ровн ен н ою по правому краю, во
внешнее поле, которое состоит из символов.
Поле состоит из нуля или больш его количества пробелов, сопровож даемы х целочис­
ленной константой (содержащ ей восьмеричные цифры) без знака и начальных нулей.
Отрицательное значение передается во внутреннем формате без первого знака "минус".
Если т - указано, целочисленная константа без знака долж на иметь по крайней мере
т цифр. В случае необходим ости она дополняется начальными нулями.
Если /77 - нуль и элем ент списка вывода имеет нулевое значение, внеш нее иоле запол­
няется пробелами.

Ввод9использующий описатель редактирования О


Формат Значение Вывод
06 32767 А77777
012 -32767 А37777700001
02 **
14261
04 27 ддзз
05 105 41050
04.2 7 ДД07
04.4 7 0007
Редактирование I. О писатель редактирования данных Ъ передает ш естнадцатерич­
ные (по основанию 16) значения. Он им еет следую щ ий формат:
Zw[.m]
304 С Л Ai<>uши, В В Кондратьев Програмироваиие на Visual FORTRAN

Значение т (м иним альное число цифр в константе) не долж но превысить значение


(ш ирина поля); т игнорируется при вводе (используется только при выводе).
У казанны й элемент списка ввода/вы вода мож ет иметь тип целочисленное, действи­
тельное или логическое.
IIреш и а для обработ ки ввода
При вводе описатель редактирования данных Ъ передает уу сим волов из внеш него по­
ля и назначает их ш естнадцатеричное значение соответствую щ ем у элементу списка вво­
да/вы вода. Внеш нее поле долж но содерж ать только ш естнадцатеричны е цифры (от 0 до 9
и от А (а) до Р (0 ) или пробелы.
Если значение превы ш ает диапазон соответствую щ его вх о д н о ю элемента списка,
возникает ош ибка.

Ввод, использующий описатель редактирования Z


Формат Ввод Значение
Z3 А94 А94
Z5 A23DEF A23DE
15 95 AF2 Ошибка; десятичная точка недопустима
Правила для обработ ки вывода
При выводе описатель редактирования данных Ъ передает ш естнадцатеричное значе­
ние с о о 1 ве тс!в у ю щ е ю элем ента списка ввода/вы вода, вы ровненного по правому краю,
во внеш нее поле, которое состоит из символов.
Поле состойI из нуля или большего количества пробелов, сопровождаемых целочислен­
ной коне 1ан той без знака (состоящей из шестнадцатеричных цифр) и начальных нулей. От­
рицательное значение передается во внутреннем формате без первою знака минус.
Если т - указано, целочисленная константа без знака долж на иметь по крайней мере
т цифры; при необходим ости она дополняется начальными нулями.
Если т - нуль и элем ент списка вывода имеет нулевое значение, внеш нее поле запол­
нено пробелами.

Вывод, использующий описатель редактирования Z


Формат Значение Вывод
74 32767 7FFF
Z9 -32767 AFFFF8001
12 16 10
Z4 -1 0 .5
****
Z3.3 2708 А94
Z6 4 2708 ДД0А94
Действительным и комплексным редактированием управляют описатели редакти­
рования данных: F, Е, D, EN, ES и G.
Если ш ирина поля (w) не указана для действительного описателя редактирования
данны х, систем а поставляет значение по умолчанию .
На д ей ствш ел ьн ы е описатели редактирования данных мож но воздействовать указа­
нием коэф ф ициента масш табирования.
Примечание. Не используйте действительные описатели редактирования данных, когда пытаетесь
анализировать текстовый ввод. Э ти описатели принимаю т некоторые форматы, которые явля­
ются просто текстовыми как допустимые числовые входные значения. Н апример, входные зна­
чения Т и F обрабатываются как значения 1.0 и 0.0, соответственно, для .T R U E , и .F A LS E .
Гчава 10 Форматирование ввода/вывода 305
Редактирование /ч О писатель редактирования данны х Р передает действительны е
значения. Он имеет следую щ ий формат:
Fiv.cZ
Значение (число цифр после десятичной точки) не долж но превы ш ать значение н ’
(ш ирина поля).
Указанный элем ент списка ввода/вывода долж ен иметь тип действительное или он
должен быть действительной или мнимой частью комплексного типа.
Правила для обработка ввода
П ри вводе описатель редактирования данны х Р передает сим волов из внеш него п о ­
ля и назначает их действительное значение соответствую щ им элементам списка вво­
да/вывода. Внеш ние полевые данные долж ны бы ть целочисленной или вещ ественной
константой.
Если входное поле содерж ит только символ экспоненты или десятичную точку, оно
обрабатывается как нулевое значение.
Если входное поле не содерж ит десятичную точку или экспоненту, оно обрабаты вает­
ся как вещ ественное число цифр, с цифрами справа от десятичной точки. (В случае
необходимости добавляю тся начальные нули.)
Если входное поле содерж ит десятичную точку, м естополож ение этой десятичной
точки отменяет местоположение, указанное описателем Р.
Если поле содерж ит экспоненту, эта экспонента используется, чтобы установить ве­
личину значения преж де, чем оно назначается элем енту списка.

Ввод, использующий описатель редактирования


Формат Ввод Значение
Р8.5 123456789 123.45678
Р8.5 -1234.567 -1234.56
Р8.5 24.77Е+2 2477.0
Р5.2 1234567.89 123.45
Правила для обработки вывода
П ри выводе описатель редактирования данных Р передает действительное значение
соответствую щ его элемента списка ввода/вы вода, вы ровненного по правому краю и о к ­
ругленного до десятичны х позиций, во внеш нее поле, которое состоит из символов.
м долж ен быть больш е или равным с!+3, чтобы учесть:
■ знак (дополнительно, если значение полож ительно и дескриптор 8Р не действует);
■ одну цифру слева от десятичной точки;
■ десятичную точку;
■ с/ цифр справа от десятичной точки.

Вывод, использующий описатель редактирования Г


Формат Значение Вывод
Р8.5 2.3547188 А2.35472
¥9.3 8789.7361 А8789.736
51.44
-23.24352 ДД-23 2435
¥5 2 325.013 ******
Р5.2 -.2 -0 20
Редактирование Е и О. О писатели редактирования данны х Е и О передаю т действи­
тельные значения в показательном формате. Они им ею т следую щ ий формат:
306 С Д А чгазин, В В Кондратьев Програмирование на Visual FORTRAN

Знак "минус"Еило([Ее]
0)мс1
Для описателя редактирования Е, значение с1 (число цифр после десятичной точки)
плю с е (число цифр в экспоненте) не долж но превыш ать значения (ш ирина поля).
Д ля описателя редактирования О, значение с/ не долж но превыш ать значения
Указанный элем ент списка ввода/вы вода долж ен иметь тип "действительное", или он
долж ен бы ть действительной или мнимой частью комплексного типа.
Правила для обработ ки ввода
П ри вводе описатели редактирования данных Е и О передаю т \\> сим волов из внеш не­
го поля и назначаю т их действительное значение соответствую щ ем у элементу списка
ввода/вы вода. О писатели Е и О интерпретирую т и назначаю т входные данны е таким же
образом , что и описатель редактирования данны х Р.

Вводу использующий описатели редактирования Е и О


Формат Ввод Значение
Е9.3 734 432E3 734432.0
Е12.4 А А1022.43Е-6 1022.43Е—6
Е15.3 52.3759663А ДАЛА 52.3759663
Е12.5 210.5271 D+101 210.5271Е10
BZ.D10.2 12345ААААА 12345000 0D0
D10.2 АА123.45АА 123.45D0
D15.3 367.4981763D+04 3.674981763D+06
1 Если элемент списка ввода/вывода действительное число с одинарной точностью, описатель редактирования Е обраба­
тывает индикатор экспоненты й как индикатор Е.

Правила для обработ ки вы вода


При выводе описатели редактирования данных Е и О передают действительное значение
соответствующ его элемента списка ввода/вывода, выровненного по правому краю и округ­
ленного до десятичных позиций, во внешнее поле, которое состоит из и’ символов,
долж ен бы ть больш е или равны м с/+7, чтобы учесть:
■ знак (дополнительно, если значение полож ительно и дескриптор 8Р, не действует);
■ необязательны й нуль слева от десятичной точки;
■ десятичную точку;
■ с! цифр справа от десятичной точки;
■ экспоненту.
Э кспонента имеет один из следую щ их форматов:
Описатель Абсолютное значение Положительный формат Отрицательный формат
редактирования экспоненты экспоненты экспоненты
Ew.d |ехр| < 99 Е+пп Е-пп
99 < |ехр| < 999 +ППП -ппп
Ew.dEe |ехр| < 10е - 1 Е+ПШ2. . .Пе Е -гипг. . .Пе
Dw.d |ехр| < 99 й+пп или Е+пп й-пп или Е-пп
99 < |ехр| < 999 +ппп -ппп
Если значение экспоненты является слиш ком больш им, чтобы бы ть преобразованным
в один из этих форм атов, возникает ош ибка.
Ш ирина ноля экспоненты (е) необязательна для описателя редактирования Е; если
оно опущ ено, значение по ум олчанию равно 2. Если е указано, н> долж ен быть больш е
или равны м чем с1+е+5.
Глава К). Форматирование ввода/вывода 307
Примечание. Значение м ож ет быть равно всего (1+5 или ё+ е+З , если необязательные поля
для знака и нуля опущены.

Использование описателей редактирования Е иО


Формат Значение Вывод
Е11.2 475867.222 ДДД 0.48Е+06
Е11.5 475867.222 0.47587Е+06
Е12.3 0.00069 ДДД 0.690Е-03
Е10.3 -0.5555 -0.556Е+00
*****
Е5.3 56.12
Е14.5Е4 -1.001 -1.10010Е+0001
Е13 3Е6 0.000123 0.123Е-000003
014.3 0.0363 ДДДДД 0.3630-1
023.12 5413.87625793 ДДДДД 0.5413876257930+04
*********
09.6 1.2
Редактирование £7У. О писатель редактирования данны х EN передает значения, ис­
пользуя техническую систему обозначений. Он имеет формат:
Е1%.с/[Ее]
Значение (число цифр после десятичной точки) плю с е (число цифр в экспоненте) не
должен превысить значение (ш ирина поля).
Указанный элем ент списка ввода/вы вода долж ен иметь тип дей стви тельн ое или он
должен быть действительной или мнимой частью комплексного типа.
Правила для обработки ввода
При вводе описатель редактирования данны х ЕЫ передает сим волов из внеш него
поля и назначает их действительны е значения соответствую щ ем у элем енту списка вво­
да/вывода. О писатель EN интерпретирует и назначает входны е данны е таким же образом
как описатель редактирования данны х Р.

Ввод, использующий описатели редактирования EN


Формат Ввод Значение
ЕШ 1.3 ДД 5.321 Е+00 5.32100
Е Ж 1.3 -600.00Е -03 -.60000
Е М 2 .3 ДДД 3.150Е-03 .00315
Е М 2 .3 ДДД 3.829Е+03 3829.0
Правила для обработки вывода
При выводе описатель редактирования данны х EN передает действительное значение
соответствую щ его элемента списка ввода/вывода, вы ровненного по правому краю и о к ­
ругленного до с1 десятичны х позиций, во внеш нее ноле, которое состоит из символов.
Д ействительное значение выводится в техническом формате, где десятичная экспонента
делится на 3, а абсолю тное значение мантиссы больш е или равно 1 и м еньш е 1000 (если
значение вывода не нуль).
Значение долж но быть больш е или равно ¿/+9, чтобы учесть:
■ знак (дополнительно, если значение полож ительно и дескриптор 8Р, не действует);
■ 1-3 цифры слева от десятичной точки;
■ десятичную точку;
■ б/ цифр справа от десятичной точки;
308 С Д. А чгатн, В В Кондратьев Програмнрование на Visual FORTRAN

Э кспонента имеет один из следую щ их форматов:


Описатель Абсолютное значение Положительный формат Отрицательный формат
редактирования экспоненты экспоненты экспоненты
ЕЫч/.б |ехр| < 99 Е+пп Е-пп
99 < |ехр| < 999 +ППП -ппп
Е^ллс1Ее |ехр| < 10е - 1 Е+П1П2. . .Пе Е-ГНП2. . .Пе

Если значение экспоненты является слиш ком больш им, чтобы быть преобразованным
в один из этих форматов, возникает ош ибка.
Ш ирина поля экспоненты (е) необязательна; если она опущ ена, значение по ум олча­
нию равно 2. Если е указан, долж ен бы ть больш е или равным ¿/+е+5.

Выводу использующий описатели редактирования


Формат Значение Вывод
EN11.2 475867.222 Д 475.87Е+03
***********
EN11.5 475867.222
EN12.3 0 00069 Д 690.000Е-06
EN10.3 - 0 5555
**********
EN11.2 0.0 Д 000.00Е—03
Редактирование ЕБ. О писатель редактирования данных Е8 передает значения, ис­
пользуя экспоненциальное представление. Он имеет следую щ ий формат:

ЕБуИЕе]
Значение (число цифр после десятичной точки) плю с е (число цифр в экспоненте) не
долж но превы ш ать значение и> (ш ирина поля).
У казанны й элем ент списка ввода/вы вода долж ен иметь тип действительное, или он
долж ен бы ть действительной или мнимой частью комплексного типа.
Правила для обработки ввода
При вводе описатель редактирования данных Е8 передает символов из внешнего
ноля и назначает их действительное значение соответствую щ ем у элементу списка
ввода/вы вода. О писатель Е8 интерпретирует и назначает входные данные таким же обра­
зом как описатель редактирования данны х Р.

Ввод, использующий описатели редактирования ЕБ


Формат Ввод Значение
ES11.3 ДД5.321Е+00 5.32100
ES11.3 —6.000Е—03 -.60000
ES12.3 Д Д Д3.150Е-03 .00315
ES12.3 ДДД3.829Е+03 3829.0
Правила для обработки вы вода
П ри вы воде описатель редактирования данны х Е8 передает действительное значение
соответствую щ его элем ента списка ввода/вы вода, выровненное по правому краю и ок­
ругленное до с1 десятичны х позиций, во внеш нее ноле, которое состоит из символов.
Д ействительное значение вы водится в экспоненциальном представлении, где абсолю тное
значение м антиссы больш е или равно 1 и меньш е чем 10 (если значение вывода не нуль).
Значение и> долж но бы ть больш е или равны м ¿/+7, чтобы учесть:
■ знак (дополнительно, если значение полож ительно и дескриптор 8Р, не действует);
■ одну цифру слева от десятичной точки;
■ десятичную точку;
■ цифр справа от десятичной точки;
Глава 10. Форматирование ввода/вывода 309
■ экспоненту.
Экспонента принимает один из следую щ их форматов:
Описатель Абсолютное значение Положительный формат Отрицательный формат
редактирования экспоненты экспоненты экспоненты
ЕЫм.б |ехр| < 99 Е+пп Е-пп
99 < |ехр| < 999 +ППП -ппп
Е^ллс1Ее |ехр| < 10е - 1 Е+ГИП2 . . . Пе Е-ГИП2 . . . Пе
Если значение экспоненты является слиш ком больш им, чтобы бы ть преобразованны м
в один из этих форматов, возникает ош ибка.
Ш ирина поля экспоненты (е ) необязательна; если она опущ ена, значение по ум олча­
нию равно 2. Если е указан, долж ен бы ть больш е или равным ¿/+е+5.

Выводу использую щ ий описат ели редакт и ровани я ЕБ


Формат Значение Вывод
ЕБ11.2 473214.356 ДДД4.73Е+05
ЕБ11.5 473214.356 4.73214Е+05
ЕБ12.3 0.00069 ДД Д6.900Е-04
ЕБЮ.З -0.5555 -5.555Е -01
ЕБ11.2 0.0 Д0.000Е+00
Р едакт ирование С. О писатель редактирования данны х в вообщ е говоря передает
значения действительного типа, но он может использоваться, чтобы передать значения
лю бого встроенного типа. Он имеет формат:

в)л/.с1[Её\
Значение (число цифр после десятичной точки) плюс е (число цифр в экспоненте) не
долж но превыш ать значение \\> (ш ирина поля).
Указанный элемент списка ввода/вы вода м ож ет иметь лю бой встроенный тип.
Когда используется этот описатель, чтобы указать ввод/вы вод для целочисленны х,
логических или символьных данны х, описатель редактирования следует тем же п рави­
лам, что и 1и*, Ь и’ и Аи’ соответственно, и и е игнорирую тся.
Правила для обработки ввода действительных чисел
При вводе описатель редактирования данны х в передает сим волов из внеш него по­
ля и назначает их действительны е значения соответствую щ ем у элем енту списка вво­
да/вывода. О писатель в интерпретирует и назначает входны е данны е таким ж е образом ,
как описатель редактирования данны х Р.
Правила для обработки вы вода действительных чисел
При выводе описатель редактирования данны х в передает действительное значение
соответствую щ его элем ента списка ввода/вы вода, вы ровненное но правому краю и ок­
ругленное до десятичны х позиций, во внеш нее поле, которое состоит из п> символов.
Ф ормат, в котором записано значение, является функцией величины значения, как
описано в табл. 10.2.
3 1 0 _______ С Д Алгаши, В В Кондратьев. Програмнрование на V¡.ниа! ГОЯТЯАИ

Таблица 10.2. Влияние величины данных на преобразования формата С


Величина данных Эквивалентное преобразование
0 < т < 0.1 -0.5 М О -*1 Е\л/.с1[Ее]
Р М ).( с М ) , п('Ь')
II
3
о

0.1-0.5 * Ю ^'1 < т < 1-0.5 * Ю 41 Р(\л/-п).с1, п('Ь')


1-0.5 * Ю41 < т < 10-0.5 * Ю-* 1 F(w-n).(d-1)I п('Ь')
10-0.5 М О - * 1 < т < 100-0.5 М О - * 2 ¥(ч1-п).(с1-2), (Ъ')

1 0 ^ 2-0.5 М 0 “2< т < 1 0 ^ -0 5 М О “1 F(w-n).1l п(Ъ')


1 0 < ^ - 0 .5 М 0 - 1 < т < 1 0 ^ 0 .5 F(w-n).0) п('Ь')
т > 10е1-0.5 Ew.dfEe]
где Ъ' - пробел после числового представления данных. Для Gw.il, п(Ъ’) - 4 пробела. Для
Сш.с1Ее, п(Ъ') равно е + 2 пробелов.
Значение уу долж но бы ть больш е или равным ¿/+7, чтобы учесть следующ ее:
■ Знак (дополнительно, если значение полож ительно и дескриптор 8Р, не действует).
■ О дну цифру слева от десятичной точки.
■ Д есятичную точку.
■ с/ цифр справа от десятичной точки.
■ 4 или е+ 2 цифр экспоненты. Если е указано, долж ен бы ть больш е или равным
¿/+£+5.

Сравнение вывода, использующего описатели редактирования С,


с выводом, использующим эквивалентное редактирование
Значение Формат Вывод с в Формат Вывод с Р
0.01234567 С13 6 Л0.123457Е—01 Р13.6 ДДДДДО.012346
-0.12345678 013.6 -0.123457ДДДД Р13.6 Д Д Д Д -0.123457
1 23456789 С13.6 АА1.23457ДДДД Р13 6 Д Д Д Д Д 1.234568
12.34567890 013 6 АА12.3457ДДДД Р13.6 ДДДД 12.345679
123.45678901 013.6 АА 123.457ДДДД Р13.6 Д Д Д 123.456789
-1234 56789012 013.6 А-1234.57ДДДД Р13.6 Д -1 234.567890
12345.67890123 013.6 АА 12345 7ДДДД Р13.6 Д 12345.678901
123456.78901234 013.6 АА123457ДДДД Р13.6 123456.789012
*************
-1234567.89012345 013.6 -0.123457Е+07 Р13.6
Редактирование комплексных чисел. К ом плексное значение - это упорядоченная
пара действительны х значений. Р едактирование комплексны х чисел указывается парой
действительны х описателей редактирования, используя лю бую комбинацию форматов:

Е^л/ДЕе], Е ^ Д Е е ] , ЕБ)ллс1[Ее] или 0м¥.с1[Ее].


Правила для обработки ввода
При вводе два последовательны х поля читаются и назначаю тся соответствую щ им
комплексны м элем ентам списка ввода/вы вода соответственно как его действительная и
мнимая часть.
Глава 10. Ф орм ат ирование вво д а /вы во д а 311
Ввод, использующий редактирование комплексных чисел
Формат Ввод Значение
F8.5.F8.5 1234567812345.67 123.45678,12345.67
E9.1.F9.3 734.432Е8123456789 734.432Е8,123456.789
Правила для обработки вывода
При выводе 2 части комплексного значения передаю тся под управлением повторных
или последовательных действительны х описателей редактирования. Эти 2 части переда­
ются последовательно без пунктуации или пробелов, если управление или описатели р е­
дактирования строк сим волов не указаны между парой действительны х описателей р е­
дактирования.

Выводу использующий комплексное редактирование


Формат Значение Вывод
2F8.5 2.3547188, 3.456732 А2.35472 А 3.45673
Е9.2/АА '.Е5.3 47587.222, 56.123 А0.48Е+06А.А*****
Редактирование логических данных (L). О писатель редактирования данны х L п ере­
дает логические значения. Он имеет следую щ ий формат:
Lw
Указанный элем ент списка ввода/вы вода долж ен иметь логический или целочислен­
ный тип. М ожет использоваться описатель редактирования G для редактирования ло ги ­
ческих данных; он следует тем же самым правилам, что и Lw.
Правила для обработки ввода
При вводе описатель редактирования данных L передает w символа из внешнего поля и
назначает их логические значения соответствующему элементу списка ввода/вывода. Назна­
ченное значение зависит от внешних эксплуатационных данных, следующим образом:
■ .TRUE, назначается, если первый не знак пробела является .Т., Т, Л. или t. Логическая
константа .TRUE. - это приемлемый входной ф орм ат.
■ .FALSE, назначается, если первый не знак пробела является .F., F. .f. или f или все по­
ле заполнено пробелами. Л огическая константа .FALSE. - это прием лем ы й входной
формат.
Если во внеш нем поле появляется другое значение, возникает ош ибка.
Правила для обработки вывода
При выводе описатель редактирования данны х L , передает следую щ ие значения
внеш нему полю, состоящ ему из w символов: w - 1 пробелов, сопровож даемы х Т или F
(если значение логической константы - .TRUE, или .FALSE., соответственно).

Выводу использующий описатели редактирования L


Формат Значение Вывод
L5 .TRUE. ААААТ
L1 .FALSE. F
Редактирование символьных данных (А). О писатель редактирования А передает
значения холеритовых или символьных данных. Он имеет следую щ ий формат:
т
Если соответствую щ ий элем ент списка ввода/вы вода имеет тип "символьное", пере­
даются символьные данные. Если элемент списка имеет лю бой другой тип, передаются
холеритовые данные.
312 С. Д. А лгат н, В В К ондрат ьев П рограм ировапие на Visual FO RTRAN

Д ля редактирования сим вольны х данны х мож ет использоваться описатель редактиро­


вания в ; он следует тем же правилам, что и Аи>.
Правила для обработки ввода
При вводе описатель редактирования данных А передает н> сим волов из внеш него по­
ля и назначает их соответствую щ ем у элементу списка ввода/вывода.
М аксимальное число сим волов, которое м ож ет бы ть запомнено, зависит от размера
элем ента списка ввода/вы вода, таким образом:
■ Д ля сим вольны х данны х максим альны й размер - это длина соответствую щ его эле­
мента списка ввода/вы вода.
■ Для несимвольны х данны х м аксимальны й размер зависит от типа данных, как показа­
но в табл. 10.3.

Таблица 10.3 Пределы размеров для несимвольных данных,


использующих редактирование
Элемент списка ввода/вывода Максимальное число символов
BYTE 1
L0GICAL(1) или LOGICAL*! 1
LOGICAL® или L0GICAL*2 2
L0GICAL(4) или L0GICAL*4 4
L0GICAL(8) или L0GICAL*8 8
INTEGER(1) или INTEGERS 1
INTEGER® или INTEGER*2 2
INTEGERS) или INTEGER*4 4
INTEGERS) или INTEGER*8 8
REAL(4) или REAL*4 4
DOUBLE PRECISION 8
REAL(8) или REAL*8 8
REAL(16) или REAL*16 16
COMPLEX(4) или COMPLEX*81 8
DOUBLE COMPLEX1 16
COMPLEX(8) или COMPLEX*161 16
COMPLEX(16) или COMPLEX*321 32
1 Комплексные значения обрабатываются как пары вещественных чисел, таким образом комплексное редактирование тре­
бует пары описателей редактирования.
Если w равен или больш е длины (len) входного элем ента, этому элементу назначаю т­
ся самы е правые символы. К райние левы е лиш ние символы игнорирую тся.
Если w меньш е, чем len, или меньш е, чем число символов, которое мож ет быть, w
сим волов, которые сопровож даю тся конечны ми пробелами, назначаю тся элементу спи­
ска, вы ровненном у по левому краю.

Ввод, использующий редактирование комплексных данных А


Формат Ввод Значение Тип данных
А6 PAGEA# # CHARACTER(LEN=1)
А6 PAGEA# ЕД # CHARACTER(LEN=3)
А6 PAGEA# PAGEA# CHARACTER(LEN=6)
А6 PAGEA# PAGEA#AA CHARACTER(LEN=8)
А6 PAGEA# # LOGICAL(1)
А6 PAGEA# A# INTEGER(2)
А6 PAGEA# GEA# REAL(4)
А6 PAGEA# PAGEA#AA REAL(8)
Глава 10 Ф орм ат ирование вво д а /вы во д а 313
Правила для обработки вывода
При выводе описатель редактирования данны х А передает содерж имое соответст­
вую щ его элемента списка ввода/вы вода во внеш нее поле, состоящ ее из символов.
Если больш е, чем размер элем ента списка, данны е передаю тся полю вывода, вы ­
ровненному по правому краю, с начальны м и пробелам и. Е сли меньш е или равен раз­
меру элемента списка, передаю тся крайние левы е сим волов.

Выводу использующий описатели редактирования А


Формат Значение Вывод
А5 OHMS AOHMS
А5 VOLTS VOLTS
А5 AMPERES AMPER
Размеры по умолчанию для описателей редактирования данных. Если (ш ирина
поля) опущ ена для описателей редактирования данны х, система прим еняет значения по
умолчанию . Для действительных описателей редактирования данны х система такж е
применяет значения по умолчанию для (число сим волов справа от десятичной точки) и
для е (число символов в экспоненте).
Эти принимаемые по умолчанию значения основаны на типе данны х элем ента списка
ввода/вывода и перечислены в табл. 10.4.

Таблица 10.4. Размеры по умолчанию для описателей редактирования данных


Описатель редактирования Тип данных элемента списка ввода/вывода W.
I, В, 0,1,0 ВУТЕ 7
1МТЕСЕ^1), L0GICAL(1) 7
INTEGER(2), L0GICAL(2) 7
INTEGER(4), L0GICAL(4) 12
INTEGER(8), L0GICAL(8) 23
0,1 REAL(4) 12
REAL(8) 23
REAL(16) 44
CHARACTER*len МАХ(7, 3*1еп)
1,0 L0GICAL(1), L0GICAL(2) 2
L0GICAL(4), L0GICAL(8) 2
¥, Е, ЕМ,ЕЭ, 0, й REAL(4), C0MPLEX(4) 15d- 7е: 2
REAL(8), C0MPLEX(8) 25 d: 16е: 2
REAL(1б), C0MPLEX(16) 42 6’33 е: 3
А1, С L0GICAL(1) 1
L0GICAL(2), INTEGER(2) 2
L0GICAL(4), INTEGER(4) 4
L0GICAL(8), INTEGER(8) 8
REAL(4), C0MPLEX(4) 4
REAL(8), C0MPLEX(8) 8
REAL(1б), C0MPLEX(16) 16
CHARACTER*len len
1По умолчанию - фактическая длина соответствующего элемента списка ввода/вывода.
Завершение коротких полей входных данных. При вводе описатель редактирования
типа Рш.с! указывает, что XV сим волов (ш ирина поля) долж ны были быть прочитаны из
внеш него поля.
Если поле будет содерж ать меньше, чем и> сим волов, то утверж дение ввода прочитает
символы из следую щ его поля данных в записи. Это мож но предотвратить, дополняя ко­
314 С Д А 1га ш н , В В К ондрат ьев. П рограм ирование на Visual FO RTRAN

роткое поле пробелам и или нулями или используя запятые, чтобы разделить входные
данные.
Заполнение коротких полей. Вы можете использовать спецификатор P A D -Y E S ' утвер­
ждения OPEN, чтобы указать заполнение пробелами коротких полей входных данных. Одна­
ко пробелы могут интерпретироваться как пробелы или как нули, в зависимости от трго, ка­
кое значение по умолчанию действует в это время. Рассмотрите следующий пример:
READ (2, '(15)') J
Если 3 будет задано для J, то значение J будет равно 30000 или 3 в зависимости от то ­
го, какое действует значение по ум олчанию (B L A N K -N U L L ' или B L A N K -Z E R O '). Это
м ож ет дать неож иданны е результаты.
Чтобы гарантировать ж елательное поведение, явно укаж ите описатель редактирова­
ния BN или BZ. Н априм ер, следую щ ий оператор гарантирует, что пробелы интерпрети­
рую тся как пробелы (а не как нули):
READ (2, '(BN, 15)') J
Использование запятых для разделения входных данных. Вы можете использовать
запятую , чтобы заверш ить короткое поле данных. Запятая не имеет никакого эффекта на
d часть специф икации (число сим волов справа от десятичной точки).
Запятая отменяет и \ указанное для описателей редактирования 1, В, О, Z, F, Е, D, EN,
ES, G и L. П редполож им , что выполняю тся следую щ ие утверждения:
READ (5,100) l,J,А,В
100 FORMAT (2I6.2F10.2)
П редполож им , что прочитана запись, содерж ащ ая значения:
1,-2,1.0, 35
В этом случае прим еняю тся такие назначения:
1= 1
J = -2
А= 10
В = 0.35
Запятая м ож ет заверш ить только поля длины меньш е, чем и’ символов. Если запятая
следует за полем w или больш его количества сим волов, запятую считаю т частью сле­
дую щ его поля.
П устое поле (нулевая длина) определяется двумя последовательными запятыми или
запятой после поля w сим волов. В зависим ости от указанного описателя поля, получаю ­
щ ееся назначаем ое значение равно 0, 0.0, 0.0D 0, 0.0Q 0 или .FALSE..
Описатели редактирования управлением. О писатель редактирования управления
или непосредственно определяет, как отображ ается текст или воздействует на преобразо­
вания, вы полненны е последую щ им и описателями редактирования данных.
Этот раздел описы вает форм аты для описателей редактирования управления и непо­
средственно индивидуальны е описатели.
Форматы для описателей редактирования управлением. О писатель редактирова­
ния управления описы вается одним из следую щ их форматов:
с
сп
пс
где с - одно из следую щ их кодов формата: Т, TL, TR, X, S, SP, SS, BN, BZ, Р, :, /, \, $ и Q.
п - число сим вольны х позиций; долж ен быть положительной целочисленной литераль­
Глава 10 Ф орм ат ирование вво д а /вы во д а 315
ной константой или выражением переменного формата. Родовой парам етр не м ож ет бы ть
указан и не мож ет быть именованной константой.
Д иапазон п изменяется от 1 до 2147483647 (2**31-1 ) на Intel процессорах Itanium ; от
I до 32767 (2** 15-1) на процессорах 1А-32. Ф актически полезны е диапазоны м огут быть
ограничены размерами записи (RECL) и файловой системой.
Правила использования
Вообщ е говоря, описатели редактирования управления неповторяем ы . Е динственное
исклю чение - описатель редактирования слеш (/), которому м ож ет предш ествовать сп е­
цификация повторения.
О писатели редактирования управления им ею т собственны е форматы :
■ П озиционный: Tn, TLn, TRn и пХ
■ Знаковый: S, SP и SS
■ И нтерпретации пробелов: BN и BZ
■ К оэф фициент м асш табирования: кР
■ Разнообразные: :, /, \, $ и Q
О писатель редактирования Р является исклю чением из общ его синтаксиса описателя
редактирования управления. Ему предш ествует коэф ф ициент м асш табирования, а не
спецификатор символьной позиции.
О писатели редактирования управления м огут бы ть сгруппированы в круглых скобках
и предш ествовать спецификации повторения группы.
Позиционное редактирование. О писатели редактирования Т, TL, TR и X указы ваю т
позицию , из которой передается следую щ ий символ в запись или из записи.
При выводе эти описатели самостоятельно не передаю т.си м волы и не воздействую т
на длину записи. Если символы перемещ аю тся в позиции после того, как позиция указа­
на одним из этих описателей, пропущ енны е и предварительно не заполненны е позиции
заполняю тся пробелами. Результат состоит в том, как будто вся запись бы ла первон а­
чально заполнена пробелами.
О писатели редактирования TR и X даю т одинаковы е результаты .
Редактирование Т. О писатель редактирования Т указы вает сим вольную позицию в
записи ввода/вывода. Он имеет формат:
Тп
Спецификатор п является полож ительной целочисленной литеральной константой
(без родового параметра), указы ваю щ ей сим вольную позицию в записи, относительно
левого табулированного предела. При вводе описагель Т п ози ционирует внеш ню ю за­
пись в символьную позицию , указанную п. При выводе описатель Т указы вает, что п ере­
дача данных начинается с я-й сим вольной позиции во внеш ней записи.
Примеры
П редположим, что файл имеет запись, содерж ащ ую значение ABCAAAXYZ, и вы пол­
няются утверждения:
READ (11,10) VALUE1, VALUE2
10 FORMAT (T7.A3J1, АЗ)
Читаются значения, сначала - X Y Z, затем ABC. П редполож им , что вы полняю тся та­
кие утверждения:
PRINT 25
25 FORMAT (*1',Т51 ,'COLUMN 2\Т21/COLUMN Г)
316 С .Д Ачгазин, В В К он драт ьев П рограм ирование на Visual FORTRAN

С ледую щ ая строка будет напечатана в обозначенны х позициях:


Позиция 20 Позиция 50
I I
COLUMN 1 COLUMN 2
О братите вним ание на то, что первый символ напечатанной записи был зарезервиро­
ван как управляю щ ий символ.
Редактирование TL. О писатель редактирования TL указы вает символьную позицию
слева от текущ ей позиции в записи ввода/вывода. Он имеет формат:

TLn
С пециф икатор п является полож ительной целочисленной литеральной константой
(без родового параметра), указы ваю щ ей п-ю сим вольную позицию слева от текущ его
символа. Если п больш е или равен текущ ей позиции, следую щ им доступны м символом
является первый сим вол записи.
Редактирование TR. О писатель редактирования TR указы вает сим вольную позицию
справа от текущ ей позиции в записи ввода/вывода. Он имеет формат:
TR п
С пециф икатор п является полож ительной целочисленной литеральной константой
(без родового параметра), указы ваю щ ей п-ю сим вольную позицию справа от текущ его
символа.
Редакт ирование X. О писатель редактирования X указывает сим вольную позицию
справа от текущ ей позиции в записи ввода/вывода. Он имеет формат:
пХ
С пециф икатор п является полож ительной целочисленной литеральной константой
(без родового параметра), указы ваю щ ей п-ю сим вольную позицию справа от текущ его
символа. При вы воде описатель редактирования X не вы водит каких-либо символов, ко­
гда он появляется в конце спецификации формата; например:
WRITE (6,99) К
99 FORMAT (А К - J6.5X)
В этом прим ере записы вается только 9 символов. Чтобы вывести п конечных пробе­
лов в конце записи, укаж ите ф орм ат п('Д').
Редактирование знака. О писатели редактирования S, SP и SS управляю т выводом
необязательного знака плюс внутри выводимых числовых полей. Эти описатели игнори­
рую тся во время вы полнения утверж дений ввода.
Внутри специф икации ф орм ата описатель редактирования знака воздействует на все
последую щ ие описатели 1, F, Е, EN, ES, D и G до появления другого описателя редакти­
рования знака.
Редактирование SP. О писатель редактирования SP заставляет процессор создавать
знак плюс в лю бой последую щ ей позиции, где он был бы иначе необязательным. Он
им еет ф орм ат:
SP
Редактирование SS. О писатель редактирования SS заставляет процессор подавлять
знак плю с в лю бой последую щ ей позиции, где он был бы иначе необязательным. Он
им еет формат:
SS
Г лава 10 Ф орм ат ирование вво д а /вы во д а 317
Редактирование S. О писатель редактирования S восстанавливает печать знака плюс
как дополнительного для всех последую щ их полож ительны х числовы х нолей. Он имеет
формат:
S
О писатель редактирования S восстанавливает на усм отрение процессора создания
знака плюс на необязательной основе.
Редактирование пробелов. О писатели управления BN и BZ интерпретирую т встро­
енные и конечные пробелы внутри входных числовых полей. Эти описатели игнориру­
ются во время выполнения утверж дений вывода.
Внутри спецификации формата, описатель редактирования пробелов воздействует на
все последую щ ие описатели I, В, О, Z, F, Е, EN, ES, D и G до появления другого оп и сате­
ля редактирования пробелов.
О писатели редактирования пробелов отм еняю т эффект специф ика ю р а BL A N K во
время выполнения отдельного входного утверж дения передачи данны х. (О спец и ф и като­
ре BLANK в утверждениях OPEN см. разд. 1 1.5.)
Редактирование BN. О писатель редактирования BN заставляет процессор игнориро­
вать все встроенные и конечны е пробелы в числовых входных полях. Он имеет формат:
BN
Входное поле обрабаты вается так, как будто все пробелы были удалены , и остаток от
поля выравнивается по правому краю. П олностью пустое иоле обрабаты вается, как нуль.
Редактирование BZ. О писатель редактирования BZ заставляет процессор интерпре­
тировать все встроенны е и конечны е пробелы в числовых входных полях как нули. Он
имеет ф орм ат:
BZ
Редактирование коэффициентом масштабирования (Р). О писатель редакти рова­
ния Р указывает коэффициент масш табирования, который перемещ ает местополож ение
десятичной точки в действительны х значениях и двух вещ ественных частях ком плекс­
ных значений. Он имеет формат:
кР
Спецификатор к является знаковой (знак необязателен, если он - плю с), целочислен­
ной литеральной константой, указываю щ ей число позиций, влево или вправо на которое
долж на переместиться десятичная точка (коэффициент масш табирования). Д иапазон /с
о т -1 2 8 до 127.
В начале форматного утверж дения ввода/вывода, значение коэф ф ициента м асш таби­
рования равно нулю. Если указан описатель редактирования масш таба, коэф ф ициент
масш табирования устанавливается в новое значение, которое воздействует на все после­
дую щ ие действительны е описатели редактирования, пока не появляется другой оп иса­
тель редактирования масш таба.
Чтобы восстановить нулевое значение коэффициента масш табирования, вы долж ны
явно указать ОР.
Возвращ ение к преж нем у состоянию формата не воздействует на коэф ф ициент мас-
шт абирования.
Правила для обработки ввода
При вводе полож ительны й коэффициент м асш табирования перем ещ ает десятичную
точку влево, а отрицательны й коэф ф ициент масш табирования перемещ ает десятичную
точку вправо. (При выводе эф ф ект обратны й.)
318 С Д А лгазин . В В К ондрат ьев П рограм ирование на Visual FORTRAN

При вводе, когда входное поле использует действительны й описатель редактирования


Р, Е, Э, Е!^, Е8 или в , содерж ащ ий явную экспоненту, коэффициент масш табирования
игнорируется. Д ругими словами, внутреннее значение соответствую щ его элемента спи­
ска ввода/вывода равно внеш ним эксплуатационны м данны м , умноженны м Ю Л Н апри­
мер, коэффициент масш табирования 2Р ум нож ает входное значение на .01, перемещ ая
десятичную точку на 2 места влево. А коэф ф ициент м асш табирования - 2Р умножает
входное значение на 100, перемещ ая десятичную точку на 2 места вправо.

Ввод9использующий редактирование Р
Формат Ввод Значение
ЗРЕЮ 5 ДДД37.614Д .037614
ЗРЕЮ.5 - ДД37 614Е2 3761.4
ЗРЕ10 5 ДДДД37.614 37614.0
Коэф фициент м асш табирования долж ен предш ествовать первому действительному
описателю редактирования, ассоциированном у с ним, но он не долж ен немедленно
предш ествовать описателю . Н апример, все следую щ ие выраж ения имею т одинаковый
эффект:
(ЗР, 16, Р6.3, Е 81)
(16, ЗР, Р6.3, Е8.1)
(16, ЗРР6Д Е8.1)
О братите вним ание на то, что, если коэф ф ициент масш табирования немедленно
предш ествует связанном у действительном у описателю редактирования, то разделитель
запятая необязателен.
Правила для обработки вывода
При выводе полож ительны й коэффициент масш табирования перемещ ает десятичную
точку вправо, а отрицательны й коэф ф ициент м асш табирования перемещ ает десятичную
точку влево. (П ри вводе, эф ф ект обратный.)
При выводе коэф ф ициент масш табирования зависит от того, какой вид действитель­
ного редактирования ассоциирован с ним.
■ Для редактирования Р внеш нее значение равняется внутреннем у значению элемента!
списка ввода/вы вода, ум нож енном у на 10к. Это редактирование изменяет величину
данных.
■ Для редактирования Е и О, внешнее десятичное поле элем ента списка ввода/вывода
умножается на 10к, и к вычитается из экспоненты. Это редактирование изменяет вид
данных.
■ П олож ительный коэф ф ициент м асш табирования ум еньш ает экспоненту; отрицатель­
ный коэф ф ициент м асш табирования увеличивает экспоненту. Д ля положительного
коэффициент масш табирования, к долж ен бы ть меньш е, чем ¿/ + 2 или возникает
ош ибка преобразования вывода.
■ Для редактирования в , коэф ф ициент масш табирования игнорируется, если величина
данных для вы вода находится внутри диапазона измерений описателя (описатель в
обеспечивает свое собственное м асш табирование). Если величина поля данных нахо­
дится вне диапазона описателя в , используется редактирование Е, и коэффициент
м асш табирования имеет тот же эффект, как при редактировании вывода Е.
■ Д ля редактирования В и Е 8 коэффициент масш табирования игнорируется.
V ia e a 10 Ф орм ат ирование вво д а /вы вод а 319
В ы вод, использую щ ий редакт и ровани е Р
Формат Ввод Значение
1РЕ12.3 -2 7 0 139 ДД-2.701Е+02
1Р.Е12.2 - -270.139 ДДД-2.70Е+02
1РЕ12.2 -270.139 ДД Д-0.03Е+04
Следую щ ий пример показы вает утверж дение FORM A T, содерж ащ ее коэффициент
масш табирования:
DIMENSION А(6)
DO 101=1,6
10 A(l) = 25.
WRITE (6,100) А
100 FORMATf F8.2, 2PF8.2, F8.2)
П редыдущ ие утверж дения даю г следую щ ие результаты:
25.00 2500 00 2500.00
2500 00 2500.00 2500.00
Редакт ирование слеш (/). О писатель редактирования слеш заверш ает передачу дан ­
ных для текущ ей записи и разреш ает передачу данны х для новой записи. Он имеет ф ор­
мат:

и/
где г - спецификация повторения, долж на бы ть полож ительной литеральной константой
целого тина но умолчанию ; родовой параметр не мож ет бы ть указан.
Диапазон г изменяется от 1 до 2147483647 (2**31—1) на процессорах In te l ЕМ 64Т и
In te l Ita n iu m ; от 1 до 32767 (2** 15-1) на процессорах 1А-32. Если г опущ ен, он предпола­
гается равным 1.
М ногократные слеш и заставляю т систему пропускать входные записи или выводить
пустые записи, следую щ им образом:
Когда п последовательные слеш и появляю тся между двумя описателями редактиро­
вания, п - 1 запись пропускается при вводе, или п - 1 пустая запись вы водится. Первый
слеш заверш ает текущ ую запись. Второй слеш заверш ает первую , пропущ енную , или
пустую запись и т. д.
Когда п последовательных слеш ей появляю тся в начале или в конце специф икации
формата, /? записи пропускается, или п пустых записей вы водится, потому что откры ­
вающие и закрываю щ ие круглые скобки спецификации ф орм ата самостоятельно являю т­
ся признаком начала и конца записи, соответственно. Н апример, предполож им , что ука­
заны следую щ ие утверждения:
WRITE (6,99)
99 FORMAT ('Г,Т51,'HEADING LINEV/T51,'SUBHEADING LINE'//)
Следую щ ие строки записаны:
Столбец 50, верх страницы
1
HEADING LINE
(пустая строка)
SUBHEADING LINE
(пустая строка)
(пустая строка)
О братите внимание, что первый символ напечатанной записи был зарезервирован как
управляю щ ий символ.
320 С Д А лгапш , В В К ондрат ьев П роклам ирование на Visual FORTRAN

Редактирование двоеточие (:). О писатель редактирования двоеточие заверш ает


управляю щ ий форм ат, если больш е нет элем ентов в списке ввода/вывода. Например,
предполож им , что указаны следую щ ие утверж дения:
PRINT 1,3
PRINT 2,13
1 FORMAT (' I-.I2 ,' J=',I2)
2 FORMAT (' K-,12,:,' L - ,12)
Будут напечатаны следую щ ие строки:
l=A3AJ=
К=13
Если элем енты списка ввода/вы вода остаю тся, описатель редактирования двоеточия
игнорируется.
Редактирование знак доллара ($) и наклонная черта влево (\). О писатели редакти­
рования ($) и (\) изм еняю т вы вод управления кареткой, указанный первым символом за­
писи. О ни воздействую т только на управление кареткой для форматных файлов и игно­
рирую тся при вводе.
Если первый символ записи является пробелом или знаком плю с (+), описатели знак
доллара ($) и наклонная черта влево (\) подавляю т перевод каретки (после того, как напе­
чатана запись).
Для герм инального устройства ввода/вывода, когда этот перевод каретки подавлен,
ответ следует прямо за выводом на той ж е самой строке. П редполож им , что указаны сле­
дую щ ие утверж дения:
TYPE 100
100 FORMAT (' ENTER RADIUS VALUE ',$)
ACCEPT 200, RADIUS
200 FORMAT (F6 2)
отображ ается следую щ ая подсказка:
ENTER RADIUS VALUE
Л ю бой ответ (наприм ер, "12."), отображ ается на той ж е самой линии:
ENTER RADIUS VALUE 12.
Если первый сим вол записи равен 0, 1 или A SC II, NUL, описатели знак доллара и на­
клонная черта влево игнорирую тся.
Р ассм отрите следую щ ее утверждением
C H A R A C T E R S ) MYNAME
WRITE (*,9000)
9000 FORMAT ('ОПожалуйста введите ваше имя-',\)
READ (*,9001) MYNAME
9001 FORMAT (А20)
WRITE (*,9002) ' ',MYNAME
9002 FORMAT (1X.A20)
Этот пример продвигает две строки, подсказки для ввода, ж дет ввод на той же самой
строке, что и подсказка, и печатает ввод.
Редактирование счетчика символов (Q). О писатель редактирования счетчика сим ­
волов возвращ ает остаю щ ееся число сим волов в текущ ей входной записи.
Соот ветствую щ ий элем ент списка ввода/вы вода долж ен иметь тип целочисленное или
логическое. Н априм ер, предполож им, что указаны следую щ ие утверждения:
READ (4,1000) XRAY, КК, NCHRS, (ICHR(I), l=1,NCHRS)
Гчава 10 Ф орм ат ирование вво д о /вы во д а 321
1000 FORMAT (Е15.7,14Д(80А1))
Два поля прочитаны в переменные XRAY и КК. Число символов, остающееся в записи,
запоминается в NCHRS и столько же символов прочитано в массив 1CHR. (Это правило не
работает, если запись длиннее 80 символов.) Если поместить описатель счетчика символов в
самом начале спецификации формата, можно определить длину входной записи.
' При выводе описатель редактирования счетчика сим волов заставляет пропустить со­
ответствую щ ий элем ент списка ввода/вывода.
Описатели редактирования строк символов. У правляю т вы водом строк символов.
О писатели редактирования строк сим волов являю тся сим вольны м и константам и и оп и ­
сателем редактирования Н.
Хотя никакому описателю редактирования строк не мож ет предш ествовать специф и­
кация повторения, заключенной в скоб!ки группе описателей редактирования строк мож ет
предш ествовать спецификация повторения.
Редактирование символьной константой. О писатель редактирования сим вольная
константа заставляет строку сим волов выводиться во внеш ню ю заиись; им еет один из
следую щ их форматов:
’string1
"string"
где string - символьная литеральная константа; родовой параметр не м ож ет бы ть указан.
Ее длина равна числу символов между разделителям и; два последовательны х р аздели те­
ля считаются за 1 символ.
Чтобы вклю чить апостроф в сим вольную константу, которая заклю чена в апострофы ,
разместите 2 последовательных апострофа (") в специф икации ф орм ата; например:
50 FORMAT (TODAY"SA DATEA IS:A ,1I2)7,)I2)7,1I2)
Точно так же, чтобы вклю чить кавы чку в сим вольную константу, которая заклю чена в
кавычки, разместите две последовательны х кавычки (" ") в специф икации формата.
Редактирование Н. О писатель редактирования Н передает данны е непосредственно
между внешней записью и описателем редактирования Н. О писатель редактирования Н
является удаленной возм ож ность в Fortran 95; он бы ло устареваю щ им в Fortran 90. Intel
Fortran полностью поддерж ивает возм ож ности, удаленны е в Fortran 95.
О писатель редактирования Н имеет следую щ ий форм ат холеритовой константы:
nHstring
где п - положительная литеральная константа (без родового параметра) целого типа по умол­
чанию без знака, указывающая число символов в string (включая пробелы и табуляторы).
Диапазон п равен от 1 до 2147483647 (2**31-1) на процессорах Intel Е М 64Т и Intel
Itanium; от 1 до 32767 (2** 15-1) на процессорах 1А-32. Ф актические полезны е диапазоны
могут быть ограничены размерам и записи (RECL) и файловой системой.
string - строка пригодных для печатания сим волов ASCII.
При вводе описатель редактирования Н передает п сим волов из внеш него поля в оп и ­
сатель редактирования. Первый символ появляется непосредственно после сим вола Н.
Лю бые символы, находящ иеся перед вводом в описателе редактирования, заменяю тся
входными символами. При выводе описатель редактирования Н заставляет п сим волов
после символа Н быть выведенными во внеш ню ю запись.
Спецификации вложения и повторения группы. С пециф икации ф орм ата могут
включить вложенные специф икации формата, заклю ченны е в круглы е скобки; например:
322 С Д А б а зи н , В. В Кондрат ьев. П рограм ирование на Visual FORTRAN

15 FORMAT (Е7.2Д12,(А5,16))
35 FORMAT (A6,(L8(3I2)),A)
С пециф икация повторения группы м ож ет предш ествовать влож енной группе описа­
телей редактирования. Н априм ер, следую щ ие утверж дения эквивалентны, а второе у т­
верж дение дем онстрирует специф икацию повторения группы:
50 FORMAT (18,18^8.3^15.7^8.3^15.7^8.3^15.7,15,15)
50 FORMAT (2I8,3(F8.3,E15.7),2I5)
Если влож енная группа не показы вает счетчик повторений, предполагается значение
но ум олчанию равное 1.
О бы чно описатели редактирования строк и описатели редактирования управления не
м огут бы ть повторены (за исклю чением слеш а), но лю бой из этих описателей может
бы ть заклю чен в круглы е скобки с предш ествую щ ей спецификацией повторения группы.
Н априм ер, следую щ ие утверж дения допустимы:
76 FORMAT (’MONTHLY',3(TOTAL'))
100 FORMAT (I8,4(T7),A4)
В ы раж ени е перем енного ф орм ат а - это числовое выражение, заклю ченное в угло­
вые скобки (< >), которое м ож ет использоваться в утверж дении FO R M A T или в сим ­
вольны х специф икациях формата.
Числовое вы раж ение м ож ет бы ть лю бым допустим ы м выражением Fortran, включая
ф ункциональны е вызовы и ссылки на форм альны е аргументы.
Если вы раж ение не им еет типа целочисленное, оно, преж де чем использоваться, пре­
образуется в целочисленны й тип.
Если значение вы раж ения переменного форм ата не удовлетворяет условиям ограни­
чений на величину, прим еняю щ ую ся для ее использования в формате, возникает ошибка.
В ы раж ения перем енного ф орм ата не могут использоваться с описателем редактиро­
вания Н и они не допускаю тся в сим вольны х специф икациях формата.
В ы раж ения перем енного ф орм ата вычисляю тся каждый раз, когда с ними сталкива­
ю тся при просм отре формата. Если значение переменной, используемой в выражении,
изм енилось во время вы полнения утверж дения ввода/вы вода, в следую щ ий раз использу­
ется новое значение, когда обрабаты вается элем ент формата, содерж ащ ий выражение.
Р ассм отрите следую щ ее утверж дение:
FORMAT (l<J+1>)
При просм отре ф орм ата преды дущ ее утверж дение вы полняет I (целочисленную ) пе­
редачу данны х с ш ириной поля J + 1 . Вы раж ение вычисляется каждый раз, когда с ним
сталкиваю тся при норм альном просм отре формата.
Рассм отрите утверж дения:
DIMENSION А(5)
DATA А/1.,2.,3.,4.,5./
DO 10 1=1,10
WRITE (6,100)1
100 FORMAT (l<MAX(l,5)>)
10 CONTINUE
DO 20 1=1,5
WRITE (6,101) (A(I),J=1,1)
101 FORMAT (<I>F10.<M >)
20 CONTINUE '
END
Гчава 10. Ф орм ат ирование вво д а /вы во д а 323
При выполнении эти утверж дения создаю т следую щ ий вывод:
1
2
3
4
5
6

10
1.
2.0 2.0
3.0 0 3 .0 0 3 .00
4.000 4.000 4.000 4.000
5.0000 5.0000 5.0000 5.0000 5.0000
Печать форматных записей. При выводе, если в результате файл был откры т с
С А К Ю А С Е С О Э Т Я О Ь ^ О К Т К А ]^ или файлом, обработанны м утилитой ф орм ата ГоПрг,
первым символом записи, переданной на устройство построчной печати или терм инал,
обы чно является символ, который не напечатается, но используется для управления ин­
тервалом строк (табл. 10.5).

Таблица 10.5. Допустимые управляющие символы для печати


Символ Смысл Действие
+ Печатать поверх Выводит запись (в текущей позиции в текущей строке) и
переводит каретку
А 1 перевод строки Выводит запись (в начале следующей строки) и перево­
дит каретку
0 2 перевода строки Выводит запись (после того, как пропустит строку) и пе­
реводит каретку
1 Следующая страница Выводит запись (в начале новой страницы) и переводит
каретку
$ Запрашивать Выводит запись (в начале следующей строки) без пере­
вода каретки
ASCII NUL (указать Печатать поверх без про­ Выводит запись (в текущей позиции в текущей строке)
как CHAR (0)) движения без перевода каретки
Любой другой символ интерпретируется как пробел и удаляется из строки печати. Если
вы не указываете управляющий символ для печати, первый символ записи не напечатается.
Взаимодействие между спецификациями формата и списками ввода/вывода.
У правление форматом начинается с выполнения ф орм атного утверж дения ввода/вы вода.
Каждое действие управления форм ата зависит от инф орм ации, обеспечиваем ой совм ест­
но следую щ им элементом в списке ввода/вы вода (если он сущ ествует) и следую щ им
описателем редактирования в спецификации формата.
И список ввода/вы вода и спецификация ф ормата интерпретирую тся слева направо,
если не появляю тся повторные спецификации или неявны е О О -списки.
Если список ввода/вывода указывает, но крайней мере, 1 элемент списка по крайней мере
1 описатель редактирования данных (1, В, О, Ъ, Р, Е, Е1^, Е8, О, в , Ь или А) в спецификации
формата должен появиться описатель редактирования С); иначе возникает ошибка.
Каждый описатель редактирования данных (или описатель редактирования С?) соот­
ветствует одному элементу в списке ввода/вы вода, за исклю чением того, что элем ент
списка ввода/вывода комплексного типа требует для интерпретации двух описателей р е­
дактирования Р, Е, В, Е8, О или в . Н икакой элем ент списка ввода/вы вода не со о тветст­
324 С Д Алгсиин, В В Кондратьев. Програмирование на Visual FORTRAN

вует описателю редактирования управления (X, Р, Т, TL, TR, SP, SS, S, BN, BZ, $ или :)
или описателю редактирования строк сим волов (Н и сим вольные константы). Для описа­
телей редактирования строк сим волов передача данны х возникает непосредственно м еж ­
ду внеш ней записью и специф икацией формата.
Когда управление ф орм атом сталкивается с описателем редактирования данных в
спецификации форм ата, оно определяет, указан ли соответствую щ ий элемент списка вво­
да/вы вода. Если такой элем ент есть, он передается под управлением описателя редакти­
рования и затем обрабатывается управление форматом. Если нет никакого соответствую ­
щ его элем ента списка ввода/вы вода, управление форматом заверш ается.
Если нет никаких других элем ентов списка ввода/вы вода, которые будут обрабаты ­
ваться, управление ф орм атом также заверш ается, когда возникает следую щ ее событие:
■ сталкивается с описателем редактирования двоеточие;
■ достигнут конец специф икации формата.
Если остаю тся дополнительны е элементы списка ввода/вывода, часть или вся специ­
фикация ф орм ата используется повторно.
При повторном использовании спецификации формата заканчивается текущ ая запись
и начинается новая. У правление форматом затем возвращ ается к одному из следую щ его
выражений (по порядку) и продолж ается из этой точки:
■ С пецификации повторения группы, откры ваю щ аяся круглая скобка которой соответ­
ствует предпоследней закры ваю щ ей круглой скобке спецификации формата.
■ Н ачальной откры ваю щ ейся круглой скобки спецификации формата.
П овторное использование спецификации форм ата не действует на коэффициент м ас­
ш табирования, описатели редактирования управления знака (S, SP или SS) или описатели
редактирования интерпретации пробелов (BN или BZ).
Пример
Д анны е в файле FO R 002.D A T долж ны обрабаты ваться по 2 записи одновременно.
Каждая запись начинает с числа, пом ещ аемого в элем ент вектора В, сопровож даем ою
пятью числами, которы е будут помещ ены в строку в матрице А.
FOR002. D A T содерж ит следую щ ие данные:
001 0101 0 1 0 2 0 1 0 3 0 1 0 4 0 1 0 5
002 0201 0202 0203 0 2 0 4 0205
003 0301 0 302 0 3 0 3 0 3 0 4 03 0 5
004 0401 0402 0403 0 4 0 4 0 405
005 0501 0502 0503 0 5 0 4 0 505
006 0601 0602 0603 0 6 0 4 0 605
007 0701 0702 0703 0 7 0 4 0705
008 0801 0802 0803 0 8 0 4 0 805
009 0901 0902 0903 0 9 0 4 0 905
0 1 0 1001 1002 1003 1 0 0 4 1 005

П ример взаим одействия меж ду специф икациям и форм ата и списками ввода/вывода,
для обработки данны х в файле FOR002. DAT.
I N T E G E R I, J, A ( 2 ,5 ) , B ( 2 )
O P E N (u n it= 2 , a c c e s s - s e q u e n t i a l ' , f il e - F O R 0 0 2 . D A T ' )
1 R E A D ( 2 ,1 0 0 ) ( B (l), (A (I,J ), J = 1 ,5 ) ,l = 1 ,2 )
2 100 F O R M A T ( 2 (13, X , 5 ( I 4 ,X ) , /))
3 W R IT E ( 6 ,9 9 9 ) B , ( (A ( I ,J ) ,J = 1 ,5 ) ,I = 1 ,2 )
999 F O R M A T (' В i s ', 2 (1 3 , X ) , '; A is', I
1 ( '' , 5 (14, X ) ) )
4 R E A D ( 2 ,2 0 0 ) ( B (l), (A (I ,J ), J = 1 ,5 ),1 = 1 ,2 )
Глава К) Форматирование ввода/вывода 325
200 F O R M A T ( 2 ( 1 3 , X , 5 (1 4 ,X ) , : / ) )
5 W R IT E ( 6 ,9 9 9 ) B , ( ( A ( I ,J ) ,J = 1 ,5 ) ,l = 1 ,2 )
6 R E A D ( 2 ,3 0 0 ) ( B (l), (A (I ,J ), J = 1 ,5 ) ,l = 1 ,2 )
300 F O R M A T ((1 3 , X, 5 ( I 4 ,X ) ) )
7 W R IT E ( 6 ,9 9 9 ) B , ( ( A ( I ,J ) ,J = 1 ,5 ) ,I = 1 ,2 )
8 R E A D ( 2 ,4 0 0 ) ( B (l), (A (I,J ), J = 1 ,5 ) ,l = 1 ,2 )
400 FO R M A T (1 3 , X, 5 ( I 4 ,X ) )
9 W R IT E ( 6 ,9 9 9 ) B , ( ( A ( I ,J ) ,J = 1 ,5 ) ,I = 1 ,2 )
END

Это утверж дение читает В(1); затем элементы от А( 1,1) до А (1,5); затем В (2) и эл е­
менты от А (2,1) до А(2,5). Первая прочитанная запись (начинается с 001) запускает о б р а­
ботку списка ввода/вывода.
Есть две записи, каж дая в ф орм ате 13, X, 5 (14, X). Слеш (/) вызывает чтение второй
записи после того, как элем ент А (1,5) обработан. Это такж е вызывает чтение третьей за­
писи после того, как элем ент А (2,5) обработан; никакие данны е не берутся из этой зап и ­
си. Это утверж дение создает следую щ ий вывод:
B is 1 2; A is
101 102 103 104 105
201 202 203 204 205

Это утверж дение читает запись, начинаю щ ую ся с 004. Слеш (/) вы зывает чтение сл е­
дующ ей записи после того, как элем ент А (1,5) обработан. Д воеточие (:) о сш н авли вает
чтение после того как элемент А (2,5) обработан, но прежде, чем слеш (/) вы нуж дает чи­
тать другую запись. Это утверж дение создает следую щ ий вывод:
В is 4 5 ; A is
401 402 403 404 405
501 502 503 504 505

Это утверж дение читает запись, начинаю щ ую ся с 006. После того, как элем ент А (1,5)
обработан, возвращ ение ф орм ата заставляет прочитать следую щ ую запись и обработка
формата начинается с левой круглой скобки перед 13.
Э ю утверж дение создает следую щ ий вывод:
В is 6 7; A is
601 602 603 604 605
701 702 703 704 705
Это утверж дение читает запись, начинаю щ ую ся с 008. П осле того, как элемент А (1,5)
обработан, повторное использование спецификации ф орм ата заставляет прочитать сл е­
дую щ ую запись и обработка ф орм ата начинается с левой круглой скобки перед 14.
Это утверж дение создает следую щ ий вывод:
B is 8 90; A is
801 802 803 804 805
90109020 9030 9040 100

Запись 009 0901 0902 0903 0904 0905 обработана с 14 как "009" для элем ента В(2), ко­
торый равен 90. X пропускает следую щ ий "О". Затем "901" обработано для элем ента
А (2,1), который равен 9010, "902" для элем ента А (2,2), "903" для элем ента А (2,3) и "904"
для элемента А(2,4). С пециф икация повторения 5 теперь исчерпана и ф орм ат заканчива­
ется. П овторное использование специф икации ф орм ата заставляет читать другую запись
и обработка ф ормата начинается в левой круглой скобке перед 14, таким образом "010"
прочитан для элем ента А (2,5), который равен 100.
Глава 11. Утверждения ввода/вывода
файловых операций

Эта глава содерж ит информ ацию об утверж дении соединения с файлом, запроса и по­
зиционировании.

11.1. Утверждение BACKSPACE


У тверж дение B A C K SPA C E позиционирует последовательны й файл в начало преды­
дущ ей записи, делая ее доступной для последую щ ей обработки ввода/вывода. Оно имеет
один из следую щ их форматов:
B A C K S P A C E ([U N IT =]/<H #M f [, E R R =label\ [, I O S T A T = /-v a r ]).
BA CK SPA CE io-unit
где io-unit - специф икатор внеш него устройства; label является меткой утверждения ад­
ресата перехода, которое получает управление, если возникает ош ибка; i-var - скалярная
целочисленная переменная, которая определяется как полож ительное целое число, если
возникает ош ибка, и нуль, если ош ибки не возникает.
Правила использования
Номер устройства ввода/вы вода долж ен указы вать откры ты й файл на диске или маг­
нитной ленте.
Возвращ ение от текущ ей записи п выполняется перемоткой к началу файла и затем,
выполняя /7-1 последовательны х REA D , чтобы достигнуть преды дущ ей записи.
У тверж дение B A C K SPA C E не долж но быть указанно для файла, который является
открытым для прям ого доступа или доступа вставки в конец, потому что п не доступен
для системы ввода/вы вода Fortran.
Если файл уже позиционирован в начало файла, утверж дение BA C K SPA C E не вы ­
полняется.
Примеры
С ледую щ ее утверж дение устанавливает файл, связанны й с устройством ввода/выво­
да 4, назад к преды дущ ей записи:
BA CK SPA CE 4

Рассмотрите следую щ ее утверждение:


B A C K S P A C E (U N I T = 9 , I O S T A T = I O S , E R R = 1 0 )

Это утверж дение позиционирует файл, связанны й с устройством 9 назад к предыду­


щей записи. Если возникает ош ибка, управление передается утверж дению , помеченному
меткой 10, и полож ительное целое число запоминается в переменной 10S.

11.2. Утверждение CLOSE


У тверж дение CLO SE отсоединяет файл от устройства. О но им еет следую щ ий формат:
ГSTA TU S 1
CLOSE ([UNIT=]/o-on/i [, \ D ISPO SE \ =p] [, ERR=label\ [, IOSTAT=war])
[ D1SP J
где io-unit - специф икатор внеш него устройства.

дт от ш 326
Г лава I /. Ут верж дения вво д а /вы во д а ф ай ю аых операций 327
р - по умолчанию скалярное вы раж ение сим вольного типа, указы ваю щ им состояние
файла после того, как он закрыт. Он имеет одно из следую щ их значений:
'KEEP' или 'SA V E' сохраняет файл после закрытия устройства.
'DELETE' удаляет файл после закрытия устрой ства1.
'PR IN T' п ред оставл яет ф айл сп ул еру (spooler) у стр о й ства п о строчн ой п ечати , за­
тем сохран яет его.
'PR IN T/D ELETE'2 предоставляет файл спулеру устройства построчной печати, затем
удаляет его.
'SUBM IT' разветвляет (fork) процесс, чтобы выполнить файл.
'SU BM IT/D ELETE' разветвляет процесс, чтобы выполнить файл, затем удаляет файл
после того, как разветвление закончено.
По умолчанию принимается 'D ELETE' для рабочих файлов и приложений Q uickW in
(W *32, W *64). Для всех других файлов по ум олчанию принимается 'SAVE'.
label является меткой утверж дения адресата перехода, которое получает управление,
если возникает ошибка.
i-var является скалярной целочисленной переменной, которая определяется как поло­
жительное целое число, если возникает ош ибка, и нуль, если ош ибки не возникает.
Правила использования
Спецификаторы утверж дения C LO SE м огут появиться в лю бом порядке. У стройство
ввода/вывода долж но б ь п ь указано, но клю чевое слово UN IT необязательно, если специ­
фикатор устройства является первым элем ентом в управляю щ ем списке ввода/вывода.
Состояние, указанное в утверж дении CLO SE зам еняет состояние, указанное в утвер­
ждении OPEN, за исклю чением того, что файл откры ты й, как рабочий файл не м ож ет
быть сохранен, напечатан или выполнен, а файл, откры ты й только для чтения, не может
быть удален.
Если утверждение CLO SE указанно для устройства, которое не откры то, оно не вы ­
полняется.
Пример
CLOSE (UNIT=J, STATUS-DELETE', ERR=99)
Это утверж дение закры вает файл, связанны й с устройством J, и удаляет его. Если
возникает ош ибка, управление передается утверж дению , помеченному меткой 99.

11.3. Утверждение DELETE


Утверж дение D ELETE удаляет запись из файла прямого доступа. О но имеет следую ­
щий формат:
DELETE ([UNIT=]io-unitt REC=r[, ERR=label\ [, IOSTAT=/-ifar]).
где io-unit - спецификатор вн еш н ею устройства; г - скалярное числовое вы раж ение, ука­
зываю щ ее номер записи, которая будет удалена; label - метка утверж дения адресата пе­
рехода, которое получает управление, если возникает ош ибка; i-var - скалярная целочис­
ленная переменная, которая определяется как полож ительное целое число, если возника­
ет ош ибка, и нуль, если ош ибки не возникает.

1ЕслидействуетOPEN(READONLY).
‘Используйте только для последовательных файлов.
328 C .J l Л 1гаш н, В. В. К о н д р а т ьев П р о гр а и и р о ва ц п е на Visual FORTRAN

Правила использования
В файле прям ого доступа, утверж дение D ELETE удаляет запись прямого доступа,
указанную в г. Если R E O r опущ ен, удаляется текущ ая запись. Когда удалена запись
прям ого доступа, лю бая связанная переменная устанавливается к номеру следую щ ей за­
писи.
У тверж дение D ELETE логически удаляет соответствую щ ую запись из указанного
файла, определяя м естонахож дение записи и отм ечая ее как удаленную запись. Оно затем
освобож дает позицию , преж де занятую удаленной записью так, чтобы новая запись мог­
ла бы ть записана в этой позиции.
Примечание. Вы должны использовать опцию компилятора, указывающую по умолчанию
OpenVMS для READ, чтобы обнаружить, что запись была удалена.
Примеры
С ледую щ ее утверж дение удаляет пятую запись в файле, связанном с устройством
ввода/вы вода 10:
DELETE (10, REC=5)
П редполож им , что указано следую щ ее утверж дение:
DELETE (UNIT=9, REC=10,10STAT=I0S, ERR=20)
Д есятая запись в файле, связанном с устройством 9 удаляется. Если возникает ош иб­
ка, управление передается утверж дению , помеченному меткой 20, и полож ительное це­
лое число запоминается в переменной IOS.

11.4. Утверждение ENDFILE


Д ля последовательны х файлов, утверж дение ENDF1LE записы вает запись конца фай­
ла в файл и позиционирует его после этой записи (конечная точка). Для файлов прямого
доступа, утверж дение EN D FILE обрезает файл после текущ ей записи.
У тверж дение EN D FILE имеет один из следую щ их форматов:
ENDFILE ({[}H\J=]io-unit [, ERR=iabel\ [, IOSTAT=/-var]).
ENDFILE io-unit
где io-unit - внеш ний описатель устройства (номером канала); label - метка утверждения
адресата перехода, которое получает управление, если возникает ош ибка; i-var - скаляр­
ная целочисленная переменная, которая определяется как полож ительное целое число,
если возникает ош ибка, и нуль, если ош ибки не возникает.
Правила использования
Если устройство, указанное в утверж дении EN D FILE не открыто, открывается файл
по ум олчанию для неф орматного вывода.
Запись конца файла м ож ет бы ть записана только в файлы с последовательной органи­
зацией, которы е доступны как форм атны е последовательны е или неф орматно-сегм ен­
тированны е последовательны е файлы.
У тверж дение EN D FILE, выполненное на файле прямого доступа всегда обрезает
файл.
Записи конца файла не долж ны быть записаны в файлах, которые прочитаны про­
грам мами, записанны м и на язы ке, отличном от Fortran.
Примечание. Если вы используете опцию компилятора, указывающую по умолчанию
OpenVMS, и ENDFILE выполнен на последовательном устройстве, фактически записывается
Глава 1 1 Ут верж дения вво д а /вы во д а ф айловы х операций 329
в файл 1-байтовая запись, содержащая CTRL+Z. Если эта опция не указана, внутренний флажок
ENDFILE устанавливается и файл обрезается. Опция не воздействует на ENDFILE на файлах прямо­
го доступа; такие файлы обрезаются.
Примеры
Следую щ ее утверж дение записы вает запись конца файла на устройство ввода/вы вода
номер 2:
ENDFILE 2
П редположим, что указано следую щ ее утверж дение:
ENDFILE (UNIT=9, IOSTAT=IOS, ERFM O)
Запись конца файла записы вается в файл, связанны й с устройством 9. Если возникает
ош ибка, управление передается утверж дению , пом еченном у меткой 10, и полож ительное
целое число запоминается в переменной IOS.

11.5. Утверждение INQUIRE


У тверж дение INQ U IRE возвращ ает информ ацию относительно состояния указанны х
свойств файла, логического устройства или каталога (директории). И меет один из сл е­
дую щ их форматов:
Запрос к файлу:
INQUIRE (FILE=name [, ERR=label\ [, IOSTAT=/-var] [, DEFAULTFILE=cfe/], slist)
Запрос к устройству:
INQUIRE ([UNIT=]io-unit [, ERR=label\ [, I0 S T A T = /-M , slist)
Запрос к каталогу:
INQUIRE (DIRECTORY=d/r, EXISTS=ex [, DIRSPEC=dirspec] [, ERR=/abe/| [, IOSTAT=/-i/ar])
Запрос к списку вывода:
INQUIRE (IOLENGTH=/en) out-item-list
где пате - по ум олчанию скалярное вы раж ение сим вольного типа, указы ваю щ ие имя
файла для запроса; label - метка утверж дения адресата перехода, которое получает
управление, если возникает ош ибка; i-var - скалярная целочисленная переменная, кото­
рая определяется как полож ительное целое число, если возникает ош ибка, и нуль, если
ош ибки не возникает.
slist является одним или более специф икаторами запроса. Каж дый специф икатор м о­
жет появиться только 1 раз. (С пециф икаторы запроса описаны индивидуально в следую ­
щих разделах.)
d e f - по ум олчанию скалярное вы раж ение сим вольного типа, указы ваю щ ие строку
пути к файлу (по умолчанию ). (Для получения дополнительной инф орм ации о специф и­
каторе D EFA U LTFILE см. разд. 11.6.)
io-unit - спецификатор внеш него устройства.
У стройство не долж но сущ ествовать и при этом оно не долж но бы ть связано с ф ай­
лом. Если устройство связано с файлом, запрос охваты вает и соединение и файл.
dir - по умолчанию скалярное вы раж ение сим вольного типа, указы ваю щ им имя ката­
лога для запроса. Если вы запраш иваете каталог, он долж ен присутствовать.
330 С Д А лгат н, В В К он драт ьев П рограм ирование на Visual FORTRAN

ех по ум олчанию является скалярной переменной логического тина, которой назнача­


ется значение .TRU E., если dir имя каталога, который сущ ествует; иначе, ех задается зна­
чение .FALSE. При запросе каталог долж ен присутствовать.
Д ля получения дополнительной информации см. "С пецификатор EXIST".
dirspec - по ум олчанию скалярная переменная сим вольного типа, которой назначается
значение полной специф икации каталога dir, если ех придано значение .TRUE.. Этот спе­
циф икатор мож ет использоваться только для запроса каталога.
len является скалярной целочисленной переменной, которой назначается значение,
соответствую щ ее длине неф орматной, записи с прямым доступом, полученной из ис­
пользования out-item -list в утверж дении W RITE.
Значение является подходящ им для использования в качестве значения спецификатора
RECL в утверждении OPEN, которое связывает файл ¿игя неформатного, прямого доступа.
Единицей измерения являю тся, по ум олчанию , слова 4-байтовой длины. О днако если
вы указы ваете опцию комггилятора, указы ваю щ ую определение длины записи в байтах,
единица измерения - байты.
out-item -list - список о д н о ю или более элем ентов вывода (см. разд. 9.12).
Правила использования
С пециф икаторы управления ([UNlT=]/'o-*//f/7, E R R= label9 and IOSTAT=/-m/*) и специ­
фикаторы запроса могут появиться где-нибудь внутри круглых скобок после утверж де­
ния INQ U IRE. О днако если клю чевое слово U N IT опущ ено, io-unit долж но появиться
первым в списке.
У тверж дение IN Q U IR E м ож ет вы полниться до, во время или после того, как файл
связан с устройством. В озвращ аем ы е значения специф икатора являю тся текущ ими, когда
вы полняется утверж дение INQ U IRE.
Ч тобы получить характеристики файла, укаж ите утверж дение INQ U IRE после откры ­
тия файла.
Примеры
С ледую щ ие утверж дения являю тся примерами утверж дений INQUIRE:
INQUIRE (FILE -FILE .B ', EXIST=EXT)
INQUIRE (4, F0RM=FM, I0S TA T=I0S , ERR=20)
INQUIRE (I0LENGTH=LEN) A, В
В последнем утверж дении вы мож ете использовать длину, возвращ енную в LEN как
значение для сп ециф икатора REC L в утверж дении O PEN , к о ю р о е связы вает файл для
неф орматного п р ям о ю доступа. Если вы уже указали значение для RECL, вы можете ис­
п ользовать LEN, чтобы проверить, что А и В м еньш е или равны длине записи, которую
вы указали.

Спецификатор ACCESS
С пециф икатор A C C E SS запраш ивает, как связан файл. Он имеет следую щ ий формат:
ACCESS = асс
где асс - по ум олчанию скалярная переменная сим вольного типа, которой назначается
одно из следую щ их значений:
'SE Q U EN T IA L ' - если файл связан для последовательн ою доступа;
'D IR E C T' - если файл связан для прям ого доступа;
'U N D E FIN E D ' - если файл не связан.
Глава 11. Утверждения ввода/вывода файловых операций 331
Спецификатор ACTION
Спецификатор A CTIO N запраш ивает, какие операции ввода/вы вода допускаю тся для
файла. Он имеет следую щ ий формат:
ACTION = act
где act - скалярная переменная сим вольного типа по ум олчанию , которой назначается
одно из следую щ их значений:
'REA D' - если файл связан только для ввода;
'W RITE' - если файл связан только для вывода;
'REA D W RITE' - если файл связан для ввода и вывода;
'U N D EFIN ED ' - если файл не связан.

Спецификатор BINARY (W*32, W*64)


Спецификатор BIN A RY запраш ивает, связан ли файл с двоичны м файлом. Он им еет
следую щ ий формат:
BINARY = bin
где bin - по умолчанию скалярная переменная сим вольного типа, которой назначается
одно из следую щ их значений:
'YES' - если файл связан с двоичны м файлом;
'N 0 ' - если файл связан с недвоичным файлом;
'UN K N O W N ' - если файл не связан.

Спецификатор BLANK
Спецификатор B LA N K запраш ивает, какое управление пробелам и действует для ф ай­
ла. Он имеет следую щ ий формат:
BLANK = Ыпк
где blnk - по умолчанию скалярная переменная сим вольного типа, которой назначается
одно из следую щ их значений:
'NU LL' - если пустое управление пробелами действует для ф айла (файл заполняется
пробелами);
'ZERO' - если нулевое управление пробелами дей ствует для ф айла (файл заполняется
нулями);
'U N D EFIN ED ' - если файл не связан или он не связан для ф орм атной передачи дан ­
ных.

Спецификатор BLOCKSIZE
Спецификатор BLO C K SIZE запраш ивает размер буф ера ввода/вы вода. Он имеет сле­
дую щ ий формат:
BLOCKSIZE = bks
где bks - скалярная целочисленная переменная; назначается текущ ий разм ер буф ера вво­
да/вывода. Если устройство или файл не связаны, заданное значение равно нулю.

Спецификатор BUFFERED
С пецификатор BU FFERED запраш ивает, действует ли во время вы полнения буф ери ­
зация (промеж уточное хранение). Он имеет следую щ ий формат:
332 С Д Алгазин, В. В Кондратьев . Программирование на Visual FORTRAN

BUFFERED = bf
где b f - no ум олчанию скалярная переменная сим вольного типа, которой назначается од­
но из следую щ их значений:
'YES' - если файл или устройство связаны и буферизация действует;
'N 0 ' - если файл или устройство связаны, а буф еризация не действует;
'U N K N O W N ' - если файл или устройство не связаны.

Спецификатор CARRIAGECONTROL
С пецификатор C A R R IA G E C O N T R O L запраш ивает, какое управление кареткой дей ­
ствует для файла. Он им еет следую щ ий формат:
CARRIAGECONTROL = сс
где сс - по ум олчанию скалярная переменная сим вольного типа, которой назначается од­
но из следую щ их значений:
'FO RTR A N ' - если файл связан с управлением кареткой Fortran в действии.
'LIST' - если файл связан с неявным управлением кареткой в действии.
'NONE' - если файл связан без управления кареткой в действии.
'U N K N O W N ' - если файл не связан.

Спецификатор CONVERT
С пециф икатор C O N V E R T запраш ивает, какое преобразование данных действует для
файла. Он имеет следую щ ий формат:
CONVERT = fm
где fm - по ум олчанию скалярная переменная сим вольного типа, которой назначается
одно из следую щ их значений (см. прил. G):
'L1TTLE END1AN' - если файл связан с little-endian (порядок представления целых
чисел от младш его к ст арш ему - интеловский порядок байт) и задано 1ЕЕЕ преобразо­
вание данны х с плаваю щ ей точкой.
'B IG JE N D IA N ' - если файл связан с big-endian (порядок представления целых чисел
от старшего к младш ему - сетевой порядок байт) и задано 1ЕЕЕ преобразование дан­
ных с плаваю щ ей точкой.
'CRA Y ' - если файл связан с big-endian (порядок представления целых чисел от
старшего к младш ему - сетевой порядок байт) и задано CRAY преобразование данных
с плаваю щ ей точкой.
'FDX' - если файл связан с little-endian (порядок представления целых чисел от млад­
шего к старшему - интеловский порядок байтов) и задан процессор VAX* F flo a tin g ,
D floating и IEEE X floating преобразование данных.
'FGX' - если файл связан с little-endian (порядок представления целых чисел от млад­
шего к ст арш ему - интеловский порядок байтов) и задано VAX F floating, G floating и
IEEE X floating преобразование данных.
'IBM ' - если файл связан с big-endian (порядок представления целых чисел от ст ар­
шего к младш ему - сетевой порядок байтов) и задано IBM* System \370 преобразование
данных с плаваю щ ей точкой в действии.
'VA X D ' - если файл связан с little-endian (порядок представления целых чисел от
младш его к ст арш ему - интеловский порядок байтов) и задан процессор VAX
F floating, D _fIoating и H flo a tin g .
Глава 1 1 Утверждении ввода/вывода фай итых операции 333
'VAXG' - если файл связан с little-endian (порядок представления целыхчисел от
младшего к старшему - интеловский порядок байтов) и задан процессор VAX
F flo a tin g , G floating и Н floating.
'NA TIVE' - если файл связан без преобразования данных.
'UNKNOW N' - если файл или устройство не связаны для неформатной передачи данных.

Спецификатор DELIM
Спецификатор DEL1M запраш ивает, как разграничиваю тся сим вольны е константы
при выводе списком имен и управляю щ им списком. Он им еет следую щ ий формат:
DELIM = del
где del - по ум олчанию скалярная переменная сим вольного типа, которой назначается
одно из следую щ их значений:
'A PO STRO PH E' - если использую тся апострофы , чтобы разграничивать сим вольны е
константы при выводе списком имен и управляю щ им списком.
'QU O TE' - если использую тся кавы чки, чтобы разграничивать сим вольны е константы
при выводе списком имен и управляю щ им списком.
'NONE' - если никакие разделители не исгюльзуюгся.
'U N D EFIN ED ' - если файл не связан или не связан для форматной передачи данных.

Спецификатор DIRECT
Спецификатор D IR ECT запраш ивает, связан ли файл для прям ого доступа. Он им еет
следую щ ий формат:
DIRECT = dir
где dir - по ум олчанию скалярная переменная сим вольного типа, которой назначается
одно из следую щ их значений:
'YES' - если файл связан для прям ого доступа.
'N 0 ' - если файл не связан для прямого доступа.
'UN K N O W N ' - если файл вообщ е не связан.

Спецификатор EXIST
Спецификатор EX IST запраш ивает, сущ ествует ли файл и м ож ет ли он быть открыт.
Он имеет следую щ ий формат :
EXIST = ex
где ex - по ум олчанию скалярная переменная лог ического типа, которой дается одно из
следую щ их значений:
.TRUE. - если указанны й файл сущ ествует и мож ет быть открыт, или если указанное
устройство сущ ествует.
.FALSE. - если указанный файл или устройство не сущ ествую т или если файл сущ е­
ствует, но не может бы г ь о ткрыт.
Устройство сущест вует', если оно задано числом в диапазоне, допускаемом процессором.

Спецификатор FORM
С пецификатор FORM запраш ивает, связан ли файл для форм атной, неф орматной или
двоичной (W *32, W *64) передачи данных. Он имеет следую щ ий формат:
FORM = fm
334 С Д Ачгазин, В В Кондратьев Програмирование на Visual FORTRAN

где fm - по ум олчанию скалярная переменная сим вольного типа, которой назначается


одно из следую щ их значений:
'FO R M A TTED ' - если файл связан для форматной передачи данных.
'U N FO R M A T TE D ' - если файл связан для неф орматной передачи данных.
'BIN A R Y ' - если файл связан для двоичной передачи данных.
'U N D EFIN ED ' - если файл не связан.

Спецификатор FORMA TTED


С пециф икатор FO R M A TTED запраш ивает, связан ли файл для форматной передачи
данных. Он имеет следую щ ий формат:
FORMATTED = fmt ,
v n e f m t - по ум олчанию скалярная переменная сим вольного типа, которой дается одно из
следую щ их значений:
'YES' - если файл связан для форм атной передачи данных.
'N 0 ' - если файл не связан для форм атной передачи данных.
'U N K N O W N ' - если процессор не м ож ет определить, связан ли файл для форматной
передачи данных.

Спецификатор IOFOCUS (W*32, W*64)


С пециф икатор IO FO CU S запраш ивает, является ли обозначенное устройство актив­
ным окном в прилож ении Q uick Win. О н имеет следую щ ий формат:
IOFOCUS = iof
где io f - по ум олчанию скалярная переменная логического типа, которой дается одно из
Следующих значений:
.TRUE. - если указанное устройство является активны м окном в приложении
Q uickW in.
.FALSE. - если указанное устройство не является активным окном в приложении
Q uickW in.
Если вы прим еняете этот специф икатор с прилож ением не W indows*, возникает
ош ибка.

Спецификатор MODE
M O D E является нестандартны м синоним ом для A CTIO N (см. "Спецификатор
A C TIO N ").

Спецификатор NAME
С пециф икатор N A M E возвращ ает имя файла, имеет следую щ ий формат:
NAME = пте
где пте - по умолчанию скалярная переменная символьного типа, которой назначается имя
файла, с которым связано устройство. Если файл не имеет имени, пте - неопределено.
Значение, назначаем ое пте, - не обязательно то же значение, что и заданное в специ­
фикаторе FILE. О днако значение, которое назначается, всегда допустим о для использо­
вания со специф икатором FILE в утверж дении O PEN , если значение не было обрезано
способом, который делает его недопустимы м . (Значения обрезаю тся, если объявление
пте является слиш ком маленьким , чтобы содерж ать все значение.)
Глава II. Утверждения ввода/вывода файловых операций 335
Примечание. Спецификаторы F IL E и N A M E являются синонимами когда используются с ут­
верждением O P EN , но не когда используется с утверждением IN Q U IR E .

Спецификатор NAMED
Спецификатор NAM ED запрашивает, именован ли файл. Он имеет следующий формат:
NAMED = nmd
где nmd - по ум олчанию скалярная переменная логического типа, которой назначается
одно из следую щ их значений:
.TRUE. - если файл им еет имя.
.FALSE. - если файл не имеет имени.

Спецификатор NEXTREC
Спецификатор N EX TR EC запраш ивает, откуда м ож ет бы ть прочитана следую щ ая за­
пись или куда она записана в файл, связанны й для прям ого доступа. Он имеет следую ­
щий формат:
NEXTREC = nr
где n r - скалярная целочисленная переменная, значение которой назначается следую щ им
образом:
■ Если файл связан для прямого доступа и запись (г) бы ла предварительно прочитана
или записана, назначаем ое значение равно г + 1.
■ Если никакая запись не бы ла прочитана или записана, назначаем ое значение равно 1.
■ Если файл не связан для прямого доступа или если позиция файла не м ож ет быть оп­
ределена из-за ош ибочного условия, назначаем ое значение равно нулю.
■ Если файл связан для прямого доступа и на файле был вы полнен REW IN D , назначае­
мое значение равно 1.

Спецификатор NUMBER
Спецификатор N U M B ER запраш ивает номер устройства, связанного с файлом. Он
имеет следую щ ий формат:
NUMBER = пит
где пит - скалярная целочисленная переменная.
П еременной пит назначается номер устройства, в настоящ ее время связанного с ука­
занным файлом. Если нет никакого устройства, связанного с файлом, назначаем ое значе­
ние равно -1 .

Спецификатор OPENED
Спецификатор O PEN ED запраш ивает, связан ли файл. Он им еет следую щ ий формат:
OPENED = об
где o d - по ум олчанию скалярная переменная логического типа, которой назначается од­
но из следую щ их значений:
.TRUE. - если указанный файл или устройство связаны.
.FALSE. - если указанный файл или устройство не связаны.
336 С Д Апгазии, В В Кондратьев . Програмироваиие на Visual FORTRAN

Спецификатор ORGANIZATION
С пециф икатор O R G A N IZA TIO N запраш ивает, как организован файл. Он имеет сле­
дую щ ий формат:
ORGANIZATION = org
где org - по ум олчанию скалярная переменная сим вольного типа, которой назначается
одно из следую щ их значений:
'SE Q U EN TIA L ' - если файл является последовательны м файлом.
'RE L A T IV E' - если файл является файлом прямого доступа.
'U N K N O W N ' - если процессор не мож ет определить организацию файла.

Спецификатор PAD
С пециф икатор PAD запраш ивает, было ли указанно для файла заполнение пробелами.
Он имеет следую щ ий формат:
PAD = pd
где p d - по ум олчанию скалярная переменная сим вольного типа, которой назначается
одно из следую щ их значений:
'YES' - если файл или устройство не связаны или были связаны с P A D -Y E S '.
'NO' - если файл или устройство были связаны с P A D - N 0 '.

Спецификатор POSITION
С пециф икатор POSITIO N запраш ивает позицию файла. Он им еет следую щ ий формат:
POSITION = pos
где p o s - по ум олчанию скалярная переменная сим вольного типа, которой назначается
одно из следую щ их значений:
'R E W IN D ' - если файл связан с позицией в начальной точке.
'A PPEN D ' - если файл связан с позицией в конечной точке (или перед записью конца
файла, если она есть).
'A SIS' - если файл связан, без изменения его позиции.
'U N D E FIN E D ' - если файл не связан, или связан для передачи данных прямого досту­
па и на устройстве не бы ло вы полнено утверж дение REW IN D .

Спецификатор READ
Специф икатор REA D запраш ивает, мож ет ли файл бы ть прочитан. Он имеет следую ­
щий формат:
READ = rd
где rd - по ум олчанию скалярная переменная сим вольного типа, которой назначается од­
но из следую щ их значений:
'YES' - если файл м ож ет быть прочитан.
'N 0 ' - если файл не м ож ет бы ть прочитан.
'U N K N O W N ' - если процессор не м ож ет определить, м ож ет ли файл быть прочитан.

Спецификатор READWRITE
С пециф икатор RE A D W R IT E запраш ивает, мож ет ли файл бы ть и прочитан и записан.
Он имеет следую щ ий формат:
Глава 11 Утверждения ввода/вывода файловых операций 337

READWRITE = rdwr
где rdw r - по умолчанию скалярная переменная сим вольного типа, которой назначается
одно из следующ их значений:
'YES' - если файл мож ет бы ть прочитан и записан.
'N 0 ' - если файл не м ож ет бы ть прочитан и записан.
'UNKNOW N' - если процессор не м ож ет определить, м ож ет ли файл бы ть прочитан и
записан.

Спецификатор RECL
Спецификатор RECL запраш ивает м аксим альную длину записи в файл. Он имеет сле­
дую щ ий формат:
RECL = гс/
где rcl - скалярная целочисленная переменная, значение которой назначается следую ­
щим образом:
■ Если файл или устройство связаны, назначаем ое значение является максимальной
разреш енной длиной записи.
■ Если файл не сущ ествует или не связан, назначаем ое значение является нулем.
Н азначаемое значение выраж ается в блоках 4-байтовой длины , если файл связан в на­
стоящ ее время (или был предварительно связан), для неф орматной передачи данных;
иначе, значение выражается в байтах.

Спецификатор RECORDTYPE
Спецификатор REC O R D TY PE запраш ивает, какой тип записей находятся в файле. Он
имеет следующий формат:
RECORDTYPE = rtype
где rtype - по умолчанию скалярная переменная сим вольного типа, которой назначается
одно из следую щ их значений:
'FIXED' - если файл связан для записей ф иксированной длины .
'VARIABLE' - если файл связан для записей переменной длины .
'SEGM ENTED' - если файл связан для неф орматной последовательной передачи дан ­
ных, использующ ей сегментированны е записи.
'STREAM ' - если файловые записи ничем не заканчиваю тся.
'S T R E A M C R ' - если файловы е записи заканчиваю тся переводом каретки.
'S T R E A M L F ' - если файловые записи заканчиваю тся переводом строки.
'UNKNOW N' - если файл не связан.

Спецификатор SEQUENTIAL
Спецификатор SEQ U EN TIA L запраш ивает, связан ли файл для последовательного
доступа. Он имеет следую щ ий формат:
SEQUENTIAL = seq
где seq - по умолчанию скалярная переменная сим вольного типа, которой назначается
одно из следующ их значений:
'YES' - если файл связан для последовательного доступа.
'N 0 ' - если файл не связан для последовательного доступа.
338 С .Д Аъ*ашн, В В Кондратьев Прокламирование на Visual FORTRAN

'U N K N O W N ' - если процессор не м ож ет определить, связан ли файл для последова­


тельного доступа.

Спецификатор SHARE
С пециф икатор SH A RE запраш ивает текущ ее состояние разделения файла или устрой­
ства. Он им еет следую щ ий формат:
SHARE = shr

где s h r - по ум олчанию скалярная переменная сим вольного типа. На системах W indows*,


этой переменной назначается одно из следую щ их значений (разделения):
'D E N Y R W ' - если файл связан для реж има запрещ ения чтения-записи.
'DENYW 'R' - если файл связан для реж има запрещ ения записи.
'D E N Y R D ' - если файл связан для реж има запрещ ения чтения.
'D E N Y N O N E ' - если файл не связан для запрещ ения ни одного режима.
'U N K N O W N ' - если файл или устройство не связаны.
На си с!ем ах Linux* и M ac OS* этой переменной назначается одно из следую щ их зна­
чений:
'D E N Y R W ' - если файл связан для исклю чительного доступа.
'D E N Y N O N E ' - если файл связан для разделяем ого доступа.
'N O D E N Y ' - если файл связан с блокировкой по умолчанию .
'U N K N O W N ' - если файл или устройство не связаны.

Спецификатор UNFORMA TTED


С пециф икатор U N FO R M A T T E D запраш ивает, связан ли файл для неформатной пере­
дачи данны х. Он имеет следую щ ий формат:
UNFORMATTED = unf

где u nf - по ум олчанию скалярная переменная сим вольного типа, которой назначается


одно из следую щ их значений:
'Y ES' - если файл связан для неформатной передачи данных.
'N 0 ' - если файл не связан для неформатной передачи данных.
'U N K N O W N ' - если процессор не может определить, связан ли файл для неформат­
ной передачи данны х. \

Спецификатор WRITE
С пециф икатор W R ITE запраш ивает, может ли быть записан файл. Он имеет следую ­
щ ий формат:

WRITE = wr
где w r - по ум олчанию скалярная переменная сим вольного типа, которой назначается
одно из следую щ их значений:
'Y ES' - если файл м ож ет бы ть записан.
'N 0 ' - если файл не м ож ет быть записан.
'U N K N O W N ' - если процессор не м ож ет определить, мож ет ли файл быть записан.
Fiaaa 11 Утверждения ввода/вывода фаГповых операции 339

11.6. Утверждение OPEN


У тверж дение OPEN связы вает внеш ний файл с устройством , создает новый файл и
связывает его с устройством, создает предварительно связанны й файл или изм еняет не­
которые свойства соединения.
У тверж дение OPEN имеет следую щ ий формат:
OPEN ([UNIT=]/chM [, FILE=name] [, ERR=1аЬеЦ [, IOSTAT=/-i/ar], slist)
где i o - u n i t - спецификатор внеш него устройст ва.
n a m e является сим вольны м или числовым вы раж ением , указы ваю щ им имя файла, ко­
торый будет связан. Для получения дополнительной инф орм ации см. "С пециф икатор
FILE".
la b e l является меткой утверж дения адресата перехода, которое п олучает управление,
если возникает ош ибка.
i- v a r является скалярной целочисленной переменной, которая определяется как п оло­
жительное целое число, если возникает ош ибка, и нуль, если ош ибки не возникает.
s lis t является одним или более спецификаторами OPEN в ф орм ате s p e c i f ie r = v a lu e или
s p e c ifie r . Каждый спецификатор м ож ет появиться только однаж ды .
Спецификаторы OPEN и их прием лем ые значения приведены в табл. 11.1.

Таблица 11.1. Спецификаторы и значения утверждения OPEN


Спецификатор Значения 1 Функция Умолчание
ACCESS 'SEQUENTIAL', 'DIRECT', Режим доступа 'SEQUENTIAL'
'APPEND'
ACTION (или MODE) 'READ', 'WRITE' Доступ к файлу 'READWRITE'
'READWRITE'
ASSOCIATEVARIABLE var Следующая запись прямо­ Нет умолчания
го доступа
BLANK 'NULL' 'ZERO' Интерпретация пробелов 'NULL'
BLOCKSIZE n_expr Физический размер блока Умолчание файловой
системы
BUFFERCOUNT n_expr Число буферов Один
ввода/вывода
BUFFERED 'YES' 'NO' Буферизация для опера­ 'N 0'
ций WRITE
CARRIAGECONTROL 'FORTRAN', 'LIST', 'NONE' Управление печатью Форматный: 'LIST'2. Нефор­
матный: 'NONE'
CONVERT 'LITTLE ENDIAN', Числовая спецификация 'NATIVE'
'BIG_ENDIAN', 'CRAY', формата
'FDX', 'FGX', 'IBM', VAXD',
'VAXG', 'NATIVE'
DEFAULTFILE c_expr Имя пути файла по умол­ Текущий рабочий каталог
чанию
DELIM 'APOSTROPHE', 'QUOTE', Разделитель для сим­ 'NONE'
'NONE' вольных констант
DISPOSE (orDISP) 'KEEP' or'SAVE', 'DELETE', Состояние файла при за­ 'KEEP'
'PRINT', 'PRINT/DELETE', крытии
'SUBMIT',
'SUBMIT/DELETE'
ERR label Управление при ошибоч­ Нет умолчания
ной передаче
340 С Д. Алгазин, В В Кондратьев. Программирование на Visual FORTRAN

Спецификатор Значения 1 Функция Умолчание


FILE (or NAME) c_expr Имя пути файла (имя fo itn 3
файла)
FORM 'FORMATTED' Тип форматирования Зависит от установки
'UNFORMATTED' 'BINARY'2 ACCESS
IO FO C US2 .TRUE. .FALSE. Активное окно в приложе­ .TRU E.4
нии О и к Ж т
IOSTAT var Состояние ввода/вывода Нет умолчания
MAXREC n_expr Ограничение размера за­ Нет предела
писи прямого доступа
NOSHARED5 Нет значения Отвержение разделения L*X, М*Х32: РАЗДЕЛ. W*32,
файла W*64: Не раздел.
ORGANIZATION 'SEQUENTIAL' 'RELATIVE' Организация файла 'SEQUENTIAL'
PAD 'YES' 'NO' Заполнение записи 'YES'
POSITION 'AS IS', 'REWIND', 'APPEND' Позиционирование файла 'ASIS'
READONLY Нет значения Защита от записи Нет умолчания
RECL n_expr Длина записи Зависит от установок
(or RECORDSIZE) RECORDTYPE,
ORGANIZATION и FO R M 5
RECORDTYPE 'FIXED', 'VARIABLE', Тип записи Зависит от установок
'SEGMENTED', 'STREAM', ORGANIZATION, ACCESS,
'STREAM CR', CARRIAGECONTROLnFORM
'STREAM LF'
SHARE5 'DENYRW' 'D EN YW R '2 Блокировка файла 'DENYW R'6
'D EN YRD '2 'DENYNONE'
SHARED5 Нет значения Файл допускающий L*X, M*X32: РАЗДЕЛ. W*32,
разделение W*64: He раздел.
STATUS (or TYPE) 'OLD', 'NEW', 'SCRATCH', Состояние файла при 'UNKNOW N'7
'REPLACE', 'UNKNOWN' открытии
TITLE2 c_expr Заголовок для дочернего Нет умолчания
окна в приложении
Оигс1М/ю
UNIT n_expr Логический номер устрой­ Нет умолчания; io-unit должен
ства быть указан
USEROPEN func Программируемые поль­ Нет умолчания
зователем опции
1 Ключ к значениям: с_ехрг - скалярное выражение символьного типа по умолчанию; func - внешняя функция; label - метка
утверждения; п_ехрг - скалярное числовое выражение; var - скалярная переменная целочисленного типа по умолчанию.
2 W*32, W*64.
3 n - номер устройства.
4 Если устройство указано умолчание - FALSE.; иначе умолчание - TRUE.
5 На системах Linux* и Mac OS* умолчание зависит только от установки FORM.
6 Умолчание отличается при некоторых условиях (см. "Спецификатор SHARE").
7 Умолчание отличается при некоторых условиях (см. "Спецификатор STATUS").

С пециф икаторы O PEN описаны индивидуально в последую щ их разделах. Специф и­


каторы управления, которы е м огут бы ть указанны в утверж дении OPEN (UN IT, ERR и
10STA T ), обсуж даю тся в разд. 10.1.
fiem a II. Утверждения ввода/вывода файчовых операций 341
Правила использования
Спецификаторы управления ([UNIT=]/o-z/w/7, E R R = label и IOSTAT=/-vc/r) и сп ец и ф и ­
каторы OPEN м огут появиться где-нибудь внутри круглых скобок после O PEN . О днако
если клю чевое слово U NIT опущ ено, io-unit долж ен появиться первым в списке.
Значения спецификатора, которые являю тся скалярны ми числовыми вы раж ениям и,
могут быть лю бы м целочисленны м или действительны м выраж ением. Значение вы раж е­
ния преобразуется в целочисленны й тип данны х преж де, чем оно используется в утвер ­
ждении OPEN.
Только одно устройство одноврем енно м ож ет бы ть связано с файлом, но м н огократ­
ные OPEN м огут быть выполнены на том же устройстве. Если утверж дение O PEN вы ­
полняется для устройства, которое уже сущ ествует, происходит' следую щ ее:
Если FILE не указан или указы вает то же имя файла, которое появилось в преды ду­
щем утверж дении O PEN , остается связанны м с текущ им файлом.
Если имена ф айла - одинаковые, значения для специф икаторов BLA N K , C A R R lA G E -
CO N TRO L, C O N V E R T, DELIM , D1SPOSE, ERJ*, IO STA T и PAD м огут бы ть изменены.
Д ругие значения спецификаторов OPEN не м огут бы ть изменены, а позиция ф айла не за­
трагивается.
Если FILE указы вает другое имя файла, предыдущ ий файл закры вается и новый файл
связывается с устройством.
Спецификаторы ERR и IOSTA T из лю бого предварительно вы полняем ого утверж де­
ния OPEN не имею т никакого эффекта на лю бое в настоящ ее время вы полняю щ ееся у т­
верждение O PEN . Если возникает ош ибка, никакой файл не откры вается или создается.
Вторичные сообщ ения операционной системы не отображ аю тся, если указан IO STA T.
Чтобы отображ ать эти сообщ ения, удалите IO ST A T или используйте специф ический для
платформы метод.
Примеры
Вы можете указы вать сим вольны е значения во время вы полнения, заменяя си м воль­
ное значение выражения специф икатора в утверж дении O PEN . С им вольное значение
может содерж ать конечны е пробелы, но не м еж строчны й интервал или внутренние п ро­
белы; напрггмер:
CHARACTER*6 FIN A L/"/

IF (expr) FINAL = 'DELETE'


OPEN (UNIT=1, STATUS-NEW ', DISP=FINAL)
Следую щ ее утверж дение создает новый последовательны й ф орм атны й ф айл на у ст­
ройстве 1 с именем файла по ум олчанию forl. 1:
OPEN (UNIT=1, STATUS-NEW ', ERR=100)
Следую щ ее утверж дение создает файл на магнитной ленте:
OPEN (UNIT=I, FILE=Vdev/rmt8', &
STA TU S -N E W , ERR=14, RECL=1024)
Следую щ ее утверж дение откры вает файл (созданный в преды дущ ем ггримере) для
ввода:
OPEN (UNIT=I, FILE=7dev/rmt8', READONLY, STATUS='OLD', &
RECL=1024)
342 С Д Ачгазин, В В Кондратьев Программирование на Visual FORTRAN

Следую щ ий пример откры вает сущ ествую щ ий файл /usr/users/som eone/ tesl.dat:
OPEN (unit=10, DEFAULTFILE='/usr/users/someone/,) FILE='test.dat,) 1 FORM='FORMATTED,1STATUS='OLD')

Спецификатор ACCESS
С пецификатор A CC ESS указы вает метод доступа для соединения файла. Он имеет
следую щ ий формат:
ACCESS = асс
где асс - по ум олчанию скалярное вы раж ение сим вольного тина, которое является одним
из следую щ их значений:
'DIRECT' указы вает прямой доступ.
'SEQ U EN TIA L' указы вает последовательны й доступ.
'APPEN D ' указы вает последовательный доступ, но файл позиционирован па запись
конца файла (добавление в конец).
По ум олчанию - 'SEQ U EN TIA L'.
Есть ограничения на доступ к записи в соответствии с организацией файла и типом
записи.

Спецификатор ACTION
С пецификатор A CTIO N указы вает допустим ы е операции ввода/вы вода для соедине­
ния с файлом. Он имеет следую щ ий формат:
ACTION = act
где act - но ум олчанию скалярное выраж ение сим вольного типа, которое является одним
из следую щ их значений:
'READ' указы вает на то, что только утверж дения REA D могут обратиться к этому со­
единению.
'W RITE' указы вает на то, что только утверж дения W RITE, D ELETE и EN D FILE могут
обратиться к этому соединению.
'READW R1TE' указы вает на то, что утверж дения REA D , W RITE, D ELETE и EN DFILE
могут обратиться к этому соединению.
По ум олчанию - 'READW R1TE'. В системах W indows* на значение но умолчанию
можно воздействовать опцией компилятора.

Спецификатор ASSOCIA TEVARIABLE


С пецификатор A SSO CIA TEV A R1A BLE указы вает переменную , которая обновляется
после каждой операции ввода/вы вода прямого доступа, чтобы отраж ать номер следую ­
щей последовательной записи в файле. Он им еет следую щ ий формат:
ASSOCIATEVARIABLE = asv
где asv - скалярная целая переменная; не может бы ть форм альны м аргументом для под­
программы, в которой появляется утверж дение OPEN.
У тверж дения REA D прямого доступа, W RITE прямого доступа и FIND. DELETE и
REW RITE м огут воздействовать на значение a sv.
Этот специф икатор допустим только для прямого доступа; он иг норируется для дру­
гих реж имов дос тупа.
Viaea / 1 Утверждения ввода'вывода файловых операций 343
Спецификатор BLANK
Спецификатор B LA N K указы вает, как интерпретирую тся пробелы в файле. Он имеет
следующий формат:
BLANK = blnk
где blnk - по умолчанию скалярное выраж ение сим вольного типа, которое является од­
ним из следую щ их значений:
'NULL' указывает, что все пробелы игнорирую тся, за исклю чением полностью пусто­
го поля (которое имеет нулевое значение).
'ZERO' указывает, что все пробелы (кроме начальных пробелов) обрабаты ваю тся, как
нули.
По умолчанию - 'N U LL' (для явно открытых файлов, предварительно связанных
файлов и внутренних файлов). Если вы указы ваете опцию компилятора F66 (или
O PTIO NS/N O F77), по ум олчанию - 'ZERO'.
Если указаны описатели редактирования BN или BZ для форм атного утверждения
ввода, они заменяю т принимаем ую по ум олчанию интерпретацию пробелов.

Спецификатор BLOCKSIZE
Спецификатор B LO CK SIZE указы вает физический размер передачи ввода/вы вода для
файла. Он имеет следую щ ий формат:
BLOCKSIZE = bks
где bks - скалярное числовое выражение. В случае необходим ости значение преобразо­
вывается в целочисленны й тип данны х перед использованием.
Если вы указываете число, отличное от нуля, для bks, оно округляется до числа, крат­
ного 512-байтовым блокам.
Если вы не указы ваете B L O C K SIZE или вы указы ваете нуль для bks, применяется
значение по умолчанию файловой системы.

Спецификатор BUFFERCOUNT
Спецификатор B U FFERC O U N T указывает число буф еров, которые будут ассоцииро­
ваться с устройством для многобуферного ввода/вывода. Он имеет следую щ ий формат:
BUFFERCOUNT = be
где be - скалярное числовое выраж ение в диапазоне от 1 до 127. В случае необходимости
значение преобразуется в целочисленны й тип данных перед использованием.
С пецификатор BL O C K SIZ E определяет размер каж дого буфера. Н апример, если
BUFFERCOUNT=3 и BLO CK S!ZE =2048, общ ее количество байтов, распределенны х для
буферов равно 3*2048 или 6144 байта.
Если вы не указы ваете B U FFE R C O U N T или вы указы ваете нуль для Ьс\ значение по
умолчанию равно I.

Спецификатор BUFFERED
Спецификатор BU FFERED указы вает поведение библиотеки времени вы полнения по­
сле операций W RITE. Он имеет следую щ ий формат:
BUFFERED = bf
344 С Д Аъчпин, В В Кондратьев Програиирование на Visual FORTRAN

где b f - по ум олчанию скалярное вы раж ение сим вольного типа, которое оценивается к
одном у из следую щ их значений:
'Y ES' требует, чтобы библиотека поддерж ки накапливала выходные данны е в ее внут­
реннем буфере, возможно для нескольких операций W RITE, прежде чем послать данные
файловой системе.
Буферизация м ож ет улучш ить работу во время выполнения для приложений с боль­
шим объемом вывода.
'N 0 ' требует, чтобы библиотека поддерж ки посы лала выходные данны е файловой
систем е после каж дой операции W RITE. По ум олчанию - 'N 0 '.
Если указано BU FFE R E D - YES', запрос будет или не будет соблюдаться, в зависимо­
сти от устройства вывода и файловы х различий или характеристик соединения.
Если BLOCKSLZE и BUFFERCOUNT были указаны для OPEN, их произведение определя­
ет размер в байтах внутреннею буфера. Иначе значение по умолчанию внутреннего буфера
равно 8192 байт.
Примечание. На системах Windows* размер по умолчанию внутреннего буфера равен
1024 байт, если используется опция компилятора /fpscomp:general.
В нутренний буфер может увеличиваться, чтобы поддерж ивать наибольш ую отдель­
ную запись, но никогда не будет сж иматься.

Спецификатор CARRIAGECONTROL
С пециф икатор C A R R IA G EC O N T R O L указы вает тип используем ого управления ка­
ретки, когда файл отображ ается на терминале. Он имеет следую щ ий формат:
CARRIAGECONTROL = сс
где сс - rio ум олчанию скалярное выраж ение сим вольного типа, которое является одним
из следую щ их значений:
'FO R T R A N ' указы вает обы чную интерпретацию F ortran для первого символа.
'LIST' указы вает 1 перевод строки между записями.
'N O N E ' не указы вает никакой обработки управления каретки.
По ум олчанию для двоичны х (W *32, W *64) и неф орматны х файлов - 'NONE'. По
ум олчанию для форм атны х файлов - 'LIST'. О днако если вы используете опцию компи­
лятора, указы ваю щ ую ум олчание O penV M S и устройство связано с терминалом, по
ум олчанию - 'FO RTR A N '.

Спецификатор CONVERT
С пециф икатор C O N V E R T указы вает неродной числовой ф орм ат для неформатных
данны х. Он им еет следую щ ий формат:
CONVERT = fm
где fin - по ум олчанию скалярное выражение сим вольного типа, которое является одним
из следую щ их значений:
*
'L 1 T T L E E N D 1A N ' - litll-endian целочисленны е данны е и 1ЕЕЕ данные с плаваю щ ей
точкой.
'ВЮм ENDIAN' - big-endicin целочисленные данные и 1ЕЕЕ данные с плавающей точкой.
'C R A Y ' - big-endian целочисленны е данны е и CR A Y * данны е с плаваю щ ей точкой
разм ера REA L(8) или CO M PLEX (8).
Глава 1 1 У т верж дения вво д а /вы во д а ф а й ю в ы х операций 345
'FDX' - Utll-endian целочисленны е данны е и VAX* данны е с плаваю щ ей точкой ф ор­
мата F flo a tin g для REA L(4) или CO M PLEX (4), D floating для REA L (8) или C O M PLEX
(8) и IEEE X J lo a tin g для REA L(16) или CO M PLEX (16).
'FGX' - litll-endian целочисленны е данны е и данны е процессора V A X с плаваю щ ей
точкой формата F floating для REA L(4) или CO M PL E X (4), G _floating для размера
REAL(8) или CO M PLEX (8) и IEEE X _floating для REA L (16) или CO M PL E X (16).
'IBM ' - big-endian целочисленны е данны е и IBM * System \370 данны е с плаваю щ ей
точкой размера REA L(4) или C O M PLEX (4) (IBM короткие 4) и разм ера R EA L(8) или
CO M PLEX(8) (IBM длинны е 8).
'VAXD' - litll-endian целочисленны е данные и данны е процессора V A X с плаваю щ ей
точкой формата F floating для размера REA L(4) или C O M PL E X (4), D flo a tin g для р азм е­
ра REAL(8) или C O M PLEX (8) и H floating для R EA L(16) или CO M PL E X (16).
'VAXG' - litll-endian целочисленны е данные и данны е процессора V AX с плаваю щ ей
точкой формата F floating для размера R EA L(4) или C O M PL E X (4), G floating для разм е­
ра REAL(8) или C O M PLEX (8) и H _floating для REA L(16) или CO M PL E X (16).
'NATIVE' - никакого преобразования данных не выполняется. Это значение прим еня­
ется по умолчанию.
Вы можете использовать CO N V ERT, чтобы указать несколько ф орм атов в одной про­
грамме. О бычно один ф орм ат используется для каждого указанного ном ера устройства.
Когда читается неродной формат, неродной ф орм ат на диске преобразуется к родном у
формату в памяти. Если преобразованное неродное значение - вне диапазона родного
типа данных, появляется динамическое сообщение (сообщение во время выполнения про­
граммы).
Есть другие способы указать числовой ф ормат для неф орматны х файлов: вы можете
указать переменную среды, опцию компилятора, указы ваю щ ую C O N V E R T или
O PTIO NS/CO N V ERT. Таблица показы вает порядок старш инства.
Используемый метод Старшинство
Переменная среды Самое высокое
OPEN (CONVERTS -
OPTIONS/CONVERT -
Опция компилятора CONVERT Самое низкое
Опция компилятора C O N V ER T и OPTION S/C O N V E R T воздействует на все номера
устройств, используемые программой, в то время как перем енны е среды и OPEN
(CO N VERT =) воздействую т на определенны е номера устройств.
Следующий пример показы вает, как закодировать утверж дение O PE N , чтобы прочи­
тать неформатные числовые данны е CRAY с устройства 15, которые могли бы бы ть об­
работаны и, возможно, записаны в родном формате litll-endian на устройство 20:
OPEN (CONVERT-CRAY', FILE=agraph3.data, FORM-UNFORMATTED',
UNIT=15)

OPEN (FILE='graph3_nativedaf, FORM-UNFORMATTED', UNIT=20)

Спецификатор DEFAULTFILE
Спецификатор D EFA U L TFILE указы вает строку имени пути ф айла по умолчанию . Он
имеет такой формат:
DEFAULTFILE = def
346 С Д А ъ'аш н, В В К ондрат ьев И рограм нроваи ие на Visual FORTRAN

где def - по ум олчанию сим вольное выраж ение, указы ваю щ ее строку имени пути файла.
Строка имени пути ф айла по ум олчанию используется главным образом при получении
имен пути файла в интерактивном режиме. Имена пути файла, известные пользователь­
ской гтротрамме, обы чно появляю тся в спецификаторе FILE.
DEFAULT FILE поставляет значение системе ввода/вывода Fortran, которое префик-
сируется (добавляется в начало) к имени, которое появляется в FILE.
Если d efw z заканчивается слеш ем (/), слеш добавляется.
Если D E FA U LTFILE опущ ен, система ввода/вы вода Fortran использует текущ ий ра­
бочий каталог в к ач ес 1 ве с троки имени пути файла по умолчанию .

Спецификатор DELIM
С пециф икатор D ELIM указы вает, какие символы (если они есть) использую тся, что­
бы разграничивать сим вольны е константы в выводе списком имен и управляю щ им спи­
ском. Он им еет следую щ ий формат:
DELIM = del
где d el - по ум олчанию скалярное выраж ение сим вольного типа, которое является одним
из следую щ их значений:
'A PO ST R O PH E' - указы вает, ч ю апострофы разграничиваю т символьные константы.
Все внутренние апостроф ы удваиваю тся.
'Q U O TE' - указы вает, что кавычки р ал р ан и ч и ваю т сим вольны е константы. Все внут­
ренние кавычки удваиваю тся.
'N O N E' - указы вает, что сим вольны е константы не имеют никаких разделителей. Н и­
какие внутренние апостроф ы или кавычки не удваиваю тся. По ум олчанию - 'NONE'.
С пециф икатор D ELIM допускается только для файлов, связанны х для форматной пе­
редачи данны х; он И1 норируется во время ввода.

Спецификатор DISPOSE
С пециф икатор D ISPO SE (или DISP) указывает состояние файла после закрытия уст­
ройства. Он имеет один из следую щ их форматов:
DISPOSE = dis
DISP = dis
где dis - no ум олчанию скалярное выраж ение си м вол ьн о ю типа, которое является одним
из следую щ их значений:
'K EEP' или 'SA V E' - сохраняет файл после закрытия устройства.
'D E L E TE ' - удаляет файл после закрытия устройства.
'PR IN T' - предоставляет файл спулеру устройства построчной печати и сохраняет ею .
(И спользовать только для последовательны х файлов.)
'PR IN T /D ELE T E ' - предоставляет файл спулеру устройства построчной печати и за­
тем удаляет его. (И спользовать только для последовательны х файлов.)
'SU B M IT ' - разветвляет процесс, чтобы выполнить операции с файлом.
'SU B M IT /D E L E T E ' - разветвляет процесс, чтобы выполнить операции с файлом, и за­
тем удаляет файл после т о ю , как разветвление закончено.
Д ля временных ф айлов, по ум олчанию - 'D ELETE'. Д ля всех других файлов, по ум ол­
чанию - 'KEEP'.
Г ласа // У т верж дения вво д а /вы во д а ф ай ю ны \ операций 347
Спецификатор FILE
Спецификатор FILE указывает имя файла, который будет связан с устройством . Он
имеет следую щ ий формат :
FILE = name
где пате - сим вольное или числовое вы раж ение; мож ет бы ть лю бы м именем пути, д о ­
пускаемым операционной системой. Конечны е пробелы в имени игнорирую тся, если
возникаю т следую щ ие условия:
■ спецификатор FILE опущен;
■ устройство не связано с файлом;
- STATUS - SCRA TCH ' не указано;
■ соответствую щ ая переменная среды FO R T« не установлена для ном ера устройства.
Intel Fortran генерирует имя файла в ф орм ат q fort.п, где п является логическим н ом е­
ром устройства. На системах W indows, если указана опция ком пилятора /fpscom p:general,
пропуск FILE, подразумевает STATUS - SCRA TCH '.
Если имя файла запомнено в числовом скаляре или массиве, имя долж но состоять из
сим волов ASCII, заканчиваю щ ихся символом нуля ASCII (нулевой байт). О днако если
оно запомнено в символьном скаляре или м ассиве, оно не долж но содерж ать н у л ев о ю
байта.

Спецификатор FORM
Спецификатор FORM указывает, связы вается ли файл для ф орм атной, неф орм атной
или двоичной (W *32, W *64) передачи данных. Он имеет следую щ ий формат:
FORM = fm
где fin - по ум олчанию скалярное выражение сим вольного типа, которому присваивается
одно из следую щ их значений:
'FO RM A TTED ' - указывает форм атную передачу данных.
'U N FO R M A TTED ' - указывает неф орматную передачу данны х.
'BIN A RY ' - указывает двоичную передачу данных.
Значение по умолчанию равно 'FO R M A TTED ' для ф айлов последовательного доступа
и 'U N FO R M A TTED ' - для файлов прямого доступа.

Спецификатор ЮFOCUS (W*32, W *6 4 )


С пецификатор 1 0 F 0 C U S указывает, является ли специф ическое устройство активны м
окном в приложении Q uickW in. Он имеет следую щ ий формат:
IOFOCUS = iof
где io f - по умолчанию скалярное выражение логического типа, которое является одним
из следую щ их значений:
.TRU E.указывает, что дочернее окно Q uickW in является активны м окном.
.FALSE, указывает, что дочернее окно Q uickW in является неактивным окном.
Если устройство указано звездочкой (*), то по ум олчанию - .FA LSE.; иначе по ум ол­
чанию - .TRUE.
Значение .TRUE, является причиной вызова FOC U SQ Q нем едленно перед лю бы м у т­
верждением READ, W RITE или PRINT к л о м у окну.
348 С Д. Алгазин, В В Кондратьев. Програмирование на Visual FORTRAN

Спецификатор MAXREC
С пецификатор M A X R E C указы вает максим альное число записей, которые могут быть
переданы из файла или в файл прям ого доступа, в то время как файл связан. Он имеет
следую щ ий формат:
MAXREC = тг
где т г - скалярное числовое выражение. При необходимости значение преобразуется в
целочисленный тип данны х перед использованием. По умолчанию - неограниченное
число записей.

Спецификатор MODE
M O D E является нестандартны м синонимом для A CTION .

Спецификатор NAME
N A M E является нестандартны м синонимом для FILE.

Спецификатор NOSHARED
С пецификатор N O SH A R E D указы вает, что файл связан для исклю чительного доступа
программой. Он имеет следую щ ий формат:
NOSHARED

Спецификатор ORGANIZA TION


Специф икатор O R G A N IZ A T IO N указы вает внутренню ю организацию файла. Он име­
ет следую щ ий формат:
ORGANIZATION = org
где o r g - но ум олчанию скалярное выражение сим вольного типа, которое является одним
из следую щ их значений:
'SE Q U EN T IA L ' - указы вает последовательны й файл.
'R ELA TIV E' - указы вает файл прямого доступа.
По ум олчанию - 'SE Q U EN T IA L'.

Спецификатор PAD
С пециф икатор PAD указы вает, дополняется ли форматная входная запись пробелами,
когда входной списка и специф икация форм ата требуют больш его количества данных,
чем содерж ит запись. С пециф икатор PAD имеет следую щ ий формат:
PAD = pd
где p d - по ум олчанию скалярное вы раж ение сим вольного тина, которое является одним
из следую щ их значений:
'YES' - указы вает, что запись будет дополняться пробелами, когда необходимо.
'N 0 ' - указы вает, что запись не будет дополняться пробелами. Входная запись долж на
содерж ать данны е, требуем ы е входным списком и спецификацией формата.
По ум олчанию - 'YES'.
Это поведение отличается от поведения Fortran 77, который никогда не дополняет ко­
роткие записи пробелам и. Н априм ер, рассм отрите следую щ ее утверждение:
READ (5/(15)’) J
Глава II Утверждения ввода/вывода фай ювых операции 349
Если вы вводите значение 123, сопровож даем ое переводом каретки, Fortran 77 пре­
вращ ает, 15 в 13 и J назначается 123.
О днако Intel Fortran дополняет значение 123 двумя пробелами, если вы явно не о т­
крываете устройство с PAD - NO'.
М ож но отменить заполнение пробелам и, указывая описатель редактирования BN.
Спецификатор PAD игнорируется во время вывода.

Спецификатор POSITION
Спецификатор POSITION указы вает позицию файла, связанного для последователь­
ного доступа. Он имеет следую щ ий ф орм а!’:
POSITION = pos
где pos - по умолчанию скалярное выраж ение сим вольного типа, которое является одним
из следую щ их значений:
'ASIS' - указывает, что позиция файла неизменяегся, если файл сущ ествует и уж е свя­
зан. Позиция не определена, если файл сущ ествуем но не связан.
'REW IN D ' - указывает, что файл позиционируется при открытии в его начальную
точку.
'APPEN D ' - указывает, что файл позиционируется в его конечную точку (или перед
записью конца файла, если она есть).
По умолчанию - 'ASIS'. (На системах ввода/вы вода Fortran аналогичен 'R EW IN D ').
Новый файл (указанный как новый явно или по ум олчанию ) всегда позиционируется
в его начальную точку.

Спецификатор READONL Y
Спецификатор REA D O NLY указы вает, что только утверж дения RJEAD м огут обра­
титься к этому с о е д и н е н и ю . Он имеет следую щ ий формат:
READONLY
REA D O N LY подобен указанию A CTION -R E A D ', но REA D O N LY предотвращ ает
удаление файла, если он закры вается со STA TU S - D ELETE'.
Значение по ум олчанию системы ввода/вы вода Fortran для доступа к файлу -
READW RITE. Если доступ отвергается, система ввода/вы вода автом атически повторяет
доступ к файлу для выполнения оператора READ.
О днако если вы используете опцию компилятора, указы ваю щ ую значение по ум олча­
нию O penV M S, система ввода/вы вода не повторяет вызов для доступа REA D . Так, во
время выполнения могут возникнуть ош ибки ввода/вывода, если защ ита файла не р азр е­
шает запись. Чтобы предотвращ ать такие ош ибки, если вы ж елаете прочитать файл, к ко­
торому вы не имеете доступа для записи, укаж ите REA D O N LY .

Спецификатор RECL
Спецификатор RECL указы вает длину каждой записи в файле, связанном для прямого
доступа, или м аксимальную длину записи в файле, связанном для последовательного
доступа. Спецификатор RECL им еет следую щ ий формат :
RECL = rl
где /7 - положительное числовое выражение, указы ваю щ ие длину записей в файле. При
необходимости значение преобразуется в целочисленны й тип данных перед использова-
350 С ,1 Ачгазин, В В Кондратьев Програиироцание на Visual FORTRAN

Если файл связан для ф орм а!ной передачи данны х, значение долж но бьп ь выражено
в байтах (символах). И наче, значение выраж ается в 4-байтовы х блоках (длинных словах).
Если файл связан для неф орматной передачи данны х, значение мож ет быть выражено
в байтах, если указанна опция компилятора A SSU M E BY TERECL.
За исклю чением сегментированны х записей, г/ является длиной только для данных
записи, он не вклю чает пространство для информ ации управления.
У казанная длина интерпретируется в зависим ости от типа записей в связанном файле
следую щ им образом:
Для сегментированны х записей RECL указы вает м аксим альную длину для лю бой до­
ли (вклю чая четыре байта информации управления).
Для записей фиксированной длины RECL указы вает разм ер каждой записи; он дол­
ж ен быть указан. Если записи неф орматные, размер долж ен бьп ь выражен как множи­
тель четырех. Вы можете использовать специф икатор RECL в утверждении INQUIRE,
чтобы получить длину записи перед откры тием файла. Для записей переменной длины
RECL указывает максим альную длину для лю бой записи.
Если вы читаете файл фиксированной длины с длиной записи, отличной от длины,
использованной для создания файла, могут возникнуть неопределенны е результаты.
М аксимальная длина для г/ зависит от типа записи и установки спецификатора
CA RR1A GECON TRO L, как показано в табл. 11.2.

Таблица 11.2. Максимальные длины записи (RECL)


Тип записи C A R R IA G E C O N T R O L Форматированные, байт
Фиксированной длины 'NONE' 2147483647 (2**31-1)1
Переменной длины •NONE' 2147483640 (2**31-8)
Сегментированный •NONE' 32764 (2**15-4)
Потоковый 'NONE' 2147483647 (2**31-1)
Потоковый с CR 'LIST' 12147483647 (2**31-1)
'FORTRAN' ¡2147483646 (2**31-2)
¡Потоковый с LF 'LIST' ¡2147483647 (2**31-1)2
! ¡’FORTRAN’ ¡2147483646 (2**31-2)
1 Вычтите 1, если используется опция компилятора, указывающая по умолчанию OpenVMS.
2 Только L*X.

Значение по ум олчанию зависит от установки специф икатора REC O R D TY PE так, как


показано в табл. 11.3.

Таблица 11.3. Значение по умолчанию длины записи (RECL)


! RECORDTYPE ' качение RËCL
pFIXED* _______ [Нет; значение должно быть явно указано___________
|_ 132 байт для форматных записей
Все другие параметры настроики р^т-Л------------------------------------т ------------------------------------------
I rArj г к к ________ ¡510 длинных слов для неформатных записеи________

Спецификатор RECORDSIZE
RECORDS1ZE является нестандартным синонимом для RECL.

Спецификатор RECORDTYPE
С пецификатор REC O R D TY PE указывае! тип записей в файле. Он имеет следую щ ий
формат:
RECORDTYPE = typ
I '.шва 11 Утверждения свода/вывода фай юаых операций 351
где typ - но умолчанию скалярное вы раж ение сим вольного типа, к о ю р о е является одним
из следую щ их значений:
'FIXED' - указы вает записи ф иксированной длины.
'V A RIA BLE' - указы вает записи переменной длины.
'SEG M EN TED ' - указы вает сегм ентированны е записи.
'STREA M ' - указы вает записи переменной длины потокового типа.
'S T R E A M L F ' - указы вает записи переменной длины потокового типа, заканчиваем ы е
переводом строки.
'STREAM CR' - указы вает записи переменной длины потокового типа, заканчивае­
мые переводом каретки.
При открытии файла значения по ум олчанию типа записи определяю тся следую щ им
образом:
'FIXED' для файлов прямого доступа.
'FIXED' для последовательны х файлов п рям ою доступа.
'STREAM LF' для форматны х файлов последовательного доступа.
'VA RIA BLE' для неф орматных файлов последовательного доступа.
Сегментированная запись - это логическая запись, состоящая из долей, которые являются
физическими записями. Так как длина сег ментированной записи может' быть больше, чем
65 535 байт, используйте только сегментированные записи для неформатною последователь­
ного доступа к дисковым или необработанным файлам магнитной ленты.
К файлам, содерж ащ им сегм ентированны е записи, м ожно получить доступ только
неформатными последовательны м и утверж дениями передачи данных.
Если утверждение вывода не указывает полную запись для файла, содерж ащ его запи­
си фиксированной длины , происходит следую щ ее:
■ в форматных файлах запись заполняется пробелами;
■ в неформатных файлах запись заполняется нулями.

Спецификатор SHARE
Спецификатор SHA RE указы вает, допустим а ли блокировка файла, в то время как от­
крыто устройство. Он имеет следую щ ий формат:
SHARE = shr
гдел7/г- по умолчанию скалярное выраж ение сим вольного тина.
На системах W indows* это вы раж ение является одним из значений:
'DEN Y RW ' - указывает режим запрета чтения/записи. Н икакой другой процесс не м о­
жет открыть файл.
'DEN Y W R' - указы вает режим запрета записи. Никакой процесс не Может открыть
файл с доступом для записи.
'DEN Y RD ' - указы вает реж им запрета чтения. Н икакой процесс не м ож ет открыть
файл с доступом для чтения.
'DEN Y N ON E' - указывает реж им без запрета. Лю бой процесс может открыть файл в
любом режиме.
На системах Linux* и Mac OS* это выражение является одним из следующих значений:
'DEN Y RW ' - указывает исклю чительны й доступ для совместны х процессов.
'DEN Y N ON E' - указывает' разделяем ы й доступ для совместны х процессов.
352 С А /[¡гат и, В В Кондратьев Програмирпаание на Visual FORTRAN

На системах W indow s по ум олчанию - 'DEN Y W R'. О днако если вы указываете опцию


ком пилятора /fpscom p:general или спецификатор SH A RED , по умолчанию -
'D E N Y N O N E'.
На системах Linux и M ac OS никакие ограничения не применяю тся для подавления
открыт ия файла, если вы не используете механизм блокировки.

Спецификатор SHARED
Специф икатор SH A R ED указы вает, что файл связан для разделяем ого доступа более
чем одной програм мой, вы полняю щ ихся одновременно. О н имеет следую щ ий формат:
SHARED
На системах Linux* и Mac OS* разделяемый доступ применяется по умолчанию для
системы ввода/вы вода Fortran. На системах W indows* эго является умолчанием, если
указанно SH A RED или опция компилятора /fpscom p:general.

Спецификатор STATUS
С пециф икатор STA TU S указы вает состояние файла, когда он открыт. Он имеет сле­
дую щ ий формат:
STATUS = sta
где sta - по ум олчанию скалярное выражение сим вольного гипа, которое является одним
из следую щ их значений:
'O LD ' указывает сущ ествую щ ий файл.
'N EW ' указывает новый файл; если файл уже сущ ествует, возникает ошибка. Как
только файл создан, его состояние изменяется на 'OLD'.
'SC R A T C H ' указывает новый файл, который является неназванным (называется рабо­
чим файлом). Когда файл закрывается или заканчивается программа, рабочий файл уда­
ляется.
'R E PL A C E ' указы вает, что файл заменяет другой. Если файл, который будет заменен,
сущ ествует, он удаляется и новый файл создается с тем же самым именем. Если файл,
которы й будет заменен, не сущ ествует, новый файл создается и его состояние изменяется
на 'OLD'.
'U N K N O W N ' указы вает, что файл может сущ ествовать или не су щ ес!в 0 вать. Если
файл не сущ ествует, новый файл создается и его состояние изменяется на 'OLD'.
Рабочие файлы находятся во временном каталоге и могут бы ть видимы, в то время
когда они открыты .
По ум олчанию - 'U N K N O W N '. Это значение такж е применяется по умолчанию , если
вы неявно откры ваете файл, используя W RITE. О днако если вы неявно открываете файл,
используя READ, по ум олчанию применяется 'OLD'. Если вы указы ваете опцию компи­
лятора F66 (или O PT IO N S/N O F77), по ум олчанию 'NEW '.
Примечание. Специф икатор S T A T U S может такж е появиться в утверждениях C L O S E , указывая
состояние файла после его закрытия. Однако в утверждениях C LO S E значения состояния являются
теми ж е, что и перечисленные для спецификатора D IS P O S E .

Спецификатор TITLE (W*32, W*64)


С пециф икатор TITL E указы вает имя д оч ерн ею окна в приложении QuickW in. Он
им еет формат:
Глава 11 Ут верж дении вво д а /вы во д а ф айловы х операций 353

TITLE = name
где пате - сим вольное выражение.
Если TITLE указан в не-Q uickw in приложении, возникает динам ическая ош ибка (во
время выполнения программы).

Спецификатор TYPE
TY PE является нестандартным синонимом для STA TU S.

Спецификатор USEROPEN
Спецификатор U SEROPEN указывает написанную пользователем внеш ню ю ф ун к­
цию, которая управляет открытием файла. Он им еет следую щ ий формат:
USEROPEN = function-name
гдеJunction-name - имя написанной пользователем функции, которая получает управление.
Ф ункция долж на бы ть объявлена в предшествующем утверж дении EX TE R N A L ; если
она типизирована, она долж на иметь тин IN T E G E R (4) (IN T E G E R *4).
Спецификатор USEROPEN позволяет опытны м пользователям использовать доп о л ­
нительные возмож ности операционной системы , которы е обы чно не доступны в Fortran.

11.7. Утверждение REWIND


У тверж дение REW IN D позиционирует файл последовательного или прям ого доступа
в начало файла (начальная точка). И меет один из следую щ их форм атов:
REWIND ([UNIT=]/<H#Mf [, ERR=label\ [, IOSTAT=/-i/ar]).
REWIND io-unit
где io-unit - спецификатор внеш него устройства; label - метка утверж дения адресата пе­
рехода, которое получает управление, если возникает ош ибка; i-var - скалярная целочис­
ленная переменная, которая определяется как полож ительное целое число, если возника­
ет ош ибка, и нуль, если ош ибки не возникает.
Правила использования
Номер устройства должен ссылаться на файл на диске или магнитной ленте, и файл дол­
жен быть открыт для последовательного или прямого доступа для добавления записей.
Если REW IN D выполнено на файле прямого доступа, сп ециф икатору N E X T R EC н а­
значается значение Г. Если файл уже ггозиционирован в начальную точку, утверж дение
REW IN D не имеет никакого эффекта. Если утверж дение R E W IN D вы полнено для уст­
ройства, которое не открыто, оно не имеет никакого эффекта.
Утверж дение REW IN D 3 устанавливает файл, связанны й с устройством ввода/вы во­
да 3, в начало файла.
Рассмотрите следую щ ее утверждение:
REWIND (UNIT=9, IOSTAT=IOS, ERR=10)
Это утверж дение позиционирует файл, связанны й с устройством 9, в начало файла.
Если возникает ош ибка, управление передается утверж дению , пом еченному меткой 10,
и положительное целое число запоминается в переменной IOS.
Глава 12. Утверждения управления компиляцией

Чтобы влиять на ком пиляцию в командной строке компилятора в дополнение к опре­


делению опций, вы м ож ете указать следую щ ие утверждения:
У тверж дение IN C LU D E вклю чает внеш ний исходный текст в программу.
У тверж дение O PT IO N S устанавливает опции, обы чно указываемые в командной
строке ком пилятора. П араметры настройки утверж дения O PTIO N S отменяю т опции ко­
мандной строки.

из текущ его файла и читать утверж дения из вклю ченного файла или текстового модуля.
У тверж дение IN C LU D E им еет формат: ^
INCLUDE Ш п а т е [/[NOJLIST]'
гд е ß l e - n a m e - строка сим вола, указы ваю щ ая имя файла, который будет вклю чен. О на не
долж на бы ть им енованной константой. Формат имени файла долж ен бы ть приемлемым
для операционной системы , как описано в ваш ей системной документации.
/[N O ]L IS T указы вает, долж ен ли вклю чаемый код появиться в распечатке программы
компиляции. В листинге число предш ествует каж дому вклю чаемому утверждению . Ч ис­
ло указы вает глубину влож ения "вклю чаем ою " кода. Ум олчанием является /NOLIST.
С п ециф икаторы /LJST и/N O L IS T долж ны бы ть записаны полностью .
Вы м ож ете использовать только /[NOJL1ST, если указы ваете опцию компилятора, ко­
торая устанавливает ум олчание O penV M S.
П равила использования
Утверждение INCLUDE может' появиться где-нибудь внутри блока области действия. Оно
может охватить больш е чем одну исходную строку, но никакое другое утверждение не может
появиться на той же самой строке. Исходная строка не может быть помечена.
В клю ченны й файл или текстовы й м одуль не могу! начинаться со строки продолж е­
ния, а каж дое утверж дение Fortran долж но полностью содерж аться внутри отдельного
файла. В клю ченны й файл или текстовы й модуль могут содерж ать лю бой исходный
текст, но он не м ож ет начинаться или заканчиваться неполным утверждением Fortran.
В клю ченны е утверж дения, когда они объединяю тся с другими утверж дениями при
ком пиляции, долж ны удовлетворить ограничениям о порядке утверж дений, которые по­
казаны на рис. 2.1. В клю ченны е файлы или текстовы е м одули могут содерж ать дополни­
тельны е утверж дения IN C LU D E, но они не долж ны бы ть рекурсивными. Утверждения
IN C L U D E м огут бы ть влож ены , пока не исчерпаю тся системны е ресурсы . Когда вклю ­
ченный файл или текстовы й модуль заканчиваю т выполнение, компиляции возобновля­
ется с утверж дения, следую щ его за утверж дением INCLUD E.
Пример
Здесь файл по имени C O M M O N .FO R (в текущ ем рабочем каталоге) вклю чен и прочи­
тан как ввод.
Включение текста из файла в основной программный файл Файл COMMON .FOR
PROGRAM
INCLUDE 'COMMON.FOR' INTEGER, PARAMETER:: M=100
REAL, DIMENSION(M) ;• Z REAL, D IM EN SIO N(M ):: X, Y
CALL CUBE COMMON X, Y
ßmomnm 354
Глава 12. Ут верж дения управлении компиляцией 355
DO I = 1, М
Z(I) = X(I) + SQRT(Y(I))
END DO
END
SUBROUTINE CUBE
INCLUDE 'COMMON.FOR'
DO l=1,M
X(l) = Y(l)**3
END DO
RETURN
END
Файл C O M M O N .FO R определяет им енованную константу M и определяет м ассивы X
и Y как часть непомеченного общ его блока.

12.2. Утверждение OPTIONS


У тверж дение O PTIO N S отм еняет или подтверж дает опции ком пилятора, дей ству ю ­
щ ие для программной единицы. О но имеет следую щ ий форм ат:
OPTIONS option [option...]
OPTIO N является одним из следую щ их выраж ений:
/ASSUME = [NO]UNDERSCORE
/CHECK = ALL
[NO]BOUNDS
[NO]OVERFLOW
NONE
/NOCHECK
/CONVERT = BIGENDIAN
CRAY
FDX
FGX
IBM
LITTLE ENDIAN
NATIVE.
VAXD
VAXG
/[NO]EXTENDSOURCE
/[NO]F77
/[NO] 14
/[NO]RECURSIVE
О братите внимание на то, что опции всегда долж ен п редш ествовать слеш (/). Н екото­
рые опции утверж дения O PTIO N S эквивалентны опциям ком пилятора.
Правила использования
У тверж дение O PTIO N S долж но бы ть первым утверж дением в п рограм м ной единице,
предш ествуя утверждениям PRO G R A M , SU B R O U TIN E , FU N C T IO N , M O D U L E и
BLO CK DATA. О пции утверж дения O PT IO N S отм еняю т опции ком пилятора, но только
до конца программной единицы, для которой они определены . Если вы хотите отм енить
опции компилятора в другой програм мной единице, вы долж ны указать утверж дение
O PTIO N S перед этой программной единицей.
С ледую щ ее утверж дение является допустим ы м и утверж дениям и O PT IO N S:
OPTIONS /CHECK=ALL/F77 OPTIONS /14
Глава 13. Директивы расширенной компиляции

Д ирективы расш иренной компиляции вы полняю тся, используя директивы компиля­


тора. Д ирективы ком пилятора - это специальны е команды, которые позволяю т вы пол­
н ять различны е задачи во время компиляции. Они подобны опциям компилятора, но м о­
гут обеспечивать больш е возм ож ностей управления внутри ваш ей программы. Д иректи­
вам компилятора предш ествует специальны й префикс, который идентифицирует их для
компилятора.

13.1. Правила синтаксиса для директив компилятора


П рименяю тся следую щ ие правила синтаксиса ко всем директивам компилятора: об­
щим и Fortran О репМ Р*. Вы долж ны точно следовать этим правилам, чтобы собрать ва­
шу програм му долж ны м образом и получить осм ы сленны е результаты.
Н аправляю щ ий преф икс - тег (от англ. tag - признак или дескриптор), имеет один из
следую щ их форматов:
Общие директивы компилятора:
cD ЕС$
Директивы компилятора Fortran ОрепМР:
с$ О М Р
где с - одно из вы раж ений: С (или с), ! или *. С ледую щ ие преф иксны е форматы могут
использоваться вм есто cD EC$: cDIRS или !MS$.
П равила исходного ф орм ата для преф иксов директив:
В фиксированны х и табулированны х исходных форматах, префиксы начинаю тся с С
(или с), * или !
П рефикс долж ен появляться в столбцах 1-5; сю л б ец 6 долж ен быть пробелом или та ­
булятором (за исклю чением преф икса !MS$.). О т столбца 7 пробелы являю тся незнача­
щ ими, таким образом , директива м ож ет бы ть позиционирована где-нибудь на строке по­
сле столбца 6.
В свободном исходном форм ате, префиксы начинаю тся с (!).
П рефикс м ож ет появиться в лю бом столбце, но ему м ож ет предш ествовать только
пробел или сим вол табуляции на той ж е самой строке.
Д и ректива ком пилятора заканчивается в столбце 72 (или столбце 132, если указана
соответствую щ ая опция компилятора).
О бщ ие директивы ком пилятора не м огут бы ть продолж ены. Д ирективы Fortran
О репМ Р м огут бы ть продолж ены .
К ом м ентарий, начинаю щ ийся с восклицательного знака (!) м ож ет следовать за дирек­
тивой компилятора на той ж е самой строке.
Д ополнительны е утверж дения Fortran (или директивы ) не м огут появиться на той же
строке, на которой присутствует директива компилятора.
Д ирективы ком пилятора не м огут появиться внутри непрерывного утверждения
Fortran.
Н епом еченны й общ ий блок, используем ы й в директиве компилятора указывается
двумя слеш ам и (//).

йтоттп 356
Глава 13. Д ирект ивы расш иренной к о и т п я ц и и 357
Если исходная строка начинается с допустим ого преф икса директив, по директива не
распознана, компилятор игнорирует строку.

Общие директивы компилятора


Intel Fortran обеспечивает несколько универсальны х директив компилятора, чтобы
выполнять некоторы е задачи во время компиляции. Вы не долж ны указы вать какую -либо
опцию компилятора, чтобы разреш ать общ ие директивы.
Правила для общих директив, кот орые воздействуют на циклы D O
Эта таблица перечисляет общ ие директивы , которые воздействую т на циклы DO:
DISTRIBUTE POINT; NOUNROLL; VECTOR ALIGNED1; '
IVDEP; NOVECTOR1; VECTOR ALWAYS1;
LOOP COUNT; PARALLEL; VECTOR NONTEMPORAL1;
NOPARALLEL; PREFETCH; VECTOR UNALIGNED1.
NOPREFETCH; SWP2;
NOSWP2; UNROLL;
1¡32, i32em
2 Только ¡64.

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


■ Д иректива долж на предш ествовать утверж дению DO каж дого цикла DO, на которы й
она воздействует.
■ Никакие строки исходного текста програм мы , кроме следую щ их строк, не м огут бы ть
помещ ены между оператором директивы и утверж дением DO:
• одной из других общ их директив, которы е воздействую т на циклы DO;
• директивы PA R A LLEL DO Fortran O penM P*;
• строки комментария;
• пустых строк.
К этим директивам могут прим еняться разны е правила. Д ля получения доп олн и тель­
ной информации, см. описание каж дой директивы .
Правила для директив цикла, воздействующие
на операторы присваивания м ассива
Когда некоторы е директивы цикла предш ествуют' оператору присваивания м ассива,
они воздействую т на неявны е циклы, которы е сгенерированы компилятором.
Следую щ ие директивы цикла м огут воздействовать на операторы присваивания м ас­
сива: IVDEP, N O U N RO LL, U N RO LL, L O O P C O U N T, N O V E C TO R (i32, i32em ), V E C T O R
A LIGNED (i32, i32em), N O PA R A L L EL, PA R A LLEL, V EC TO R A L W A Y S (i32, i32em ),
NOPREFETCH, PREFETCH , V ECTO R N O N TE M PO R A L (¡32, ¡32em), N O SW P (только
¡6 4 ), SW P (только ¡64), V E C T O R U N A L IG N E D (¡32, ¡32em).
Только одна из выш еупомянуты х директив мож ет предш ествовать оператору при ­
сваивания массива (одном ерный массив = выраж ение), чтобы воздействовать на него.
К этим директивам м огут прим еняться разны е правила (см. описание каж дой д и р ек ­
тивы).
Пример
Рассмотрите следую щ ее выражение:
REAL А(10), В(10)
358 СД Алгазин, В В Кондрат ьев. П рограм и рован и е на Visual FO RTRAN

!DEC$ IVDEP
A=В+3
Это имеет тог ж е эффект, что и запись следую щ его явного цикла: *
!DEC$ IVDEP
DO 1= 1,10
А (I) = В (I) + 3
END DO

13.2. Директива ALIAS


Д иректива ALIA S указы вать дополнительное внеш нее имя, которое используется для
обращ ения к внеш ним подпрограмм ам . О на мож ет бы ть полезной для сборки прилож е­
ний, написанны х для других платформ, которы е им ею т другие соглаш ения об именах.
Д иректива A LIA S имеет следую щ ий формат:
cDEC$ ALIAS internal-name, external-name
где с - одно из выражений: С (или с), ! или * (см. разд. 13.1).
internal-name является именем подпрограм м ы , используем ой в текущ ей программной
единице.
external-name является именем или сим вольной константой, разграниченной апостро­
фами или кавы чками.
Правила использования
Если указано имя, имя (в верхнем регистре) используется как внеш нее имя для ука­
зан н ого внутреннего имени (internal-name). Если указана символьная константа, она ис­
пользуется, как есть; строка не изменяется к верхнем у регистру и при этом пробелы не
удаляю тся.
Д иректива A LIA S воздействует только на внеш нее имя, используем ое для ссылок на
указанное внутреннее имя (internal-name).
Имена, которы е неприемлемы для ком поновщ ика, явятся причиной ош ибки во время
компоновки.

13.3. Директива ASSUMEALIGNED


Д иректива A SSU M E A L IG N E D указы вает, что объект в памяти выровнен. О на имеет
следую щ ий формат:
cDEC$ ASSUME_ALIGNED addressl ni [, address2:n2]..,
где с - одно из выражений: С (или с), ! или * (см. разд. 13.1).
address является ссы лкой к памяти; м ож ет иметь лю бой тин данных, вид или ранг. Он
не мож ег бы ть ни одним из следую щ их выраж ений:
О бъектом в CO M M O N (или объектом E Q U IV A LE N C E (эквивалентный) к чему-
нибудь в CO M M O N ).
Ком понентом переменной производного типа или ссы лкам и к гголям записи.
Объектом, к которому получают достугг через связывание хостом или использованием.
п является инициализированны м скалярны м целочисленны м выражением. Его значе­
ние долж но быть степенью 2 между 1 и 256, го есть, 1, 2, 4, 8, 16,3 2, 64, 128, 256.
Правила исполь ювания
Если вы указы ваете больш е чем 1 элем ент address:n, они долж ны быть разделены за­
пятой.
Глава 13. Д ирект ивы расш иренной компиляции 359
Если адресом является Cray P O IN T E R или он имеет признак указателя, то именно
указатель, а не указуемый объект или цель (TA R G ET) предполагается выровненным.
Если вы указываете недопустимое значение для /7, отображается сообщение об ошибке.

13.4. Директива ATTRIBUTES


Д иректива A TTR IB U TES позволяет указы вать свойства для объектов данны х и про­
цедур. Он имеет следую щ ий формат:
cDEC$ ATTRIBUTES att [, att].. :: object [, object]...
где с - одно из выражений: С (или с), ! или * (см. разд. 13.1).
a t t является одной из следую щ их опций (или свойств): A LIA S, D EFA U LT,
NO ARG CH ECK , AL1GN, D L LE X PO R T (W *32, W *64), N 01NL1NE, A LLO C A TA B LE,
DLL1M PORT (W *32, W *64), N O M IX E D _ST R _L E N _A R G , A LLO W N U LL, EX TERN,
REFERENCE, A RRAY V1SUAL1ZER, FORCE1NL1NE, STD C A LL, C, 1 G N O R E L O C ,
VALUE, D ECO RA TE, INLIN E, VARY1NG.
o b je c t - имя объекта данны х или процедуры.
Табл. 13.1 показывает, какие опции A T TR IB U TE S м огут использоваться с какими
объектами:

Таблица 13.1. И спользован ие опции A T T R IB U T E S


Объявления переменной Спецификация подпрограммы
Опция Имена общего блока1
и массива и утверждения EXTERNAL
ALIAS Нет Да Да
ALIGN Да Нет Нет
ALLOCATABLE Да г Нет Нет
ALLOW.NULL Да Нет Нет
ARRAY_VISUALIZER Д а2 Нет Нет
С Нет Да Да
DECORATE Нет Нет Да
DEFAULT Нет Да Да
DLLEXPORT Д а3 Да Да
D LLIMPORT Да Да Да
EXTERN Да Нет Нет
FORCEINLINE Нет Нет Да
IGNORE LOC Д а4 Нет Нет
INLINE ■ ¡Нет Нет Да
NO ARG CHECK Да Нет Д а5
NOINLINE Нет Нет Да
NOM IXED_STR_LEN_ARG Нет Нет Да
REFERENCE Да Нет Да
STDCALL Нет Да Да
VALUE Да Нет Нет
VARYING No No Yes
1Имя общего блока указанно как [/]имя общего блока[/].
2 Эта опция может быть применена только к массивам.
3 Только переменные уровня модуля имассивы.
4 Эта опция может быть применена только к блокам интерфейса.
5 Эта опция не может быть применена к утверждениям EXTERNAL.
360 С Д А чгат н, В В К о н д р а т ьев П р о грам и рован и е на Visual FORTRAN

Эти опции M o i y r использоваться в функции и определениях подпрограммы, в объяв­


лениях типа и с утверж дениями IN TE R FA C E и EN TRY .
Опции применимы к объектам, доступны м через связы вание хостом или использова­
нием действую т в течение связывания. Рассм отрите следую щ ий пример:
MODULE M0D1
INTERFACE
SUBROUTINE SUB1
!DEC$ ATTRIBUTES С, ALIAS.’othername’ :: NEW .SUB
END SUBROUTINE
END INTERFACE CONTAINS
SUBROUTINE SUB2
CALL NEW .SUB
END SUBROUTINE
END MODULE
В этом случае вызов N E W S U B внутри SU B 2 использует опции С и ALIA S, указан­
ные в блоке интерфейса.
С ледую щ ие вы раж ения являю тся опциям и A TTR IB U TE S:
A T TR IB U TES A LIA S;
A T TR IB U TES A LIG N ;
A T TR IB U TES A LLO C A T A B L E ;
A T TR IB U TE S A L LO W N U LL;
A T TR IB U TES A R R A Y V ISU A L IZ ER (W *32, W *64);
A T TR IB U TE S С и STD C A LL;
A T TR IB U TE S D ECO RA TE;
A T TR IB U TES D EFA U LT;
A T TR IB U TES D L LE X PO R T и D L LIM PO R T (W *32, W *64);
A T TR IB U TES EX TERN;
A T TR IB U TE S IG N O RE LOC;
A T TR IB U TES IN LIN E, NOIN LINE и FO R C E D IN L IN E ;
A T TR IB U TE S NO A RG CH ECK ;
A T TR IB U TE S N O M IX ED STR LEN A RG ;
A T TR IB U TE S R EFE R EN C E и V A LU E;
A T TR IB U TE S V A RY IN G .
О пции С, STD C A LL, R E FE R EN C E , V A LU E и V A RY IN G воздействую т на соглаш е­
ния о вызовах подпрограмм:
Вы м ож ете указать С, STD C A LL, R E FER E N C E и V A RY IN G для всей подпрограммы.
Вы м ож ете указать V A LU E й R EFE R E N C E для индивидуальны х параметров.

ATTRIBUTES ALIAS
О пция A LIA S директивы A T TR IB U TES указы вает дополнительное внеш нее имя, ко­
торое используется для обращ ения к внеш ним подпрограмм ам . О на имеет следую щ ий
формат:
cDEC$ ATTRIBUTES ALIAS: external-name : : subprogram
где external-name - сим вольная константа, разграниченная апостроф ами или кавычками.
С им вольная константа используется, как есть: строка не изменяется к верхнему регистру
и пробелы не удаляю тся.
subprogram - внеш няя подпрограмма.
Гчава 13 Д ирект ивы расш иренной компиляции 361
О пция A LIA S отм еняет опцию С (и STD CALL). Если и С и A L IA S указаны для п од­
программы, подпрограмм е придаю т соглаш ения о вызовах С, но не соглаш ение об им е­
нах С. О на вместо э то ю получает имя, заданное в A LIA S, без модиф икаций.
Опция A LIA S не может использоваться с внутренними процедурам и и она не м ож ет
применяться к формальным аргум ентам .
Следую щ ий пример дает подпрограмм е имя "_O therN am e@ 4" вне этого блока облас­
ти действия:
INTERFACE
SUBROUTINE happy(i)
!DEC$ ATTRIBUTES STDCALL, DECORATE, AUAS:’0therName’ :: happy INTEGER i
END SUBROUTINE
END INTERFACE
cD EC$ A TTR IB U TE S ALIA S имеет то же действие, что и ди ректива A LIA S.

A TTRIBUTES ALIGN
О пция ALIG N директивы A TTR IB U TES указы вает границу вы равнивания в байтах
для переменной. О на имеет такой формат:
cDEC$ ATTRIBUTES ALIGN: л:: var
где п - число байтов для минимальной границы выравнивания.
Для размещ аем ы х переменных (allocatable array), граничная величина долж н а быть
степенью двойки между 1 и 16384, таким и как 1, 2, 4, 8, 16, 32, 64, 128 и т. д.
Для неразмещ аемы х переменны х граничная величина долж на бы ть степенью 2 между
1 и 64 на системах W indow s*, между 1 и 2**16 на системах L inux*, или меж ду 1 и 2**12
на системах Mac OS*.
var - выравниваю щ аяся переменная.

A TTRIBUTES ALLOCA TABLE


О пция A LLO C A TA B L E директивы A TTR IB U TES обеспечивается для совместим ости
со старыми программами. О на позволяет задерж ивать распределение пам яти для специ­
фически объявленного объекта до некоторой точки во время вы полнения, когда вы явно
вызываете подпрограмм у, которая динамически распределяет пам ять для объекта. Опция
A LLO C A TA BLE приним ает следую щ ий формат:
cDEC$ ATTRIBUTES ALLOCATABLE : : entity
где entity - имя объекта, распределение которого долж но бы ть задерж ано.
Рекомендованный метод для динам ического распределения пам яти долж ен использо­
вать атрибут и утверж дение A LLO C A T A B L E .

A TTRIBUTES ALLOWNULL
Опция A LLO W N U LL директивы A TTR IB U TES разреш ает передавать соответст­
вую щ ему формальному аргументу указатель N U LL (определяем ы й нулем или встроен­
ной подпрограммой N U LL), как значение параметра. О на им еет следую щ ий формат:
cDEC$ ATTRIBUTES ALLOW_NULL : : arg
где arg - именя параметра.
Опция A LLO W N U LL допустим а только, если такж е указана опция RE FE R E N C E ;
иначе она не имеет никакого эффекта.
362 С Д А лгазин . В В К ондрат ьев П рограм ирование на Visual FORTRAN

ATTRIBUTESARRAY_VISUALIZER (W*32, W 44)


О пция A R R A Y V IS U A L IZ E R директивы A T TR IB U TE S разреш ает более эффектив­
ное разделение памяти между прилож ением и библиотекой Intel Array Visualizer. Она имеет
следую щ ий формат:
cDEC$ ATTRIBUTES ARRAY_VISUALIZER : : array
где a r r a y - массив, которы й используется с библиотекой Intel A rray Visualizer.
С ледую щ ий прим ер показы вает способ использовать угу директивную опцию , чтобы
улучш ить работу вызова:
real(4), allocatable :: МуАггау(:,:)
!DEC$ ATTRIBUTES array_visualizer:: MyArray

A TTRIBUTES С и STDCALL
О пции С и S TD C A L L директивы A TTR IB U TES указываю т, как нужно передавать
данны е, ког да вы используете подпрограмм ы , написанны е на С или ассемблере с подпро­
грам мами Fortran или Fortran 95/90. О ни им ею т следую щ ие форматы:
cDEC$ ATTRIBUTES С : : object I object] . . .
cDEC$ ATTRIBUTES STDCALL : : object [, object] . . .
г де o b je c t - имя объекта данны х или процедуры.
На процессорах IA-32 опции С и STD C A LL имею т немного разные смыслы; на всех
других п латф орм ах они интерпретирую тся как синонимы.
К огда опции С и S TD C A LL прим еняется к подпрограмм е, они определяют подпро­
грам му, как им ею щ ую специф ический набор соглаш ений о вызовах.

Таблица 13.2. Различия м еж ду соглаш ениям и о вы зовах


Соглашение С1 ! STDCALL1 Умолчание2
Параметры, которые передают значением Да Да Нет
Регистр внешних имен подпрограммы L*X, М*Х32: нижний 1*Х, М*Х32* нижний L*X, М*Х32: нижний
регистр. \Л/*32, регистр \Л/*32, регистр \Л/*32,
\Л/*64‘ нижний ре­ \Л/*64: нижний ре­ \Л/*64*: верхний ре­
гистр гистр гистр
Только L*X, М*Х32: добавлен замыкающий Нет Нет Д а3
символ подчеркивания
Только М*Х32: начальный символ подчер­ Нет Нет Да
кивания добавлен
W*32 only: начальный символ подчеркива­ Да Да Да4
ния добавлен
Число параметров добавлено Нет Да Нет
Очистка стека вызывающей программы Да Нет Да
Переменное число параметров Да Нет Да
1 С и Б Т Р С А И - синонимы на системах Ыпих
2 Соглашение о вызовах М е! Ро|1гап.
3 На системах Ыпих, если есть 1 или более символов подчеркивания во внешнем имени, добавляются 2 конечных символа
подчеркивания; если нет никаких символов подчеркивания во внешнем имени, один добавляется.
4 Только \/У*32

Если С или 5Т О С А Е Е указаны для подпрограмм ы , параметры (за исклю чением м ас­
сивов и сим волов) передаю тся по значению . П одпрограм м ы , использую щ ие стандартные
соглаш ения РогЧгап 95/90, передаю т параметры ссылкой.
Глава 13. Д ирект ивы расш иренной компиляции 363
На процессорах 1А-32 символ подчеркивания (_) пом ещ ается в начале внеш него и м е­
ни подпрограммы. Если указано STD C A LL, знак (@), сопровож даем ы й числом байтов
параметра, которые передаю тся, пом ещ ается в конце имени. Н априм ер, подпрограм м а по
имени SUB1, которая имеет 3 параметра INTEG ER(4) и определен а с STD C A LL, назн а­
чается внеш нее имя _ subl@ 12.
Символьные параметры передаю тся следую щ им образом:
■ По умолчанию скрытые д л и н ы 1 помещ аю тся в конце списка параметров.
■ Н а системах 1А-32 W indows* вы м ожете получить поведение по ум олчанию Compaq*
Visual Fortran, указывая опцию компилятора /iface:m ixed_ str ien arg.
■ Если С или STD C A LL (только) указаны: на всех системах первы й сим вол строки п е­
редается (и дополняется нулями до длины 1NTEGER(4)).
■ Если указаны С или STD C A LL и указан R EFER E N C E для парам етра; на всех си сте­
мах строка передается без длины.
■ Если С или STD C A LL указаны и R EFE R EN C E указан для подпрограм м ы (но
R EFEREN CE (ссылка) не указана для параметра, если он есть); на всех системах,
строка передается вместе с длиной.
Для больш его количества деталей см. описание R E FE R E N C E в разд. "A TTR IB U TES
REFEREN CE и VALUE".

A TTRIBUTES DECORA ТЕ
О пция D ECO RA TE директивы A TTR IB U TES указы вает, что внеш нее имя, исполь­
зуемое в cD EC$ A LIA S или cD ECS A TTR IB U TE S A L IA S, им еет преф иксны е и п ост­
фиксные знаки отличия, которы е ассоциирую тся с действую щ им м еханизм ом вызова. Это
те же самые знаки отличия, которы е вы полняю тся с именем процедуры , когда A LIA S не
указан. Опция D ECO RA TE им еет следую щ ий формат:
cDEC$ ATTRIBUTES DECORATE : : exname
где ex пате - внеш нее имя.
Регистр внеш него имени A LIA S не изменяется. Если A L IA S не указан, эта опция не
имеет никакого эффекта. См. такж е прим ер в описании "A T T R IB U T E S A L IA S" и краткое
изложение преф иксны х и постфиксны х знаков отличия в описании "A T T R IB U T E S С и
STDCALL".

ATTRIBUTES DEFAULT
Опция A TTR IB U TES директивы D ECO RA TE отм еняет некоторы е опции ком п и лято­
ра, которые м огут воздействовать на внеш ню ю подпрограм м у и объявления блока
COM M ON. О на имеет следую щ ий формат:
cDEC$ ATTRIBUTES DEFAULT : : entity
где entity - внеш няя процедура или блок CO M M O N .
Эта опция указывает, чтобы ком пилятор игнорировал опции ком пилятора, которые
изменяю т соглаш ения по ум олчанию для обозначения внеш него сим вола и для передачи
параметров подпрограммам и блокам CO M M O N .

1ПоумолчаниюIntel Fortran передает скрытую длину аргумента для строк. Скрытая длина аргу­
мента состоитиз 4-байтового цаого числа без знака (системыIA-32).
364 С Д . Алгазин, В. В К ондрат ьев П рограм ирование на Visual FO RTRAN

Эта опция м ож ет бы ть объединена с другим и опциями A TTR IB U TES типа STD CALL,
С, REFER EN C E, A LIA S и т. д., чтобы указы вать свойства, отличные от умолчаний ком­
пилятора.
Эта опция полезна, когда объявляют блоки INTERFACE для внешних подпрограмм, так
как она препятствует опциям компилятора изменять вызов или соглашения об именах.

A TTRIBUTES DLLEXPORT и DLLIMPORT (W*32, W 44)


Опции D L LEX PO R T и D L LIM PO R T директивы A T TR IB U TE S определяю т интерфейс
динамически ком понуем ой библиотеки (DLL) для процессов, которые их используют.
Опции м огут бы ть назначены переменным модуля, блокам CO M M O N и процедурам. Они
имею т следую щ ие форматы :
cDEC$ ATTRIBUTES DLLEXPORT : : object I objecf\ . . .
cDEC$ ATTRIBUTES DLLIMPORT : : object I object] . . .
где object - имя перем енной м одуля, блока CO M M O N или процедуры. Имя блока
CO M M O N долж но бы ть заклю чено в слеши.
Опция D L LE X PO R T указы вает, что процедуры или данны е экспортирую тся в другие
приложения или DLLs. Это заставляет компилятор создавать эффективный код, устраняя
потребность в файле определения (.def) модуля, чтобы экспортировать символы.
Опция DLLEXPORT долж на быть указана в подпрограмме, к которой она применяется.
Символы, определенны е в D LL импортирую тся программами, которые их использу­
ют. П рограмма долж на связаться с библиотекой импорта DLL (.lib) и использовать оп­
цию D L LIM PO R T в програм м ной единице, которая им портирует символ. О пция
D LLIM PO R T указы вается в объявлении, а не в определении, так как вы не можете опре­
делить символ, которы й вы им портируете.

A TTRIBUTES EXTERN
О пция EX TERN директивы A TTR IB U TE S указывает, что переменная распределена в
другом исходном файле. О пция EXTERN мож ет использоваться в объявлениях глобаль­
ных переменных, но она не долж на применяться к ф ормальным аргументам. О на имеет
следую щ ий формат:
cDEC$ ATTRIBUTES EXTERN : : var
где var - переменная, которая будет распределена.
Эта опция долж на использоваться для получения доступа к переменным, объявлен­
ным на других языках.

A TTRIBUTES IGNOREJLOC
О пция IG N O R E L O C директивы A T TR IB U TES разреш ает удалить % LO C из пара­
метра. О на имеет следую щ ий формат:
cDEC$ ATTRIBUTES IGNORE_LOC : : arg
где arg - имя параметра.
О пция IG N O R E LO C допустим а только, если опция R EFEREN CE такж е указана;
иначе она не им еет никакого эффекта.
Гпава 13 Д ирект ивы расш иренной ком т пяи ии 365
ATTRIBUTES INLINE, NOINLINE и FORCEDINLINE
О пции INLIN E, N O IN LIN E и FORCE1NLINE директивы A T TR IB U TE S могут исполь­
зоваться, чтобы управлять решениями встраивания (inline function), принимаем ым и ком ­
пилятором. Вы долж ны пом естить директивную опцию в процедуру, которая вы зы вает
подпрограмму, на встраивание которой вы хотите влиять.
Опция INLINE указывает, что ф ункция или подпрограм м а м огут бы ть встроены.
Встраивание м ож ет игнорироваться компилятором , если действую щ ая эвристика реш ает,
что оно может иметь отрицательное воздействие на работу или явится причиной слиш ­
ком больш ого увеличения разм ера кода. О на им еет следую щ ий формат:
cDEC$ ATTRIBUTES INLINE : : procedure
где procedure - функция или подпрограмм а, которая м ож ет бы ть встроена.
Опция N O IN LIN E отклю чает встраивание функции. О на им еет следую щ ий формат:
cDEC$ ATTRIBUTES NOINLINE : : procedure
где procedure - функция или подпро]рам м а, которая не долж на бы ть встроена.
Опция FORCEINL1NE указывает, чтобы ф ункция или подпрограм м а были встроены ,
если это не явится причиной ош ибки. О на имеет следую щ ий формат:
cDEC$ ATTRIBUTES FORCEINLINE : : procedure
где procedure - функция или подпрограмм а, которая долж на бы ть встроена.

A TTRIBUTES N O A R G C HE C K
О пция NO ARG CH ECK директивы A T TR IB U TE S указы вает, чтобы тип и форма,
соответствую щ ие правилам, связы вания с явны м интерфейсом игнорировались. Это раз­
реш ает конструкцию блока IN T E R FA C E для внеш ней процедуры или процедурного м о­
дуля, который принимает параметр лю бого типа или формы; наприм ер, подпрограмму ко­
пирования памяти. О пция NO ARG CH ECK имеет следую щ ий формат:
cDEC$ ATTRIBUTES NO_ARG_CHECK : : object
где object - имя параметра или процедуры.
Опция NO ARG C H EC K мож ет появиться только в блоке IN TER FA C E для неродо­
вой процедуры или в процедурном модуле. О на м ож ет прим еняться к индивидуальном у
имени формального аргум ента или к имени подпрограммы, тогда опция прим еняется ко
всем формальным аргументам в этом интерфейсе.
Опция NO ARG C H EC K не мож ет использоваться для процедур с преф иксом PURE
или ELEM ENTA L.

A TTRIBUTES NOMI XEDS TRLENARG


Опция NOM1XED STR LEN A RG директивы A T TR IB U TE S указы вает, что скрытые
длины помещ аю тся в последовательном порядке в конце списка параметров. О на имеет
следую щ ий формат:
cDEC$ ATTRIBUTES NOMIXED_STR_LEN_ARG : : args
где a rg s - список параметров.
366 С Д А чгазин, В В Кондрат ьев. П рограм ирование на Visual FO RTRAN

ATTRIBUTES REFERENCE и VALUE


Опции R E FE R E N C E и V A LU E директивы A T TR IB U TE S указываю т, как нужно пере­
давать форм альны й параметр. О ни имею т следую щ ий формат:

cDEC$ ATTRIBUTES REFERENCE : : arg


cDEC$ ATTRIBUTES VALUE : : arg

где a rg - имя форм ального параметра.


О пция R EFEREN CE указы вает, что местополож ение пам яти ф ормального параметра
нужно передать вместо значения параметра.
О пция V A LU E указы вает, что значение форм ального парам етра нужно передать вме­
сто местополож ения памяти параметра.
Когда опция V A LU E указана для форм ального параметра, фактический параметр, пе­
реданны й ему, мож ет иметь другой тип. При необходим ости преобразование типа вы­
полняется преж де, чем вызывается подпрограмма.
Когда комплексны й (K IN D =4 или K IN D =8) параметр передается значением, 2 пара­
м етра с плаваю щ ей точкой (один содерж ащ ий вещ ественную часть, другой содержащий
мнимую часть) передаю тся в качестве непосредственного значения.
С им вольны е значения, подстроки, м ассивы переним аю щ его разм ера и массивы с пе­
рем енны ми границами нельзя передавать значением.
Если опция REFE R E N C E (только) указана для сим вольного параметра, строку пере­
даю т без длины.
Если опция R EFER EN C E указана для сим вольного парам етра и опция С (или
STD C A LL) бы ла указана для подпрограммы, строку передаю т без длины. Это верно, д а­
же если опция R EFER EN C E указана такж е для подпрограмм ы . Если опции REFERENCE
и С (или STD C A LL) указаны для подпрограмм ы , но опция REFE R E N C E не была указана
для параметра, строку передаю т с длиной.
О пция V A LU E прим еняется по умолчанию , если опция С или STD CALL указана в
определении подпрограммы.
В следую щ ем примере целое х передается значением:

SUBROUTINE Subr(x)
I NTEGERx
!DEC$ ATTRIBUTES VALUE ::x

ATTRIBUTES VARYING
О пция N O M IX ED STR LEN A RG директивы A T TR IB U TE S разреш ает переменное
число параметров вызова. О на имеет следую щ ий формат:

cDEC$ ATTRIBUTES VARYING : : var[, var] . . .


где var - имя переменной. Или первый параметр долж ен бы ть числом, указываю щ им,
сколько параметров для обработки, или последний парам етр долж ен быть специальным
маркером (таким как - 1 ) указания, что это - конечны й параметр. П оследовательность па­
раметров, типов и видов долж на бы ть совместим ой с вы зы ваем ой процедурой.
Если V A R Y IN G указана, опция С такж е долж на бы ть указана.
Глава 13 Д ирект ивы расш иренной компиляции 367

13.5. Директивы DECLARE и NODECLARE


Д иректива D ECLA RE генерирует предупреж дения для переменны х, которые исполь­
зовались, но не были объявлены (подобно утверж дению IM PLICIT NONE). Д иректива
N O DECLA RE (умолчание) отклю чает эти предупреж дения. Эти директивы имею т сле­
дую щ ий формат:
cDEC$ DECLARE
cDEC$ NODECLARE
где с - о д н о из выражений: С (или с), ! или * (см. разд. 13.1).
Д иректива D ECLA RE является, преж де всего, средством отладки, которое определяет
местонахож дение переменны х, которые не были долж ны м образом инициализированы ,
или были определены, но никогда не использовалось.

13.6. Директивы DEFINE и UNDEFINE


Д иректива D EFIN E создает сим волическую переменную , сущ ествование которой или
значение могут быть проверены во время условной компиляции. Д иректива U N D EFIN E
удаляет определяемы й символ. Эти директивы им ею т следую щ ий формат:
cDEC$ DEFINE name [=val\
cDEC$ UNDEFINE name
где с - одно из выражений: С (или с), ! или * (см. разд. 13.1); поте - имя переменной; val -
значение 1NTEGER(4), заданное пат е.
Правила использования
D EFIN E создает, a U N D EFIN E удаляет переменны е для использования с директивой
1F (или IF D EFIN ED ). Символы, определенны е директивой D EFIN E, являю тся локальны ­
ми ио отнош ению к директиве. О ни не могу г бы ть объявлены в програм ме Fortran.
П оскольку программы Fortran не м огут получить доступ к им енованны м переменным,
имена могут без конфликта дублировать клю чевы е слова Fortran, встроенны е функции
или определяемы е пользователем имена.
Чтобы проверить, был ли определен символ, используйте директиву IF D EFIN ED
(имя). Вы можете назначить целочисленное значение определяем ом у символу. Чтобы
проверить значение, назначенное пате, используйте директиву IF. П роверяем ое вы раж е­
ние 1F может содерж ать больш инство логических и ариф метических операторов.
П опытка отменить определение символа, который не был определен, создает преду­
преждение компилятора.
Д ирективы D EFIN E и U N D E FIN E м огут появиться в лю бом месте програм мы , разре­
шая и отключая определения символа.
Пример
!DEC$ DEFINE testflag
!DEC$ IF DEFINED (testflag)
WRITE (*,*) 'Компилирование первой строки'
!DEC$ ELSE
WRITE (*,*) 'Компилирование второй строки'
!DEC$ ENDIF
!DEC$ UNDEFINE testflag
368 С Д Алгазин, В В К о н д р а т ьев . П р о гр а и и р о ва н и е на Visual FORTRAN

13.7. Директива DISTRIBUTE POINT


Д иректива D ISTR IB U TE PO IN T указы вает распределение для цикла DO. Эта дирек­
тива им еет следую щ ий формат:
cDEC$ DISTRIBUTE POINT
где с - одно из выражений: С (или с), ! или * (см. разд. 13.1).
Правила использования
Распределение цикла заставляет больш ие циклы бы ть распределенны ми (разбитыми)
на меньш ие. П олучаю щ иеся циклы содерж ат подм нож ество команд из начального цикла.
Распределение цикла м ож ет разреш ить прим енение програм мной конвейерной обработки
к больш ем у количеству циклов. О но м ож ет такж е сократить давление на регистры
и улучш ить использование обоих кеш ей: инструкций и данных.
Если ди ректива будет пом ещ ена перед циклом, то компилятор реш ит, где выполнить
распределение, чтобы соблю дались зависим ости данны х.
Если директива пом ещ ена в цикле, распределение вы полняется после директивы
и лю бы е вносимые циклом зависим ости игнорирую тся. В настоящ ее время поддерж ивает­
ся только одна директива распределения - если директива помещ ается в цикле.
Пример
!DEC$ DISTRIBUTE POINT
do i =1, m
b(i) = a(i)+1

c(i) = a(i) + b (i)! Компилятор решит


! где распределять.
! Зависимости данных
! соблюдаются

d(i) = c(i) + 1
enddo
do i = 1 ,m
b(i) = a(i)+1

!DEC$ DISTRIBUTE POINT


call sub(a, n) ! Распределение начнется здесь, игнорирование все вносимые циклом зависимости
c(i) = a(i) + b(i)

d(i) = c(i) + 1
enddo

13.8. Директива FIXEDFORMLINESIZE


Д иректива FIX E D FO R M L IN ESIZE устанавливает длину строки для исходного текста
фиксированного формата. Д иректива имеет следую щ ий формат:
cDEC$ FIXEDFORMLINESIZE:{72 | 80 1132}
где с - одно из выражений: С (или с), ! или * (см. разд. 13.1).
Гпава 13. Директивы расширенной компиляции 369
Правила использования
Вы можете установить F1XEDFORML1NES1ZE в 72 (по ум олчанию ), 80 или 132 си м ­
вола. У становка F1XEDFORML1NES1ZE остается в силе до конца файла, или пока она не
сброш ена.
Д иректива F1XEDFORM LINES1ZE устанавливает длину строки исходного текста во
вклю ченных файлах, но не в м одулях USE, которы е собираю тся отдельно. Если файл для
вклю чения переустанавливает длину строки, изм енение не воздействует на файл хоста.
Эта директива не имеет никакого эф ф екта на исходны й текст свободного формата.
Пример
cD E C $ NOFREEFORM
c D E C $ F I X E D F O R M L IN E S I Z E :1 3 2
W R IT E (*,*) ' П р е д л о ж е н и е , в ы х о д я щ е е з а п р е д е л ы 7 2 - о ’го с т о л б ц а '

13.9. Директивы FREEFORM и NOFREEFORM


Д иректива FREEFO RM указывает, что исходный текст им еет свободны й формат. Д и ­
ректива N O FREEFO R M указывает, что исходны й текст им еет ф иксированны й формат.
Эти директивы имею т следую щ ий формат:
cD E C $ FR EEFO R M
cD E C $ NO FR EEFO R M

где с - одно из выражений: С (или с), ! или * (см. разд. 13.1).


Когда использую тся директивы FR EE FO R M или N O FR E E F O R M , они остаю тся в силе
до конца файла, или пока не используется противополож ная директива. К огда эти д и р ек ­
тивы действую т, они прим еняю тся такж е к вклю ченны м ф айлам, но не воздействую т на
модули USE, которые собираю тся отдельно.

13.10. Директива IDENT


Д иректива 1DENT указывает строку, которая идентиф ицирует объектны й модуль.
К ом пилятор помещ ает строку в идентиф ицирую щ ее поле объектного модуля, когда он
создает модуль для каждой исходной програм мной единицы . Д иректива 1DENT имеет
следую щ ий формат:
c D E C $ ID E N T string

где с - одно из выражений: С (или с), ! или * (см. разд. 13.1); string - сим вольная кон­
станта, содерж ащ ая пригодны е для печатания символы. Число сим волов ограничено
длиной исходной строки.
Э фф ективна только первая директива 1DENT; ком пилятор игнорирует лю бы е доп о л ­
нительные директивы 1DENT в програм мной единице или м одуле.

13.11. Директивы IF и IF DEFINED


Д ирективы IF и IF D EFIN ED указы ваю т конструкцию условной компиляции. 1F про­
веряет, является ли логическое вы раж ение .TRUE, или .FA LSE.. Д иректива IF D EFIN ED
проверяет, был ли определен символ.
Инициализированная директивой конструкция им еет формат:
c D E C $ IF (expr) [or c D E C $ IF D E F I N E D (name)]
block
[ c D E C $ E L S E IF (expr)
370 С. Д Алгазин, В В Кондратьев Програмирование на Visual FORTRAN

block], ..
[cD E C $ E L SE
block]
c D E C $ E N D IF

где с - одно из вы раж ений: С (или с), ! или * (см. разд. 13.1); ехрг - логическое вы раж е­
ние - .TRU E, или .FA LSE.; пате - имя сим вола, который будет проверен на определение.
block - вы полним ое утверж дение, которое компилируется (или нет) в зависимости от зна­
чения логических вы раж ений в конструкции директивы 1F.
Правила использования
К онструкции директив 1F и IF D EFIN ED заканчиваю тся директивой END1F и могут
содерж ать одну или более директив ELSE1F и самое больш ее одну директиву ELSE. Если
логическое условие внутри директивы вычисляется при компиляции как .TRUE., а все
п реды дущ ие условия в конструкции 1F вы числяю тся как .FA LSE., то компилирую тся ут­
верж дения, содерж ащ иеся в директивном блоке.
И мя пате мож ет бы ть определено директивой D EFIN E и дополнительно ему может
бы ть назначено целочисленное значение. Если символ был определен, с или без назна­
ченного значения, IF D E FIN ED (имя) вычисляется как .TRUE.; иначе оно вычисляется
как .FA LSE.
Если логическое условие в директиве 1F или IF D EFIN ED равно .TRUE., утверждения
внутри 1F или IF D E FIN ED блока компилирую тся. Если условие равно .FALSE., управле­
ние п ереходит к следую щ ей директиве ELSE1F или ELSE, если они есть.
Если логическое вы раж ение в директиве ELSEIF равно .TRUE., утверж дения внутри
блока ELSE1F - ком пилирую тся. Если вы раж ение равно .FA LSE., управление переходит
к следую щ ей директиве ELSE1F или ELSE, если они есть.
Если управление дости гает директивы ELSE, потому что все предш ествую щ ие логи­
ческие условия в конструкции 1F, вы числяется как .FALSE., утверж дения в блоке ELSE
ком пилирую тся безоговорочно.
Вы м ож ете использовать лю бой логический оператор или оператор отнош ения или
сим вол в логическом вы раж ении директивы , включая: .LT., <, .GT., >, .EQ., ==, .LE., <=,
.GE., >=, .NE., /=, .EQ V ., .N EQ V ., .NO T., .AND., .OR. и .XOR.. Л огическое выражение
м ож ет бы ть сколь угодно составны м , но вся директива долж на располагаться на одной
строке.
Пример
! К огда сл ед у ю щ и й к од к ом п и л и р ов ан и в ы п о л н ен ,
! вы в од за в и си т от того я в л я ет ся ли о д н о из п р о в ер я ем ы х
! в ы р а ж е н и й . Т Р и Е ., и л и в с е п р о в е р к и р а в н ы .F A L S E .
! D E C $ D E F I N E f la g = 3
! D E C $ IF ( fla g .L T . 2 )
W R IT E (*,*) " Э т о к о м п и л и р у е т с я е с л и f la g м е н ь ш е ч е м 2."
! D E C $ E L S E I F ( fla g > = 8 )
W R IT E (* ,* )" Э т о к о м п и л и р у е т с я е с л и f la g б о л ь ш е ч е м &
и л и р а в е н 8."
!D E C $ E L S E
W R IT E (*,*) "И ли э т о к о м п и л и р у е т с я е с л и в с е п р е д ш е с т в у ю щ и е &
у с л о в и я .F A L S E ."
!D E C $ E N D IF
Глава 13. Директивы расширенной компиляции 371

13.12. Директива INTEGER


Д иректива IN TEG ER указы вает вид целого числа по ум олчанию . Эта ди ректи ва им еет
следую щ ий формат:
c D E C $ I N T E G E R :{2 1 4 1 8 }

где с - одно из выражений: С (или с), ! или * (см. разд. 13.1).


Правила использования
Д иректива IN TEG ER указы вает разм ер 2 (K1ND=2), 4 (K1ND=4) или 8 (K1ND=8) бай ­
тов для целых чисел по умолчанию .
К огда действует директива IN TEG ER, все целые перем енны е им ею т вид, указанны й в
директиве. Эта директива действует только на числа, указанны е или подразум еваем ы е
как IN TEG ER без KIND.
Д иректива IN T EG E R м ож ет появиться только вначале програм м ной единицы . П ро­
граммная единица - это основная програм ма, внеш няя п одп рограм м а или функция, м о­
дуль или программная единица блока данны х. Д иректива не м ож ет появиться между п р о ­
граммны ми единицами, или в начале внутренних подпрограм м . О на не воздействует на
модули, вызываемые утверж дением USE в програм мной единице, которая их содерж ит.
Вид логического значения по ум олчанию - тот же, что и вид целого числа по у м олч а­
нию. Так, когда вы изменяете вид целого числа по ум олчанию , вы такж е изм еняете вид
логического значения по умолчанию .
Пример
IN T E G E R i ! 4 -б а й т о в о е ц е л о е чи сл о
W R I T E ( V ) K IN D (i)
C A LL I N T E G E R 2 ( )
W R I T E ( Y ) K IN D (i) ! в се е щ е 4 -б а й т о в о е ц е л о е ч и сл о не воздей ств ую т установки в п одп р огр ам м е
END
S U B R O U T IN E IN T E G E R 2 ()
!D E C $ IN T E G E R S
IN T E G E R j ! 2 -б а й т о в о е ц е л о е ч и сл о
W R IT E (*,*) K IN D (j)
E N D SU B R O U T IN E

13.13. Директива IVDEP


Д иректива IV D EP пом огает зависим ому от компилятора анализу итерационны х цик­
лов DO. Д иректива 1VDEP им еет следую щ ий формат:
c D E C $ IV D E P [: option ]

где с - одно из выражений: С (или с), ! или * (см. разд. 13.1). option является LO O P или
BACK. Этот параметр доступен только на процессорах 1А-32.
Правила использования
Д иректива 1VDEP является утверж дением для оптим изатора ком пилятора о порядке
ссылок к памяти в цикле DO.
1 V D E P :L 0 0 P подразум евает отсутствие вносимых циклом зависим остей.
1VDEP:BACK подразум евает отсутствие обратны х зависим остей.
Если option не указан, возникает одна из ситуаций:
■ На процессорах Intel Itanium поведение такое же, как при 1V D EP;BACK. Вы м ож ете
изменить поведение на 1V D E P :L 0 0 P , используя опцию ком пилятора.
372 С. Д. Алгазин, В. В. Кондратьев Програмирование на Visual FORTRAN

■ На процессорах Intel Е М 64Т и 1А-32, компилятор начинает анализ зависимостей,


предполагая, что все зависим ости возникаю т в том же самом направлении вперед, что
и их появление в норм альном скалярном порядке выполнения. Это контрастирует с
нормальным поведением компилятора, который выполняет анализ зависимостей без
начальных предполож ений о направлении зависимости.
cD EC$ 1VDEP без опции м ож ет быть такж е записан как cD EC$ 1N1T DEP FW D (1N1-
T ialize D EPendences ForW arD ).
Д иректива 1VDEP прим еняется к циклу DO, в котором пользователь знает, что зави­
симости находятся в лексическом порядке. Н априм ер, если две ссылки к памяти в цикле
касаю тся одного м естополож ения памяти и одно из них изменяет м естополож ение памя­
ти, то первая ссы лка, которая коснется м естополож ения, долж на быть лексически более
ранней в исходном тексте програм мы . Это предполагает, что правая сторона оператора
присваивания является "более ранней", чем левая сторона.
Д иректива 1VDEP сообщ ает компилятору, что програм ма вела бы себя правильно, ес­
ли бы утверж дения вы полнялись в некоторы х порядках, кроме последовательного поряд­
ка выполнения (наприм ер, вы полнение первого утверж дения или блока заверш ается для
всех итераций, затем следую щ ее утверж дение или блок для всех итераций и т. д.). О пти­
мизатор м ож ет использовать эту инф орм ацию наряду с тем, что он м ож ет сам доказать о
зависимостях, вы бирая другие порядки выполнения.
Пример
В следую щ ем прим ере директива 1VDEP обеспечивает подробную информацию о за­
висимостях внутри цикла, которы й м ож ет разреш ить сделать преобразования цикла:
! D E C $ IV D E P
D O 1=1, N
A (I N D A R R (I )) = A (I N D A R R (I )) + B (l)
END DO

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


■ О тыскать IN D A R R (l).
■ И спользовать результат из ш ага 1, чтобы оты скать A(INDARR(J)).
■ О тыскать В(1).
■ Сложить результаты из ш агов 2 и 3.
■ Запомнить результаты из ш ага 4 в местополож ение, обозначенное (1NDARR (1)) из
шага 1.
Д иректива 1VDEP п редписы вает компилятору первоначально предполож ить, что, ко­
гда шаги 1 и 5 получаю т доступ к общ ему м естополож ению памяти, ш аг 1 всегда получа­
ет доступ к м естополож ению первым, потому что ш аг 1 возникает ранее в последова­
тельности вы полнения. Э тот подход позволяет компилятору переупорядочивать коман­
ды, когда он вы бирает планирование инструкций, которое поддерж ивает относительный
порядок ссылок к м ассиву.

13.14. Директива LOOP COUNT


Д иректива LO OP C O U N T указы вает счетчик цикла для цикла DO; это помогает опти­
мизатору, Эта директива им еет формат:
cD E C $ LO O P C O U N T (n)

или
Глава 13. Директивы расширенной компиляции 373
cD E C $ LO O P C O U N T = п

где с - одно из выражений: С (или с ) , ! или * (см. разд. 13.1); п - целочисленная константа.
Правила использования
Значение счетчика цикла воздействует на эвристику, используем ую в програм мной
конвейерной обработке, векторизации и преобразованиях цикла.
Пример
cD E C $ L O O P C O U N T (1 0 0 0 0 )
d o i = 1 ,m
b (i) = a (i) + 1 ! Э т о , в е р о я т н о , р а з р е ш и т ц и к л у ,
! п о л у ч и т ь к он вей ер н ую п р о г р а м м н у ю о б р а б о т к у
enddo

13.15. Директива MEMREFCONTROL (только i64)


Д иректива M EM R EF C O N TR O L позволяет обеспечивать кеш подсказки для предвы -
борок, загрузок и сохранений. Эта директива доступна только на процессорах Intel
Itanium.
Д иректива имеет следую щ ий формат:
cD E C $ M EM R E F_C O N T R O L addressl [: locality [ : latency]] [, address2 . . .]

где с - одно из выражений: С (или с), ! или * (см. разд. 13.1).


a d d re ssl, address2 является ссы лкой к пам яти (необходим о указать минимум один a d ­
dress).
locality является необязательны м инициализированны м скалярны м целочисленны м
выражением со значением 1, 2, 3 или 4. Чтобы использовать этот параметр, вы долж ны
такж е указат ь address.
Этот параметр указы вает уровень кеш а, на котором эти данны е им ею т временное м е­
стоположение, т. е. где данны е долж ны бы ть сохранены для будущ их доступов. Это о п ­
ределяет подсказку загрузки/сохранения (или подсказку предвыборки), чтобы использо­
вать для этой ссылки. Значение м ож ет бы ть одним из следую щ их:
F O R K _L O C A L IT Y _L 1 = 1
F O R _ K _ L O C A L IT Y _ L 2 = 2
F O R _ K _ L O C A L IT Y _ L 3 = 3
F O R _ K _ L O C A L IT Y _ M E M = 4

latency является необязательны м инициализированны м скалярным целочисленны м


выражением со значением 1, 2, 3 или 4. Чтобы использовать этот параметр, вы долж ны
также указать address и locality.
Этот параметр определяет наиболее соответствую щ ее значение времени задержки, ко­
торое используется для загрузки (или время задержки, которое долж но быть перекры то,
если предвыборка выполнена для этого адреса). Значение м ож ет быть одним из следую ­
щих:
FO R _K _LA TEN C Y _L1 = 1
FO R _K _L A T E N C Y _L 2 = 2
FO R _K _LA TEN C Y _L3 = 3
FO R _K _LA TEN C Y _M E M = 4
374 С Д Алгазин, В В Кондратьев Программирование на Visual FORTRAN

13.16. Директива MESSAGE


Д иректива M ESSA G E указы вает строку сим волов, которая будет послана на устрой­
ство стандартного вывода во время первого прохода компилятора; это пом огает отладке.
Эта директива имеет следую щ ий формат:
cD E C $ M E S S A G E :sfm g

где с - одно из выражений: С (или с), ! или * (см. разд. 13.1); string - символьная кон­
станта, указы ваю щ ая сообщ ение.
Пример
!D E C $ M E S S A G E ^ С о с т а в л е н и е зв у к о в ы х у р а в н е н и й ск ор ости '

13.17. Директива OBJCOMMENT


Д иректива O B JC O M M E N T указы вает в объектном файле путь для поиска библиоте­
ки. Эта директива им еет следую щ ий формат:
c D E C $ O B J C O M M E N T LIB '.library

где с - одно из выражений: С (или с), ! или * (см. разд. 13.1); library - символьная кон­
станта, указы ваю щ ая имя и, при необходим ости, путь для библиотеки, которую должен
искать компоновщ ик.
Правила использования
К ом поновщ ик ищ ет библиотеку, назы ваем ую в соответствии с директивой
O B JC O M M EN T, как будто вы назвали ее на командной строке, т. е. перед поисками биб­
лиотеки по умолчанию . Вы можете пом естить многократны е директивы поиска библио­
теки в тот же самы й исходный файл. Каждая директива поиска появляется в объектном
файле в порядке, в котором появлялись в исходном файле.
Если ди ректи ва O B JC O M M E N T появляется внутри м одуля, лю бая программная еди­
ница, которая использует этот модуль, такж е содерж ит директиву, как если бы директива
O B JC O M M E N T появилась в исходном файле, использую щ ем этот модуль.
Если вы хотите иметь в м одуле директиву O B JC O M M E N T , но не хотите ее в про­
граммны х единицах, которые использует этот м одуль, пом естите директиву вне модуля.
Пример
! M O D 1 .F 9 0
M ODULE а
! D E C $ O B J C O M M E N T LIB: " o p e n g l3 2 .lib "
END M ODULE а
! M O D 2 .F 9 0
! D E C $ O B J C O M M E N T LIB: " g r a fto o ls.lib "
M ODULE b
!
END M ODULE b

! U S E R .F 9 0
PROGRAM go
USE a ! пои ск би б л и о т ек и , со д е р ж а в ш и й с я в M O D ULE а
! вк лю ч ается з д е с ь
USE b ! п о и с к б и б л и о т е к и , н е в к л ю ч а е т с я ( в н е Ь)
END
Глава 13 Директивы расширенной компиляции 375

13.18. Директива OPTIONS


Д иректива O PTIO N S воздействует на вы равнивание данны х и предупреж дения о вы ­
равнивании данных. О на имеет следую щ ий формат:
c D E C $ O P T IO N S option [option]

c D E C $ E N D O P T IO N S

где с - одно из выражений: С (или с), ! или * (см. разд. 13.1).


option мож ет быть одним (или двум я) из следую щ его:
/W A R N ={N 0]A L1G N M EN T управляет выводом предупреж дений ком пилятора для
данных, которые естественно не вы ровнены . По ум олчанию вы получаете сообщ ения
компилятора, когда он сталкивается с данны м и расположенными с нарушением границ
(/W A RN =A LIG N M EN T).
/[N O ]A L IG N [= р] управляет выравниванием полей в структурах записи и элем ентов
данных в общ их блоках. П оля и элем енты данны х м огут быть вы ровнены естественно (по
соображ ениям эффективности), или они могут бы ть упакованы вместе на границах про­
извольных байтов.
р - спецификатор с одним из следую щ их форматов:
[ c l a s s =] ru le
(c la s s = r u le ,. . . )
ALL
NONE

class - одно из следую щ их клю чевы х слов:


CO M M O N S: для общ их блоков;
RECORDS: для записей;
STRU CTU RES: синоним для REC O R D S.
rule - одно из следую щ их клю чевых слов:
PACKED упаковы вает поля в записях или элем ентах данны х в общ их блоках на гра­
ницах произвольных байтов.
N A TU RAL выравнивает поля в записях и элем ентах данны х в общ их блоках на гра­
ницу 64 бит (несовместим со стандартом Fortran 95/90). Это клю чевое слово заставляет
компилятор естественно вы равнивать все данны е в общ ем блоке, вклю чая 1NTEGER(8),
REAL(8) и все данные CO M PLEX .
STA N D A RD естественно вы равнивает элементы данны х в общ их блоках на границу
32 бит (совместим со стандартом Fortran 95/90). Это клю чевое слово прим еняется только
к общим блокам; так, вы можете указать /A L IG N ^C O M M O N S ^ STA N D A R D , но не м о­
жете указать /A L IG N =STA N D A R D .
ALL является тем же, что и определение O PTIO N S /A LIG N , O PTIO N S /A LIG N =
^N A T U R A L и O PTIO N S /A LIG N = (R E C O R D S=N A T U R A L , C O M M O N S= N A TU R A L).
N ONE является тем же, что и определение O PTIO N S /NOAL1GN, O PTIO N S
/A L IG N -P A C K E D и O PTIO N S /A LIG N - (R E C O R D S=PA C K E D , C O M M O N S=PA C K E D ).
Правила использования
Д ирективы O PTIO N S (и сопровож даю щ ая EN D O PT IO N S) долж ны находиться после
утверждений O PTIO NS, SU B R O U TIN E , FU N CTIO N и B LO C K D A TA (если они есть)
в программной единице и перед вы полним ой частью програм м ной единицы.
376 С Д А /г а sun. В. В Кондратьев Програмирование на Visual FORTRAN

Д иректива O PTIO N S заменяет опцию ком пилятора, которая устанавливает выравни­


вание.
Д ля работы Intel Fortran вы равнивает локальны е элементы данных на естественных
границах. О днако утверж дения E Q U IV A LE N C E, CO M M O N , REC O R D и объявления
данны х STR U C TU R E могут вызывать создание не вы ровненны х данных. Если будет ука­
зан /W A R N =N O A L IG N M E N T , то предупреж дения не будут выданы, если компилятор
будет сталкиваться с невы ровненны ми данны м и.
Примечание. Расположенные с нарушением границ данные значительно увеличивают время,
которое требуется, чтобы выполнить программу. Число расположенных с нарушением границ полей
увеличивается, так что увеличивается и время выполнения программы. Определение /ALIGN (или оп­
ции компилятора, которая устанавливает выравнивание) минимизирует данные, расположенные с
нарушением границ.
Если вы хотите иметь вы ровненны е данны е в общ их блоках, сделайте следующ ее:
Укажите /A LlG N =CO M M O NS=STA N D ARD для элементов данных до 32 битов длиной.
У каж ите /A L lG N =C O M M O N S = N A T U R A L для элем ентов данны х до 64 битов длиной.
П оместите объявления исходны х данны х внутри общ его блока в порядке убываю щ его
размера, так чтобы каждый элем ент данны х естественно был выровнен.
Если вы хотите упаковать не вы ровненны е данны е в структуре записи, сделайте сле­
дую щ ее:
- У каж ите /A L lG N =R E C O R D S =P A C K E D .
■ П ом естите объявления исходных данны х в структуре записи, так чтобы данные есте­
ственно были выровнены.
Д иректива O PTIO N S долж на сопровож даться соответствую щ ей директивой END
O PT IO N S; директивы могут' быть влож енны м и до 100 уровней. Н апример:
C D E C $ O P T IO N S /A L I G N = P A C K E D ! Н а ч а л о Группы А
О бъявлен ия
C D E C $ O P T IO N S /A L I G N = R E C O = N A T U ! Н а ч а л о в л о ж е н н о й Группы В
бол ьш е объявлений
C D EC $ END O P T IO N S ! К о н ец Группы В
в се ещ е бол ь ш е объ явлен и й
C D EC $ END O P T IO N S ! К о н ец Группы А

С пециф икация O PTIO N S для Группы В только прим еняется к RECORD S. О бщ ие


блоки внутри Группы В будут PA C K ED , потом у что C O M M O N S сохраняет предш ест­
вую щ ую установку (в этом случае из специф икации Группы А).

13.19. Директива PACK


Д иректива PA C K указы вает начальны е адреса памяти элем ентов производного типа.
Эта директива им еет следую щ ий формат:
c D E C $ Р А С К [: [ { 1 1 2 1 4 1 8}] ]

где с - о д н о из выражений: С (или с), ! или * (см. разд. 13.1).


Правила использования
Элементы производных типов и структур записи выравниваются в памяти на меньшем
из двух размеров: разм ере типа элем ента или текущ ей установки выравнивания. Текущая
установка вы равнивания мож ет бы ть 1, 2, 4 или 8 байт. Н ачальная установка по умолча­
нию равна 8 байт (если опция компилятора не указы вает иначе). Сокращ ая установку вы­
равнивания, вы можете упаковать переменны е ближ е друг к другу в памяти.
Глава 13 Директивы расширенной компиляции 377
Д иректива PACK позволяет управлять упаковкой производного типа или элем ентов
структуры записи в ваш ей программе, отм еняя текущ ую установку вы равнивания пам я­
ти. Н апример, если указано Р А С К :1, все перем енны е начинаю тся в следую щ ем доступ­
ном байте, четном или нечетном. Х отя это немного увеличивает время доступа, никакое
пространство памяти не потрачено впустую . Если указано РА С К :4, IN T E G E R (l),
L O G IC A L (l) и все символьные переменные начинаю тся в следую щ ем доступном байте,
четном или нечетном. INTEG ER(2) и L 0G 1C A L (2) начинает на следую щ ем четном байте;
все другие переменные начинаю тся на 4-байтовы х границах.
Если директива PA C K указана без числа, упаковка возвращ ается к установке опции
компилятора (если они есть) или к настройке по ум олчанию - 8.
Д иректива может появиться где-нибудь в програм ме перед определением производ­
ного типа или определением структуры записи. О на не м ож ет появиться внутри опреде­
ления структуры записи или производном типе.
Пример
! И сп о л ь зу й т е 4 -б а й т о в у ю упаковку д л я эт о го п р о и зв о д н о г о ти п а
! З а м е т ь т е P A C K и с п о л ь з у е т с я в н е о п р е д е л е н и я п р о и зв о д н о г о ти п а
Ю Е С $ Р А С К :4
T Y P E p a ir
I N T E G E R a, b E N D T Y P E
! в о зв р а т к оп ц и и ком п ил ятора или у м о л ч а н и ю
!D E C $ P A C K

13.20. Директивы PARALLEL и NOPARALLEL


Д иректива PA R A LLEL разреш ает автом атическое расп араллеливание для непосредст­
венно следующего цикла типа DO. Д иректива N O PA R A L L E L (по ум олчанию ) отклю чает
это автоматическое распараллеливание.
Эти директивы имеют следую щ ий формат:
cD E C $ PARALLEL
cD E C $ NOPARALLEL

где с - одно из выражений: С (или с), ! или * (см. разд. 13.1).


Правила использования
Д иректива PA R A LLEL инструктирует компилятор игнорировать зависим ости, кото­
рые, как он предполагает, м огут сущ ествовать и которые предотвратили бы правильное
распараллеливание в непосредственно следую щ ем цикле. О днако если зависим ости до ка­
заны, они не игнорирую тся.
Пример
p r o g r a m m a in
p a r a m ete r (n = 1 0 0 )
i n t e g e r x ( n ) ,a ( n )
!D E C $ N O P A R A L L E L
do
i = 1 , n x ( i) = i
enddo
!D E C $ P A R A LLE L
d o i= 1 ,n
a( x (i)) = i en d d o en d
378 С Д Алгазин, В В. Кондратьев Програмирование на Visual FORTRAN

13.21. Директивы PREFETCH и NOPREFETCH


Д иректива PR E FE T C H разреш ает иредвы борку данны х из памяти. П редвы борка дан ­
ных может м иним изировать эф ф екты ож идания памяти. Д иректива N O PREFETCH (по
ум олчанию ) отклю чает предвы борку данных. Эти директивы воздействую т на эвристику,
используем ую в компиляторе.
Д ирективы им ею т следую щ ий формат:
cD E C $ PR EFE TC H [va ri [: hinti [: distancel]] [, var2 [: hint2 [: distance2]]]. . .]
cD E C $ N O PR E FE T C H [va ri [, va r2]. . .]

где с - одно из вы раж ений: С (или с), ! или * (см. разд. 13.1); vor - необязательная ссылка
памяти.
hint является необязательны м инициализированны м скалярным целочисленным вы ­
раж ением со значением 0, 1, 2 или 3. Они имею т гот же самый смысл, что и значения для
hint во встроенной подпрограм м е M M PREFETCH . Чтобы использовать этот параметр,
вы долж ны такж е указать var.
distance является необязательны м инициализированны м скалярным целочисленным
вы раж ением со значением , больш е чем 0. Он указывает число итераций цикла, которые
надо выполнить перед иредвы боркой. Чтобы использовать этот параметр, вы долж ны
такж е указать var и hint.
Правила использования
Чтобы использовать эти директивы , долж на быть задана опция компилятора /0 3 .
Эта директива воздействует на цикл DO, которому она предш ествует.
Если вы укаж ете PR E FE T C H без параметров, то все массивы, к которым получаю т
доступ в цикле DO, будут вы бираться с упреж дением.
Если цикл вклю чает вы раж ение A(j), помещ ая cD EC$ PREFETCH перед циклом, вы
инструктируете ком пилятор вставлять предвыборкн для A(j + d) внутри цикла. Значение
d определяется самим ком пилятором .
Примеры
cD E C $ N O PR E FE T C H с
cD E C $ PR EFE TC H а
d o i = 1, m
b(¡) = a(c(¡)) + 1
enddo

С ледую щ ий прим ер допустим на процессорах Itanium:


sum = O.dO
d o j= 1 J a s tr o w -f ir s t r o w + 1
i = ro w str (j)
¡ r e s id u e = m o d ( r o w s t r (j + 1 ) - i, 8 )
s u m = O.dO
C D E C $ N O P R E F E T C H a ,p ,c o l ¡ d x
d o k = i,i+ ir e s id u e - 1
s u m = s u m + a ( k )* p (c o lid x ( k ) )
enddo
C D E C $ N O P R E F E T C H c o lid x
C D E C $ P R E F E T C H a :1 :4 0
C D E C $ P R E F E T C H p :1 :2 0
d o k = i+ ir e s id u e , r o w s t r ( j + 1 ) - 8 , 8
s u m = s u m + a ( k ) * p ( c o l id x ( k ))
Глава 13 Директивы расширенной комтпяции 379
& + a ( k + 1 ) * p ( c o l¡ d x ( k + 1 )) + a ( k + 2 ) * p ( c o lid x ( k + 2 ))
& + a ( k + 3 ) * p ( c o l¡ d x ( k + 3 )) + a ( k + 4 ) * p ( c o l¡ d x ( k + 4 ))
& + a ( k + 5 ) * p ( c o l¡ d x ( k + 5 )) + a ( k + 6 ) * p ( c o l¡ d x ( k + 6 ))
& + a ( k + 7 ) * p ( c o lid x ( k + 7 ))
enddo

q(j) = sum
enddo

13.22. Директива PSECT


Д иректива PSECT изм еняет некоторы е характеристики общ его блока. О на им еет сл е­
дую щ ий формат:
cDEC$ PSECT Icommon-namel a [, a ] ..
где с - одно из выраж ений: С (или с), ! или * (см. разд. 13.1); сот топ-пате - имя общ его
блока [слеши (/) требую тся];
а является одним из следую щ их клю чевых слов:
ALIGN=v¿7/ или A L \G N = kevw ord указы ваю т вы равнивание для общ его блока. A LIG N
имеет эффект, только когда оно указано на системах W indow s* и Linux*.
val является константой в пределах от 0 до 6 на системах W indow s и от 0 до 4 на си с­
темах Linux. У казанное число интерпретируется как степень 2. Значение вы раж ения яв­
ляется выравниванием в байтах.
k e y w o rd - одно из следую щ его:
K eyw ord Эквивалентное val
BYTE О
W ORD
LONG 2
Q U AD 3
О СТА 4
PA G E 1 i32: 12
i64: 13
1 Диапазон - от 0 до 13 за исключением 1*Х32 и М*Х32, где диапазон - от 0 до 12.

[ Н 0 ^ 1 1 Т определяет, м ож ет ли содерж имое общ его блока бы ть изм енено во время


выполнения программы.
Правила использования
Глобальная или локальная область действия является значащ ей для образа, который
занимает больш е одного кластера. Если действует локальная область действия, про­
граммные секции с одинаковы м и именами, которые появляю тся в различны х модулях
других кластеров, пом ещ аю тся в отдельны е кластеры. О ни разм ещ ены в то т же самый
кластер, если действует глобальная область действия.
Если одна программная единица изм еняет одну или более характеристик общ его бл о ­
ка, все другие модули, которы е ссылаю тся на этот общ ий блок, долж ны такж е изм енить
эти характеристики таким же самым образом.
П рименяю тся характеристики по ум олчанию , если вы не изм еняете их директивой
Р8ЕСТ. В табл. 13.3 перечислены характеристики по ум олчанию общ их блоков и как они
могут быть изменены Р8ЕС Т.
380 С. Д Алгазин, В В. К о н д р а т ьев . Программирование на Visual FORTRAN

Таблица 13.3. Значения по умолчанию общего блока и модификации PSECT


Характеристики по умолчанию Модификация РЭЕСТ
Перемещаемый Нет
С оверлеем Нет
Глобальная область действия Глобальная или локальная область действия
Не выполнимый Нет
Не многоязычный Многоязычный или немногоязычный
Перезаписываемый Перезаписываемый или неперезаписываемый
Читаемый Нет
Без защиты Нет
\Л/*32, \Л/*64: от 0 до 6 2
Выравнивание на границу восьми слов1
М*Х32: от 0 до 4 2
На ¡64:
Не разделяемый Разделяемый или неразделяемый
Зависимая позиция Нет
На ¡32:
Разделяемый Разделяемый или неразделяемый
Независимая позиция Нет
1 Адрес, который является кратным числу 16.
2 Или ключевые слова от BYTE до ОСТА

13.23. Директива REAL


Д иректива REA L указы вает вид действительного числа по умолчанию . Эта директива
имеет следую щ ий формат:
cDEC$ REAL:{4 | 8 116}
где с - одно из вы раж ений: С (или с), ! или * (см. разд. 13.1).
Правила использования
Д иректива REA L указы вает разм ер 4 (K IN D =4), 8 (K1ND=8) или 16 (K1ND=16) байтов
для чисел действительного типа по ум олчанию .
Когда действует директива REA L, все переменны е действительного типа по ум олча­
нию им ею т вид, указанны й в директиве. Д иректива воздействует только на числа, ука­
занные или подразум еваем ы е как REA L без KIND.
Д иректива REA L м ож ет появиться только в начале программной единицы. П ро­
граммная единица - это основная програм ма, внеш няя подпрограмма или функция, мо­
дуль или програм мная единица блока данных. Д иректива не может появиться между про­
граммны ми единицам и или в начале внутренних подпрограмм. Она не воздействует на
модули, вы зы ваем ы е утверж дением USE в програм мной единице, которая ее содержит.
Пример
REAL г ! 4-байтовое REAL
W R ITE (V ) KIND(r)
CALL REAL8()
W R ITE (V ) KIND(r) ! все еще 4-байтовое REAL
! не воздействует на установки в подпрограмме
END
SUBROUTINE R EA L8()
!DEC$ REAL:8
REAL s ! 8-байтовое REAL
W R ITE (V ) KIND(s)
END SUBROUTINE
F iona 13. Д ирект ивы расш иренной к ои т п яц и и 381

13.24. Директивы STRICT и NOSTRICT


Д иректива STRICT отклю чает язы ковы е возм ож ности, не найденны е в язы ковом
стандарте, указанном в командной строке (Fortran 95 или Fortran 90). Д иректива
NO STRICT (по ум олчанию ) разреш ает эти язы ковы е возможности.
Эти директивы им ею т следую щ ий формат:
cDEC$ STRICT
cDEC$ NOSTRICT
где с - о д н о из выражений: С (или с), ! или * (см. разд. 13.1).
П равш а исполь зова пня
Если указана STR IC T и язы ковой стандарт не указан в командной строке, п риним ае­
мое по ум олчанию значение долж но отклю чить возмож ности, не найденны е в Fortran 90.
Д ирективы STR IC T и N O STR IC T м огут появиться только в начале програм много м о­
дуля. П рограммная единица - это основная програм ма, внеш няя подпрограмм а или
функция, модуль или программная единица блока данных. Д ирективы не могут появи ть­
ся между программны ми единицам и или в начале внутренних подпрограмм. О ни не во з­
действую т ни на какие модули, вы зы ваем ы е утверж дением USE в программной единице,
которая их содержит.
Пример
! NOSTRICT by default
TYPE stuff
INTEGER(4)k
INTEGER(4)m
CHARACTER^) name
END TYPE stuff
TYPE (stuff) examp
DOUBLE COMPLEX cd ! нестандартный тип данных, нет ошибки
cd = (3.0D0,4.0D0)
examp.k = 4 ! нестандартное обозначение компонента, нет ошибки
END
SUBROUTINE STRICTDEM O ()
!DEC$ STRICT
TYPE stuff
INTEGER(4) k
INTEGER(4) m
CHARACTER^) name
END TYPE stuff
TYPE (stuff) samp
DOUBLE COMPLEX cd ! ОШИБКА
cd = (3.0D0,4.0D0)
samp.k = 4 ! ОШИБКА
END SUBROUTINE

13.25. Директивы SWP и NOSWP (только i64)


Д иректива SW P разреш ает програм мную конвейерную обработку для цикла DO. Д и ­
ректива N O SW P (по ум олчанию ) отклю чает эту програм мную конвейерную обработку.
Эти директивы только доступны на процессорах Intel Itanium.
382 С Д Алгазин, В В К ондрат ьев П рогралш рованис на Visual FO RTRAN

Д ирективы им ею т следую щ ий формат:


cDEC$ SWP
cDEC$ NOSWP
где с - одно из выраж ений: С (или с), ! или * (см. разд. 13.1).
Правила использования
Д иректива SW P не пом огает выявлять зависимости данных, но отм еняет эвристику,
основанную на счетчиках конф игурации или непрямом потоке управления.
П рограммная оптим изация конвейерной обработки, указанная в соответствии с ди ­
рективой SW P, прим еняет планирование инструкций для некоторы х самых внутренних
циклов, допуская разбиение команд внутри цикла на разные стадии.
О на допускает увеличение уровня параллелизм а инструкций, который может сокра­
тить воздействие операций долгой задержки, создавая более бы строе вы полнение цикла.
Циклы, вы бранны е для програм мной конвейерной обработки, - всегда самые внут­
ренние циклы, содерж ащ ие вызовы процедур, которые являю тся встроенны ми. П осколь­
ку оптимизатор больш е не рассм атривает полностью развернуты е циклы, как самые
внутренние циклы, разверты вание циклов м ож ет привести к дополнительном у циклу, ко­
торы й становиться самым внутренним циклом.
Вы м ожете запросить и просм отреть отчет об оптим изации, чтобы увидеть, была ли
применена програм мная конвейерная обработка.
Пример
!DEC$ SWP
do i = 1, m
if (a(i) .eq. 0) then
b(i) = a(i) + 1

6lS6b(i) = a(i)/c(i)
endif
enddo

13.26. Директивы UNROLL и NOUNROLL


Д иректива U N RO LL говорит оптим изатору компилятора сколько раз разворачивать
цикл DO. Д иректива N O U N R O LL (по ум олчанию ) отклю чает разворачивание цикла DO.
Эти директивы могут только бы ть применены к итерационным циклам DO.
Д ирективы им ею т следую щ ий формат:
cDEC$ UNROLL [(п)] -и л и - cDEC$ UNROLL [= п]
cDEC$ NOUNROLL
где с - одно из выраж ений: С (или с), ! или * (см. разд. 13.1); п - целочисленная констан­
та, диапазон которой от 0 до 255.
Правила использования
Если п указан, оптимизатор разворачивает цикл п раз. Если п опущен или если он нахо­
дится вне допустимого диапазона, оптимизатор сам выбирает сколько раз развертывать цикл.
Директива U N R O LL отм еняет лю бую установку разверты вания цикла, заданную
в командной строке.
Чтобы использовать эти директивы , долж на быть задана опция компилятора /0 3 .
Г ю с а 13 Д ирект ивы расш иренной колти тции 383

13.27. Директивы VECTOR ALIGNED


и VECTOR UNALIGNED (i32, i32em)
Д иректива V ECTO R A LIG N ED указы вает, что все данны е в цикле DO вы равниваю т­
ся. Д иректива V ECTO R UN A LIG N ED указы вает, что данны е в цикле не выравниваю тся.
Эти директивы только доступны на процессорах IA-32 и Intel ЕМ 64Т.
Д ирективы имеют следую щ ий формат:
cDEC$ VECTOR ALIGNED
cDEC$ VECTOR UNALIGNED
где с - одно из выражений: С (или с), ! или * (см. разд. 13.1).
Правила использования
Эти директивы от меняю т эвристику эф ф ективности в оптим изаторе. С пецификаторы
UNAL1GNED и A LIG N ED инструктирую т компилятор использовать, соответственно, не­
выровненные и выровненные команды перемещ ения данны х для всех ссы лок к массивам.
Это отклю чает всю расш иренную оптим изацию вы равнивания компилятора, типа оп ре­
деления свойств выравнивания из контекста програм мы или использования динам иче­
ского очищ ения цикла, чтобы сделать ссылки вы ровненны м и.
Предостережение. Директивы VECTOR ALIGNED и VECTOR UNALIGNED должны использо­
ваться с осторожностью. Отмена эвристики эффективности компилятора должна быть сделана
только, если вы абсолютно уверены, что векторизация улучшит работу. Кроме этого, инструктиро­
вание компилятора осуществлять все ссылки к массиву выровненными инструкциями перемеще­
ния данных явится причиной исключения во время выполнения, если некоторые из образцов
доступа окажутся фактически невыровненными.

13.28. Директивы VECTOR ALWAYS


и NOVECTOR (i32, i32em)
Д иректива V ECTO R A LW A Y S разреш ает векторизацию цикла DO. Д иректива
N O V EC TO R отклю чает эту векторизацию . Эти директивы только доступны на процессо­
рах 1А-32 и Intel ЕМ 64Т.
Д ирективы имею т следую щ ий формат:
cDEC$ VECTOR ALWAYS
cDEC$ NOVECTOR
где с - одно из выражений: С (или с), ! или * (см. разд. 13.1).
Правила использования
Д ирективы V ECTO R A LW A Y S и N O V E C TO R отм еняю т поведение компилятора по
умолчанию. Д иректива V ECTO R A L W A Y S такж е отм еняет эвристику эффективности
блока векторных операций, но она работает только если, цикл м ож ет фактически быть
векторизуем. Вы долж ны использовать "Д ирективу 1VDEP", чтобы игнорировать пред­
положенные зависимости.
Предостережение. Д иректива V E C T O R A L W A Y S долж на использоваться с осто­
рожностью. О тмена эвристики эф ф ективности компилятора долж на бы ть сделана только,
если вы абсолютно уверены, что векторизация улучшит работу.
384 С И A ira ши, В В К ондрат ьев, llp o r p a мироиапие на Visita! FO RTRAN

Примеры
Ком пилятор обы чно не делает векторизации циклов DO, которые им ею т больш ое ко­
личество неединичных ссы лок большого шага (по сравнению с числом единичны х ссылок
большог о шага).
В следую щ ем прим ере векторизация бы ла бы по ум олчанию заблокирована, но ди ­
ректива отм еняет это поведение:
!DEC$ VECTOR ALWAYS
do ¡ = 1 ,1 0 0 ,2
! две ссылки с большим шагом 2 следуют
a(i) = b(i)
enddo
М огут бы ть случаи, где вы хотите явно аннулировать векторизации цикла; например,
если векторизация привела бы к регрессу работы, а не к улучш ению . В этих случаях вы
м ож ете использовать директиву N O V EC TO R , чтобы отклю чить векторизацию цикла.
В следую щ ем примере векторизация бы ла бы вы полнена по умолчанию , но директива
отм еняет это поведение:
!DEC$ NOVECTOR
do ¡ = 1,100
a(i) = b(i) + c(i)
enddo

13.29. Директива VECTOR NONTEMPORAL (i32, i32em)


Д иректива V ECTO R N O N T EM PO R A L разреш ает потоковую намять. Эта директива
доступна только на процессорах IA-32 и Intel ЕМ 64Т. О на имеет следую щ ий формат:
cDEC$ VECTOR NONTEMPORAL
где с - одно из выраж ений: С (или с), ! или * (см. разд. 13.1).
П отоковая пам ять м ож ет явиться причиной значи тельн ою улучш ения работы, по
сравнению с непотоковой памятью , для больш ого количества процессоров 1А-32.

13.30. Директивы компилятора Fortran ОрепМР*


Intel Fortran обеспечивает директивы ком пилятора Fortran О репМ Р*, которые выпол­
няю тся со специф икацией И нтерф ейса прикладной програм мы (API) Fortran ОрепМ Р
версии 1 .1, а лучш е версии 2.0.
Чтобы использовать эти директивы , вы долж ны указать опцию компилятора, которая
разреш ает эти директивы .
Директивы распараллеливания О репМ Р м огут бы ть ар у п п и р о в а н ы в категории, кото­
ры е показаны в табл. 13.4.

Таблица ¡3.4. Категории директив распараллеливания Fortran ОрепМР


Категория Описание
Параллельная область Определяет параллельную область: PARALLEL
Разделение работы Разделяет выполнение вложенного блока кода среди членов группы, которые
сталкиваются с ним: DO, SECTIONS и WORKSHARE
Комбинированное парал­ Сокращение для обозначения параллельной области, которая содержит только
лельное разделение работы одну конструкцию распределенных рабочих заданий: PARALLEL DO, PARALLEL
SECTIONS и PARALLEL WORKSHARE
Глава /3 Д ирект ивы расш иренной компиляции 385
Категория Описание
Синхронизация Обеспечивает различные аспекты синхронизации; например доступ к блоку
кода или порядок выполнения утверждений внутри блока кода: ATOMIC,
BARRIER, CRITICAL, FLUSH, MASTER и ORDERED
Среда данных Управляет средой данных во время выполнения параллельных конструкций:
THREADPRIVATE
О братите внимание, что некоторы е общ ие директивы и правила м огут воздействовать
на циклы ОО (см. разд. 13.1).
П рим еры
Следую щ ие примеры эквивалентны:
!$ОМР PARALLEL DO &
!$ОМР SHARED(A,B,C)
!$ОМР PARALLEL &
!$ОМР DO SHARED(A.B.C)
!$ОМР PARALLEL DO SHARED(A,B,C)

13.31. Операторы атрибута области действия данных


Н екоторые из директив Fortran О репМ Р имею т операторы (или опции), которые вы
можете указать, чтобы управлять атрибутам и области действия перем енны х для продле­
ния директив.

Оператор COPYIN
О ператор CO PY IN указы вает, чтобы данны е главного потока группы копирую тся
в личные копии общ его блока потока в начале параллельной области. Он им еет следую ­
щий формат:
COPYIN (list)
где list - имя одной или более переменны х или общ их блоков, которы е являю тся доступ ­
ными для блока области действия. П одобъекты не м огут бы ть указаны. Каждое имя
долж но бы ть отделено запятой, а имя поим енованного общ его блока долж но появляться
между слеш ами ( / / ) .
О ператор COPY1N прим еняется только к общ им блокам, объявленны м как
THREADPR1VATE.
Вы не обязаны указы вать весь общ ий блок T H R E A D PR IV A T E целиком, вы можете
указать именованные перем енны е внутри о б щ е ю блока.

Оператор COPYPRIVATE
Оператор C O PY PR IV A TE использует личную переменную , чтобы передать значение,
или указатель на разделяем ы й объект, o i одного члена группы другим членам. О ператор
CO PY PRIV A TE м ож ет только появиться в директиве EN D SIN G LE. Он им еет следую ­
щий формат:
COPYPRIVATE (list)
где list - имя одной или более переменны х или общ их блоков, которые являю тся доступ ­
ными для блока области действия. П одобъекты не м огут бы ть указаны . Каждое имя
долж но быть отделено запятой, а имя именованного общ его блока долж но появляться
между слешами ( / / ) .
386 С Д. A 'h'aniH. В В К ондрат ьев Программирование на Visitai FORTRAN

П ерем енны е в списке не долж ны появиться в операторе PRIV A TE или


F IR ST PR IV A T E для конструкции директивы SINGLE.
Если с директивой сталкиваются в динамическом пространстве параллельной области,
перем енны е в списке долж ны бы ть личны ми в контексте включения.
Если указан общ ий блок, он долж ен быть объявлен как THREADPR1VATE; эффект -
тот же самы й, как будто имена переменной в его списке объектов общ его блока были
указаны.
Э ф ф ект оператора C O P Y P R IV A T E на переменные в его списке возникает после вы­
полнения кода, заклю ченного внутри конструкции SINGLE, и прежде, чем лю бой поток в
группе, оставили барьер в конце конструкции.

Оператор DEFA UL Т
О ператор D E FA U LT позволяет указы вать область действия для всех переменных в
лексическом пространстве параллельной области. Он имеет следую щ ий формат:
Í PR IV A TE ]
D EFA U LT( SH A RED О
NONE
С пециф икации способны на следую щ ие действия:
PR IV A T E делает все им енованны е объекты в лексическом пространстве параллель­
ной области, вклю чая перем енны е общ его блока, но исклю чая переменные TH REA D-
PRIV A TE, личны м и для потока, как будто вы явно перечислили каждую переменную в
операторе PRIV A TE.
SH A R E D делает все им енованны е объекты в лексическом пространстве параллельной
области разделяем ы м и среди потоков в группе, как будто вы явно перечислили каждую
перем енную в операторе SH A RED . Если вы не указы ваете оператор DEFAULT, применя­
ется значение по ум олчанию .
N O N E указы вает, что нет никакого неявного умолчания относительно того, являются
ли перем енны е типа PR IV A T E или SH A RED . В этом случае вы долж ны указать свойство
PR IV A T E , SH A R E D , F1RSTPR1VATE, LA STPRIV A TE или RED U CTIO N для каждой пе­
рем енной, которую вы используете в лексическом пространстве параллельной области.
Вы м ож ете указать только один оператор D EFA U LT в директиве PA RALLEL. Вы мо­
жете исклю чить перем енны е из определенного по умолчанию , используя операторы
PR IV A T E , SH A R ED , FIR ST PR IV A T E, LA STPRIV A TE или RED U CTIO N .
Н а перем енны е в общ их блоках T H R E Â D PR IV A T E этот оператор не воздействует.

Оператор FIRSTPRIVATE
О ператор FIR ST PR IV A T E обеспечивает надм нож ество функциональны х возможно­
стей, обеспечиваем ы х оператором PR IV A T E (см. "О ператор PRIVA TE"); объекты явля­
ются объявленны м и PR IV A T E и они инициализирую тся некоторы ми значениями. Он
им еет следую щ ий формат:
FIRSTPRIVATE (list)

где list —имя одной или более переменны х или общ их блоков, которые являю тся доступ­
ными для блока области действия. П одобъекты не м огут быть указаны. Каждое имя
долж но бы ть отделено запятой, а имя им енованного о б щ ею блока долж но появляться
между слеш ам и ( / / ) .
Глава 13 Директивы расширенной компиляции 387
Переменные, которые появляю тся в списке FIR ST PR IV A T E , подчиняю тся сем антике
оператора PRIVATE. Кроме того, личны е (локальны е) копии каж дой переменной в д р у ­
гих потоках инициализируется значением , которое переменная имела перед началом п а­
раллельной области.

Оператор LASTPRIVATE
О ператор LA ST PR IV A T E обеспечивает надм нож ество ф ункциональны х возм ож н о­
стей, обеспечиваемых оператором PRIV A TE (см. "О ператор PR IV A T E "); объекты явл я­
ются объявленными PR IV A T E и им приписы ваю т некоторы е значения, когда вы ходят из
параллельной области. Он имеет такой формат:
LASTPRIVATE (list)
где list - имя одной или более переменных или общ их блоков, которы е являю тся д о сту п ­
ными для блока области действия. П одобъекты не м огут бы ть указаны . Каж дое имя
долж но бы ть отделено запятой, а имя им енованного общ его блока долж но появляться
между слеш ами ( / / ) .
П еременные, которые появляю тся в списке L A ST PR IV A T E , подчинены сем антике
оператора PRIVATE. Кроме того, как только они вы ходят из параллельной области, каж ­
дой переменной обеспечивается значение последовательно последним разделом или и те­
рацией цикла.
Когда оператор LA STPRIV A TE появляется в директиве DO, поток, которы й вы полня­
ет последовательно последню ю итерацию , обновляет версию объекта, которую он имел
перед конструкцией. Когда оператор LA STPR IV A T E появляется в ди рективе SEC T IO N S,
поток, который вы полняет лексически последний SEC TIO N , обн овляет версию объекта,
которую он имел перед конструкцией.
Подобъекты, которым не назначены значение последней итерацией DO или лекси ч е­
ски последним SECTION директивы SEC TIO N S, становятся неопределенны м и после
конструкции.

Оператор PRIVA ТЕ
О ператор PRIV A TE объявляет, что указанны е переменны е личны е для каж дого пото­
ка в группе. Он имеет такой формат:
PRIVATE (list)
где list - имя одной одной или более переменных или общ их блоков, которы е являю тся
доступными для блока области действия. П одобъекты не м огут бы ть указаны . Каждое
имя долж но быть отделено запятой, а имя именованног о общ его блока долж но п оявлять­
ся между слеш ами ( / / ) .
Правила использования
Следую щ ие ситуации возникает, когда переменные объявлены в операторе PRIV A TE:
Новый объект того же самого типа объявляется однажды для каждого потока в группе.
Новый объект больше не является памятью, ассоциированной с оригинальным объектом.
Все ссылки на оригинальны й объект в лексическом пространстве конструкции дирек­
тивы заменяю тся ссылками на личны й объект.
П еременные, определенны е как PR IV A TE, становятся неопределенны м и для каж дого
потока при входе в конструкцию , а соответствующая разделяем ая переменная становится
неопределенной на выходе из параллельной конструкции.
388 С Д А и'атн, В В Кондратьев. Програмирооание на Visual FORTRAN

Содерж имое, состояния распределения и состояния связывания переменных, опреде­


ленны х как PR IV A TE , становится неопределенны м , когда на них ссылаю тся вне лексиче­
ского пространства (но в динам ическом пространстве) конструкции, если их не передаю т
как фактические параметры к вызы ваем ы м подпрограммам.

Оператор REDUCTION
О ператор R ED U C TIO N вы полняет операцию сокращ ения на указанных переменных.
Он имеет формат:

operator - одно из вы раж ений: +, *, - , .AND., .OR., .EQV. или .NEQV.; intrim ic - одно
из следую щ его: М АХ, M IN, 1AND, IOR или 1EOR.
list является именем одной или более переменных встроенного типа, которые являю т­
ся доступны м и для блока области действия. П одобъекты не м огут бы ть указаны. Каждое
имя долж но бы ть отделено запятой. М ассивы отлож енной формы и перенимаю щ его раз­
мера (см. стр. 55) не разреш аю тся.
П еременные, которы е появляю тся в операторе RED U CTIO N , долж ны быть SHARED
в контексте вклю чения. Л ичная копия каждой переменной в list создается для каждого
потока, как будто использовался оператор PRIVATE.
В конце RE D U C T IO N (сокращ ения) разделяем ая переменная обновляется, чтобы от­
разить результат объединения оригинального значения разделяемой переменной сокра­
щ ения с конечны м значением каж дой из личны х копий, используя указанный оператор.
О ператоры сокращ ения все ассоциативны (за исклю чением вычитания), и компилятор
мож ет свободно повторно ассоциировать вычисление конечного значения; частичные ре­
зультаты сокращ ения вычитанием добавляю тся, чтобы сф ормировать конечное значение.
Значение разделяем ой переменной становится неопределенным, когда первый поток
достигает оператора, содерж ащ его сокращ ение, и оно остается неопределенным, пока
вы числение сокращ ения не заверш ено. О бычно вычисление заверш ается в конце конст­
рукции R E D U C T IO N .
О днако если оператор RED U CTIO N используется в конструкции, к которой также
прим еняется N O W A IT, разделяем ая переменная остается неопределенной, пока не будет
вы полнена синхронизация барьера. Это гарантирует, что все потоки заканчивают опера­
тор RED U CTIO N .
О ператор R E D U C TIO N долж ен использоваться в области или конструкции распреде­
ления рабочих заданий, где перем енная сокращ ения используется только в утверждении
сокращ ения, им ею щ ем один из следую щ их форматов:
х = х operator ехрг
х = ехрг operator х (except for subtraction)
х = intrinsic (x, expr)
x = intrinsic (expr, x)
Н екоторы е сокращ ения м огут бы ть выражены в других форматах. Н апример, сокра­
щ ение М А Х м ож ет бы ть вы раж ено следую щ им образом:
IF (x 1Т. expr) х = ехрг
А льтернативно сокращ ение могло бы быть скрыто в вызове подпрограммы. Будьте
вним ательны , чтобы оператор, который вы указы ваете в операторе RED U CTION , cooi-
ветствовал операции сокращ ения.
Г шва 13. Директивы расширенной компиляции 389
Табл. 13.5 перечисляет операторы и встроенны е подпрограмм ы и их значения ини­
циализации. Ф актическое значение инициализации будет совм естим о с типом данны х
переменной сокращ ения.

Таблица 13.5. Значения инициализации для операторов REDUCTION


и встроенных подпрограмм
Оператор Значение инициализации
+ 0
* 1
- 0
.AND. .TRUE.
.OR. .FALSE.
.EQV. TRUE.
.NEQV. .FALSE.'
Встроенная подпрограмма Значение инициализации
MAX Наименьшее представимое число
¡MIN Наибольшее представимое число
IAND Все биты в 1
ilOR 0 .............
IÏEOR jO
Если директива допускает опера ю ры сокращ ения, число операторов, которые вы м о­
жете указать, не ограничено. О днако каж дое имя переменной м ож ет появиться только
в одном из операторов.

Оператор SHARED
О ператор SH A RED указы вает переменные, которы е будут разделяться всеми потока­
ми в группе. Он имеет формат:
SHARED {list)
i/ie list —имя одной или более переменных или общ их блоков, которые являю тся доступ ­
ными для блока области действия. П одобъекты не могут бы ть указаны. Каж дое имя
долж но быть отделено запятой, а имя им енованного общ его блока долж но появляться
между слеш ами ( / / ) .
Все потоки внутри группы для данных SHA RED получаю т’ доступ к той же самой об­
ласти памяти.
Правила условной компиляции
API Fortran О репМ Р позволяет условно ком пилировать утверж дения Intel Fortran, если
вы используете соот ветствую щ ий преф икс директив.
П рефикс зависит, какой исходный формат вы используете, хотя !$ допустим во всех
форматах.
П рефикс долж ен сопровож даться допустим ы м утверж дением Intel Fortran на той же
самой с троке.

Свободный исходный формат


П рефикс условной компиляции свободного исходного ф орм ата !$. Этот преф икс мо­
жет появиться в лю бом столбце, пока ему ггредшествует' только незаполненное простран­
ство. Он долж ен появиться как единственное слово без прош едш его незаполненного про­
390 С Д Апгазин, В В Кондратьев Програмирование на Visual FORTRAN

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

Фиксированный исходный формат


Для программ с фиксированны м исходным форм атом префикс условной компиляции
является одним из следую щ его: !$ , С$ (или с$), или *$.
П рефикс долж ен начинаться в столбце 1 и появиться как отдельная строка без про­
ш едш его незаполненного пространства. П равила исходного текста фиксированного фор­
мата применяю тся к строке директивы .
Н ачальны е строки долж ны иметь пробел или нуль в столбце ш есть, а строки продол­
жения долж ны иметь символ отличны й пробела или нуля в столбце шесть. Н апример,
следую щ ие форматы для указания условной компиляции эквивалентны:
С23456789
!$ IAM = OMP_GET_THREAD_NUM() +
!$ * INDEX
#IFDEF _0PENM P
IAM = OMP_GET_THREAD_NUM() +
* INDEX
#ENDIF
Правила вложения и закрепления
Этот раздел описы вает правила динам ического влож ения и закрепления для директив
A PI Fortran O penM P.
Правила закрепления
С ледую щ ие правила прим еняю тся к динамическом у закреплению :
Д ирективы DO, SEC TIO N S, SIN G LE, M A STER и BA R RIER связываю тся с динамиче­
ски вклю чаю щ ей их директивой PA R A LLEL, если она сущ ествует.
Д иректива O R D ER ED связы ваю тся с динам ически вклю чаю щ ей ее директивой DO.
Д иректива A TO M IC предписы вает исклю чительны й доступ относительно директив
A TO M IC во всех потоках не только текущ ей группы.
Д иректива C R IT IC A L предписы вает исклю чительны й доступ относительно директив
C R IT IC A L во всех потоках не только текущ ей группы.
Д иректива никог да не м ож ет связы ваться ни с какой директивой вне самой близкой,
вклю чаю щ ей директивы PARALLEL.
Правила вложения
С ледую щ ие правила прим еняю тся к динам ическом у вложению :
Д иректива PA R A LLEL, динам ически находящ аяся в другой директиве PARALLEL,
логически устанавливает новую группу, которая составлена только из текущ его потока,
если влож енны й параллелизм не разреш ается.
Д ирективы DO, SEC TIO N S и SIN G LE, которые связаны с одной директивой
PA R A LLEL, не допускаю т влож ения, когда одна является внутренней частью другой.
Д ирективы DO, SEC TIO N S и SIN G LE не разреш аю тся в динамическом пространстве
директив M A ST E R и CR ITICA L.
Глава 13 Директивы расширенной компиляции 391
Д ирективы BA R R IER не разреш аю тся в динамическом пространстве директив DO,
SECTIONS, SINGLE, M A STER и CR ITICA L.
Директивы M A STER не разреш аю тся в динамическом пространстве директив DO,
SECTIONS и SINGLE.
Разделы O RD ERED не допускаю тся в динам ическом пространстве разделов
CRITICAL.
Лю бой набор директив, который является законным, когда выполняется динамически
в области PA R A LLEL, является такж е законным, когда он выполняется вне параллельной
области. Когда он выполняется динам ически вне определяемой пользователем парал­
лельной области, директива выполняется относительно группы, составленной только из
главного потока.
Примеры
Следую щ ий пример показывает влож енны е области PA R A LLEL:
с$ОМР PARALLEL DEFAULT(SHARED)
с$ОМР DO
DO I =1, N
c$OMP PARALLEL SHARED(I.N)
c$OMP DO
DO J =1, N
CALL WORK(I.J)
END DO
c$OMP END PARALLEL
END DO
c$OMP END PARALLEL
Обратите внимание, что внутренние и внеш ние директивы DO связы ваю т с разными
областями PARALLEL. Следую щ ий пример является разновидностью предыдущ его
примера:
с$ОМР PARALLEL DEFAULT(SHARED)
с$ОМР DO
DO I =1, N
CALL SOME_WORK(l,N)
END DO
c$OMP END PARALLEL

SUBROUTINE SOME_WORK(l,N)
c$OMP PARALLEL DEFAULT(SHARED)
c$OMP DO
DO J =1, N
CALL WORK(I.J)
END DO
c$OMP END PARALLEL
RETURN
END
Директива A TOMIC
Д иректива A TO M IC гарантирует, что определенное м естополож ение памяти обновля­
ется динамически: это предотвращ ает возм ож ность множественных, одноврем енно запи­
сываю щ их потоков. О на им еет формат:
с$ОМР ATOMIC
где с - одно из выражений: С (или с), ! или * (см. разд. 13.1).
392 С Д. Афазии, В В Кондратьев. П роект ирование на Visual FORTRAN

Правила использования
Д иректива A TO M IC разреш ает оптим изацию вне этой критической секции около на­
значения. Реализация м ож ет заменить директивы A TO M IC , заклю чая каж дое утверж де­
ние в критическую секцию. Критическая секция (или секции) долж на использовать то же
самое уникальное имя.
Д иректива A T O M IC применяется только к непосредственно следую щ ему утверж де­
нию , которое долж но иметь один из следую щ их форматов:
х = х operator ехрг
х = ехрг operator х
х = intrinsic (х, ехрг)
х = intrinsic (ехрг, х)
В преды дущ их утверж дениях:
л* - скалярная переменная встроенного типа; operator является +, *, -, /, .AND., .OR.,
.EQV. или . N E Q V ; ехрг - скалярное выраж ение, которое не ссылается на х; intrinsic явля­
ется M AX, M IN, IAND, IOR или IEOR.
Все ссылки на местополож ение памяти .v долж ны иметь одинаковы е тип и параметры
типа.
Только загрузка и запоминание л' являю тся динам ическим и; оценка ехрг не является
динамической. Чтобы избегать условий состязания (или состязания параллелизма), все па­
раллельны е обновления местополож ения долж ны быть защ ищ ены, используя директиву
A TO M IC , кроме тех, которые, как известно, являю тся свободны ми от условий состязания.
Ф ункция intrinsic, оператор operator и назначение долж ны бы ть встроенны ми функция­
ми, операторам и и назначениями.
Пример
С ледую щ ий пример показы вает способ избеж ать условий состязания при использова­
нии A TO M IC , чтобы защ итить все одноврем енны е обновления м естополож ения множ е­
ственны м и потоками:
с$ОМР PARALLEL DO DEFAULT(PRIVATE) SHARED(X,Y,INDEX,N)
DO 1=1,N
CALL WORK(XLOCAL, YLOCAL)
c$OMP ATOMIC
X(INDEX(I)) = X(INDEX(I)) + XLOCAL
Y(I) = Y(I) + YLOCAL
END DO
Так как директива A TO M IC применяется только к утверж дению , непосредственно
следую щ ем у за ним, замет им, что Y не обновляется атомарно.

Директива BARRIER
Д иректива B A R R IER синхронизирует все потоки в группе. О на заставляет каждый
поток ждать, пока все другие потоки в группе не достигнут барьера.
Д иректива B A R R IER имеет следую щ ий формат:
с$ОМР BARRIER
где с - одно из выраж ений: С (или с), ! или * (см. разд. 13.1).
С директивой B A R R IER долж ны столкнуться все потоки в группе или ни один вооб­
ще. О на такж е долж на встретиться со всеми потоками в группе в том же самом порядке.
Глава 13 Директивы расширенной компиляции 393
Пример
П равила закрепления директив запраш иваю т директиву B A R R IER , чтобы связать ее с
самой близкой директивой включения PA R A LLEL. В следую щ ем прим ере директива
BA RRIER гарантирует, что все потоки выполнили первый цикл и что безопасно вы пол­
нять второй цикл:
с$ОМР PARALLEL
с$ОМР DO PRIVATE®
DO ¡ = 1,100
b(i) = i
END DO
c$OMP BARRIER
c$OMP DO PRIVATE(i)
DO ¡ = 1,100
a(i) = b(101-i)
END DO
c$OMP END PARALLEL

Директива CRITICAL
Д иректива C R IT IC A L ограничивает доступ к блоку кода только одним потоком одн о­
временно. О на имеет формат:
с$ОМР CRITICAL [(name)] block
с$ОМР END CRITICAL [(name)]
где с - одно из выражений: С (или с), ! или * (см. разд. 13.1); пате - имя критической
секции (critical section); block - структурированны й блок (секция) утверж дений или кон­
струкций. Вы не можете выполнить переход в или из блока.
Правила использования
П оток ждет в начале критической секции, пока не будет никакого, другого потока в
группе, который вы полняет критическую секцию , им ею щ ую то же самое имя. Все неиме­
нованные директивы C R ITIC A L получаю т одинаковое имя.
Если имя указанно в директиве CR ITICA L, оно же долж но появиться в соответст­
вую щ ей директиве CR ITICA L END. Если никакое имя не появляется в директиве
C R ITICA L, никакое имя не может появиться в соответствую щ ей директиве CR ITICA L
END.
И мена критических секций являю тся глобальны м и объектам и программы . Если имя
вступает конфликт с лю бым другим объектом, поведение програм мы является неопреде­
ленным.
Пример
С ледую щ ий пример показывает м одель организации очереди, в которой задача удаля­
ется из очереди и обрабатывается. Чтобы предпринять меры против м нож ественны х по­
токов, убираю щ их из очереди ту же самую задачу, операция удаления из очереди пом е­
щ ается в критическую секцию.
П оскольку в этом примере имеется 2 независимы е очереди, каж дая очередь защ ищ а­
ется соответствую щ ими директивами CR ITICA L, им ею щ ими соответственно разные
имена: XA XIS и YAXIS:
с$ОМР PARALLEL DEFAULT(PRIVATE) SHARED(X.Y)
с$ОМР CRITICAL(XAXIS)
CALL DEQUEUE(IX NEXT, X)
c$OMP END CRITICAL(XAXIS)
394 С Д A'U'diiiH, В В К о н д р а т ьев П р о грам и ровачи е па Visual FORTRAN

CALL WORK(IX_NEXT, X)
c$OMP CRITICAL(YAXIS)
CALL DEQUEUE(IY_NEXT,Y)
c$OMP END CRITICAL(YAXIS)
CALL WORK(IY_NEXT, Y)
c$OMP END PARALLEL

13.32. Директива DO
Д иректива DO указы вает, чтобы итерации непосредственно следую щ его цикла DO
вы полнились параллельно. О на имеет такой формат:
с$ОМР DO [clause[[t] clause] . . . ]
dojoop
[с$ОМР END DO [NOWAIT]]
где с - одно из вы раж ений: С (или с), ! или * (см. разд. 13.1).
clause - одно из следую щ их выражений:
F IR ST PR IV A T E (list).
L A ST PR JV A TE (list).
O R D E R E D (долж ен использоваться, если упорядочиваемые секции содержатся в дина­
мическом пространстве директивы DO; см. разд. 13.35).
P R IV A T E (list).
RED U CTIO N (operator \ intrinsic : list).
S C H E D U L E (type [, chunk]). У казы вает, как итерации цикла DO разделяю тся среди
потоков группы, chunk долж ен быть полож ительны м скалярным целочисленны м выраж е­
нием. С ледую щ ие 4 значения type разреш аю тся, 3 из них допускаю т необязательный
chunk- параметр:
Тип Влияние
STATIC Делит итерации на непрерывные части, деля число итераций на число потоков в группе. Каждая
часть затем посылается потоку прежде, чем начинается выполнение цикла. Если с/?ип/с указано,
итерации разделяются на части размера, указываемого chunk Части статически посылаются
потокам в группе циклическим способом в порядке номера потока
DYNAMIC Может использоваться, чтобы получить ряд итераций динамически. По умолчанию 1, если chunk \
не указано. Если chunk указано, итерации разделяются на части размера, указываемого chunk. \
Когда каждый поток заканчивает часть итеративного пространства, он динамически получает
следующий набор итераций
GUIDED Может использоваться, чтобы указать минимальное число итераций. По умолчанию 1, если
chunk не указан. Если chunk указано, размер куска сокращается по экспоненте с каждым после­
дующей диспетчеризацией, chunk указывает минимальное число итераций, которое можно по­
слать каждый раз. Если итераций осталось меньше чем указано chunk, все оставшиеся итерации
посылаются
RUNTIME1 Задерживает решение планирования до времени выполнения Вы можете выбрать тип списка и
размер куска во время выполнения, используя переменную среды OMP_SCHEDULE
1 Никакой chunk не разрешается для этого типа.

Если оператор S C H E D U L E не используется, тип списка по умолчанию - STATIC.


d o j o o p - итерация DO (итерационны й цикл DO). Это не может быть DO W HILE или
цикл DO без управления циклом. П еременная итерации цикла DO долж на иметь тин "це­
л о чи сл ен н ое”.
Г лава 13 Д ирект ивы расш иренной компиляции 395
Итерации цикла DO распределены среди сущ ествую щ ей группы потоков. Значения
параметров управления цикла DO, ассоциированного с директивой D O долж ны бы ть
одинаковыми для всех потоков в группе.
Вы не можете вы полнить переход из цикла DO, ассоциированного с директивой DO.
Правила использования
Если используется директива EN D DO, она долж на появиться нем едленно в конце
цикла. Если вы не указы ваете директиву EN D DO, директива EN D D O предполагается в
конце цикла DO.
Если вы указываете, оператор N O W A IT в директиве EN D DO, потоки не си н хрон и зи ­
руются в конце параллельного цикла. П отоки, которы е заканчиваю тся рано, продолж а­
ются прямо с инструкции, следую щ ей за циклом, не дож идаясь пока другие члены гр у п ­
пы, закончат директиву DO.
П еременные управления параллельны м циклом D O являю тся объектам и уровня блока
внутри цикла DO. Если переменная управления циклом появляется такж е в списке
LA STPRIV A TE параллельного DO, она копируется в переменную с тем же самым им е­
нем в области включающей директивы PA R A LLEL. П еременная в области PA R A LLEL
долж на быть SHARED, если она указана в списке L A ST PR IV A T E директивы DO.
Только один оператор SCH ED U LE и оператор O R D E R E D могут появиться в ди ректи ­
ве DO. С директивами DO долж ны встретиться все потоки в группе или ни один вообщ е.
Они такж е должны встретиться в том же самом порядке со всеми потокам и в группе.
Примеры
В следую щ ем примере переменная итерации цикла является личной по ум олчанию и
не надо ее явно объявлять. Д иректива END DO необязательна:
с$ОМР PARALLEL
с$ОМР DO
DO 1=1 ,N
B(l) = (A(l) + A (M ))/2 .0
END DO
c$OMP END DO
c$OMP END PARALLEL
Если есть множественные независимые циклы внутри параллельной области, можно ис­
пользовать оператор NOW AIT, чтобы избежать неявного BARRIER в конце директивы DO:
с$ОМР PARALLEL
с$ОМР DO
DO l=2,N
B(l) = (A(l) + A (M ))/2 .0
END DO
c$OMP END DO NOWAIT c$OMP DO
DO 1=1 ,M
Y(l) = SQRT(Z(I))
END DO
c$OMP END DO NOWAIT
c$OMP END PARALLEL
П равильное выполнение иногда зависит от значения, которое последняя итерация
цикла назначает переменной. Такие программы долж ны перечислить все такие перем ен­
ные, как параметры для оператора L A STPR IV A TE так, чтобы значения переменны х бы ли
теми же самыми, что и тогда, когда цикл вы полняется последовательно, следую щ им об­
разом:
396 С Д . Ллгсшт, В В К он драт ьев П риграм нроваине на Visual FO RTRAN

с$ОМР PARALLEL
С$ОМР DO LASTPRIVATE(I)
DO l=1,N
A(I) = B(I) + C(I)
END DO
c$OMP END PARALLEL
CALL REVERSE(I)
В этом случае значение I в конце параллельной области равно N+1, как в последова­
тельном случае.
У порядочиваемы е секции полезны для последовательного упорядочивания вывода из
работы, которая вы полняется параллельно. П редполагая, что повторно используемая
библиотека ввода/вы вода сущ ествует, следую щ ая программа распечаты вает индексы в
последовательном порядке:
с$ОМР DO ORDERED SCHEDULE(DYNAMIC)
DO l=LB,UB,ST
CALL WORK(I)
END DO

SUBROUTINE WORK(K)
c$OMP ORDERED
W R ITE (V ) К
c$OMP END ORDERED

13.33. Директива FLUSH


Д иректива FLU SH идентиф ицирует точки синхронизации, в ко ю р ы х реализация
долж на обеспечить совм естим ы й вид памяти. О на имеет следую щ ий формат:
с$ОМР FLUSH [(list)]
где с - одно из выраж ений: С (или с), ! или * (см. разд. 13.1).
list является именем одной или более переменны х, которые будут переписаны на
диск. И мена долж ны бы ть разделены запятыми.
Правила использования
Д иректива FLU SH долж на появиться точно в точке кода, в которой требуется синхро­
низация. Чтобы избегать переписы вания па диск всех переменные, укаж ите list.
Видимые потоком переменны е записы ваю тся обратно в память в точке, в которой по­
является эта директива. М одиф икации видимых потоком переменных видимы всем пото­
кам после этой точки. П оследую щ ее чтение видимы х потоком переменных выбирает по­
следню ю копию данны х.
Видимы е потоком перем енны е вклю чаю т следую щ ие элементы данных:
■ Глобально видимы е переменны е (общ ие блоки и модули).
■ Л окальны е перем енны е, которы е не имеют атрибута SAVE, но извлекаю тся и сохра­
няю тся, используя свой адрес, или передаю тся своим адресом другой подпрограмме.
■ Л окальны е перем енны е, которые не имеют атрибута SAVE, но объявлены разделяе­
мыми в параллельной области внутри поднро!рам м ы .
■ Ф орм альны е аргум енты .
■ Все разы м енованны е указатели (dereferences).
Д иректива FLU SH подразум евается для следую щ их директив (если клю чевое слово
NOWA1T не используется):
Гтава 13 Д ирект ивы расш иренной компиляции 397

BARRIER
CRITICAL и END CRITICAL
END DO
END SECTIONS
END SINGLE
ORDERED и END ORDERED
PARALLEL и END PARALLEL
PARALLEL DO и END PARALLEL DO
PARALLEL SECTIONS и END PARALLEL SECTIONS
Пример
Следую щ ий пример использует директиву FLUSH для двухточечной синхронизации
между парами потоков:
с$ОМР PARALLEL DEFAULT(PRIVATE) SHARED(ISYNC)
1AM = GET_THREAD_NUM()
ISYNC(IAM) = 0
c$OMP BARRIER
CALLW ORK()
С Я СДЕЛАЛ СВОЮ РАБОТУ, СИНХРОНИЗИРУЮСЬ С МОИМ СОСЕДОМ
ISYNC(IAM) = 1
с$ОМР FLUSH(ISYNC)
С ЖДИТЕ, ПОКА СОСЕД НЕ СДЕЛАЕТ
DO WHILE (ISYNC(NEIGH) .EQ 0)
c$OMP FLUSH(ISYNC)
END DO
c$OMP END PARALLEL

13.34. Директива MASTER


Д иректива M A STER указы вает блок кода, который вы полняется главным потоком
группы. О на имеет следую щ ий формат:
с$ОМР MASTER
block
с$ОМР END MASTER
где с - одно из выражений: С (или с), ! или * (см. разд. 13.1); block - структурированны й
блок (секция) утверж дений или конструкций. Нельзя вы полнить переход 6' или из блока.
Правила использования
Когда указана директива M A STER , другие потоки в группе пропускаю т влож енны й
блок (секцию) кода и продолж аю т выполнение. Нет никакого неявного барьера на входе
в или выходе из главной секции.
Пример
Следую щ ий пример вы нуж дает главный поток вы полнять подпрограмм ы O U TPU T
и INPUT:
с$ОМР PARALLEL DEFAULT(SHARED)
CALL WORK(X)
c$OMP MASTER
CALL OUTPUT(X)
С ALL INPUT(Y)
c$OMP END MASTER
CALL WORK(Y)
c$OMP END PARALLEL
398 С Д Алгазин, В В Кондратьев . Програм провал не на Visual FORTRAN

13.35. Директива ORDERED


Д иректива O R D E R E D указы вает блок кода, который выполняется в порядке, в кото­
ром итерации вы полнились бы при последовательном вы полнении. О на имеет следую ­
щий формат:
с$ОМР ORDERED
block
с$ОМР END ORDERED
где с - одно из выражений: С (или с), ! или * (см. разд. 13.1).
block является структурированны м блоком (секцией) утверж дений или конструкций.
Вы не можете выполнить переход в или из блока.
Правила использования
Д иректива O R D E R E D м ож ет появиться только в динам ическом пространстве дирек­
тивы DO или PA R A L LE L DO. Д иректива DO, с которой связы ваю т упорядочиваемые
секции, долж на указы вать оператор O R D ERED .
И терация цикла, использую щ ая директиву DO, не долж на выполнить ту же самую
директиву O R D E R E D более одного раза, и она не долж на вы полнять больш е одной ди­
рективы O RD ERED .
Один поток допускается в упорядочиваем ы х секциях одноврем енно. Потоки допус­
каю тся для входа в порядке итераций цикла. Н икакой поток не мож ет войти в упорядо­
чиваемую секцию , пока нельзя гарантировать, что все предш ествую щ ие итерации закон­
чены или упорядочиваем ы е секции ни разу не выполнялись. Это является координирова­
нием доступа и упорядочиванием кода внутри упорядочиваем ы х секций, пока код вне сек­
ции выполняется параллельно.
У порядочиваемы е секции, которы е связаны с другим и директивами DO, независимы
друг от друга.
Пример
У порядочиваем ы е секции полезны , чтобы последовательно привести в порядок вывод
из работы, которая выполняется параллельно. П редполагая, что повторно используемая
библиотека ввода/вы вода сущ ествует, следую щ ая программа распечаты вает индексы в
последовательном порядке:
с$ОМР DO ORDERED SCHEDULE(DYNAMIC)
DO NLB.UB.ST
CALL WORK(I)
END DO

SUBROUTINE WORK(K)
c$OMP ORDERED
W R ITE (V ) К
c$OMP END ORDERED

13.36. Директива PARALLEL


Д иректива PA R A LLEL определяет параллельную область. О на принимает следую ­
щ ую форму:
cSOMP PARALLEL [c!ause[[,] clause]... ]
block
c$OMP END PARALLEL
Гчааа 13 Д ирект ивы расш иренной ком т пяц ии 399
где с - одно из выражений: С (или с), ! или * (см. разд. 13.1).
clause является одним из следую щ их выражений:
C O P Y IN (list).
DEFA U LT ( PRIV A TE | SH A RED | N O NE ).
FIRSTPRIV A TE (list).
IF (scalar logical expression) указывает, что влож енная секция кода была долж на вы ­
полниться параллельно, только если scalar logical_expression вычислено как .TRUE..
Иначе параллельная область преобразуется в последовательную форму. Если этот опера­
тор не используется, область выполняется, как будто был указан оператор IF (.TRUE)..
Этот оператор вычисляется главным потоком прежде, чем вступаю т в силу лю бы е атри­
буты области действия данных. Т олько один оператор 1F м ож ет появи ться в директиве.
NUM TH REA D S (scalar integer expression) указы вает число потоков, которые ис­
пользую тся в параллельной области, scalar integer expression долж но оцениваться к по­
ложительному скалярному целочисленном у значению . Только один оператор
NUM TH READS может появит ься в дирек ш ве.
PRIVATE (list)
REDUCTION ( operator \ intrinsic ■list ).
SHARED (list)
где block - сф уктурированны й блоком (секция) утверж дений или конструкций. Нельзя
вы полниib переход в или из блока (параллельной области).
Правила использования
П арные директивы PA R A LLEL и PA R A LLEL END долж ны появиться в той же самой
подпрограмме в выполнимой секции кода.
Д иректива PARALLEL EN D обозначает конец параллельной области. В этой точке
имеется неявный барьер. Только главный поток группы продолж ает вы полнение в конце
параллельной области.
Числом потоков в группе можно управлять при помощи оператора N U M TH REA DS,
переменной среды OM P NUM T H R EA D S или вызывая подпрограмм у библиотеки под­
держки О М Р SET NUM TH REA D S в последовательной части программы.
Оператор NUM TH REA D S заменяет подпрограмм у O M P SET NUM T H REA D S, ко­
торая заменяет переменную среды O M P NUM TH REA D S. На последую щ ие параллель­
ные области не воздействую т, если они не имею т их собственны е операторы N U M _
THREADS.
После того, как указано, число потоков в группе остается постоянным для продолж е­
ния этой параллельной области.
Если динамический механизм потоков разреш ается переменной среды или подпро­
граммой библиотеки, то число потоков, запраш иваем ы х оператором NUM TH REA D S,
является максимальным числом для использования в параллельной области.
Код, содержавшийся внутри динамического пространства параллельной области, выпол­
няется в каждом потоке, а путь вну три кода может быть различным для разных потоков.
Если поток, выполняю щ ий параллельную область, встречается с другой параллельной
областью , он создает новую группу и становится ведущ им этой новой группы. По ум ол­
чанию вложенные параллельные области всегда преобразовы ваю тся в последовательную
форму и выполняю тся группой одного потока.
400 С Д A 1га т н, В В К ондрат ьев . Программирование на Visual FORTRAN

Примеры
Вы м ож ете использовать директиву PA R A LLEL в крупноблочны х параллельны х про­
граммах. В следую щ ем прим ере каж дый поток в параллельной области реш ает, какую
часть глобального м ассива X обрабаты вать, основы ваясь на номере потока:

с$0М Р PARALLEL DEFAULT(PRIVATE) SHARED(X.NPOINTS)


1AM = OMP_GET_THREAD_NUM()
NP = OMP_GET_NUM _THREADS()
IPOINTS = NPOINTS/NP
CALL SUBDOMAIN(X,IAM,IPOINTS)
c$0M P END PARALLEL
П редполож им , вы предварительно использовали переменную среды O M P_N U M _
T H R E A D S, чтобы установить число потоков - ш есть, вы можете изменить число потоков
между параллельны ми областями следую щ им образом:
CALL OMP_SET_NUM _THREADS(3)
!$0МР PARALLEL

!$0МР END PARALLEL


CALL OMP SET.NUM_THREADS(4)
!$0MP PARALLEL DO

i$0M P END PARALLEL DO

13.37. Директива PARALLEL DO


Д иректива PA R A LLEL DO обеспечивает сокращ енны й способ указать параллельную
область, содерж ащ ую отдельную директиву DO. Д иректива PA R A LLEL DO имеет сле­
дую щ ий формат:

с$0М Р PARALLEL DO [clause[U clause] . . . ]


dojoop
[c$0MP END PARALLEL DO]
где с —одно из выражений: С (или с), ! или * (см. разд. 13.1).
clause м ож ет бы ть лю бым из операторов, допустим ы х с директивами DO или
PA R A LLEL.
d o j o o p является итерацией DO (цикл DO). Это не может быть циклом DO W HILE
или DO без управления циклом. Переменная итерации цикла DO долж на иметь тип "це­
лочисленное". Вы не можете выполнить переход из цикла DO, ассоциированного с ди ­
рективой DO.
Правила и поведение
Если директива END PA R A LLEL DO не указана, PA R A LLEL DO, как предполагаю т,
заканчивается концом цикла DO, который нем едленно следует за директивой PA­
RA LLEL DO. Если используется, д и р е к ш в а PA R A LLEL DO END, она долж на появиться
нем едленно в конце цикла DO.
С ем антика идентична явному определению директивы PARALLEL, немедленно со­
провож даем ой в соответствии с директивой DO.
Г ш в а 13 Д ирект ивы расш иренной компиляции 401
Примеры
В следую щ ем примере переменная итерации цикла является по ум олчанию личной,
и ее не нужно явно объявлять. Д иректива END PA R A LLEL DO необязательна:
с$0МР PARALLEL DO
DO 1=1 ,N
B(l) = (A(l) + A (M ))/2 .0
END DO
c$0MP END PARALLEL DO
Следую щ ий пример показывает, как использовать оператор R E D U C T IO N в директиве
PA R A LLEL DO:
с$0МР PARALLEL DO DEFAULT(PRIVATE) REDUCTION^: A,B)
DO 1=1 ,N
CALL WORK(ALOCAL.BLOCAL)
A = A + ALOCAL
В = В + BLOCAL
END DO
c$0MP END PARALLEL DO

13.38. Директива PARALLEL SECTIONS


Д иректива PA R A LLEL SEC TIO N S обеспечивает сокращ енны й способ указать парал­
лельную область, содерж ащ ую отдельную директиву SEC T IO N S. С ем антика идентична
явному определению директивы PA R A LLEL, нем едленно сопровож даем ой соответст­
вующей директивой SECTIO N S. Д иректива PA R A L L E L SEC T IO N S им еет следую щ ий
формат:
с$0МР PARALLEL SECTIONS [clause[[] clause] . . . ]
[c$0MP SECTION]
block
[c$0MP SECTION
block] . . .
c$0MP END PARALLEL SECTIONS
где с - одно из выражений: С (или с), ! или * (см. разд. 13.1).
clause мож ет быть лю бым из операторов, допустим ы х с директивам и SEC TIO N S или
PARALLEL.
block является структурированны м блоком (секцией) утверж дений или конструкций.
Вы не можете выполнить переход в или из блока.
Последняя секция заканчивается директивой END PA R A L L E L SEC TIO N S.
Пример
В следую щ ем примере подпрограммы XAX1S, Y A X IS и ZAX1S м огут вы полняться
одновременно:
с$0МР PARALLEL SECTIONS
с$0МР SECTION
CALL XAXIS
c$0MP SECTION
CALLYAXIS
c$0MP SECTION
CALL ZAXIS
c$0MP END PARALLEL SECTIONS
402 С. Д Ачгсиин, В В Кондратьев Программирование на Visual FORTRAN

13.39. Директива PARALLEL WORKSHARE


Д иректива PA R A L L E L W O R K SH A R E обеспечивает сокращ енны й способ указать па­
раллельную область, содерж ащ ую отдельную директиву W O RKSH ARE.
Д иректива PA R A L L E L W O R K SH A R E имеет следую щ ий формат:
с$0М Р PARALLEL WORKSHARE [clause[[] clause] . . . ]
block
c$0M P END PARALLEL WORKSHARE
гд е с - о д н о из в ы р а ж е н и й : С (и л и с ), ! и ли * (с м . р азд . 1 3 .1 ).
clause может бы ть лю бы м из операторов, допустим ы х с директивами PA R A LLEL или
W O R K SH A R E .
block является структурированны м блоком (секцией) утверж дений или конструкций.
Вы не м ож ете вы полнить переход в или из блока (параллельной области).

13.40. Директива SECTIONS


Д и ректива SEC T IO N S указы вает 1 или более блоков кода, которые долж ны быть раз­
делены между потокам и в группе. Каждая секция вы полняется одним потоком в группе.
Д иректива SEC TIO N S им еет следую щ ую форму:
с$0М Р SECTIONS [clause[[] clause] . . . ]
[с$0МР SECTION]
block
[c$0MP SECTION
block] . . .
c$0M P END SECTIONS [NOWAIT]
где с - о д н о из вы раж ений: С (или с), ! или * (см. разд. 13.1).
clause является одним из следую щ их выражений:
F1RSTPR1VATE (list).
L A ST PR IV A T E (list).
PR IV A T E (list).
RE D U C T IO N ( operator \ intrinsic : l i s t ).
block является структурированны м блоком (секцией) утверж дений или конструкций.
Л ю бая составляю щ ая секция долж на бы ть такж е структурированны м блоком. Вы не м о­
ж ете вы полнить переход в или из блока. .
Правила использования
К аж дой секции кода предш ествует директива SECTIO N , хотя директива необязатель­
на для первой секции. Д ирективы SECTIO N долж ны появиться внутри лексического про­
странства SEC TIO N S и парной директивы END SECTIO N S.
П оследняя секция заканчивается директивой END SECTIO N S. Потоки, которые за­
канчиваю т вы полнение своих секций, встречаю тся с неявным барьером при директиве
EN D SEC T IO N S, если не указан N O W A IT.
С директивам и SEC T IO N S долж ны ветреш ться все потоки в группе или ни один по­
ток вообще.
Пример
В следую щ ем прим ере подпрограм м ы X A XIS, Y A XIS и ZAX1S могут выполняться
одноврем енно:
с$0М Р PARALLEL
Гпава /3 Д ирект ивы расш иренной компиляции 403
с$ОМР SECTIONS
с$0МР SECTION
CALL XAXIS
С$0МР SECTION
CALLYAXIS
c$OMP SECTION
рд| I 7Ду|о
C$OMP END SECTIONS
c$OMP END PARALLEL

13.41. Директива SINGLE


Д иректива SIN G LE указывает, чтобы блок кода долж ен был вы полниться только о д ­
ним потоком в группе. О на имеет следую щ ий формат:
с$ОМР SINGLE [clause[[] clause] . . . ]
block
c$OMP END SINGLE [modifier]
где с - о д н о из выражений: С (или с), ! или * (см. разд. 13.1).
clause является одним из следую щ их выражений:
F1RSTPR1VATE (list).
PR IV A TE (list).
block является структурированны м блоком (секцией) утверж дений или конструкций.
Вы не можете выполнить переход в или из блока.
modifier является одним из следую щ его: C O PY PR IV A T E (list) или NOW A1T.
Правила использования
Потоки в группе, которы е не вы полняю т эту директиву, ж дут на директиве SIN G LE
END, если не указано NOWA1T.
С директивами SIN G LE долж ны встретиться все потоки в группе или ни один поток
вообщ е. О на долж на такж е встретиться со всеми потокам и в группе в том же самом п о ­
рядке.
Пример
В следую щ ем примере первый ноток, который сталкивается с директивой SIN G LE,
вы полняет подпрограммы O U TPU T и INPUT:
с$ОМР PARALLEL DEFAULT(SHARED)
CALL WORK(X)
c$OMP BARRIER
c$OMP SINGLE
CALL OUTPUT(X)
CALL INPUT(Y)
c$OMP END SINGLE
CALL WORK(Y)
c$OMP END PARALLEL
Вы не долж ны делать предполож ений о том, который из потоков вы полняет секцию
SINGLE. Все другие потоки пропускаю т секцию SIN G LE и останавливаю тся на барьере в
конструкции END SINGLE. Если другие потоки м огут п родолж иться, не дож идаясь по­
тока, выполняю щ его секцию SIN G LE, вы можете указать NOW A1T в директиве END
SINGLE.
404 C.JI А пгазин, В В Кондратьев Программирование на Visual FORTRAN

13.42. Директива THREADPRIVАТЕ


Д иректива TH REA D PR1V A TE указы вает именованные общ ие блоки, которые будут
личны ми (локальны м и) по отнош ению к потоку; они глобальны внутри потока. Она име­
ет следую щ ий формат:
с$0МР THREADPRIVATE( lebl [, Щ . . .)
где с - одно из выраж ений: С (или с), ! или * (см. разд. 13.1).
сЪ - имя общ его блока, который вы хотите сделать личны м по отнош ению к потоку.
Только им енованны е общ ие блоки м огут бы ть сделаны личны ми для потока. О братите
внимание, что требую тся слеш и (/).
П р а в и л а испол ь зования
Каждый поток получает свою собственную копию общ его блока, таким образом, дан ­
ные, записанны е в общ ий блок одним потоком, непосредственно не видимы другими по­
токами.
Во время вы полнения последовательны х частей и секций M A STER программы дос­
тупна копия общ его блока главного потока. На входе в первую параллельную область
предполагается, что данны е в общ их блоках TH R E A D PR IV A T E будут неопределенными,
если оператор COPY1N не указан в директиве PA R A LLEL.
Когда общ ий блок (которы й инициализирован, используя утверждения DATA) появ­
ляется в директиве TH R E A D P R IV A T E , каждая копия потока инициализируется однажды
до ее первого использования. Д ля последую щ их параллельны х областей гарантируется
сохранение данны х в общ их блоках TH R EA D PR IV A TE, только если динамический м е­
ханизм потоков бы л заблокирован и если число потоков является одинаковым для всех
параллельны х областей.
Общ ий блок T H R E A D P R IV A T E или составляю щ ие его переменные могут появляться
только в операторе CO PY IN . Им не разреш ается появляться в операторе PRIVATE,
FIR STPR IV A TE, L A ST PR IV A T E , SH A RED или RED U CTIO N . На них не воздействует
оператор D EFA U LT.
Прим ер
В следую щ ем прим ере общ ие блоки BLK1 и FIELDS указаны как личны е для потока:
COMMON /BLK/ SCRATCH
COMMON /FIELDS/ XFIELD, YFIELD, ZFIELD
c$OMPTHREADPRIVATE(/BLK/,/FIELDS/)
c$0MP PARALLEL DEFAULT(PRIVATE) C0PYIN(/BLK1/,ZFIELD)

13.43. Директива WORKSHARE


Д иректива W O R K SH A R E дели т работу по выполнению блока утверждений или кон­
струкций на отдельные единицы . О на такж е распределяет вы полнение работ единиц по­
токам группы, таким образом , каждая единица выполняется только однажды.
Д иректива W O R K SH A R E им еет следую щ ий формат:
с$0МР WORKSHARE
block
с$0МР END WORKSHARE [NOWAIT]
где с - одно из выраж ений: С (или с), ! или * (см. разд. 13.1).
Глава 13 Директивы расширенной комтпяции 405
block является структурированны м блоком (секцией) утверж дений или конструкций.
Вы не можете выполнить переход в или из блока
У тверж дения block вы полняю тся так, что каж дое утверж дение заканчивается преж де,
чем начинается следую щ ее утверж дение и вычисление правой стороны оператора назна­
чения заканчивается прежде, чем возникают влияния назначения на левую сторону.
Следую щ ие правила является дополнительны ми для этого параметра:
П араметр block может содерж ать утверж дения, которы е связы ваю тся с лексически
вложенными конструкциями PA R A LLEL. У тверж дения в этих конструкциях PA R A LLEL
не ограничены.
Параметр block м ож ет содерж ать директивы A TO M IC и конструкции CR ITIC A L.
Параметр block долж ен содерж ать только операторы присваивания массива, скаляр­
ные операторы присваивания, утверж дения FO R A LL, конструкции FO R A LL, у тверж д е­
ния W H ERE или конструкции W HERE.
П араметр block не долж ен содерж ать никаких определяемы х пользователем ф ун кц и о­
нальных вызовов, если функция не ELEM EN TA L.
Глава 14. Область действия и связывание

О бъекты програм мы идентиф ицирую тся именам и, меткам и, номерами устройств вво­
да/вы вода, сим волам и оператора или сим волами назначения. Н апример, переменная,
производный тип или подпрограмм а идентифицирую тся ее именем.
О б л аст ь дейст вия относится к области, в которой имя распознается. Блок области
действия является програм мой или частью программы , в которой определено или извест­
но имя. Он м ож ет бы ть лю бы м из следую щ их выражений:
■ Вся вы полняем ая программа.
■ О тдельны й блок области действия.
■ О тдельное утверж дение (или часть утверж дения).
О бласть програм мы , в которой имя является известны м и доступны м , упоминается
как область действия этого имени. Различные области действия допускаю т использование
одного и того же имени для разны х вещ ей в разных областях программы.
Связы вание - это язы ковое понятие, которое допускает обращ ение под другим име­
нем к том у же самом у объекту в специфической области программы .

14.1. Область действия


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

Таблица 14.1. О бласт ь дейст вия объект ов програм м ы


Объект Область действия
Программные единицы Глобальная
Общие блоки 1 Глобальная
Внешние процедуры Глобальная
Встроенные процедуры Глобальная2
Процедуры модуля (класс I) Локальная
Внутренние процедуры (класс I) Локальная
Формальные процедуры (класс I) Локальная
Функции - утверждения (класс I) Локальная
Производные типы (класс I) Локальная
Компоненты производных типов (класс II) Локальная
Именованные константы (класс I) Локальная
Именованные конструкции (класс I) Локальная
Имена группы списка имен (класс I) Локальная
Родовые идентификаторы (класс I) Локальная
Ключевые параметры в процедурах (класс III) Локальная
Переменные, на которые можно сослаться всюду в подпрограмме (класс I) Локальная
Переменные, которые являются формальными аргументами в функциях утверждения Утверждение
Переменные DO в неявном DO-списке3 утверждений DATA или F0RALL, Утверждение
или конструктор массива

ттоттп 406
Глава 14 Об часть действия и связывание 407
Объект Область действия
Встроенные операторы Глобальная
Определяемые операторы Локальная
Метки утверждений Локальная
Номера внешних устройств ввода/вывода Глобальная
Встроенное назначение Глобальная4
Определяемое назначение Локальная
1 Имена общих блоков могут также использоваться, чтобы идентифицировать локальные объекты.
2 Если встроенная процедура не используется в блоке области действия, ее имя может использоваться как локальный объ­
ект внутри этого блока области действия. Например, если встроенная функция COS не используется в программной еди­
нице, COS может использоваться там как имя локальной переменной
3 Переменная DO в неявном - DO списке списка ввода/вывода имеет локальную область действия.
4 Область действия символа назначения (=) глобальна, но она может идентифицировать дополнительные операции.

Утверждение. Объекты, которые являются доступными только внутри утверждения или части
утверждения; на такие объекты нельзя сослаться в последующих утверждениях.
Блок области действия (Локальная область действия). О бъекты, которы е о бъ яв­
лены внутри блока области действия. Эти объекты являю ю я локальны м и по отнош ению
к этому блоку области действия. И мена локальны х объектов разделены на классы (см.
табл. 14.1). Блок области действия является одним из следую щ их выражений:
■ О пределением производного типа.
■ Телом интерфейса процедуры (исклю чая лю бы е определения производного типа и т е ­
ла интерфейсов, содерж ащ ихся внутри нег о).
■ Программной единицей или подпрограмм ой (исклю чая лю бы е определения п рои з­
водного типа, тела интерфейса и подпрограмм ы , содерж авш иеся внутри него).
■ Блок области действия, который непосредственно окружает другой блок области дей ­
ствия, называется блоком области действия хоста. Именованные объекты внутри блока
области действия хоста доступны для влож енного блока области действия связы вани­
ем хостом (см. "С вязы вание хостом и использованием ").
Как только объект объявлен в блоке области действия, его имя м ож ет использоваться
повсюду в этом блоке области действия. О бъект, объявленны й в другом блоке области
действия, является другим объектом, даж е если он имеет то же самое имя и свойства.
Внутри блока области действия, локальное имя объекта, которое не является ро до ­
вым, долж но быть уникальны м внутри его класса. О днако имя локального объекта в о д ­
ном классе мож ет использоваться, чтобы идентифицировать локальны й объект другого
класса.
Внутри блока области действия, родовое имя м ож ет быть тем же, что и лю бое из имен
процедур в блоке интерфейса.
Имя компонента имеет ту же область действия, что и производный тип, компонентом
которого он является. О но м ож ет появиться только внутри указателя компонента струк­
туры этог о типа.
Имя объекта утверж дения м ож ет такж е быть именем глобального или локального
объекта в том же самом блоке области действия; в этом случае имя интерпретируется
внутри утверждения как имя из объекта утверж дения.
Блоки области действия м огут содерж ать другие блоки области действия. Н априм ер,
следую щ ий пример показы вает ш есть блоков области действия:
MODULE M0D_1 ! Блок области действия 1
! Блок области действия 1
408 С j l А 1гашн, В В Кондратьев Нрограинрование на Visual FORTRAN

CONTAINS ! Блок области действия 1


FUNCTION FIRST ! Блок области действия 2
TYPE NAME ! Блок области действия 3
! Блок области действия 3
END TYPE NAME ! Блок области действия 3
! Блок области действия 2
CONTAINS ! Блок области действия 2
SUBROUTINE SUB В ! Блок области действия 4
TYPE PROCESS ! Блок области действия 5
! Блок области действия 5
END TYPE PROCESS ! Блок области действия 5
INTERFACE ! Блок области действия 5
SUBROUTINE SUB_A [ Блок области действия 6
! Блок области действия 6
END SUBROUTINE SUB_A ! Блок области действия 6
END INTERFACE ! Блок области действия 5
END SUBROUTINE SUB_B ! Блок области действия 4
END FUNCTION FIRST ! Блок области действия 2
END MODULE ! Блок области действия 1

14.2. Однозначные родовые процедурные ссылки


Когда сделана родовая процедурная ссылка, вызывается собственная процедура. Если
будут использоваться следую щ ие правила, го родовая ссылка будет однозначна:
Внутри блока области действия 2 процедуры, которые имеют' одно и то же родовое
имя, долж ны бы ть подпрограмм ам и (или функциями). О дна из процедур долж на иметь
обязательны й ф орм альны й аргумент, который является одним из следую щ их выражений:
■ Не присутствует как позиционный или ключевой параметр в другом списке параметров.
■ П рисутствует, но имеет другой тип и родовые параметры или ранг.
В нутри блока области действия 2 процедуры, которые имею т одинаковый родовой
оператор, долж ны иметь одинаковое число параметров или определять назначение. Одна
из процедур долж на иметь ф орм альны й api умен т, к о ю р ы й соот ветст вует позицией в
списке параметров ф орм альному аргум енту другой процедуры, которая имеет другой тип
и родовы е параметры или ранг.
Когда блок интерфейса расш иряет встроенную процедуру, оператор или назначение,
прим еняю тся правила, как будто встроенная подпрограмм а состоит из коллекции собст­
венных процедур, одна для каж дого допустим ого набора параметров.
Когда к родовой процедуре получаю т доступ из м одуля, правила применяю тся ко
всем собственны м версиям, даж е если некоторы е из них недоступны при помощи своих
собственны х имен.

14.3. Разрешение процедурных ссылок


Имя процедуры в процедурной ссы лке или устанавливается, чтобы быть родовым или
собственны м , или не устанавливается. П равила для разреш ения процедурной ссылки о т­
личаю тся в зависим ости от того, установлена ли процедура и как она установлена.

Ссылки на родовые имена


Внутри блока области действия имя процедуры устанавливается как родовое, если
лю бое из следую щ их утверж дений - истинно:
■ Блок области действия содерж ит блок интерфейса с тгим именем процедуры.
■ Имя процедуры соответствует имени родовой b c i роенной процедуры и оно указано с
атрибутом IN TR IN SIC в этом блоке области действия.
Глава 14. Область действии и связывание 409
■ Имя процедуры установлено, чтобы бы ть родовым в м одуле, и блок области действия
содерж ит утверж дение USE, делаю щ ее доступны м имя процедуры.
■ Блок области действия не содерж ит никаких объявлений для этого им ени процедуры,
но имя процедуры установлено, чтобы бы ть родовым в блоке области действия хоста.
Чтобы разреш ить ссылку на имя процедуры, установленное как родовое, использую т­
ся правила в порядке, который приводим.
1. Если блок интерфейса с этим именем процедуры появляется в одном из следую щ их
утверждений, ссы лка к собственной процедуре, обеспечиваю щ ей этот интерфейс:
■ в блоке области действия, который содерж ит ссылку;
■ в модуле, ставш ем доступным при пом ощ и утверж дения U SE в блоке области дей ­
ствия;
■ ссылка долж на быть совместим ой с одним из собственны х интерф ейсов блока ин­
терфейса.
2. Если имя процедуры указано с атрибутом IN TR IN SIC в одном из следую щ их ссы ­
лок к этой встроенной процедуре:
■ в том же самом блоке области действия;
■ в модуле, ставш ем доступны м при помощ и утверж дения USE в блоке области д ей ­
ствия;
■ ссылка долж на бы ть совместим ой с интерфейсом этой встроенной процедуры.
3. Если следую щ ее утверж дение - истинно, ссы лка разреш ается, прим еняя правила 1
и 2 к блоку области действия хоста:
■ имя процедуры установлено как родовое в блоке области действия хоста;
■ есть соглаш ение между блоком области действия и блоком области действия хоста
относительно того, является процедура именем подпрограм м ы или функции.
4. Если ни одно из предыдущ их правил неприм еним о, ссы лка долж на бы ть к родовой
встроенной процедуре с этим именем. Ссы лка долж на бы ть совм естим ой с интерфейсом
этой встроенной процедуры.
Пример
Следую щ ий пример показывает, как м одуль м ож ет определить 3 разделительны х
процедуры, а основная программа дает им родовое имя D U P через блок интерфейса. Х отя
основная програм ма вызывается всеми тремя родовы м и им енам и, нет никакой двусм ы с­
ленности, так как параметры имею т разны е типы данны х, и D U P - функция, а не подпро­
грамма. М одуль UN M O D долж ен дать каж дой процедуре другое имя.
MODULE U N J/I0D
!
CONTAINS
subroutine dup1(x,y)
real x,y
print * ,' Действительные параметры', x, у
end subroutine dupl
subroutine dup2(m,n)
integer m,n
print * ,' Целочисленные параметры’, m, n
end subroutine dup2
character function dup3 (z)
character(len=2) z
dup3 = 'Строковый параметр'// z
end function dup3
END MODULE
410 СД А пгазин, В В. Кондратьев, Програмирование на Visual FORTRAN

program unclear
!
! показывает, как использовать родовые процедурные ссылки
USE U N J/IO D
INTERFACE DUP
MODULE PROCEDURE dupl, dup2, dup3
END INTERFACE
real a.b
integer c,d
character (len=2) state
a = 1.5
b = 2.32
с=5
d = 47
state = 'WA'
call dup(a.b)
call dup(c.d)
print *, dup(state) фактический вывод - только 'S'
END
О братите внимание, что функция DUP3 печатает ю л ь к о 1 символ, гак как модуль,
U N M O D не устанавливает никакого параметра длины для ф ункционального результата.
Если бы ф орм альны е аргум енты х и у для DUP были объявлены как целые числа вм е­
сто вещ ественны х чисел, то лю бы е вызовы в DUP были бы неоднозначными. Если дело
о бстоит так, компиляция заканчивается с ош ибкой.
О пределения подпрограмм DUP1, DUP2 и DUP3 долж ны иметь разны е имена. Родо­
вое имя указы вается в первой линии блока интерфейса и в примере - эго DUP.

14.4. Ссылки на собственные имена


В блоке области действия, имя процедуры устанавливается как собственное, если оно
не установлено как родовое, и лю бое из следую щ их утверж дений - истинно:
■ Блок области действия содерж ит гело интерфейса с этим именем процедуры.
■ Блок области действия содерж ит внутренню ю процедуру, процедурный модуль или
ф ункцию утверж дения с этим именем процедуры.
■ Имя процедуры является тем же самым что и имя родовой встроенной процедуры,
и оно указано с атрибутом IN TR IN SIC в этом блоке области действия.
■ И мя процедуры указанно с атрибутом EX TER N A L в этом блоке области действия.
■ Имя процедуры устанавливается как собственное в модуле, и блок области действия
содерж ит утверж дение USE, делаю щ ее это имя процедуры доступным.
■ Блок области действия не содерж ит никаких объявлений для этого имени процедуры,
но имя процедуры устанавливается как собственное в блоке области дейст вия хоста.
Ч тобы разреш ить ссы лку на имя процедуры , установленное как собственное, исполь­
зую тся следую щ ие правила в порядке, который приведен здесь:
1. Если лю бое из следую щ их утверж дений - истинно, формальный аргум ент является
ф орм альной процедурой и ссы лка к этой ф орм альной процедуре:
■ Блок области действия является подпрограмм ой и он содержит тело интерфейса с
этим именем процедуры .
■ И мя процедуры бы ло объявлено EX TER N A L и имя процедуры является формальным
аргум ентом этой подпрограм м ы . П роцедура, вы зы ваем ая ссылкой, поставляется как
соответствую щ ий ф актический параметр.
Глава 14. Обтаешь действия и связывание 411
2. Если блок области действия содерж ит тело интерф ейса или имя п роцедуры бы ло
объявлено EX TER N A L и правило 1 неприм еним о, ссылка к внеш ней процедуре с этим
именем.
3. Если блок области действия содерж ит внутренню ю процедуру или ф ункцию у т­
верждения с этим именем процедуры, ссылка к этому объекту.
4. Если имя процедуры было объявлено INTRIN SIC в блоке области действия, ссы лка
к встроенной процедуре с этим именем.
5. Если блок области действия содерж ит утверж дение U SE, которое делает имя про­
цедурного модуля доступны м , ссылка к этой процедуре. (У тверж дение U SE допускает
переименование, таким образом имя, на которое ссы лаю тся, м ож ет отличаться от имени
процедурного модуля.)
6 . Если ни одно из предыдущ их правил неприм еним о, ссы лка разреш ается, прим еняя
эти правила к блоку области действия хоста.

14.5. Ссылки на неустановленные имена


В блоке области действия имя процедуры считается неустановленны м , если оно не
определяется как родовое или собственное.
Чтобы разреш ить ссылку на имя процедуры, которое не установлено, используется
следую щ ие правила в порядке, который приведен здесь:
1. Если оба из следую щ их утверж дений - истинны, ф орм альны й аргум ен т является
формальной процедурой и ссы лка к этой формальной процедуре:
■ Блок области действия является подпрограмм ой.
■ Имя процедуры является форм альным аргум ентом этой п одпрограм м ы . П роцедура,
вызываемая ссылкой, поставляется как соответствую щ ий ф актический параметр.
2. Если оба из следую щ их утверж дений - истинны, процедура является встроенной
процедурой и ссылка к этой встроенной процедуре:
■ Имя процедуры соответствует имени встроенной процедуры .
■ Есть соглаш ение между определением встроенной процедуры и ссы лкой к имени как
функции или подпрограмме. Если ни одно из преды дущ их правил неприм еним о,
ссы лка к внеш ней процедуре с этим именем.

14.6. Связывание
С вязывание разреш ает получить доступ разным програм мны м единицам к том у же
самому значению через различные имена. О бъекты является связанны м и, когда каж дый
является связанным с тем же самы м м естополож ением памяти.
Есть 3 вида связывания:
■ связывание имени,
■ связывание указателя,
■ связывание памяти.
П ример показывает связывание имени, указателя и памяти м еж ду внеш ней п рограм м ­
ной единицей и внеш ней процедурой.
! Блок области действия 1: Внешняя программная единица
REAL А, В(4)
REAL, POINTER :: М(:)
REAL, TARGET :: N(12)
COM M O N/СОМ/...
EQUIVALENCE (A, B(1)) ! Связывание памяти между А и B(1)
М => N ! Связывание указателя
CALL Р (actual-arg,..)
412 С. Д Алгазин, В В Кондратьев Программирование на Visual FORTRAN

! Блок области действия 2: Внешняя процедура


SUBROUTINE Р (dummy-arg,...) ! Связь
Связывание имени и памяти между
! этими параметрами и параметрами
! подпрограммы вызова в блоке области действия 1
COMMON /СОМ/... ! Связывание памяти с общим блоком СОМ
! в блоке области действия 1
REAL Y
CALL Q (actual-arg,...)
CONTAINS
SUBROUTINE Q (dummy-arg,...) • Связывание имени и памяти этими параметрами и параметрами
! подпрограммы вызова в процедуре хоста
! Р (подпрограмма О имеет связывание хостом с процедурой Р)
Y = 2.0*(Y-1.0) ! Связывание имени с У в процедуре хоста Р

14.7. Связывание имени


Связы вание имени разреш ает получить доступ к объекту из различных блоков области
действия при пом ощ и того же самым имени или других имен. Есть 3 типа связывания
имени: парам етром , использованием и хостом.

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

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


Связывание использованием допускает доступность объектов в модуле для других
блоков области действия. М еханизм ом для связывания использованием является утвер­
ждение USE. У тверж дение USE обеспечивает доступ ко всем общ им объектам в модуле,
если не указан ONLY. В этом случае можно получить доступ только к объектам, назван­
ным в списке O N LY .
Связывание хост ом допускает доступность объектов в блоке области действия хоста
для внутренней процедуры , определений производного типа или процедурного модуля,
содерж ащ ихся внутри хоста. О бъекты , к которым получаю т доступ, являю тся известны­
ми под тем же самы м именем и им ею т те же самы е атрибуты, что и в хосте. О бъекты, ко­
торы е являю тся локальны м и по отнош ению к процедуре, недоступны для ее хоста.
Связы вание хостом или использованием остается в силе в течение выполнения вы ­
полняем ой програм мы . Если объект, к которому получаю т доступ связыванием исполь­
зованием, им еет то же самое неродовое имя что и объект хоста, объект хоста недоступен.
Имя, которое появляется в блоке области действия как внеш нее имя в утверждении
EX TER N A L, является глобальны м именем, и лю бой объект хоста, который имеет это имя
как неродовое имя, недоступен.
Тело интерф ейса не п олучает доступа к именованным объектам связыванием хостом,
но он мож ет получить доступ к объектам связыванием использованием.
Если процедура получает доступ к указателю связы ванием хостом, связывание указа­
теля с адресатом, которы й является текущ им в то время, когда вызывается процедура, ос­
i'iaea 14 0 6 и KWh дейс теня н связывание 413
тается текущ им внутри процедуры . Это связы вание указателя м ож ет бы ть изм енено
внутри процедуры. П осле вы полнения процедуры, связы вание указателя остается теку ­
щим, если выполнение процедуры не заставило адресат стать неопределенны м . Если это
происходит, хост связался, указатель становится неопределенным.
Примечание. Неявные объявления м огут явиться причиной проблемы для связывания хостом.
Рекомендуется использовать IM P L IC IT N O N E в хосте и в содержащейся процедуре и явно объявлять
все объекты. Когда все объекты явно объявлены, локальные объявления отменяют объявления хоста,
а объявления хоста, которые не отменены, доступны в содержащейся процедуре.
Следую щ ий пример показывает связы вание хостом и использованием:
MODULE SHARE_DATA
REAL Y, Z E N D MODULE
PROGRAM DEMO
USE SHARE_DATA ! Все объекты в SHARE_DATA доступны
REAL В, Q ! через связывание использованием.

CALL CONS (Y)


CONTAINS
SUBROUTINE CONS (Y) ! Y - локальный объект (формальный аргумент).
REAL С, Y ...
Y =B+C+Q +Z ! В и Q доступны через связывание хостом.
! С - локальный объект, явно объявленный.
END SUBROUTINE CONS ! Z доступен через связывание использованием.
END PROGRAM DEMO

Связывание указателя
Указатель может бы ть связан с адресатом. В разное время в течение вы полнения про­
граммы, указатель м ож ет бы ть неопределенны м , связанны м с другим и адресатам и или
разъединенным. Н ачальное состояние связы вания указателя является неопределенны м .
Указатель может стать связанны м следую щ им образом:
■ Н азначением указателя (указатель => адресат). А дресат долж ен бы ть связан или ука­
зан с атрибутом TA RG ET. Если адресат распределяемы й, он долж ен бы ть в н астоя­
щее время распределенным.
■ Распределением (успеш ное выполнение утверж дения A L LO C A T E ) У тверж дение
A LLO CATE долж но ссы латься на указатель.
Указатель становится разъединенны м , если возникает лю бое из следую щ их условий:
■ Указатель аннулирован утверж дением N U LLIFY .
■ У казатель освобож ден утверж дением D EA LLO CA TE.
■ Указателю назначен разъединенны й указатель (или встроенная функция N U LL).
Когда указатель связан с адресатом , состояние определения указателя - определен ­
ный или неопределенный, в зависим ости от состояния определения адресата. А дресат яв­
ляется неопределенным в следую щ их случаях:
■ Если он никогда не распределялся.
■ Если он не освобож ден через указатель.
■ Если утверждение RETU RN или END заставляет его стать неопределенны м .
■ Если указатель связан с определяемы м адресатом, состояние определения указателя
может быть определенным или неопределенны м , согласно правилам для переменной.
■ Если состояние связы вания указателя - разъединенное или неопределенное, на указа­
тель нельзя сослаться или освободить.
Н езависимо от св о ею состояния связы вания указатель всегда м ож ет аннулироваться,
распределяться или связываться с адресатом. Когда указатель аннулирован, он становится
414 С. Д Алгазин, В В К ондрат ьев П р о гр а и и р о ва п и е на Visual FORTRAN

разъединенны м . Когда указатель распределен, он становится связанны м, но неопреде­


ленным. К огда указатель связан с адресатом, его связы вание и состояние определения
определяю тся его адресатом.

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

14.8. Блоки памяти и последовательность памяти


Блок памяти - это ф иксированны й блок физической памяти, распределенной некото­
рым данным. Последовательность памяти - это последовательность блоков памяти.
Размер последовательности памяти - число блоков памяти в последовательности памяти.
Блок памяти м ож ет бы ть числовым, сим вольны м или неопределенным.
Н еуказательны й скаляр значения по ум олчанию действительного, целочисленного
или логического типа занимает 1 числовой блок памяти. Н еуказательный скаляр типа
действительного удвоенной точности или ком плексного числа по умолчанию занимает 2
непрерывны х числовых блока памяти. В Intel Fortran один числовой блок памяти соот­
ветствует 4 байтам памяти.
Н еуказательны й скаляр сим вольного типа по ум олчанию с символьной длиной 1 за­
ним ает блок памяти в 1 символ. Н еуказательны й скаляр сим вольного типа по умолчанию
с сим вольной длиной len занимает len непреры вны х сим вольны х блоков памяти. В Intel
Fortran блок памяти в 1 символ соответствует 1 байту памяти.
Н еуказательны й скаляр не принимаем ого но ум олчанию типа данных занимает от­
дельны й неопределенны й блок памяти. Число байтов, соответствую щ их неопределенно­
му блоку памяти, различается в зависимости от типа данных.
Табл. 14.2 перечисляет требования к памяти для встроенны х типов данных.

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


Тип данных Требования к памяти, байт
BYTE 1
LOGICAL 2 ,4 или 8 1
L0GICAL(1) 1
L0GICAL(2) 2
L0GICAL(4) 4
L0GICAL(8) 8
INTEGER 2 ,4 или 8 1
INTEGER(1) 1
INTEGERS) 2
INTEGERS) 4
IN TE G E R ® 8
REAL 4 ,8 или 1 6 2
REAL(4) 4
DOUBLE PRECISION 8
REAL(8) 8
REAL(16) 16
COMPLEX 8 ,1 6 или 3 2 2
C0MPLEX(4) 8
DOUBLE COMPLEX 16
Г лава 14 О бласт ь дейст вия и связы вание 415
Тип данных Требования к памяти, байт
C OM PLEX® 16
C0MPLEX(16) 32
CHARACTER 1
CHARACTERS len3
CHARACTERS*) предполагаемая длина4 .
1 В зависимости от целочисленного типа по умолчанию, LOGICAL и INTEGER могут иметь 2 ,4 или 8 байт. Распределение по
умолчанию - 4 байта.
2 В зависимости от действительного типа по умолчанию, REAL может иметь 4 ,8 или 16 байт, a COMPLEX может иметь 8 ,1 6
или 32 байта. Распределение по умолчанию: 4 байта для REAL и 8 байт для COMPLEX.
3 Значение len - указанное число символов. Наибольшее допустимое значение - 2**31-1 на процессорах IA -32,2 ** 63-1 на
процессорах Intel Itanium. Отрицательные значения обрабатываются, как нуль.
4 Формат предполагаемой длины * (*) применяется к утверждениям PARAMETER, формальным аргументам или символь­
ным функциям и указывает, что используется длина фактического параметра или функции (см. разд. 7.11).

Н еуказательный скаляр последовательности производного типа заним ает ряд после­


довательное гей памяти, соответствую щ их компонентам структуры , в порядке, в котором
они появляются в определении производного типа. (П роизводны й тип последовательно­
сти имеет утверждение SEQ U E N C E .)
Указатель занимает отдельны й неопределенны й блок памяти, который отличается от
блока лю бого неуказательного объекта и отличается для каж дой комбинации типа, п ара­
метров типа и ранга.
Состояние определения и значение объекта данных воздействую т на состояние опре­
деления и значение лю бого связанного пам ятью объекта.
Когда 2 объекта занимаю т одну и ту же последовательность памяти, они полностью
связаны памятью. Когда 2 объекта заним аю т части одной и той же последовательности
памяти, они частично связаны. У тверж дение EQ U IV A LEN C E, утверж дение CO M M O N
или утверждение EN TRY м огут явиться причиной полного или частичного связывания
памяти последовательностей памяти.

14.9. Связывание массива


Неуказательный м ассив заним ает последовательность непрерывны х последовательно­
стей памяти, по одной для каж дого элем ента м ассива в порядке элем ентов массива.
Д ва или больше массива связаны, когда каждый связан с тем же самы м м естополож е­
нием памяти. Они частично связаны, если часть памяти, связанной с одним массивом,
является тем же, что и часть или вся память, связанная с другим массивом.
Если массивы с различными типам и данны х связаны (или частично связаны ) с одним
м естоположением памяти и значение одного м ассива определенное (наприм ер, назначе­
нием), значение д р у го ю м ассива становится неопределенным. Это случается, потому что
элемент массива считаю т определенны м , только если память, связанная с ним, содерж ит
данные того же типа, что и имя массива.
Элемент массива, секция м ассива или весь массив определяю тся утверж дением D ATA
перед выполнением программы . (С войства м ассива долж ны бы ть объявлены в предш ест­
вующем описании.) Во время вы полнение программы , элементы м ассива и секции опре­
деляю тся назначением или утверж дением ввода, а весь м ассив определяется утверж де­
ниями ввода.
Приложение А. Удаленные и устаревающие
языковые возможности

Fortran 90 идентифицировал некоторы е возм ож ности Fortran 77 как устареваю щ ие.


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

А-1. Удаленные языковые возможности в Fortran 95


Н екоторы е язы ковы е возм ож ности, которы е рассм атриваю тся как избыточные в For­
tran 77, не вклю чены в Fortran 95. О днако они все ещ е полностью поддерж иваю тся Intel
Fortran:
■ A SSIG N и назначенны е утверж дения GO ТО.
■ Н азначенны й специф икатор FO RM A T.
■ П ереход к утверж дению END IF снаруж и блока IF.
■ О писатель редактирования Н.
■ У тверж дение PAUSE.
■ Д ействительны е и удвоенной точности DO перем енны е управления и выражения
управления цикла DO.

А-2. Устаревающие языковые возможности


в Fortran 95
Н екоторы е язы ковы е возмож ности, считаем ы е избы точны ми в Fortran 90, идентифи­
цированы как устареваю щ ие в Fortran 95.
Д ругие методы предлагаю тся, чтобы добиться функционирования следую щ их устаре­
ваю щ их возм ож ностей.
Дополнительные возвращения. Д ля замены этой возмож ности рекомендуется ис­
пользовать целочисленную переменную , чтобы возвращ ать значение вызываю щ ей про­
грам ме и позволить вызываю щ ей програм ме использовать конструкцию CA SE для про­
верки этого значения и выполнения нужных операций (см. разд. 6.3).
Арифметический IF. Чтобы зам енить эту возм ож ность, рекомендуется использовать
утверж дение или конструкцию 1F (см. разд. 6.10).
Функции символьного типа предполагаемой длины. Чтобы заменить эту возмож ­
ность, реком ендуется использовать:
■ автом атическую функцию сим вольной длины , где длина функционального результата
объявляется в выраж ении спецификации;
■ подпрограм м у, параметры которой соответствую т функциональном у результату и
ф ункциональны м параметрам.
Ф орм альны е аргум енты функции м огут все ещ е предполагать символьную длину; эта
возм ож ность не является устареваю щ ей.
CHARACTER*(*) формат объявления CHARACTER. Чтобы заменить эту возмож ­
ность, реком ендуется использовать ф орм аты Fortran 90 для определения селектора длины
в объявлениях CH A RA CTER .
/т о т т 416
П/ипожения 417
Вычисляемое утверждение GO ТО. Чтобы заменить эту возм ож ность, реком ендует­
ся использовать конструкцию CA SE (см. разд. 6.3).
Утверждения DATA среди выполнимых утверждений* Эта возм ож ность была
вклю чена, начиная с Fortran 66, но, как полагаю т, является источником потенциальны х
ошибок.
Фиксированный исходный формат. Более новые м етоды ввода данны х сделали этот
исходный ф орм ат устареваю щ им и подверж енны м ош ибкам . Реком ендуем ы й метод для
кодирования долж ен использовать свободный исходный ф орм ат (см. разд. 13.31).
Разделяемое завершение DO и завершение па утверждении, отличном от END
DO или CONTINUE. Чтобы заменить эту возм ож ность, реком ендуется использовать у т­
верждение END DO или утверж дение CO N T IN U E (см. разд. 6.4).
Функции утверждения. Чтобы заменить эгу возм ож ность, реком ендуется использо­
вать внутренню ю функцию (см. разд. 7.10).

А-З. Устаревающие языковые возможности в Fortran 90


Fortran 90 не удалил ни одной из возм ож ностей Fortran 77, но некоторы е из возм ож ­
ностей Fortran 77 были идентифицированы как устареваю щ ие.
Д ругие методы предлагаю тся, чтобы добиться функционирования следую щ их устаре­
вающ их возможностей.
Дополнительное возвращение (метки в списке параметров). Чтобы заменить эту
возможность, реком ендуется использовать целочисленную перем енную , чтобы возвра­
тить значение к вызываю щ ей програм ме, и позволить вы зы ваю щ ей програм м е проверить
это значение и выполнять операции, используя вы числяем ое утверж дение GO ТО или
конструкцию CA SE (см. разд. 6.3).
Арифметический IF. Чтобы заменить эту возм ож ность, реком ендуется использовать
утверж дение или конструкцию 1F.
ASSIGN и назначенные утверждения GO ТО. Эти утверж дения обы чно использу­
ются, чтобы м оделировать внутренние процедуры (см. разд. 7.10), которы е теперь могут
бы ть закодированы непосредственно.
Назначенный спецификатор FORMAT (метка утверждения FORMAT назнача­
ется целочисленной переменной). Чтобы заменить эту возм ож ность, реком ендуется ис­
пользовать сим вольны е выраж ения для определения специф икации ф орм ата (см.
разд. 10.1).
Переход к утверждению END IF снаружи блока IF. Чтобы зам енить эту возм ож ­
ность, реком ендуется выполнять переход к утверж дению , следую щ ем у за утверж дением
END IF (см. разд. 6.10).
Описатель редактирования Н. Чтобы заменить эту возм ож ность, реком ендуется ис­
пользовать описатель редактирования сим вольной константы.
Утверждение PAUSE. Чтобы заменить эту возм ож ность, реком ендуется использо­
вать утверж дение REA D , которое ждет ввода данных (см. разд. 9.15).
Действительные и удвоенной точности DO переменные управления и выражения
управления циклом DO. Чтобы заменить эту возм ож ность, реком ендуется использовать
целочисленны е DO переменные и выраж ения (см. разд. 6.5).
Разделяемое завершение DO и завершение на утверждении отличном от END DO
или CONTINUE. Чтобы заменить эту возм ож ность, реком ендуется использовать утвер­
ждение END DO или утверж дение C O N TIN U E (см. разд. 6.4).
418 С Д. Ачгазин, В. В. К о н д р а т ьев П рогралш рование на Visual FORTRAN

Приложение В. Дополнительные
возможности языка

Чтобы облегчать совм естим ость со старыми версиями, Intel Fortran обеспечивает до­
полнительны е язы ковы е возм ож ности. Эти язы ковы е возможности особенно полезны
при перенесении стары х програм м Fortran в Fortran 95/90. О днако вы долж ны избежать
использования их в новых програм м ах на этих системах и в новых программах, для кото­
ры х взаим озам еняем ость с другой реализацией Fortran 95/90 является важной.

В-1. Утверждение DEFINE FILE


У тверж дение D E FIN E FIL E устанавливает размер и структуру файлов с родственной
организацией и связы вает их с логическим номером устройства. У тверж дение D EFIN E
FILE сопоставим о утверж дению O PEN . В ситуациях, где вы можете использовать утвер­
ж дение O PEN , O PEN является предпочтительны м механизмом для создания и открытия
файлов.
У тверж дение D EFIN E FILE им еет следую щ ий формат:
DEFINE FILE u(mt n, Ц asv) [, u(mt nt Ц asv)]..
где и - скалярная целочисленная константа или переменная, которая указы вает логиче­
ский номер устройства; т - скалярная целочисленная константа или переменная, которая
указы вает число записей в файле; п - скалярная целочисленная константа или перем ен­
ная, которая указы вает длину каж дой записи в 16-разрядных словах (2 байта).
¿У указывает, что файл неф орм атны й (двоичный); он допустим только в этой позиции.
asv является скалярной целочисленной переменной, называемой связанной перемен­
ной файла. В конце каж дой операции ввода/вы вода прямого доступа номер следую щ ей
более высокой пронум ерованной записи в файле назначается asv. asv не долж ен быть
ф орм альны м аргум ентом .
Правила использования
У тверж дение D E FIN E FILE указы вает, что файл, содерж ащ ий т записей ф иксирован­
ной длины , каж дая из которы х составлена из п 16-разрядных слов, сущ ествует (или будет
сущ ествовать) на указанном логическом устройстве. Записи в файле пронумерованы по­
следовательно от 1 до т.
У тверж дение D EFIN E FILE сам остоятельно не откры вает файл. О днако утверждение
долж но вы полниться перед первы м утверж дением ввода/вы вода прямого доступа, обра­
щ аю щ им ся к указанном у файлу. Ф айл откры вается, когда утверж дение ввода/вывода вы­
полняется.
Если это утверж дение ввода/вы вода - утверж дение п р ям о ю доступа W RITE, откры ­
вается последовательны й файл или создается в случае необходимости.
Если утверж дение ввода/вы вода - REA D или FIN D , открывается сущ ествую щ ий
файл. Если файл не сущ ествует, происходит ош ибка.
У тверж дение D E FIN E FILE устанавливает переменную asv как связанную перемен­
ную файла. В конце каж дой операции ввода/вы вода прямого доступа системы вво­
да/вы вода Fortran в asv разм ещ ается номер записи немедленно после чтения или записи.
Связанная перем енная всегда указы вает на следую щ ую последовательную запись в
файле (если связанная перем енная не переопределена назначением, вводом или утвер­
ж дением FIN D ). Так, утверж дения ввода/вы вода прямого доступа могут выполнять но-
Приложении 419
следовательную обработку в файле при использовании связанной перем енной файла как
спецификатора номера записи.
Пример
В этом примере утверж дение D E FIN E FILE указы вает, что логическоей устройство 3
долж но быть связано с файлом из 1000 записей ф иксированной длины ; каж дая запись -
длины сорок восемь 16-разрядных слов. Записи пронум ерованы последовательно от 1 до
1000 и они - неформатные. П осле каж дой операции ввода/вы вода прям ого доступа с
этим файлом целая переменная N REC будет содерж ать ном ер следую щ ей записи, после
только что обработанной.
D EFIN E FILE 3( 1000,48,U,NREC)

В-2. Утверждения ENCODE и DECODE


У тверж дения EN CO D E и D ECO D E преобразовы ваю т данны е и п ередаю т их между
переменными или массивами во внутренней памяти. У тверж дение E N C O D E преобразо­
вывает данные из внутреннего (двоичного) ф орм ата в сим вольны й формат. У тверж дение
D ECO D E преобразовы вает данны е из сим вольного во внутренний формат. Эти у твер ­
ждения сопоставимы по использованию внутренних ф айлов в форм атны х п оследова­
тельных утверждениях соответственно W R ITE и REA D .
У тверж дения EN CO D E и D ECO D E имею т следую щ ие ф орм аты :
ENCODE (с, f, Ь [, \0 S m = i- v a r \ [, ERR =label\) [io-Hsf\
DECODE (с, f, b [, IOSTAT=/-var] [, ERR =label\) [ ю Щ
где с - скалярное целочисленное выражение. В утверж дении E N C O D E с - число си м во­
лов (в байтах), для преобразования к сим вольному форм ату. В утверж дении D ECO D E,
с - число символов, которое будет оттранслировано к внутреннем у формату.
/ - спецификатор формата. П роисходит ош ибка, если указана больш е чем одна запись.
b - ссылка на скаляр или массив. Если b - ссы лка на м ассив, его элем енты обрабаты ­
ваю тся в порядке увеличения нижнего индекса.
В утверждении EN CO D E b получает сим волы после преобразования к внеш нему
формату. Если получено м еньш е чем с сим волов, остаю щ иеся сим вольны е позиции за­
полняю тся пробелами. В утверждении D EC O D E b содерж ит сим волы , которы е будут от­
транслированы к внутреннему формату.
i-var является скалярной целочисленной переменной, которой назначается полож и­
тельное целое число, если возникает ош ибка, и - нуль, если ош ибки нет (см. разд. 9.8).
label является меткой вы полним ого утверж дения, которое получает управление, если
происходит ошибка.
io-list является списком ввода/вы вода (см. разд. 9.12).
В утверждении EN CO D E список содерж ит данны е, которы е будут оттранслированы к
символьному формату. В утверж дении D ECO D E список получает данны е после п реобра­
зования к внутреннему формату.
Взаимодействие между специф икатором форм ата и списком ввода/вы вода - то же,
что и в утверждениях форм атного ввода/вывода.
Правила использования
Число символов, которое могут' преобразовать утверж дение EN C O D E или D ECO D E,
зависит от типа данных Ь. Н апример, массив 1NTEGER(2) м ож ет содерж ать 2 сим вола в
элементе так, что м аксимальное число сим волов равно удвоенном у числу элем ентов
в этом массиве.
420 С. Д . А чгазин, В В К он драт ьев П рограм ирование на Visual FO RTRAN

М аксим альное число сим волов, которое мож ет содерж ать сим вольная переменная или
сим вольны й элем ент м ассива, является длиной символьной переменной или символьного
элем ента м ассива.
М аксим альное число сим волов, которое может содерж ать символьный массив, - это
длина каж дого элем ента, ум нож енная на число элементов.
Примеры
В следую щ ем прим ере утверж дение D ECO D E преобразовы вает 12 сим волов из А к
целочисленном у форм ату (как указано утверж дением FORM A T):
DIMENSION К(3)
C H A R A C T E R S А,В
DATA А/'123456789012'/
DECODE(12,100,A) К
100 F0RMAT(3I4)
ENCODE(12,100,B) К(3), К(2), К(1)
12 символов сохранены в массиве К:
К(1) = 1234
К (2 )= 5678
К(3) = 9012
У тверж дение E N C O D E преобразовы вает значения К (3), К (2) и К (1) к символьному
ф орм ату и хранит сим волы в сим вольной переменной В:
В = '901256781234'

В-З. Утверждение FIND


У тверж дение FIN D позиционирует файл прямого доступа на указанную запись и ус­
танавливает связанную перем енную файла к этому номеру записи. О но сопоставимо ут­
верж дению R EA D прям ого доступа без списка ввода/вывода, и оно может открыть сущ е­
ствую щ ий файл. Н икакой передачи данны х нет.
У тверж дение FIN D имеет один из следую щ их форматов:
FIND ([UNIT=]io-unit, REC=r[, ERR=label\ [, IOSTAT=/-i/ar]).
FIND (io-unit'rl ERR=label\ [, IOSTAT=mfar]).
где io-unit - логический ном ер устройства, которое долж но относиться к соответствую ­
щ ей структуре ф айла (см. разд. 9.4).
v является номером записи прям ого доступа. Он не может быть м еньш е, чем единица,
или больш е чем число записей, определенны х для файла (см. разд. 9.7).
label является м еткой вы полним ого утверж дения, которое получает управление, если
п роисходит ош ибка.
i-var является скалярной целочисленной переменной, которой назначается положи­
тельное целое число, если возникает ош ибка, и - нуль, если ош ибки нет (см. разд. 9.8).
Примеры
У тверж дение F IN D позиционирует логическое устройство 1 на первую запись в фай­
ле. С вязанная перем енная ф айла устанавливается в единицу:
FIND(1,REC=1)
В следую щ ем прим ере утверж дение FIN D позиционирует файл на запись, идентифи­
цированную содерж им ом 1NDX. Связанная переменная файла устанавливается в значе­
ние INDX:
FIND(4, REC=INDX)
П рилож ения 421

В-4. Утверждение INTERFACE ТО


У тверж дение IN TERFA CE ТО идентиф ицирует подпрограмм у и ее ф актические па­
раметры прежде, чем на нее ссы лаю тся или она вызывается.
Утверж дение IN TER FA C E ТО им еет следую щ ий формат:
INTERFACE ТО subprogram-stmt
[formal-declarations]
END
где subprogram -stm t - функция или утверж дение объявления подпрограмм ы . Формальные
объявления (возмож ные) являю тся утверж дениям и объявления типа (вклю чая доп олн и ­
тельные атрибуты) для параметров.
Правила использования
Блок IN TERFA CE ТО бпределяет явны й интерфейс, но он содерж ит специф икации
только для процедуры, объявленной в утверж дении IN T E R FA C E ТО. Я вны й интерфейс
определяется только в програм мной единице, которая содерж ит блок IN T E R FA C E ТО.
Для того чтобы определять явны е интерфейсы, реком ендуется использовать блок
INTERFACE.
Пример
Допустим, что функция С, которая им еет следую щ ий прототип:
extern void Foo (int i);
Следую щ ий блок IN TER FA C E ТО объявляет вызов этой ф ункции из Fortran:
INTERFACE ТО SUBROUTINE Foo [C.ALIAS:'_Foo'] (I)
INTEGERS I
END

В-5. Интерпретация Fortran 66 утверждения EXTERNAL


Если вы указываете опцию ком пилятора, указы ваю щ ую семантику F ortran 66, утвер­
ждение EX TERNA L интерпретируется способом , который облегчает совм естим ость со
старыми версиями Fortran. (И нтерпретация Fortran 95/90 несовм естима с преды дущ ими
стандартами Fortran и преды дущ ими реализациям и Com paq*.)
Интерпретация Fortran 66 утверж дения E X TER N A L ком бинирует ф ункциональны е
возможности утверждения IN TR IN SIC с некоторыми из утверж дений EX TERNA L.
Это позволяет использовать подпрограм м ы как параметры к другим подпрограмм ам .
Подпрохраммы, которые использую тся как параметры, м огут бы ть или п ользовательски­
ми функциями, или библиотечны м и функции, Fortran 95/90.
У тверж дение EX TER N A L Fortran 66 им еет следую щ ий формат: E X TE R N A L [*]v [,
[*]v].~
Он показывает, что обеспеченная пользователем функция долж на прим енятьяс вместо
библиотечной функции Fortran 95/90, им ею щ ей то же самое имя. v является именем под­
программы или именем форм ального аргум ента, связанного с именем подпрограмм ы .
Правила использования
Утверж дение EX TER N A L Fortran 66 объявляет, что каж дое имя в его списке - это имя
внеш ней функции. Такое имя м ож ет затем использоваться как фактический параметр для
подпрограммы, которая затем м ож ет использовать соответствую щ ий форм альны й аргу­
мент в функциональной ссы лке или утверж дении CALL.
422 С Д. Апгазин, В. В К ондрат ьев Программирование на Visual FO RTRAN

О днако когда используется как параметр полная функциональная ссылка, она пред­
ставляет значение, а не имя подпрограмм ы ; наприм ер, SQRT (В) в CA LL SUBR (A, SQRT
(В), С). П оэтому эта функция не определена в утверж дении EX TER N A L (как было бы
для неполной ссылки - SQRT).
Пример
П оказы вает утверж дение EX TER N A L Fortran 66:
Основная программа П одпрограммы
EXTERNAL SIN, COS, *TAN, SINDEG SUBROUTINE TRIG(X,F,Y)
Y = F(X)
RETURN
END
CALL TRIG(ANGLE, SIN, SINE)

FUNCTION TAN(X)
TAN = SIN(X)/COS(X) CALL TRIG(ANGLE, COS, COSINE)
RETURN
END

CALL TRIG(ANGLE, TAN, TANGNT) FUNCTION SINDEG(X)


SINDEG=SIN(X*3.1459/180)
RETURN
END
CALL TRIG(ANGLED, SINDEG, SINE)
У тверж дения CA LL передаю т имя функции в подпрограмм у TRIG. Ф ункциональная
ссылка F(X) впоследствии вы зы вает функцию во втором утверж дении TRIG. В зависимо­
сти от того, какое утверж дение C A LL вы звало TRIG , второе утверж дение эквивалентно
одному из следую щ его:
= SiN (X )
= CO S(X )
= TA N (X )
= SiN D E G (X )
Ф ункции SIN и CO S - прим еры тригоном етрических функций, поставляемых в биб­
лиотеке Fortran 95/90. Ф ункция TAN такж е поставляется в библиотеке, но звездочка (*) в
утверж дении E X TE R N A L указы вает, что используется заданная пользователем функция
вместо библиотечной функции. Ф ункция SIN D EG - такж е заданная пользователем функ­
ция. П оскольку никакая библиотечная функция не им еет то же самое имя, звездочка не
требуется.

В-6. Альтернативный синтаксис


для утверждения PARAMETER
У тверж дение PA R A M ETER , обсуж даем ое здесь, подобно утверж дению , обсуж даемо­
му в разд. "А трибут и утверж дение P A R A M ET E R ”. О ни оба назначаю т имя константе.
О днако это утверж дение PA R A M ETE R им еет отличия:
■ Его список не ограничивается круглы м и скобками.
■ Ф орм ат константы, а не неявного или явного типа имени, определяет тип данных пе­
ременной.
Приюж ения 423
Это утверж дение P A R A M ET ER им еет следую щ ий формат:
PARAMETER с = ехрг [, с = ехрг]...
где с - имя константы; ехрг - инициализированное вы раж ение, м ож ет иметь лю бой тип
данных.

Правила использования
Каждое имя с становится константой и определено как значение вы раж ения ехрг. Как
только имя определено как константа, оно м ож ет появиться в лю бой позиции, в которой
допустима константа. Эф ф ект - тот же самы й, как будто константа бы ла написана там
вместо имени.
Имя константы не м ож ет появиться как часть другой константы, кроме как действи­
тельная или мнимая часть комплексной константы. Н апример:
PARAMETER 1=3
PARAMETER М=1.25 ! Не допустимо
PARAMETER N=(1.7 0 3 ,1) ! Допустимо
Имя, используемое в утверждении PA R A M ETER , идентифицирует только константу,
соответствую щ ую имени в этой программной единице. Такое имя м ож ет быть определе­
но только однажды в утверж дениях PA R A M ET E R внутри той же самой программной
единицы.
Имя константы принимает тип данны х соответствую щ его ей постоянного выражения.
Тип данных константы параметра не м ож ет бы ть указан в утверж дении объявления типа.
Начальный символ имени константы не затрагивает неявно его тип данных.
Примеры
Следую щ ие утверж дения являю тся правильны м и прим ерам и этого форм ата утвер­
ждения PARAM ETER:
PARAMETER Pl=3.1415927, DPI=3.141592653589793238D0
PARAMETER PIOV2=PI/2, DPIOV2=DPI/2
PARAMETER FLAG=.TRUE., LO NG NAM E-A STRING OF 25 CHARACTERS’

В-7. Утверждение VIRTUAL


У тверж дение V IR TU A L вклю чено для совместим ости с Fortran PDP-11. О но имеет
тот же формат и эффект, что и утверж дение D IM EN SIO N (см. разд. 4.7).

Альтернативный синтаксис для двоичных,


восьмеричных и шестнадцатеричных констант
Чтобы облегчать совместим ость, вы можете использовать альтернативны й синтаксис
для двоичных, восьмеричных и ш естнадцатеричны х констант. Следую щ ая таблица пока­
зывает альтернативный синтаксис и его эквивалент:
Константа Альтернативный синтаксис Эквивалент
Двоичный '0..ГВ В'0..Г
Восьмеричный 'O.J'O 0 ‘0..7'
Шестнадцатеричный '0. F'X Z O .F
X'0..F
Вы можете использовать кавы чку (") вместо апострофа.
424 С. Д . Алгазин, В В К ондрат ьев П рограм ирование на Visual FORTRAN

Альтернативный синтаксис для спецификатора записи


Чтобы облегчать совместим ость, вы м ож ете указать следую щ ий формат для специф и­
катора записи в списке управления ввода/вывода:

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

Альтернативный синтаксис для утверждения DELETE


Чтобы облегчать совместим ость, вы м ож ете указать следую щ ий форм ат утверждения
D E LE T E , когда удаляете запись из файла прям ого доступа:
DELETE (io-unitrl ERR=label\ [, IOSTAT=/-var])
где io-unit - номер логического устройства, содерж ащ его запись, которая будет удалена;
г - позиционны й номер записи, которая будет удалена; label - метка выполнимого ут­
верж дения, которое получает управление, если происходит ош ибка.
i-var - скалярная целочисленная переменная, которой назначается положительное це­
лое число, если возникает ош ибка, и нуль, если ош ибки нет (см. разд. 9.8). Этот формат
удаляет запись прям ого доступа, указанную в г.

Альтернативный формат для списка имен внешних записей


Чтобы облегчать совм естим ость, вы м ож ете использовать следую щ ий формат для
внеш ней записи:
$group-name object = value [object = value}...$
[END]
где g ro u p-пате - имя группы, содерж ащ ей объекты , которые получат значения. Имя
долж но бы ть предварительно определено в утверж дении N A M ELIST в блоке области
действия.
o bject - имя объекта (или указатель подобъекта), определенное в объявлении
N A M E L IS T имени группы. Имя объекта не долж но содерж ать внутренних пробелов, но
пробелы м огут предш ествовать ему или за ним следовать.
value -- нулевое значение, константа (или список констант), повторение константы в
ф орм ате г*с или повторением нулевых значений в ф орм ате г*.
Если больш е, чем одно oh ject= valu e, или больш е, чем одно значение, указаны, они
долж ны бы ть отделены разделителям и значений.
Р азделитель значения - это лю бое число пробелов, занятая или слеш, которому пред­
ш ествует или за которы м следует лю бое число пробелов.
Пртож ения 425

В-8. Целочисленное утверждение POINTER


У тверж дение POIN TER, обсуж даемое здесь, отличается от обсуж давш егося в "А три­
бут и утверж дение POIN TER". О но устанавливает связь пар объектов и указателей, в ко ­
торы х каж дый указатель содерж ит адрес соединенного с ним объекта.
Это утверж дение PO IN TER им еет следую щ ий формат:
POINTER (pointer, pointee) [, (pointer, pointee)]. . .
где p oin ter - переменная, значение которой используется как адрес pointee.
poin tee - переменная; м ож ет бы ть именем м ассива или специф икацией массива. О на
мож ет бы ть такж е процедурой, названной в утверж дении E X T E R N A L или в специф иче­
ском (неродовом) блоке интерфейса процедуры.
Правила использования
Следую щ ие правила определяю т поведение указат еля:
■ Д ва указателя м огут иметь то же самое значение, таким образом , разреш ается совм е­
щ ение имен указателя.
■ Когда указатель используется непосредственно, он обрабаты вается как целочисленная
переменная. На процессорах IA-32 указатель заним ает 1 числовой модуль памяти и
является 32-разрядным числом (IN TEG ER (4)). Н а процессорах Intel Itanium и Intel
ЕМ 64Т указатель занимает 2 числовых модуля пам яти - это 64-разрядное число
(IN TEGER(8)).
■ У казатель не мож ет бы ть объектом, на который указы вает указатель.
■ Указатель не может появиться в утверж дении A SSIG N и не м ож ет иметь атрибуты:
A LLO C A TA BLE, IN TR IN SIC , PO IN TER , EX T E R N A L , PA R A M E T E R , TA RG ET. У ка­
затель может появиться в утверж дении D A TA только с целочисленны м и константа­
ми.
■ Ц елые числа могут быть преобразованы в указатели. Таким образом м ож но указать на
абсолю тное местоположение памяти.
■ П еременная указателя не мож ет бы ть объявлена с другим типом данны х.
■ У казатель не может быть функциональны м возвращ аем ы м значением .
■ Вы м ож ете задавать значения указателям , проводя следую щ ие действия:
• оты щ ите адреса, используя встроенную функцию LO C (или встроенную функцию
% LOC);
• распределите память для объекта, используя встроенную функцию M A LLO C (или
используя m alloc (3i) на системах Linux* и M ac OS *).
Н апример:
Используя %LOC: Используя MALLOC:
INTEGER 1(10) INTEGER 1(10)
INTEGER 11(10) /10*10/ POINTER (P,l)
POINTER (P,l) P = MALLOC(40)
P = %L0C(I1) 1= 10
l(2) = l(2) + 1 l(2) = l(2) + 1
■ Значение указателя используется как базовы й адрес объекта, на которы й указы вает
указатель.
426 С. Д . Алгазин, В В К о н д р а т ьев П рограм ирование на Visual FO RTRAN

С ледую щ ие утверж дения определяю т правила использования poin tee (объекта, на


который указы вает указат ель):
■ Pointee не распределяется никакая память. Ссылки к pointee вы глядят как к текущ ему
содерж им ом у связанного с ним указателя для поиска базового адреса pointee.
■ P ointee не м ож ет бы ть инициализирован данны м и или иметь структуру записи, кото­
рая содерж ит инициализированны е данны м и поля.
■ Pointee м ож ет появиться только в одном целочисленном утверж дении POIN TER.
■ М ассив pointee м ож ет бы ть фиксированны м , расш иряем ым или предполагаемы х из­
мерений.
■ Pointee не м ож ет появиться в утверж дениях CO M M O N , D A TA , E Q U IV A LEN C E или
N A M E L IST , и он не м ож ет иметь следую щ их атрибутов: A LLO C A TA BLE,
O PT IO N A L SAV E, A U TO M A T IC P A R A M ETE R STA TIC, IN TEN T POIN TER.
■ P oin tee не может' быть:
■ форм альны м аргум ентом ;
■ ф ункциональны м возвращ аем ы м значением;
■ полем записи или элем ентом массива;
• нулевого размера;
• автом атическим объектом;
• именем родового блока интерфейса.
■ Если poin tee им еет производны й тип, он долж ен иметь тип последовательности.

В-9. Структуры записи


С труктуры записи Intel Fortran подобны производным типам Fortran 95/90.
Ст рукт ура записи - это составной объект, содерж ащ ий 1 или более элементов. (Эле­
м енты записи такж е назы ваю тся полями или компонентам и.) Вы можете использовать
записи, которы е вы долж ны объявить и работать с мультиполевыми структурами данных
в ваш их програм мах.
С оздание записи является двухступенчаты м процессом:
Вы долж ны определить форму записи при помощи объявления структуры м нож ест­
вом утверж дений.
Вы долж ны использовать утверж дение RECORD , чтобы объявить запись как объект с
именем . (Больш е чем одно утверж дение REC O R D может обратит ься к данной структуре.)

Объявления структуры
Объявление ст рукт уры определяет имена полей, типы данны х в пределах полей и по­
рядка и вы равнивания полей внутри записи. Поля и структуры могут быть инициализи­
рованы , но записи не м огут бы ть инициализированы .
О бъявление структуры им еет следую щ ий формат:
STRUCTURE [lstructure-namei\[field-namelist]
field-declaration
[field-declaration ] ...
[field-declaration]
END STRUCTURE
где structure-nam e - имя, используем ое для идентификации структуры, заклю ченное в
слеш и.
П оследую щ ие утверж дения REC O R D использую т имя структуры, для того чтобы об­
ратиться к структуре. И мя структуры долж но бы ть уникальны м среди имен структуры,
П р т о ж ен и я 427
но структуры м огут им еть одинаковы е им ена с перем енны м и (скалярам и или м ассивами),
полями записи, константами PA R A M ETER и общ ими блокам и.
О бъявления структуры могут бы ть влож ены (содерж ать одно или более других о бъ ­
явлений структуры). И мя структуры требуется для структурированного объявления на
наиболее удаленном уровне вложения и является дополнительны м для других объявле­
ний, вложенных, в него. О днако если вы ж елаете сослаться на влож енную структуру в у т­
верждении REC O R D в вашей программе, структура долж на им еть имя.
Структура, поле и имена записей все являю тся локальны м и для програм м ой единицы,
где они определены . Когда записи передаю тся как парам етры , поля в определениях
структур внутри вызова и вызываемых подпрограмм долж ны соответствовать в типе, п о­
рядке и измерении.
field-n am elist - список полей, имеющих конструкцию связанного объявления структу­
ры. Список полей имен разреш ается только для влож енны х объявлений структуры .
field-declaration , такж е называемое телом объявления, состоит из лю бой комбинации
следую щ их утверж дений:
Типичные объявления - это обы чны е объявления типа данны х Fortran.
Объявления подструктур. П оле внутри структуры м ож ет бы ть подструктурой, со ­
ставленной из элем ентарны х полей, других подструктур или их комбинации.
Объявление объединения составлено из одного или более отображ енны е полевы х
объявлений.
Утверждения PARAMETER могут появиться в объявлении структуры , но нельзя за­
давать тип данны х внутри блока объявления. О бъявления типа для имен PA R A M ET E R
долж ны предш ествовать утверж дению PA R A M ET E R и бы ть вне объявления ST R U C ­
TU RE следую щ им образом:
INTEGERS Р
STRUCTURE /АВС/
PARAMETER (Р=4)
REAL*4 F
END STRUCTURE
REAL*4 A(P)
Правила использования
В отличие от утверж дений объявления типа, объявления структуры не создаю т пере­
менных. Структурированны е переменны е (записи) создаю тся, когда вы используете у т­
верждение R EC O R D , содерж ащ ее имя предварительно объявленной структуры . У твер­
ж дение REC O R D можно рассм атривать как своего рода утверж дение объявления типа.
Различие состоит в том, что определяю тся составные элем енты , а не единственны е эл е­
менты.
Внутри объявления структуры, упорядочивание утверждений и имен полей внутри ут­
верждений важно, потому что это упорядочивание определяет порядок полей в записях.
В объявлении структуры каж дое полевое смещ ение - это сум м а длин преды дущ их
полей, таким образом, длина структуры - сумма длин ее полей. С труктура упакована; вы
долж ны явно обеспечить лю бое вы равнивание, которое необходим о, вклю чая, наприм ер,
неим енованные поля соответствую щ ей длины .
По ум олчанию поля выравниваю тся на естественны х границах; невы ровненны е поля
дополняю тся по мере необходимости. Чтобы избегать доп олн ен и я записей, вы долж ны
располагать структуры так, чтобы все поля были вы ровнены естественно.
428 С Д. Алгсиин, В. В Кондратьев. Программирование на Visual FORTRAN

Чтобы упаковы вать поля на границе произвольного байта, вы долж ны указать опцию
компилятора. Вы м ож ете такж е указать вы равнивание для полей, используя общ ие ди ­
рективы cD EC $ O PT IO N S или cD EC $ PACK.
Имя ноля не долж но бы ть тем же самым что и лю бой встроенный или определяемы й
пользователем оператор (наприм ер, EQ не м ож ет использоваться как имя поля).
Пример
В этом прим ере объявление определяет структуру по имени A PPO IN TM EN T.
A PP O IN T M E N T содерж ит структуру D A TE (поле A PP DATE), как подструктуру. Она, в
свою очередь, содерж ит подструктуру по имени TIM E (поле A PP TIM E, массив), массив
C H A R A C T E R *20 по имени А РР М ЕМ О и поле L O G IC A L *l по имени A PP FLAG.
STRUCTURE /DATE/
INTEGER*1 DAY, MONTH
INTEGER*2 YEAR
END STRUCTURE
STRUCTURE /APPOINTMENT/
RECORD /DATE/ APP.DATE
STRUCTURE /TIME/ APP.TIME (2)
INTEGER*1 HOUR, MINUTE
END STRUCTURE
CHARACTER*20 APP.MEMO (4)
L0GICAL*1 APP_FLAG
END STRUCTURE
Д лина лю бого образца структуры A PPO IN T M EN T - 89 байт.
Рис. В-1 показы вает карту пам яти лю бой записи или элем ента массива записи со
структурой A PPO IN T M E N T.

В -10. Объявления типа


С интаксис объявления типа внутри структуры записи идентичен нормальному утвер­
ж дению типа Fortran.
П рименяю тся следую щ ие правила использования к объявлениям типа в структурах
записи:
■ % FILL м ож ет бы ть указан вместо имени поля, чтобы оставить пространство в записи
в целях вы равнивания. Э тот оператор создает неим енованное поле и может иметь
специф икацию м ассива; наприм ер IN T EG ER % FILL (2,2). Н еим енованны е поля не
м огут бы ть инициализированы . Н апример, утверж дение N TEG ER % FILL /1980/ недо­
пустимо и генерирует сообщ ение об ош ибке.
■ Начальные значения могут поставляться в утверждениях объявления поля. Неименован­
ные поля не могут быть инициализированы; они являются всегда неопределенными.
■ И менам полей нужно всегда давать явны е типы данных. У тверж дение IM PLICIT не
воздействует на объявления поля.
■ Л ю бы е необходим ы е изм ерения массива долж ны бы ть указанны в утверж дениях объ­
явления поля. У тверж дения D IM EN SIO N не м огут использоваться для определения
имен полей.
■ О бъявления массива, изм еняем ого или предполагаемого размера и CH A RA CTER
предполагаем ой длины не разреш аю тся в объявлениях поля.
П рилож ения 429

П оле внутри структуры само м ож ет (смещение байта)


быть структурированны м элем ентом , со­ поле DAY поля APP_DATE
ставленным из других полей, других поле MONTH поля APP_DATE
структур или их обоих. Вы м ож ете объ я­
I
вить подструктуру двумя способами: поле YEAR поля APP_DATE
1. Вкладывая объявления структуры в ;
пределах других объявлений структуры поле HOUR поля АРР_Т1МЕ(1)
или объединения (с ограничением , на ко­ поле MINUTE поля АРР_Т1МЕ(1)
торое вы не м ожете сослаться к структуре поле HOUR поля АРР_Т1МЕ(2)
в себе ни на каком уровне влож ения). О дно поле MINUTE поля АРР_Т1МЕ(2)
или более имен полей для подструктуры поле АРР_МЕМ0(1)
должны быть определены в утверж дении
STRU CTU RE, потому что все поля в поле АРР_МЕМ0(2)
структуре нужно именовать. В этом случае
подструктура используется как поле внут­ 48 поле АРР|_МЕМ0(3)
ри структуры или объединения. И мена по­
лей в пределах одного уровня влож енности 68 полеАРР МЕМ0(4)
объявления долж ны быть уникальны м и, но
внутреннее объявление структуры м ож ет поле APP_FLAG
включить имена полей, используем ы е во
внешнем объявление структуры без кон­
фликта.
Рис. В-1Картаga.\mmu структуры
APPOINTMENT
2. При использовании утверж дения R EC O R D , которое указы вает другую предвари­
тельно определяемую структуру записи, таким образом, вклю чая это в объявляем ую
структуру.
Для типового объявления структуры , содерж ащ его влож енное объявление структуры
(TIM E) и вклю ченную структуру (D A TE), см. пример на стр. 428.

Объявления объединения
О бъявление объединения - это объявление м нож ества утверж дений, определяю щ ее
область данных, которая м ож ет периодически разделяться во время вы полнения про­
граммы одним или более полями или группами полей. О бъявление объединения долж но
находиться внутри объявления структуры .
Каждое уникальное поле или группа полей определяю тся в соответствии с отдельным
объявлением карты. О бъявление объединения приним ает следую щ ий формат:
UNION
map-declaration
map-declaration
[map-declaration]

[map-declaration]
END UNION
map-declaration
Принимает такую форму:
MAP
field-declaration
430 С Д. Алгазин, В В. Кондратьев Программирование на Visual FORTRAN

[field-declaration]

[field-declaration]
END MAP
где field-declaration - объявление структуры или утверж дение RECORD , содержащ ееся
внутри объявления объединения; объявление объединения, содерж ащ ееся внутри объяв­
ления объединения или объявление поля данны х (имеет тип данны х) внутри объединения
(см. разд. "О бъявления структуры ").
Правила использования
Как и обы чны е объявления типа Fortran, данны е м огут бы ть инициализированы в ут­
верж дениях объявления поля в объявлениях объединения. О днако, если поля внутри по­
вторяю щ ихся объявлений карты в единственном объединении инициализированы, объяв­
ления данны х инициализирую тся в порядке, в котором появляю тся утверждения. В ре­
зультате только конечная инициализация вступает в силу, а все предыдущ ие инициали­
зации перезаписаны поверх.
Размер разделяем ой области, установленной для объявления объединения, является
размером наибольш ей карты, определенной для этого объединения. Размер карты - это
сум м а разм еров полей, объявленны х внутри нее.
М анипулирование данны м и с использованием объявлений объединения подобно ис­
пользованию утверж дений E Q U IV A LEN C E. Разница состоит в том, что информационные
объекты, указанны е внутри утверж дений E Q U IV A LE N C E , одноврем енно связаны с об­
щим м естополож ением памяти и данны м и, постоянно находящ им ися там; с объявления­
ми объединения вы м ож ете использовать одно дискретное местополож ение памяти, что­
бы поочередно содерж ать различны е поля (массивы или переменные).
При объявлениях объединения, только одно объявление карты внутри объявления
объединения м ож ет бы ть связано в лю бой м омент времени с местополож ением памяти,
которое разделяю т карты. Всякий раз, когда на поле внутри другого объявления карты в
том же самом объявлении объединения ссылаю тся в ваш ей программе, поля в предш ест­
вую щ ем объявлении карты становятся неопределенны м и и наследую т поля в объявлении
карты, содерж ащ ем поле, на которое недавно ссылались.
В следую щ ем примере определена структура W O R D S L O N G . Эта структура содер­
ж ит объявление объединения, определяю щ ее 2 поля карты. П ервое поле карты состоит из
трех IN TEG ER *2 переменных (W O R D O , W O R D 1 и W O RD 2), а второе переменная
IN TEG ER*4, LONG:
STRUCTURE /W0RDS_L0NG/
UNION
MAP
INTEGER*2 WORDJ), W O R D J, W0RD_2
END MAP
MAP
INTEGERS LONG
END MAP
END UNION
END STRUCTURE
Д лина лю бой записи со структурой W O R D S LO N G - 6 байт. Рис. В-2 показывает
управление памятью лю бой записи со структурой W O R D S LONG:
Приложения 431
(смещ ение байта)
0 1 2 3 4 5 6

ч
. А А j

Лоле WORD _0 Попе WORD 1 Поле WORD_2


ч........ ...... _
.........................-¿V...................... _
__ j>
Попе LONG Неиспользованное
пространство

Рис. В-2 Карта памяти структуры WORDS LONG

B-l 1. Утверждение RECORD


У тверж дение REC O R D принимает следую щ ий формат:
RECORD /structure-name/record-namelist
[, Istructure-namelrecord-namelist]

[, Istructure-name/record-namelist]
где structure-name - имя предварительно объявленной структуры.
record-nam elist является списком о д н о ю или более имен переменны х, имен массива
или спецификаций массива, разделенны х запятыми. Все записи, именованны е в этом
списке, имеют одну и ту же структуру и распределены отдельно в памяти.
Правила использования
Вы м ожете использовать имена записей в утверж дениях CO M M O N и D IM EN SIO N , но
не в утверждениях DATA, EQ U IV A LE N C E или N A M ELIST.
Записи первоначально им ею т неопределенны е значения, если вы не определили им
значения в объявлениях структуры.

Ссылки на поля записи


Ссылки на поля записи долж ны соответствовать виду поля, на которое ссылаю тся.
Ссылки на составные поля относятся к слож ным структурам (и подструктурам). С каляр­
ные нолевые ссылки относятся к особым элем ентам данны х, таким как переменные.
О перация записи может вовлечь одно или более полей. Ссылки на поля записи имею т
один из следую щ их форматов:
Ссылка на составное ноле:
record-name [.aggregate-field-name]...
С сылка на скалярное поле:
record-name [.aggregate-field-name]... .scalar-field-name
где record-nam e - имя, используем ы м в утверж дении REC O R D , чтобы идентифицировать
запись.
aggregate-field-nam e является именем поля, которое является подструктурой (запись
или влож енное объявление структуры ) внутри структуры записи, идентифицируемой
именем записи.
scalar-field-nam e является именем элем ента данны х (имею щ им тип данны х) опреде­
ленным внутри объявления структуры.
Правила использования
Записи и поля записи не м огут использоваться в утверж дениях DA TA , но индивиду­
альные поля могут быть инициализированы в определении STR U CTU RE.
А втоматический массив не м ож ет бы ть полем записи.
432 С Д Ачгазин, В В. Кондратьев. Програмирование на Visual FORTRAN

С сы лка на скалярное поле состоит из имени записи (как указано в утверждении


R E C O R D ) и нуля или более уровней имен составного поля, сопровож даемых именем
скалярного поля. С сы лка на скалярное поле относится к отдельному элементу данных
(им ею щ ем у тип данны х) и м ож ет бы ть обработана как обычная ссылка на переменную
Fortran или элем ент массива.
Вы можете использовать ссылки на скалярны е поля в функциях утверж дения и в вы­
полним ы х утверж дениях. О днако они не м огут использоваться в утверждениях
CO M M O N , SAV E, N A M E LIST или E Q U IV A LE N C E или как переменная управления в
индексированном D O -цикле.
П равила преобразования типа для ссылок скалярного поля те же, что и для перемен­
ных и элем ентов массива.
С сы лка на составное иоле состоит из имени записи (как указанно в утверждении
R EC O R D ) и нуля или более уровней имен составного поля.
Вы можете назначить составное поле только другом у составному полю (запись = за­
пись), если записи им ею т одинаковую структуру. Intel Fortran не поддерж ивает никакие
другие операции (типа ариф метических или сравнения) для составных полей.
Intel Fortran требует квалификации на всех уровнях. В то время как некоторы е языки
доп ускаю т вы черкивание имен составного поля, когда нет никакой двусм ы сленности о т­
носительно того, какое поле назначается, Intel Fortran требует, чтобы все имена составно­
го поля были вклю чены в ссылки.
Вы м ож ете использовать ссылки на составное ноле в неф орматных утверждениях
ввода/вы вода; одна запись ввода/вы вода записы вается независимо от того, какое м нож е­
ство ссы лок и ссы лок к имени массива появляется в списке ввода/вывода. Вы не можете
использовать ссы лки на составное поле в форм атном , управляемом списком имен и
управляем ом списком утверж дении ввода/вы вода.
Вы м ож ете использовать ссылки на составное поле как фактические параметры и за­
писы вать ф орм альны е аргументы . О бъявление ф орм альной записи в подпрограмме
долж но соответствовать форм ату ссылки на составное поле, которую передает вы зы ­
ваю щ ая програм мная единица; каждая структура долж на иметь то же самое число и типы
полей в том же самом порядке. П орядок полей карты внутри объявления объединения
является несоответствую щ им .
Записи передаю тся ссылками. Ссылки на составное поле обрабаты ваю тся как обыч­
ные переменны е. Вы можете использовать массивы с переменными границами в утвер­
ж дениях REC O R D , которы е использую тся как ф орм альны е аргументы.
Примечание. Поскольку точки используются в ссылках на записи, чтобы разделять поля, вы не
должны использовать операторы отношения (.EQ., .XOR.), логические константы (.TRUE.,
.FALSE.) и логические выражения (.AND., .NOT., .OR.) как имена полей в объявлениях структуры.
Примеры
С ледую щ ие примеры показы ваю т ссы лки к записям и полям. Рассмотрите объявления
структуры .
С труктура DATE:
STRUCTURE /DATE/
INTEGER*! DAY, MONTH
INTEGER*2 YEAR
Приложения 433
END STRUCTURE
С труктура A PPO IN TM EN T:

STRUCTURE /APPOINTMENT/
RECORD/DATE/ APP_DATE
STRUCTURE /TIME/ APP_TIME(2)
INTEGER*1 HOUR, MINUTE
END STRUCTURE
CHARACTER*20 APP_MEM0(4)
LOGICAL*1 APP_FLAG
END STRUCTURE
С ледую щ ее утверж дение RECO RD создает перем енную по имени N E X T A P P и м ас­
сив с 10 элементами по имени A P P L 1 S T . И переменная и каж ды й элем ент м ассива п р и ­
нимаю т формат структуры A PPO IN TM EN T.
REC O R D /A PPO IN T M E N T / N E X T_A PP,A PP_LIST(10)
Каждый из следую щ их примеров ссы лок к записи и полю получен из предш ествую ­
щ их объявлений структуры и утверж дений REC O R D :
Ссылки на составное поле
- Запись N EX T APP:
N EX TA PP.
■ П оле A P P D A T E , 4-байтовое поле м ассива в записи м ассива A PP_L1ST(3):
A PP_L1ST(3).A PP_DA TE.
Ссылки на скалярные поля
■ П оле A P P F L A G , является полем L O G IC A L записи N E X T A PP:
N Е Х Т А Р Р .A P P F L A G .
■ П ервы й символ А РР_М ЕМ О (1), поля C H A R A C T E R *20 записи N E X T A PP:
N Е Х Т А Р Р .А РР_М ЕМ О ( 1)( 1:1 ).

В -12. Составное назначение


Для составных операторов присваивания, переменная и вы раж ение долж ны иметь ту
же самую структуру что и составное значение, на которое они ссы лаю тся.
Составной оператор присваивания задает значение каж дого поля составного значения
справа от знака равенства соответствую щ ем у полю составного значения слева. О ба из
составных операторов долж ны бы ть объявлены с одной и той ж е структурой.
Пример
Следую щ ий пример показы вает допустим ы е составны е назначения:

STRUCTURE /DATE/
INTEGER*1 DAY, MONTH
INTEGER*2 YEAR
END STRUCTURE
RECORD /DATE/ TODAY, THIS_WEEK(7)
STRUCTURE /APPOINTMENT/

RECORD /DATE/ APP.DATE


END STRUCTURE
434 С Д Алгазин, В В Кондратьев Програмирование на Visual FORTRAN

RECORD /APPOINTMENT/ MEETING


DO I = 1,7
CALL GET_DATE (TODAY)
THIS_WEEK(I) = TODAY
THIS_WEEK(I).DAY = TODAY.DAY + 1
END DO
MEETING.APP_DATE = TODAY

Приложение С. Набор символов ASCII


для Систем Linux* и Mac OS *

Это прилож ение описы вает набор символов A SCII, который является доступным на
системах Linux* и M ac OS*. Д ругие наборы сим волов доступны на системах W indows*;
для деталей, см. диалоговую докум ентацию для этих систем.
Д ля деталей о наборе сим волов Fortran 95/90 см. разд. 1.3.

Набор символов ASCII (L*X, М*Х32)


Н а рис. С.1 представен набор сим волов ASCII (символы с десятичны ми значениями
от 0 до 127). П ервая половина каж дого из пронум ерованны х столбцов идентифицирует
сим вол, как вы ввели бы их с терм инала или как вы будете видеть их на принтере. За ис­
клю чением SP и НТ, сим волы с именами непригодны для печатания. Таблица показыва­
ет, как определяю тся сим волы с именами.
Символ Значение Символ Значение
NUL Пустой DC1 Управление устройством 1 (XON)
S 0H Начало заголовка DC2 Управление устройством 2
STX Начало текста DC3 Управление устройством 1 (XOFF)
ЕТХ Конец текста DC4 Управление устройством 4
EOT Конец передачи NAK Отрицательное подтверждение
ENQ Запрос SYN Синхронный простой
АСК Подтверждение ЕТВ Конец блока передачи
BEL Звонок CAN Отмена
BS Возврат на 1 символ ЕМ Конец среды
HT Горизонтальная табуляция SUB Замена
LF Перевод строки ESC Выход
VT Вертикальная табуляция FS Разделитель файла
FF Перевод страницы GS Разделитель группы
CR Перевод каретки RS Разделитель записи
SO Сдвиг US Разделитель устройства
SI Сдвиг В SP Пробел
DLE Переключение DEL Удаление
О стаю щ аяся половина каж дого столбца идентиф ицирует сим вол двоичны м значением
байта; значение ф иксируется в 3 видах восьм еричном, десятичном и ш естнадцатеричном.
Н априм ер, прописная буква А имеет, согласно соглаш ениям А 5СП, ш естнадцатеричное
значение 41 (битовая конф игурация 01000001), эквивалентно 101 в восьмеричной нота­
ции и 65 в десятичном представлении чисел.
Приложении 435
0 1 2 3 4 5 в 7
Ь8 0 0 0 0 0 0 0 0
t>7 0 0 0 0 1 1 1 1
Ь6 0 1 1 () 0 i 1
Ь5 0 1 0 1 0 1 0 1
Ь4 ЬЗ t>2 Ы
6 20 4(5 60 lôô 12 Ô \ 14Ô 160
0 0 0 0 0 NUL 0 OLE 16 SP 32 0 43 @ 64 p 80 96 P 112
0 10 20 30 40 50 60 70
1 21 A\ 61 1Ô1 1Й1 i4 i 161
0 0 0 1 SOH 1 DC1 17 ! 33 49 А 65 Q 81 a 97 113
1
1 (XON) 11
1
41
q 71
21 31 51 61
2 22 42 62 1Ô2 122 142 162
2 0 0 10 STX 2 DC2 18 " 34 2 50 В 66 R 82 b 98 r 114
12 22 32 42 52 62 72
3 23 43 63 io à 123 14$ 16$
3 0 0 11 ETX 3 DC3 19 # 35 3 51 С 67 S 83 с 99 s 115
3 (XOPF) 13 23 33 43 53 63 73
4 24 44 64 104 124 144 164
4 0 1 0 0 EO T 4 DC4 20 $ 36 4 52 D 68 T 84 d 100 t 116
4 14 24 34 44 54 64 74
5 25 45 65 1Ö5 125 145 165
5 0 10 1 ENQ 5 NAK 21 % 37 5 53 E 69 u 85 e 101 u 117
5 15 25 35 45 55 65 75
6 26 46 66 106 126 146 166
6 0 1 1 0 дек 6 SYN 22 & 33 6 54 F 70 V 86 f 102 V 118
6 16 26 36 46 56 66 76
7 17 ✓ 47 67 1Ô7 127 147 167
7 0 1 1 1 BEL ETB 23 39 7 55 G 71 w 87 g 103 w 119
/ 17 27 37 47 57 67 77
10 30 5C *0 110 130 150 ifo
8 10 0 0 BS 8 CAN 24 ( 40 8 56 H 72 X 88 h 104 X 120
6 18 23 38 48 58 68 78
11 31 51 71 111 131 151 171
9 10 0 1 HT 9 EM 25 ) 41 9 57 1 73 Y 89 i 105 y 121
9 19 29 39 49 59 69 79
12 32 52 72 ii2 132 152 172
10 10 10 LF 10 SUB 26 * 42 58 J 74 z 90 j 106 z 122
A 1A 2A ЗА 4A 5A 6A 7Л
13 33 53 73 113 1^3 153 173
11 10 11 VT 11 ESC 27 ♦ 43 59 К 75 [ 91 k 107 { 123
в 1B 2В 3B 46 56 6B 7B
14 34 54 74 1i4 134 154 174
12 1 1 0 0 FF 12 FS 28 » 44 < СО L 76 \ 92 1 108 I 124
с 1C 2C 3с 4C 5G 6C 7C
15 35 56 1ь 115 135 155 iïè
13 110 1 CR 13 GS 29 - 45 s 61 M 77 93 m 109 125
1 }
D 1D 2D 3D 4D 5D 6D 7D
16 36 56 /6 116 136 156 1?6
A
14 1 1 1 0 SO 14 RS 30 46 > 62 N 78 94 n 110 - 126
E 1E 2E 3E 4E 5E 6E 7E
17 37 57 77 i 17 137 157 177
16 1 1 1 1 SI 15 US 31 / 47 •> 63 0 79 95 о 111 DEL 127
1F 4F
- 5F -6F 7F
■f.. .Л , .X .
Символ
Восьмеричный
Десятичный
Шестнадцатеричный

Рис. С.1. Графическое представление набора символов ASCII (L*X, М*Х32)

Приложение D. Модели представления данных

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


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

В ст роенны е ф ункции
Встроенные
Модель Возвращаемое значение
функции
BIT SIZE Bit Число битов в битовой модели
DIGITS Integer или Число значащих цифр в модели для параметра
Real
EPSILON Real Число, которое является почти незначащим по сравнению с единицей
EXPONENT Real Значение экспонентной части экспоненты действительного параметра
FRACTION Real Дробная часть действительного параметра
436 С Д Ачгазин, В В. Кондратьев Программирование на Visual FORTRAN

Встроенные
Модель Возвращаемое значение
функции
HUGE Integer или Наибольшее число в модели для параметра
Real
MAXEXPONENT Real Максимальная экспонента в модели для параметра
MINEXPONENT Real Минимальная экспонента в модели для параметра
NEAREST Real Наименьшее различимое машинно-представимое число в данном руко­
водстве
PRECISION Real Десятичная точность (действительного или комплексного) параметра
RADIX Integer или Основание модели для параметра
Real
RANGE Integer или Десятичный диапазон экспоненты модели для параметра
Real
RRSPACING Real Обратная величина относительного зазора значения, около параметра
SCALE Real Значение части экспоненты (модели для параметра), измененное ука­
занным значением
SET_EXPONENT Real Значение части экспоненты (модели для параметра), установленное к
указанному значению
SPACING Real Значение абсолютного интервала образцовых чисел около параметра
TINY Real Наименьшее положительное число в модели для параметра

D-1. Модель для целочисленных данных


М одельны й набор для целых чисел определяется таким образом:
ч
Equation Section (N ext) i = s x ^ w k x r k~]
k~\
где / - целочисленное значение; s - знак (+1 или -1 ); q - число цифр (полож ительное це­
лое число); г - основание системы счисления (целое число, больш е чем 1); wk - неотрица­
тельное число м еньш им е чем г.
М одель для IN T EG ER (4) определяется таким образом:
II
Equation Section (N ext) / = s x ^ wk x 2k~1
к-i
С ледую щ ий прим ер показы вает общ ую целочисленную модель для / = -2 0 , исполь­
зую щ ую основание (г) 2:

/ = (-1 ) х (0 х 2 ° + 0 х 2 |+ 1 х 22 + 0 х 23 + 1 х -2 4 )

/ = ( -1 ) х (4 + 16)
i = -1x20
/ = -20
D-2. Модель для действительных данных
М одельны й набор для вещ ественны х чисел, вообщ е, определяется как одно из сле­
дую щ его:
х=0

х = s x b e х £ / а хЬ~к
Приложения 437
где х - действительное значение; .у - знак (или +1 и л и -1 ); h - основание (действительное
основание системы счисления; целое число, больш е чем 1; в Intel Fort .n b = 2); p - число
цифр мантиссы (целое число больш е, чем 1).
Число цифр различает ся в зависимости от формата действительного ш и а таким образом:
REAL(4)IEEES floating 24
REAL(8)IEEE TJIoating 53
REAL(16) IEEE XJoating 113
где e - целое число в диапазоне от етш до етах вклю чительно. Этот диапазон варьируемся
в зависимости от действительного формата:
Qmin Bmax
REAL(4) IEEE SJoating IEEE -1 2 5 128
REAL(8) T_floating IEEE -1021 1024
REAL(16) XJoating -16381 16384
Ук - неотрицательное число меньш е, чем h \f\ отличается от нуля. Д ля х - 0, его экспо­
нента е и цифры /к определяю тся, как нули.
М одельный набор для действительного с одинарной точностью (R E A L (4)) определя­
ется как одно из следую щ их выраж ений:
х = 0

X = s X 2е X 1/2 +£ / ; 2-
х -125 < е < 128

Следую щ ий прим ер показы вает общ ей м одель действительного для х = 20.0, и сп оль­
зую щ ую основание (Ь) 2:
х = 1 х 25 х (1 х 2 '1 +0 х 2'2 +1 х 2 '?)
х = 1 х 32 х ( .5 + .125)
х - 32 х (.625)
.г = 20.0

Б-3. Модель для битовых данных


М одельный набор для битов (двоичны е цифры) интерпретирует неотрицательны й
скалярный объект данны х типа "целочисленное" как последовательность таким образом:
V-!
У = Х И,АХ2*

где / - целочисленное значение; .V - число битов; и>к - битовое значение 0 или 1. Биты
пронумерованы справа налево, начиная с 0.
Следую щ ий пример показы вает битовую модель для у = 1001 (целое число 9) исполь­
зую щ ую число бит (¿), равное 4:
1 0 0 1
438 С Д Ачгазин, В. В Кондратьев Програмирование на Visual FORTRAN

Приложение Е. Подпрограммы библиотеки


поддержки
Intel Fortran обеспечивает следую щ ие подпрограмм ы библиотеки поддержки:
■ М одульны е подпрограммы.
■ П одпрограммы Fortran О репМ Р*.
Для получения дополнительной инф орм ации об этих подпрограммах см. Ссылку биб­
лиотек или диалоговую ссылку Intel V isual Fortran.

Е-1. Модульные подпрограммы


Intel Fortran обеспечивает библиотечные модули, содерж ащ ие следую щ ие подпро­
граммы:
■ П одпрограммы, пом огаю щ ие писать програм мы для графических, Q uickW in и других
прилож ений (в м одулях 1FQWÍN, IFLO G M и IFCORE):
• подпрограмм ы Q uickW in (W *32, W *64);
■ графические подпрограмм ы (W *32, W *64);
• диалоговые подпрограммы (W *32, W *64);
• см еш анны е динам ические подпрограммы.
■ П одпрограм м ы , которые пом огаю т писать програм мы , использую щ ие объектную мо­
дель програм мны х компонентов (СО М ) и Серверы автом атизации (в модулях 1FCOM
и IFAUTO):
■ подпрограмм ы CO M (W *32, W *64);
• подпрограммы A U TO (W *32, W *64).
■ Мобильные (взаимозаменяемые) подпрограммы, которы е пом огаю т переносить ваши
программы в или из других систем или выполнять основной ввод/вы вод для последо­
вательных портов в системах W indows* (в м одуле ÍFPORT).
■ П одпрограм м ы П оддерж ки национального язы ка (W *32, W *64), помогаю щ ие писать
программы на иностранных язы ках для м еж дународны х ры нков (в м одуле ÍFNLS).
■ П одпрограм м ы POSIX * для написания програм мы Fortran, поддерживающие Стандарт
POSIX * (в м одуле ÍFPOSIX).
При вклю чении утверж дения USE module-name в программу, подпрограммы библио­
теки автом атически связы ваю тся с ваш ей програм м ой, если они вызываю тся.
М ож но огран и ч и ть доступ из м одуля U SE, д об ав л яя оп ер ато р ы O N LY к у твер ­
ж ден и ю USE.

Е-2. Мобильные подпрограммы


Чтобы использовать мобильную подпрограмм у, добавьте следую щ ее утверждение к
програм мной единице, содерж ащ ей подпрограмму:
USE IFPORT

Таблица Е-1. Краткое изложение мобильных подпрограмм


Имя 1 Описание
Поиск информации.
FSTAT Возвращает информацию о логическом блоке файла
GETCWD Возвращает имя пути текущего рабочего каталога
GETENV Ищет в окружающей среде данную строку и возвращает ее значение, если оно
найдено
П рилож ения 439
Имя Описание
GETGID Возвращает групповой ID (identifier) пользователя
GETLOG Возвращает входное имя пользователя
GETPID Возвращает ID процесса
GETUID Возвращает пользовательский ID пользовательского процесса
HOSTNAM1 Возвращает имя пользовательского хоста
ISATTY Проверки, определяет ли логический номер устройства терминал
RENAME Переименовывает файл
STAT, LSTAT Возвращает информацию о именованном файле
UNLINK Удаляет файл, заданный путем
Управление процессом’
ABORT Останавливает выполнение текущего процесса, очищает буфера ввода/вывода
и записывает строку на внешнее устройство 0
ALARM Выполняет внешнюю подпрограмму после ожидания указанного числа секунд
KILL Посылает код сигнала процессу, заданному Ю
SIGNAL Изменяет действие для сигнала
SLEEP Приостанавливает выполнение программы на указанное число секунд
SYSTEM Выполняет команду в отдельной оболочке
Числовые Значения и Преобразование.
BESJO, BESJ1, BESJN, Возвращают значения с одинарной точностью функций Бесселя первого и вто­
BESYO, BESY1, BESYN рого рода порядка соответственно 1 ,2 и п
BIC, BIS, BIT Очищает, устанавливает и проверяет битовый уровень для целых чисел
CDFLOAT Преобразует параметр COMPLEX(4) в тип DOUBLE PRECISION
COMPLINT, COMPLREAL, Возвращают поразрядное дополнение или логическое NOT параметра
COMPLLOG
CSMG Выполняет поразрядное запоминание под маской
DBESJO, BESJ1, DBESJN, Возвращают значения с двойной точностью функций Бесселя первого и второ­
BESYO, DBESY1, DBESYN го рода порядка соответственно!, 2 и п
DFLOATI, DFLOATJ, DFLOATK Преобразует целое число в действительный тип с двойной точностью
DRAND, D RAN DM Возвращают случайные значения с двойной точностью в диапазоне от 0 до 10
DRANSET Устанавливает начальное число для генератора случайных чисел
IDFLOAT Преобразует параметр INTEGER(4) к действительному типу с двойной
точностью
IFLOATI, IFLOAT J Преобразуйте целое число в действительный тип с одинарной точностью
INMAX Возвращает максимальное положительное значение для целого числа
INTC Преобразует параметр INTEGER(4) в тип INTEGER(2)
IRAND, IRANDM Возвращает положительное целое число в диапазоне от 0 до 2**31—1
или 2**15-1, если вызывается без параметра
IRANGET Возвращает текущее начальное число
IRANSET Устанавливает начальное число для генератора случайных чисел
JABS Вычисляет абсолютное значение
LONG Преобразует параметр INTEGER(2) в тип INTEGER(4)
QRANSET Устанавливает начальное число для последовательности псевдослучайных
чисел
RAND, RANDOM2 Возвращает случайные значения в диапазоне от 0 до 10
RAN F Генерирует случайное число между 00 и RAND_MAX
RÄNGET Возвращает текущее начальное число
RANSET Устанавливает начальное число для генератора случайных чисел
SEED Изменяет начальное число генератора случайных чисел
SHORT Преобразует параметр INTEGER(4) в тип IN TE G ER ®
SRAND Устанавливает начальное число, используемое с IRAND и RAND
440 С Д. А ¡газии, В ВКондратьев. Программирование на Visual FORTRAN

Имя • Описание
Ввод и вывод:
ACCESS Отмечает доступность для файла в соответствии с режимом
CHMOD Изменяет атрибуты файла
FGETC Читает символ из внешнего устройства
FLUSH Записывает на диск буфер внешнего устройства для связанного с ним файла
FPUTC Записывает символ на внешнее устройство
FSEEK Устанавливает позицию файла на внешнем устройстве
FTELL, FTELLI8 Возвращают смещение, в байтах, от начала файла
GETC Читает символ из устройства 5
GETPOS, GETPOSI8 Возвращают смещение, в байтах, от начала файла
PUTC Записывает символ из устройство 6
Дата и время:
CLOCK Возвращает текущее время в формате "hh:mm:ss", используя 24-часовые часы
CLOCKX Возвращает часы процессора в микросекундах
CTIME Преобразует системное время в 24-символьную строку ASCII
DATE Возвращает текущую системную дату
DATE4 Возвращает текущую системную дату
DCLOCK Возвращает прошедшее время, в секундах начиная с начала текущего процесса
DTIME Возвращает процессорное время, прошедшее с (1) начала программы, или (2)
наиболее свежего вызова DTIME
ETIME Возвращает процессорное время, прошедшее с начала выполнения программы
FDATE Возвращает текущую дату и время как строку ASCII
GETDAT Возвращает дату
GETTIM Возвращает время
GMTIME Возвращает среднее время по Гринвичу как целочисленный массив
с 9 элементами
IDATE Возвращает дату как один массив с 3 элементами или как 3 скалярных парамет­
ра (месяц, день, год)
IDATE4 Возвращает дату как один массив с 3 элементами или как 3 скалярных парамет­
ра (месяц, день, год)
ITIME Возвращает текущее время как массив с 3 элементами (час, минута, секунда)
JDATE Возвращает текущую дату как 8-символьную строку с Юлианской датой
JDATE4 Возвращает текущую дату как 10-символьная строка с Юлианской датой
LTIME Возвращает местное время как целочисленный массив с 9 элементами
RTC Возвращает число секунд с 00:00:00 GMT, 1 января 1970
SECNDS Возвращает число секунд с полуночи, меньше значения ее параметра
SETDAT Устанавливает дату
SETTIM Устанавливает время -
TIME Как подпрограмма возвращает время, сформатированное как HH:MM:SS; как
функция возвращает время в секундах с 00:00:00 GMT, 1 января 1970
TIMEF Возвращает число секунд, прошедших с первого вызова этой функции (или 0)
Обработка ошибок:
GETLASTERROR Возвращает последнюю установленную ошибку
GETLASTERRORQQ Возвращает последнюю ошибку, установленную функцией или динамической
подпрограммой
IERRNO Возвращает последний код ошибки
SETERRORMODEQQ Устанавливает режим для обработки критических ошибок
Вызов и Управление Программ:
RAISEQQ Посылает прерывание выполняемой программе, моделируя прерывание от
операционной системы
RUNQQ Вызывает другую программу и ждет, чтобы она выполнилась
Прилож ения 441
Имя Описание
ЭЮ МАЮО Управляет обработкой сигнала
Задерживает выполнение программы в течение указанного времени
Система, Диск и Каталог:
CHDIR Изменяет текущий рабочий каталог
CHANGEDIRQQ Делает указанный каталог текущим (принимаемым по умолчанию) каталогом
CHANGEDRIVEQQ Делает указанный диск текущим диском
DELDIRQQ Удаляет указанный каталог
GETDRIVEDIRQQ Возвращает текущий диск и путь каталога
GETDRIVESIZEQQ Возвращает размер указанного диска
GETDRIVESQQ Возвращает диски, доступные для системы
GETENVQQ Возвращает значение из текущей среды
MAKEDIRQQ Создает каталог с указанным именем каталога
SETENVQQ Добавляет новую переменную среды или устанавливает значение суще­
ствующей
SYSTEMQQ Выполняет команду, передавая командную строку интерпретатору команд опе­
рационной системы
Динамики:
ВЕЕРСЮ | Издает звук динамиком указанной продолжительности в миллисекундах на ука­
занной частоте в Герц
Управление файлами' \
DELFILESQQ Удаляет указанные файлы в указанном каталоге
FINDFILEQQ Ищет файл в каталогах, указанных в переменной среды РАТН
FULLPATHQQ Возвращает полный путь для указанного файла или каталога
GETFILEINFOQQ Возвращает информацию о файлах с именами, соответствующими требуемой
строке
PACKTIMEQQ Упаковывает значения времени для использования БЕТЕН-ЕИМЕОО
RENAMEFILEQQ Переименовывает файл
SETFILEACCESSQQ Устанавливает режим доступа к файлу для указанного файла
SETFILETIMEQQ Устанавливает время модификации для указанного файла
SPLITPATHQQ Разделяет полный путь на четыре компонента
4JNPÄCKTIMEQQ Распаковывает значение файлового времени и даты на его составные части
Массивы
BSEARCHQQ Выполняет двоичный поиск для указанного элемента на сортированном одно­
мерном массиве встроенного типа
SORTQQ Сортирует одномерный массив встроенного типа
Исследование и управление плавающей точки'
CLEARSTATUSFPQQ Очищает флажки исключения в слове состояния процессора с плавающей
точкой
GETCONTROLFPQQ Возвращает значение слова управления процессором с плавающей точкой
GETSTATUSFPQQ Возвращает значение слова состояния процессора с плавающей точкой
LCWRQQ То же что и SETCONTROLFPQQ
SCWRQQ То же что и GETCONTROLFPQQ
SETCONTROLFPQQ Устанавливает значение слова управления процессора с плавающей точкой
SSWRQQ То же самое что и ОЕТЭТАТУБЕРОО
IEEE * Функциональность:
IEEE FLAGS Устанавливает, выбирает или очищает флажки 1ЕЕЕ
IEEEJHANDLER Устанавливает обработчик для исключений 1ЕЕЕ
Ввод/вывод последовательного порта 3
SPORT CANCEL Ю Отменяет любой ввода/вывода в указанный порт
SPORT.CONNECT Устанавливает соединение с последовательным портом и определяет некото­
рые параметры использования
442 С Д. А ичпии. В В Кондратьев Прокламирование на Visual FORTRAN

Имя \ Описание
$РОРТ_СОММЕСТ_ЕХ Устанавливает соединение с последовательным портом, определяет некото-
|рые параметры использования и определяет размер внутреннего буфера для
¡приема данных
SPORT_GET_HANDLE Возвращает описатель Windows^ связанный с портом связи
S PO R T.G ET STATE Возвращает скорость в бодах, четность, состояние информационных разрядов
и состояние стоповых битов порта связи
SPORT_GET__STATE_EX Возвращает скорость в бодах, четность, установку информационных разрядов,
стоповые биты и другие параметры настройки порта связи
SPORT. G ETJIM EO UTS Возвращает выбранные пользователем времена ожидания для последова­
тельного порта
SPORT PEEK DATA Возвращает информацию о пригодности входных данных
SPORT PEEK LINE Возвращает информацию о пригодности входных записей
SPORT PURGE Выполняет функцию очистки на указанном порту
SPORT READ DATA Читает доступные данные из указанного порта
SPORT_READ_LINE Читает запись из указанного порта
SPORT RELEASE Освобождает последовательный порт, который был предварительно связан
SPORT. SET_STATE Устанавливает скорость в бодах, четность, состояние информационных разря­
дов и состояние стоповых битов порта связи
SPORT_SET_STATE_EX Устанавливает скорость в бодах, четность, состояние информационных разря­
дов, стоповые биты и другие параметры настройки порта связи
SPORT _SET_TIMEOUTS Устанавливает выбранные пользователем времена ожидания для последова­
тельного порта
SPORT SHOW STATE Отображает состояние порта
SPORT_SPECIAL_FUNC Выполняет функцию связи с указанным портом
SPORTJVRITE DATA Выводит данные в указанный порт
SPORT_WRITE_LINE Выводит данные в указанный порт и следующий за ними признак конца записи
Смешанные■
LNBLNK Возвращает индекс последнего непробельного символа в строке I
QSORT Возвращает сортированную версию одномерного массива указанного числа
элементов названного размера
RINDEX Возвращает индекс последнего возникновения подстроки в строке
SCANENV Просматривает среду для значения переменной среды
TTYNAM Проверяет, является ли логическое устройство терминалом
1 Эта подпрограмма может также быть указанна как HOSTNM
2 Есть функция RANDOM и подпрограмма RANDOM в библиотеке взаимозаменяемости
3 W*32, W*64.

Е-3. Подпрограммы поддержки


национального языка (W*32, W*64)
П одпрограм м ы поддерж ки Н ационального языка (NLS), к о ю р ы е обесп ечи ваю i язы ­
ковую локализацию и м ногобайтовы й набор сим волов (M BCS), позволяю т писать при­
лож ения на друг их язы ках. Чтобы использовать подпрограмму NLS, добавьте следую щ ее
утверж дение к програм м ной единице, содерж ащ ей подпрограмму:
USE IFNLS
Табл. Е-2 обобщ ает подпрограмм ы NLS. Стандартны е имена показаны в смеш анном
регистре, чтобы сделать имена прощ е для понимания. Записывая приложения, вы можете
использовать лю бой регистр.
При ю ж ення 443
Таблица Е-2. Краткое изложение подпрограмм N L S (W *32, IV*64)
Имя | Описание
Установка места действия и исследование.
NLSEnumCodepages Возвращает все поддерживаемые в системе кодовые страницы
NLSEnumLocales Возвращения все комбинации языка и страны, поддерживаемые системой
NLSGetEnvironmentCodepage Возвращает номер кодовой страницы для системной кодовой страницы
или кодовой страницы пульта
NLSGetLocale Возвращает текущий язык, страну и кодовую страницу
NLSGetLocalelnfo Возвращает запрашиваемую информацию о текущем локальном кодовом
наборе
NLSSetEnvironmentCodepage Изменяет кодовую страницу для текущего пульта (управления)
NLSSetLocale [Устанавливает язык, страну и кодовую страницу
Форматирование:
NLSFormatCurrency Форматирует числовую строку и возвращает правильную строку валюты для
текущего места действия
NLSFormatDate Возвращает правильно отформатированную строку, содержащую дату для
текущего места действия
NLSFormatNumber Форматирует числовую строку и возвращает правильную числовую строку
для текущего места действия
NLSFormatTime Возвращает правильно отформатированную строку, содержащую время для
текущего места действия
Исследование MBCS:
MBCharLen Возвращает длину первого многобайтового символа в строке
MBCurMax Возвращает самый длинный многобайтовый символ для текущей кодовой
страницы
MBLead Определяет, является ли данный символ первым байтом многобайтового
символа
MBLen Возвращает число многобайтовых символов в строке, включая конечные
пробелы
MBLen_Trim Возвращает число многобайтовых символов в строке, не включая конечные
пробелы
MBNext Возвращает позицию строки первого байта многобайтового символа непо­
средственно после данной позиции строки
MBPrev Возвращает позицию строки первого байта многобайтового символа непо­
средственно перед данной позицией строки
MBStrLead Выполняет контекстно-зависимую проверку, чтобы определить, является ли
данный байт в строке символов ведущим байтом (lead byte)
Преобразование MBCS.
Преобразует строку символов из многобайтовой кодовой страницы в строку
MBConvertMBToUnicode
Уникода
MBConvertUnicodeToMB Преобразует строку Уникода в многобайтовую строку символов текущей ко­
довой страницы
MBJISTToJMS Преобразует символ (JIS) Промышленного стандарта Японии в Канджи
Microsoft* (Shift JIS или JMS), символ
MBJMSTToJIS Преобразует Канджи Microsoft (Shift JIS или JMS), символ в символ (JIS)
Промышленного стандарта Японии
Эквиваленты РоПгап МВСв.
МВИМСНАРСЮ ¡То же, что и ИМСНАРСЮ за исключением того, что она может прочитать от­
дельный многобайтовый символ и сразу возвращает число прочитанных
байтов
MBINDEX То же, что и INDEX, за исключением того, что многобайтовые символы могут
быть включены в его параметры
444 С Д Алгазин,В. В Кондратьев Програчирование на Visual FORTRAN

MBLGE, MBLGT, MBLLE, MBLLT, То же что и LGE, LGT, LLE, LLT, и операторы EQ и NE за исключением того,
MBLEQ, MBLNE что многобайтовые символы могут быть включены в их параметры
MBSCAN То же что и SCAN, за исключением того, что многобайтовые символы могут
быть включены в его параметры
MBVERIFY То же что и VERIFY, за исключением того, что многобайтовые символы могут
быть включены в его параметры

Е-4. Подпрограммы POSIX*


Intel Fortran обеспечивает подпрограмм ы , которые осущ ествляю т IEEE POSIX
Fortran 77 привязки к язы ку. Чтобы использовать подпрограмму POSIX , добавьте сле­
дую щ ее утверж дение к програм мной единице, содерж ащ ей подпрограмму:
USE IFPOSIX

Таблица Е-3. Краткое изложение подпрограмм POSIX


Имя Описание
IPXFARGC Возвращает индекс последнего параметра командной строки
IPXFCONST Возвращает значение, связанное с константой, определенной в С РОЭ1Х стандарте
IPXFLENTRIM Возвращает индекс последнего непробельного символа во входной строке
IPXFWEXITSTATUS1 Возвращает код завершения дочернего процесса
IPXFWSTOPSIG1 Возвращает номер сигнала, который заставил дочерний процесс остановиться
IPXFWTERMSIG1 Возвращает номер сигнала, который заставил дочерний процесс завершиться
PXF<TYPE>GET Получает значение, хранимое в компоненте (или поле) структуры
PXF<TYPE>SET Устанавливает значение компонента (или поля) структуры
PXFA<TYPE>GET Получает значения массива, хранимые в компоненте (или поле) структуры
PXFA<TYPE>SET Устанавливает значение компонента массива (или поля) структуры
PXFACCESS Определяет доступность файла
PXFALARM Планирует тревогу
PXFCALLSUBHANDLE Вызывает связанную подпрограмму
PXFCFGETISPEED1 Получает входную скорость в бодах из структуры {егтюз
PXFCFGETOSPEED1 Получает выходную скорость в бодах из структуры {егтюэ
PXFCFSETISPEED1 Устанавливает входную скорость в бодах в структуре !егтю$
PXFCFSETOSPEED1 Устанавливает выходную скорость в бодах в структуре 1егтю$
PXFCHDIR Изменяет текущий рабочий каталог
PXFCHMOD Изменяет режим монопольного использования файла
PXFCHOWN1 Изменяет владельца и группу файла
PXFCLEARENV Очищает среду процесса
PXFCLOSE Закрывает файл, связанный с описателем
PXFCLOSEDIR Закрывает поток каталога *
PXFCONST Возвращает значение, связанное с константой 1
PXFCNTL1 Манипулирует описателем открытого файла
PXFCREAT Создает новый файл или перезаписывает существующий файл
PXFCTERMID1 Генерирует конечное имя пути
PXFDUP, PXFDUP2 Дублирует существующий описатель файла
PXFE<TYPE>GET Получает значение, хранимое в компоненте (или поле) структуры |
PXFE<TYPE>SET Устанавливает значение массивного компонента (или поля) структуры
PXFEXECV, Выполняет новый процесс, передавая параметры командной строки |
PXFEXECVE,
|
PXFEXECVP
PXFEXIT, PXFFASTEXIT Выходит из процесса !
PXFFDOPEN Открывает внешнее устройство ^
PXFFFLUSH Записывает дисковый файл непосредственно на диск 1
Приложения 445
Имя Описание
PXFFGETC Читает символ из файла
PXFFILENO Возвращает описатель файла, связанный с указанным устройством
PXFFORK1 Создает дочерний процесс, который отличается от родительского процесса только
его PID (Process Identification Number)
PXFFPATHCONF Получает значение для опции конфигурации открытого файла
PXFFPUTC Записывает символ в файл
PXFFSEEK Изменяет позицию файла
PXFFSTAT Получает информацию о состоянии файла
PXFFTELL Возвращает относительную позицию в байтах с начала файла
PXFGETARG Получает указанный параметр командной строки
PXFGETATTY Проверяет, связан ли описатель файла с терминалом
PXFGETC Читает символ из стандартного входного устройства 5
PXFGETCWD Возвращает путь текущего рабочего каталога
PXFGETEGID1 Получает эффективный групповой ID текущего процесса
PXFGETENV Получает установку переменной среды
PXFGETEUID1 Получает эффективный пользовательский ID текущего процесса
PXFGETGID1 " 1 Получает действительный групповой ID текущего процесса
PXFGETGRGID1 Получает информацию группы для указанного GID
PXFGETGRNAM1' Получает информацию группы для названной группы
PXFGETGROUPS1 Получает дополнительные групповые ID
PXFGETLOGIN Получает имя пользователя
PXFGETPGRP1 Получает процессный групповой ID вызывающего процесса
[PXFGETPID Получает процессный ID вызывающего процесса
PXFGETPPID Получает процессный ID родителя вызывающего процесс
PXFGETPWNAM1 Получает информацию пароля для указанного имени
.PXFGETPWUID1 J Получает информацию пароля для указанного UID
PXFGEfSUBHANDLE Возвращает описатель для подпрограммы
PXFGETUID1 Получает действительный пользовательский ID текущего процесса
iPXFISBLK Проверяет на блочный специальный файл
'PXFISCHR Проверяет на символьный файл
¡PXFiSCONSf Проверяет, является ли строка допустимым константным именем
¡PXFISDIR Проверяет, является ли файл каталогом
!PXFISFIFO Проверяет, является ли файл специальным файлом FIFO
¡PXFISREG Проверяет, является ли файл регулярным файлом
PXFKILL Посылает сигнал указанному процессу
PXFLINK Создает связь с файлом или каталогом
'PXFLOCALTIME Преобразует прошедшее время в секундах в местное время
PXFLSEEK Позиционирует файл на указанную величина в байтах
PXFMKDIR Создает новый каталог
PXFMKFIFO1 Создает новый FIFO
PXFOPEN Открывает или создает файл
PXFOPENDIR Открывает каталог и связывает с ним поток
PXFPATHCONF Получает значение для опций конфигурации открытого файла
PXFPAUSE Приостанавливает выполнение процесса
PXFPIPE Создает канал связи между двумя процессами
PXFPOSIXIO Устанавливает текущее значение флажка POSIX ввода/вывода
¡PXFPUTC Выводит символ на логическое устройство 6 (стандартный вывод)
IPXFREAD Читает из файла
PXFREADDIR Читает вход текущего каталога
PXFRENAME Изменяет имя файла
¡PXFREWINDDIR Сбрасывает позицию потока в начало каталога
446 С / / Алгспин, В В Кондратьев Прокламирование на Visual FORTRAN

; Имя Описание
PXFRMDIR Удаляет каталог
1PXFSETENV Добавляет новую переменную среды или устанавливает ее значение
‘ PXFSETGID1 Устанавливает эффективный групповой Ю текущего процесса
PXFSETPGID1 Устанавливает процессный групповой ID
PXFSETSID1 Создает сеанс и устанавливает групповой ID процесса
PXFSETUID1 Устанавливает эффективный пользовательский ID текущего процесса
PXFSIGACTION Изменяет действие, связанное с собственным сигналом
PXFSIGADDSET1 Добавляет сигнал к набору сигналов
PXFSIGDELSET1 Удаляет сигнал из набора сигналов
PXFSIGEMPTYSET1 Делает пустым набор сигналов
| PXFSIGFILLSET1 Заполняет набор сигнала
¡PXFSIGISMEMBER1 Проверяет, является ли сигнал элементом набора сигналов
iPXFSIGPENDING1 Исследует ждущие обработки сигналы
PXFSIGPROCMASK1 Изменяет список в настоящее время блокируемых сигналов
[PXFSIGSUSPEND1 Приостанавливает процесс, пока сигнал не получен
¡PXFSLEEP Вынуждает процесс бездействовать
PXFSTAT Получает состояние файла
IPXFSTRUCTCOPY Копирует содержание одной структуры в другую
i'PXFSTRUCTCREATE Создает образец указанной структуры
PXFSTRUCTFREE Удаляет образец структуры
PXFSYSCONF Получает значения для системных пределов или опций
PXFTCDRAIN1 Ждет, пока весь записанный вывод не будет передан
Ip x f t c f l o w 1 Приостанавливает передачу или прием данных
¡PXFTCFLUSH1 Сбрасывает входные данные терминала, выходные данные или оба
[PXFTCGETAfTR1 Читает текущие параметры настройки терминала
PXFTCGETPGRP1 Получает групповой Ю приоритетного процесса связанного с терминалом
PXFTCSENDBREAK1 Посылает отключение на терминал
PXFTCSETATTR1 Записывает новые параметры настройки терминала
PXFTCSETPGRP1 Устанавливает группу приоритетного процесса, связанную с терминалом
PXFTIME Получает системное время
PXFTIMES Получает времена процесса
'PXFTTYNAM1 Получает имя пути терминала
PXFUCOMPARE Сравнивает 2 целочисленных без знака
PXFUMASK Устанавливает новую маску создания файла и получает предшествующую
^XFUNAME Получает имя операционной системы
PXFUNLINK Удаляет вход каталога
PXFUTIME Устанавливает доступность файла и время модификации
PXFWAIT1 Ждет завершения дочернего процесса
PXFWAITPID1 Ждет завершения собственного PID
PXFWIFEXITED1 Определяет, имел ли место выход из дочернего процесса
PXFWIFSIGNALED1 Определяет, имел ли место выход из дочернего процесса из-за сигнала
PXFWIFSTOPPED1 Определяет, остановлен ли дочерний процесс
PXFWRITE Записывает в файл
1 Только L *X .

Е-5. Подпрограммы QuickWin (W*32, W*64)


П одпрограммы Q uickW in пом огаю т превращ ать графические программы в простые
прилож ения W indow s*. Ч ю б ы использовать подпрограмм у Q uickw in, добавьте следую ­
щ ее утверж дение к програм мной единице, содерж ащ ей подпрограмму:
П риш ж еиия 447

USE IFQWIN
Графические подпрограммы такж е использую тся в прилож ениях Q uickW in.

Таблица Е-4. Краткое изложение подпрограмм QuickWin (W*32, W*64)


Имя Описание
Управление и исследование окон.
FOCUSQQ Устанавливает фокус к указанному окну (активизирует окно)
GETACTIVEQQ Возвращает номер устройства в настоящее время активного дочернего процесса
GETHWNDQQ Преобразует номер устройства в дескриптор Windows для функций, которые
его требуют
GETUNITQQ Возвращает номер устройства, соответствующий указанному дескриптору
Windows
GETWINDOWCONFIG Возвращает свойства текущего окна
GETWSIZEQQ Возвращает размер и позицию окна
ilNQFOCUSQQ Определяет, какое окно имеет фокус (активизировано)
SETACTIVEQQ Делает дочернее окно активным, но не дает ему фокус (focus)
SETWINDOWCONFIG Устанавливает свойства текущего окна
SETWSIZEQQ Устанавливает размер и позицию окна
Расширения приложений QuickWin*
ABOUTBOXQQ Добавляет Окно информации с настроенным текстом
APPENDMENUQQ Добавляет пункт меню
CLICKMENUQQ Моделирует эффект щелчка или выбор пункта меню
DELETEMENUQQ Удаляет пункт меню
GETEXITQQ Возвращает установку для поведения выхода приложения О и Ш М п
INCHARQQ Читает отдельный символ, вводимый с клавиатуры, и возвращает значение
АЭСП этого символа без какой-либо буферизации
INITIALSETTINGS Управляет начальными установками меню и начальным рамочным окном
INSERTMENUQQ Вставляет пункт меню
MESSAGEBOXQQ Отображает окно сообщений
MODIFYMENUFLAGSQQ Изменяет состояние пункта меню
MODIFYMENUROUTINEQQ Изменяет подпрограмму отзыва пункта меню
MODIFYMENUSTRINGQQ Изменяет текстовую строку пункта меню
PASSDIRKEYSQQ Определяет поведение руководства и страницы ключей
REGISTERMOUSEEVENT Регистрирует определяемые приложением подпрограммы, которые вызыва­
ются для событий от нажатия мыши
SETEXITQQ Устанавливает поведение выхода приложения О ш с1^ п
SETMESSAGEQQ Изменяет любое сообщение О и Ш М п, включая сообщения строки состояния,
сообщения состояния и сообщения диалогового окна
SETMOUSECURSOR Устанавливает курсор мыши для окна, которое находится в фокусе (активи­
зировано)
SETWINDOWMENUQQ Устанавливает меню, к которому добавляет список имен окон текущих дочер­
них процессов
UNREGISTERMOUSEEVENT Удаляет подпрограмму, зарегистрированную при помощи
REGISTERMOUSEEVENT
WAITONMOUSEEVENT Блокирует возвращение до возникновения события от нажатия мыши
Преобразование цветов.
INTEGERTORGB Преобразует номер цвета RGB в его красные, зеленые и синие компоненты
RGBTOINTEGER Преобразует целые числа, указывающие красный, зеленый и синий цвета в
целое число RGB (для использования в подпрограммах РвВ)
448 С. Л Ачгашн, В В Кондратьев Програлтрование на Visual FORTRAN

Е-6. Графические подпрограммы (W*32, W*64)


Граф ические подпрограммы могут использоваться в стандартны х прикладных про­
граммах для работы с графикой и в прилож ениях Q uickw in. Чтобы использовть эту под­
програм му, добавьте утверж дение USE IFQW IN к програм мной единице, содержащ ей
подпрограмм у. В ы берите тип программы : графику Q uick W in или стандартную графику.

Таблица Е-5. Краткое изложение графических подпрограмм (W*32, W*64)


Имя Описание
Управление или исследование цветов:1
FLOODFILL Заполняет область, используя текущий индекс и маску закраски; начальная
точка заполнения использует координаты области просмотра
FLOODFILLJV Заполняет область, используя текущий индекс и маску закраски; начальная
точка заполнения использует координаты окна
FLOODFILLRGB Заполняет область, используя текущий цвет RGB и маску закраски; начальная
точка заполнения использует координаты области просмотра
FLOODFILLRGB W Заполняет область, используя текущий цвет RGB и маску закраски; начальная
точка заполнения использует координаты окна
GETBKCOLOR Возвращает текущий индекс цвета фона и для текста и для графики
GETBKCOLORRGB Возвращает текущий номер RGB цвета фона и для текста и для графики
GETCOLOR Возвращает текущий графический индекс цвета
GETCOLORRGB Возвращается текущее графическое значение RGB цвета
GETPIXEL Возвращает индекс цвета пикселя; положение пикселя использует координаты
области просмотра
GETPIXEL.W Возвращает индекс цвета пикселя; положение пикселя использует координаты
окна
iGETPIXELRGB Возвращает число RGB цвета пикселя; положение пикселя использует коор­
динаты области просмотра
GETPIXELRGB.W Возвращает число RGB цвета пикселя; положение пикселя использует коор­
динаты окна
GETPIXELS ¡Возвращает индексы цвета нескольких пикселей
GETPIXELSRGB i¡Возвращает номера RGB цвета нескольких пикселей
[GETTEXTCOLOR !Возвращает текущий индекс цвета текста
GETTEXTCOLORRGB Возвращает текущий номер RGB цвета текста
REMAPALLPALETTERGB !Повторно отображает всю палитру к цвету RGB
REMAPPALETTERGB iПовторно отображает один индекс цвета к цвету RGB
'SETBKCOLOR i;Устанавливает индекс текущего цвета фона и для текста и для графики
SETBKCOLORRGB ' Устанавливает число RGB текущего цвета фона и для текста и для графики
SETCOLOR 1Устанавливает текущий индекс цвета для графики
SETCOLORRGB Устанавливает текущее значение RGB цвета для графики
SETPIXEL Устанавливает пиксель к текущему графическому индексу цвета; расположение
пикселя, использует координаты области просмотра
SETPIXEL.W Устанавливает пиксель к текущему графическому индексу цвета; расположение
пикселя, использует координаты окна
SETPIXELRGB Устанавливает пиксель к числу RGB цвета; расположение пикселя, использует
координаты области просмотра
SETPIXELRGB_W jУстанавливает пиксель к числу RGB цвета; расположение пикселя, использует
координаты окна
SETPIXELS jУстанавливает индексы цвета нескольких пикселей
SETPIXELSRGB Устанавливает несколько пикселей в цвет РвВ
SETTEXTCOLOR Устанавливает текущий индекс цвета для текста
SETTEXTCOLORRGB Устанавливает текущий текстовый цвет в значение RGB
П рилож ении 449
Имя Описание
Характеристики иллюстрации.
бЕТПи-МАБК Возвращает текущую маску закраски
СЕТШ ЕБТУЬЕ Возвращает текущий тип линии
вЕТОРИЕМОйЕ Возвращает логический режим записи, используемый для рисования линии
БЕТСиРРвМ Маскирует часть экрана; это не изменяет координаты области просмотра
БЕТПи-МАБК Устанавливает текущую маску закраски
БЕТШ ЕЗтЕ Устанавливает текущий стиль линии
SETWRITEMODE Наборы логический режим записи, используемый для рисования линии
Преобразование и Установки Координат:
СЕТРНУЭСООРР Преобразует координаты области просмотра к физическим координатам
GETVIEWCOORD Преобразует физические координаты в координаты области просмотра
GETVIEWCOORD \Л/ Преобразует координаты окна к координатам области просмотра
СЕТ\Л/1МОО\Л/СООРО Преобразует координаты области просмотра к координатам окна
SETVIEWORG Перемещает начало координат области просмотра (0,0) в указанную физиче­
скую точку
SETVIEWPORT Переопределяет границы области просмотра к указанным пределам и уста­
навливает начало координат области просмотра в левый верхний угол этой
области
SETVIEWPORT Переопределяет границы области просмотра к указанным пределам и уста­
навливает начало координат области просмотра в левый верхний угол этой
области
SETWINDOW Определяет границу окна при помощи указанных координат окна
Гмафический рисунок:
АНС Рисует дугу, используя координаты области просмотра
АРС_\Л/ Рисует дугу, используя координаты окна
СЬЕАРЭСРЕЕМ Очищает экран, область просмотра или текстовое окно
ЕШ РЭЕ Рисует эллипс или круг, используя координаты области лросмотра
ELLIPSE_W Рисует эллипс или круг, используя координаты окна
вЕТАРаМГС) Возвращает оконечные точки последней нарисованной дуги или круга
вЕТСиРРЕМТРОЭтОМ Возвращает координаты области просмотра текущей позиции графического
вывода
GETCURRENTPOSITION_W Возвращает координаты окна текущей позиции графического вывода
СРЭТАТиЭ Возвращает состояние (успех или отказ) последней вызванной графической
подпрограммы
И М ЕЮ Чертит линию из текущей позиции графического\вывода к указанной точке,
используя координаты области просмотра
LINETO_W Чертит линию из текущей позиции графического вывода к указанной точке,
используя координаты окна
ШЕТОАР Чертит линию между точками в одном массиве и соответствующих точках
в другом массиве
Ш ЕТОАРЕХ Подобна Ш Е Т О А Р , но также и позволяет указывать цвет и тип линии
МОУЕТО Перемещает текущую позицию графического вывода в указанную точку,
используя координаты области просмотра
MOVETO_W Перемещает текущую позицию графического вывода в указанную точку,
используя координаты окна
Р1Е Рисует фигуру, имеющую форму круглой пластины, используя координаты
области просмотра
Р1Е \Л/ Рисует фигуру, имеющую форму круглой пластины, используя координаты окна
Р01УВЕг1ЕР Рисует кривую Безье, используя координаты области просмотра
POLYBEZIER_W Рисует кривую Безье, используя координаты окна
Р01_УВЕ71ЕРТ0 ¡Рисует кривую Безье, используя координаты области просмотра
450 С Д . А чгазин, В В К ондрат ьев. П рограм ирование на Умиа1 ГОЯТЛА.М

Имя Описание
Р01_УВЕг1ЕКТ0 \Л/ Рисует кривую Безье, используя координаты окна
РСИУССМ Рисует многоугольник, используя координаты области просмотра
Р01_УС0М \л/ Рисует многоугольник, используя координаты окна
Р01_УШ ЕСЮ Чертит линию между последовательными точками в массиве
РЕСТА№1_Е Рисует Прямоугольник, используя координаты области просмотра
RECTANGLE_W Рисует прямоугольник, используя координаты окна
Символьно-ориентированное отображение текста:
.О ^РЬА УС иРЭО К Включает или выключает курсор
СЕТТЕХТРОЭНЮ М Возвращает текущую позицию текстового вывода
GETTEXTW INDOW Возвращает границы текущего текстового окна
ОиТТЕХТ Посылает текст на экран в текущую позицию
ЗС РО аТЕХТО Ш СМ Листает содержимое текстового окна
ЭЕПЕХТСиРЗОР Устанавливает высоту и ширину текстового курсора для окна в фокусе
ЗЕТТЕХТРОЭНЮ М Устанавливает текущую позицию текстового вывода
SETTEXTWINDOW Устанавливает границы текущего текстового окна
WRAPON Включает или выключает направление обтекания текстом
Отображение символа на основе шрифта.
СЕТРОМПМРО Возвращает текущие характеристики шрифта
СЕТСТЕХТЕХТЕМТ Возвращает ширину указанного текста в текущем шрифте
СЕТСТЕХТКОТАТЮ М Возвращает текущую ориентацию текста выводимого шрифтом 0 1 те Т Е Х Т
м т^Е Р О м тэ Инициализирует библиотеку шрифта
ОиТСТЕХТ Посылает текст в текущем шрифте на экран в текущей позиции2
ВЕТРОМ" Находит один шрифт, который соответствует указанному набору характеристик
и делает его текущим шрифтом используемым 01ТС ТЕ Х Т
БЕТСТЕХТКОТАТЮ М Устанавливает угол ориентации вывода текста шрифта в градусах
Передача образа в памяти
ОЕТМ АОЕ Запоминает образ экрана, используя координаты области просмотра
СЕП М А С Е \Л/ Запоминает образ экрана, используя координаты окна
1МА6ЕБ£Е Возвращает размер образа, основанного на координатах области просмотра
в байтах
(МАСЕБЯЕ \Л/ Возвращает размер образа, основанного на координатах окна в байтах
РиП М А С Е Восстанавливает образ, основанный на координатах области просмотра,
из памяти и отображает его
PUTIMAGE_W Восстанавливает образ, основанный на координатах окна, из памяти и ото­
бражает его
Загрузка и сохранение образа:
Ю АРИШ ЗЕ Читает файл точечной графики \Мпс1о\л/8 (ВМР) с диска и отображает его как
определено координатами области просмотра
LOADIMAGE_W Читает файл точечной графики \Л/|'пс1о)л/8 (ВМР) с диска и отображает его как
определено координатами окна
БАУЕИШ ЗЕ Сохраняет образ из указанной части экрана и сохраняет его как файл точеч­
ной графики \Мпс1о\л/8; местоположение экрана указывается, используя коор­
динаты области просмотра
SAVEIMAGE_W Сохраняет образ из указанной части экрана и сохраняет его как файл точеч­
ной графики \№пс!о)л/8; местоположение экрана указывается, используя коор­
динаты окна
1 КС В - "красный, зеленый, синий цвет"
2 О иТС ТЕ ХТ допускает использование специальных шрифтов; О УТТЕХТ этого не делает.
П рилож ения 451

Е-7. Диалоговые подпрограммы (W*32, W*64)


Д иалоговы е подпрограммы позволяю т добавлять ди алоговы е окна к W indow s,
Q uickW in и консольным приложениям. Чтобы активизировать ди алоговое окно, добавьте
утверж дение USE 1FLOGM к нужной програм мной единице прилож ения.

Таблица Е-6. Краткое изложение диалоговых подпрограмм (W*32, W*64)


Имя Описание
DLGEXIT Закрывает открытое диалоговое окно
DLGFLUSH Обновляет отображение диалогового окна
DLGGET Возвращает значение переменной управления
DLGGETCHAR Возвращает значение символьной переменной управления
DLGGETINT Возвращает значение целочисленной переменной управления
DLGGETLOG Возвращает значение логической переменной управления
DLGINIT Инициализирует диалоговое окно
DLGINITWITHRESOURCEHANDLE Инициализирует диалоговое окно
DLGISDLGMESSAGE Определяет, предназначено ли сообщение для немодального диало­
гового окна (modeless dialog box)
DLGISDLGMESSAGEWITHDLG Определяет, предназначено ли сообщение для определенного немо­
дального диалогового окна
DLGMODAL Показывает диалоговое окно
DLGMODALWITHPARENT Показывает диалоговое окно и указывает родительское окно
DLGMODELESS Показывает немодальное диалоговое окно
DLGSENDCTRLMESSAGE Посылает сообщение управлению диалогового окна
DLGSET Назначает значение переменной управления
DLGSETCHAR Назначает значение символьной переменной управления
DLGSETCTRLEVENTHANDLER Назначает написанные пользователем обработчики событий управле­
ния ActiveX* в диалоговом окне
DLGSETINT Назначает значение целочисленной переменной управления
DLGSETLOG Назначает значение логической переменной управления
DLGSETRETURN Устанавливает возвращаемое значение для DLGMODAL
DLGSETSUB Назначает определяемую подпрограмму отзыва для управления
DLGSETTITLE Устанавливает заголовок диалогового окна
DLGUNINIT Освобождает память для инициализированного диалогового окна

Е-8. Смешанные динамические (run-time) подпрограммы


Intel Fortran обеспечивает несколько см еш анны х подпрограм м для прилож ений. Ч то ­
бы использовать for_rtl_init_ и for_rtl_finish_, вы долж ны вы зы вать их из основной п ро­
граммы, написанной на Си. Чтобы использовать другие п одпрограм м ы , добавьте утвер ­
ж дение USE 1FCORE к програм мной единице, содерж ащ ей подпрограм м у.

Таблица Е-7. Краткое изложение смешанных динамических подпрограмм


Имя Описание
Клавиатуры и динамики:
GETCHARQQ Возвращает следующее нажатие клавиши клавиатуры
GETSTRQQ Читает строку символов от клавиатуры, используя буферизированный ввод
PEEKCHARQQ Проверяет буфер, чтобы узнать, ожидается ли нажатие клавиши
Управление файлами.
COMMITQQ Выполняет любые ожидающие обработки операции записи для файла, связан­
ного с указанным устройством для файловых физических устройств
452 С Д Алгазин, В. В Кондратьев Програмирование на Visual FORTRAN

Имя Описание
Обработка ошибок:
GERROR Возвращает код ошибки IERRNO как строковую переменную
PERROR Возвращает сообщение об ошибке, которой предшествует строка, для послед­
ней обнаруженной ошибки
Исследование и управление плавающей точкой:
FOR GET FPE Возвращает текущие установки флажков исключения плавающей точки
FOR_SET_FPE Устанавливает флажки исключения для плавающей точки
GETEXCEPTIONPTRSQQ1 Возвращает указатель на указатели информации исключения времени вы­
полнения С, используемые в обработчиках сигнала, устанавливаемых
БЮ МАЮ О или прямыми вызовами подпрограмм С 111 $1дпа1()
Среда выполнения (W*32, W*64):
for rtl finish • I(Очищает среду выполнения Fortran
for_rtl_init_ Инициализирует среду выполнения Fortran
Управление режимом повторной входимости:
FOR_SET_REENTRANCY Управляет типом защиты повторной входимости, которую показывает библио­
тека поддержки
Обратная трассировка-
TRACEBACKQQ |Генерирует трассу стека
Назначение памяти■
FOR_DESCRIPTOR_ASSIGN1 ¡Создает описатель массива в памяти

Е-9. Подпрограммы COM (W*32, W*64)


П одпрограм м ы СО М пом огаю т работать с объектами СОМ . Чтобы использовать под­
программу СО М , добавьте следую щ ее утверж дение к программной единице, содерж ащ ей
подпрограмму:
USE IFCOM
Н екоторы е из подпрограм м м огут требовать утверждения USE IFW1NTY.
Табл. Е-8 обобщ ает подпрограм м ы СОМ . Стандартны е имена показаны в смеш анном
регистре, чтобы сделать им ена прощ е для понимания. Записывая прилож ения, вы можете
использовать лю бой регистр.

Таблица Е-8. Краткое изложение подпрограмм COM (W*32, W*64)


Имя Описание
COMAddObjectReference Добавляет ссылку на интерфейс объекта
COMCLSIDFromProgID Передает программный идентификатор и возвращает соответствующий
идентификатор класса
COMCLSIDFromString Передает строку идентификатора класса и возвращает соответствующий
идентификатор класса
COMCreateObjectByGUID Передает идентификатор класса, создает образец объекта и возвращает ука­
затель на интерфейс объекта
COMCreateObjectByProgID Передает программный идентификатор, создает образец объекта и возвра­
щает указатель на интерфейс IDispatch объекта
COMCreateObjectByProgID Передает программный идентификатор, создает образец объекта и возвра­
щает указатель на интерфейс IDispatch объекта
COMGetActiveObjectByGU ID Передает идентификатор класса и возвращает указатель на интерфейс в на­
стоящее время активного объекта
COMGetActiveObjectByProgID Передает программный идентификатор и возвращает указатель на интер­
фейс IDispatch в настоящее время активного объекта
COMGetFileObject Передает имя файла и возвращает указатель на интерфейс IDispatch объекта
автоматизации, который может манипулировать файлом
Прилож ения 453
Имя Описание
COMInitialize Инициализирует библиотеку COM
COMlsEqualGUID Определяет, являются ли 2 глобально уникальных идентификатора (GUIDs)
одинаковыми
COMQuerylnteríace Передает идентификатор интерфейса и возвращает указатель на интерфейс
объекта
COMReleaseObject Указывает, что программа - со ссылкой на интерфейс объекта
COMStringFromGUID Передает глобально уникальный (GUID) идентификатор' и возвращает строку
пригодных для печати символов
COMUninitialize Отменяет инициализацию библиотеки СОМ

Е-10. Подпрограммы AUTO (W*32, W*64) ,


П одпрограммы A U TO помогаю т работать с объектами автом атизации. Чтобы исполь­
зовать подпрограмму A U TO , добавьте следую щ ее утверж дение к программной единице,
содержащ ей подпрограмму:
USE IFAUTO
Н екоторые из подпрограмм м огут требовать утверж дения USE IFW IN TY .
Табл. Е-9 обобщ ает подпрограмм ы AUTO. С тан д ар ш ы е имена показаны в см еш ан ­
ном р е г и а р е , чю б ы сделать им ена прощ е для понимания. Записывая прилож ения, вы
м ожете использовать лю бой регистр.

Таблица Е-9. Краткое изложение Подпрограмм AUTO (W*32, W*64)


Имя Описание
AUTOAddArg Передает имя параметра и значение и добавляет параметр к структуре дан­
ных списка параметров
AUT0 Al locate 1nvokeArgs Распределяет структуру данных списка параметров, которая поддерживает па­
раметры, передаваемых в А иТ01тю ке
AUTODeallocatelnvokeArgs Освобождает структуру данных списка параметров
AUTOGetExceptlnfo Отыскивает информацию исключения, когда метод возвратил состояние ис­
ключения
AUTOGetProperty Передает имя или идентификатор свойства и получает значение свойства
объекта автоматизации
AUTOGetPropertyBylD Передает Ю элемента свойства и получает значение свойства объекта авто­
матизации в первом параметре списка параметров
AUTOGetPropertylnvokeArgs Передает структуру данных списка параметров и получает значение свойства
объекта автоматизации, указанного в первом параметре списка параметров
AUTOInvoke Передает имя или идентификатор метода объекта и структуру данных списка
параметров, и вызывает метод с переданными параметрами
AUTOSetProperty Передает имя или идентификатор свойства и значения и устанавливает зна­
чение свойства объекта автоматизации
AUTOSetPropertyBylD Передает Ю элемента свойства и устанавливает значение свойства объекта
автоматизации, используя первый параметр списка параметров
AUTOSetPropertylnvokeArgs Передает структуру данных списка параметров и устанавливает значение
свойства объекта автоматизации, указанного в первом параметре списка па­
раметров
AUTOSetPropertylnvokeArgs Передает .структуру данных списка параметров и устанавливает значение
свойства объекта автоматизации, указанного в первом параметре списка па­
раметров
Для получения дополнительной информ ации об этих подпрограмм ах см. ссылку биб­
лиотек или диалоговую ссылку Intel Visual Fortran.
454 С Д. Алгазин, В В. Кондратьев. Програмирование на Visual FORTRAN

E-l 1. Подпрограммы Fortran ОрепМР*


Intel Fortran обеспечивает вызов подпрограмм библиотеки Fortran О репМ Р*, которые
вы можете использовать для управления параллельной декомпозицией. Чтобы использо­
вать подпрограмм у Fortran О репМ Р, добавьте утверж дение USE O M P L1B к программ­
ной единице, содерж ащ ей подпрограмм у.
Табл. Е - 10 обобщ ает подпрограм м ы Intel F ortran библиотеки поддерж ки A PI Fortran
О репМ Р. Все эти подпрограмм ы являю тся внеш ним и процедурам и.

Таблица Е-10. Краткое изложение подпрограмм Fortran ОрепМР


Имя Описание
OMP_SET_NUM_TH READS Устанавливает число потоков для использования в следующей параллельной
области
OMP_GET_NUM_THREADS Получает число потоков в текущей группе, выполняющей параллельную об­
ласть, из которой вызывается подпрограмма
OMP_GET_MAX_THREADS Получает максимальное значение, которое может быть возвращено вызовом
функции OMP_GET_NUM_THREADS
OMP_GET_THREAD_NUM Получает число потоков, внутри группы, в диапазоне от 0 до OMP GET NUM
TH R EA DS-1
OMP GET_NUM_PROCS Получает число процессоров, которые являются доступными для программы
OMP IN PARALLEL Сообщает, действительно ли область выполняется параллельно
OMP_SET_DYNAMIC Разрешает или отключает динамическую настройку числа потоков, доступных
для выполнения параллельных областей
OMP GET DYNAMIC Сообщает, действительно ли разрешается динамическая настройка потока
OMP SET NESTED Разрешает или отключает вложенный параллелизм
OMP GET NESTED Сообщает, действительно ли разрешается вложенный параллелизм
OMP INIT LOCK Инициализирует блокировку для использования в последующих вызовах
OMP DESTROY LOCK Разъединяет блокируемую переменную от любых блокировок
0M P_SET_L0CK Заставляет выполняемый поток ждать, пока указанная блокировка не освобож­
дена
0M P_UNSET_L0CK Освобождает выполняемый поток от монопольного использования блокировки
OMP TEST LOCK Пытается установить блокировку, связанную с блокируемой переменной
OMP_INIT_NEST_LOCK Инициализирует вложенную блокировку для использования в последующих
вызовах
OMP DESTROY NEST LOCK Отсоединяет блокируемую переменную от вложенной блокировки
OMP_SET_NEST_LOCK Заставляет выполнимый поток ждать, пока указанная вложенная блокировка не
освобождена
OMP_UNSET_NEST_LOCK Освобождает выполнимый поток от монопольного использования вложенной
блокировка, если счетчик вложения равен нулю
OMP_TEST_NEST_LOCK Пытается установить вложенную блокировку, связанную с блокируемой пере­
менной
OMP_GET_WTIME Возвращает значение с двойной точностью, равное времени (в секундах),
прошедшему относительно произвольного начала отсчета времени Начало
отсчета времени не изменяется в течение выполнения программы
OMP_GET_WTICK Возвращает значение с двойной точностью, равное числу секунд между после­
довательными тактами системных часов
Расширения Intel Fortran:
KMP_GET_STACKSIZE_S1 Возвращает число байтов, которые будут распределены для каждого парал­
лельного потока, чтобы использовать их как личный стек
KM P_SET_STAC KSIZE_S2 Устанавливает число байтов, которые будут распределены для каждого па­
раллельного потока, чтобы использовать их как личный стек
П рилож ения 455
Имя Описание
KMP_GET_BLOCKTIME Возвращает число миллисекунд, которые поток должен ждать, после завер­
шения выполнения параллельной области, перед бездействием
KMP_SET_BLOCKTIME Устанавливает число миллисекунд, которые поток должен ждать, после завер­
шения выполнения параллельной области, перед бездействием
KMP.MALLOC Распределяет блок памяти указанного размера (в байтах) из локального хипа
(heap)потока
KMP_CALLOC Распределяет массив указанного числа и размера элементов из локального
хипа потока
KMP_REALLOC Перераспределяет блок памяти в указанном адресе и указанного размера из
локального хипа потока
KMP.FREE Освобождает блок памяти в указанном адресе из локального хипа потока
1Для совместимости в обратном направлении она может быть указанна как КМР_СЕТ_8ТАСК812Е.
2 Для совместимости в обратном направлении она может быть указанна как КМ Р^Е Т_8ТА С К812Е .

Приложение F. Краткое изложение


расширений языка

Это приложение обобщ ает расш ирения язы ка Intel Fortran но сравнению со стандар­
том AN SI/ISO Fortran 95. Больш инство расш ирений доступно на всех поддерж иваем ы х
ОС. О днако некоторы е расш ирения ограничены одной или более платформами. Если
расш ирение ограничено, это отмечено.

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


Следую щ ие правила являю тся расш ирениям и к м етодам и правилам для форм атов ис­
ходного текста:
■ Табулированный ф орм ат применим как м етод к строкам текста програм мы (см.
стр. 14).
■ Символ D как индикатор утверж дения отладки в столбце 1 ф иксированного или табу ­
лированного форм ата исходного текста (см. разд. 1.5).
■ Необязательная ш ирина поля утверж дения в 132 столбца для ф иксированного или та­
булированного форм ата исходного текста (см. разд. 1.5).
■ Н еобязательное поле порядкового ном ера для фиксированного исходного формата.
■ До 511 строк продолж ения в исходной програм м е (см. разд. 1.4).

F-2. Имена
Следую щ ие правила являю тся расш ирениям и к правилам для имен (см. стр. 7):
■ Имена могут содерж ать до 63 сим волов.
■ Знак доллара ($) является допустим ы м символом для имен и м ож ет быть первым си м ­
волом.

F-З. Наборы символов


Следую щ ие правила являю тся расш ирениям и к стандартном у набору символов:
■ Символ Tab (<Tab>) (см. разд. 1.3).
■ Для систем W indows:
■ специальные наборы сим волов A SC II и A N SI,
• наборы кодов клавиш .
456 С. Д А 1га п т , В В К он драт ьев П р ограм и ровали е на Visual FO RTRAN

F-4. Встроенные типы данных


С ледую щ ая таблица перечисляет расш ирения типов данных и расш иренный способ
указы вать типы данны х (см. разд. 2.1):
BYTE INTEGERS REAL*16
DOUBLE COMPLEX INTEGER*2 C0MPLEX*8
L0GICAL*1 INTEGERS C0MPLEX*16
L0GICAL*2 INTEGER*8 COMPLEX*32
L0GICAL*4 REAL*4
L0GICAL*8 REAL*8

F-5. Константы
С -строки допускаю тся в сим вольны х константах как расш ирение.
Х олериговы е константы допускаю тся как расш ирение (см. стр. 34).

F-6. Выражения и назначение


Когда операнды разных устроенных типов данны х объединены в выражениях, преоб­
разования выполняю тся по мере необходим ости (см. стр. 49).
Д воичны е, восьм еричны е, ш естнадцатеричны е и холеритовы е константы могут по­
явиться везде, где допускаю тся числовые константы (см. разд. 2.4).
С ледую щ ие правила являю тся расш ирениям и, допускаем ы м и в логических вы раж е­
ниях (см. стр. 51):
■ .XOR. к а к с и н о н и м для .N E Q V .
■ Ц елые числа как допустим ы е логические элементы.
■ Л огические операторы прим еняю тся к целым числам по битам.

F-7. Спецификации утверждений


С ледую щ ие специф икации ачрибутов и утверж дений являю тся расш ирениями:
• A U TO M A TIC и STA TIC,
■ PROTECTED' (см. разд. 4.18),
■ V O LA TILE (см. разд. 4.21).
Д войное двоеточие теперь необязательно для утверж дений IN TR IN SIC , SAVE,
STA TIC , A U TO M A TIC , EX TER N A L и V O LA TILE.

F-8. Управление выполнением


С ледую щ ие утверж дения управления являю тся расш ирениям и для Fortran 95 (см.
гл. 6):
- A SSIG N .
■ Н азначенный GO ТО.
- PAU SE.
О ни являю тся стары м и возм ож ностям и Fortran, которые были удалены в Fortran 95.
Intel Fortran полностью поддерж ивает эти возм ож ности.

F-9. Утверждения управления компиляцией


С ледую щ ее утверж дение и опция являю тся расш ирениям и, которые могут влиять на
компиляцию :
П рилож ения 457
■ /[N 0]L1ST, который мож ет бы ть указан для утверж дения IN C L U D E (см. разд. 12.1),
■ У тверж дение O PTIO N S (см. разд. 12.2).

F-10. Встроенные функции


Следую щ ие встроенны е функции являю тся расш ирениям и:
■ % VAL, % REF и % LO C , которые облегчаю т ссылки на п роцедуры не Fortran,
■ %F1LL, который м ож ет использоваться в определениях типов структуры записи (см.
прил. В -10).

F-l 1. Утверждения ввода/вывода


Следую щ ие утверж дения ввода/вы вода являю тся расш ирениям и:
■ У тверж дение A CC EPT,
■ У тверж дение TY PE, которое является синонимом для утверж дения PR IN T (см.
разд. 9.20),
■ У тверж дение REW RITE (см. разд. 9.21).

F-12. Форматирование ввода/вывода


Следую щ ие правила являю тся расш ирениям и, допустим ы м и в ф орм атировании вво­
да/вывода:
■ Описатель редактирования Q (см. разд. 10.23).
■ Описатель редактирования знак доллара ($) (см. стр. 320) и сим вол управления карет­
кой (см. стр. 323).
■ О писатель редактирования наклонная черта влево (\) (см. стр. 320).
■ Символ управления кареткой A SCII NUL (см. стр. 323).
■ Выражения переменного формата.
■ О писатель редактирования И (см. стр. 321). Это является старой возм ож ностью
Fortran, которая бы ла удалена в Fortran 95. Intel F ortran полностью поддерж ивает эту
возможность.

F-13. Утверждения файловых операций


Следую щ ие спецификаторы утверж дения и утверж дения являю тся расш ирениям и
(см. гл. 11):
■ С пецификаторы утверж дения CLO SE:
• значения STATUS: ’SA V E' (как синоним для ’K EEP'), ’PR IN T ', 'PR IN T /D E LE T E ',
'SU BM IT', 'SU B M IT /D E LET E ';
• D ISPO SE (или DISP).
■ Утверж дение D ELETE.
■ Спецификаторы утверж дения INQUIRE:
■ BIN A RY (W *32, W *64);
■ BLO CK SIZE;
■ BU FFERED ;
■ CARR1AGECONTROL;
• CO NVERT;
• D EFA U LTFILE;
• значения FORM : 'U N K N O W N ', 'B IN A R Y ' (W *32, W *64);
■ IOFO CU S (W *32, W *64);
458_________ с д Ачгазин. В. В. К ондрат ьев. П рограм ировипие на Visual FO RTRAN

■ M O D E как синоним для A C TIO N ;


■ O R G A N IZ A T IO N ;
■ R E C O R D T Y PE ;
• SH A RE (W *32, W *64).
■ С пециф икаторы утверж дения OPEN :
• Значения A C C ESS; 'A PPEN D ';
• A SS O C IA T E V A R IA B L E ;
■ B L O C K SIZ E ;
• B U F FE R C O U N T ;
■ B U FFE R E D ;
■ C A R R IA G E C O N T R O L ;
■ C O N V ER T ;
■ D EFA U L TFILE;
■ D ISPO SE (или D1SP);
• значение FO R M : 'B IN A R Y ' (W *32. W *64);
■ IO FO C U S (W *32, W *64);
• M A X REC;
• M O D E как синоним для A CTION ;
• N A M E как синоним для FILE;
■ N O SH A R E D ;
■ O R G A N IZ A T IO N ;
■ READONLY;
RECORD S1ZE как синоним для RECL;
■ R E C O R D T Y PE ;
■ SH A R E (W *32, W *64*);
• SH A R ED ;
■ T IT L E (W *32, W *64);
■ T Y PE как синоним для STA TU S;
■ U SER O PEN .

F-14. Директивы компилятора


С ледую щ ие общ ие директивы являю тся расш ирениям и (см. разд. 13.1):
A LIA S;
A S S U M E A L IG N E D ;
A T TR IB U T E S ;
D E C L A R E и N O D E C LA R E;
D E FIN E и UN D EFIN E;
D IST R IB U T E PO IN T;
F IX E D FO R M L IN ES IZ E ;
FR EEFO R M и N O FR E E FO R M ;
ID EN T;
IF и IF D E FIN ED ;
IN TE G E R ;
IV D EP;
L O O P CO U N T ;
M E M R E F C O N T R O L (i64 only);
M E SSA G E;
П рилож ения 459
O BJCOM M ENT;
O PTIO NS;
PACK;
PARALLEL и N O PA RA LLEL;
PREFETCH и N O PREFETCH ;
PSECT;
REAL;
STRICT и NOSTRICT;
SW P и N O SW P (¡64 only);
UN RO LL и N O U N RO LL;
V ECTO R A LIG N ED и V ECTO R UN A L IG N E D (¡32, i32em );
V ECTO R A LW A Y S и N O V E C TO R (¡32, i32em );
V ECTO R N O N TE M PO R A L (¡32, i32em).
Д ирективы распараллеливания Fortran O penM P, являю щ иеся расш ирениям и (см.
разд. 13.10): A TO M IC ; BA R RIER ; C R ITIC A L; DO; FLU SH ; M A STER ; O R D E R E D ;
PARALLEL; PA R A L L EL D O ; PA R A LLEL SEC TIO N S; P A R A L L E L W O R K SH A R E ;
SECTIO N S; SIN G LE; T H R EA D PR IV A T E ; W O R K SH A R E.

F-15. Встроенные процедуры


Встроенные процедуры, являю щ иеся расш ирениям и (см. гл. 8):
ACOSD; H D IM ; K IF IX ;
ACOSH; H F IX H IA N D ; K IN T ;
А 1М А Х0; H IE O R ; K IO R ;
A IM IN O ; H IO R ; K IQ IN T ;
A JM A X0; H IX O R ; K IQ N N T ;
A J M IN 0 ; HMOD; K IS H F T ;
АКМ АХО; H M V B IT S ; K IS H F T C ;
A K M IN 0 ; HNOTHSHFT; K IS IG N ;
AND; HSHFTC; KMAXO;
A S IN D ; H S IG N ; K M A X I;
A S IN H ; HTEST; K M IN O ;
ATA N2D ; I; K M IN 1 ;
ATAND; IA D D R ; KMOD;
ATANH; IA R G ; K M V B IT S ;
B AB S; IA R G C : K N IN T ;
BADDRESS; IA R G P T R ; KNOT;
BBCLR; 1B C H N G ; KZEXT;
B B IT S ; 1D A TE ; LEADZ;
B B S ET; IIA B S ; LO C;
B B T E S T; HAND; LSHFT;
B D IM ; IIB C L R ; L S H iF T ;
B IA N D ; IIB IT S ; M ALLOC;
B IE O R ; IIB S E T ; M CLO CK;
B IO R ; H D IM ; M M PREFETCH;
B IT E S T ; 1 ID IN T ; M O V E ALLOC;
B IX O R , IID N N T ; M U L T H IG H ;
B JTEST; IIE O R ; NARGS;
BKTEST; II F IX ; NOT;
BMOD; 1IN T; NUMARG;
460 C JT, A'iecisuH, B. B. Koudpambea. ripoppam ipoeam ie hü Visual FORTRAN

BMVBITS; ITOR; OR;


BNOT; IIQINT; POPCNT;
BSHFT; IIQNNT; POPPAR;
BSHFTC; TISHFT; QABS;
BSIGN; IISHFTC; QACOS;
CACHESIZE, IISIGN; QACOSD;
CDABS; IIXOR; QACOSH;
CDCOS; 1JINT; QARCOS;
CDEXP; ILEN; QASIN;
CDLOG; IMAG; QASIND;
CDSIN; IMAXO; QASINH;
CDSQRT; IMAX1; QATAN;
CDTAN; IMINO; QATAN2;
COMMANDARGUMENTCOUNT; IMIN1; QATAN2D;
COSD; IMOD; QATAND;
COTAN; IMVBITS; QATANH;
COTAND; ININT; QCMPLX;
CQABS; INT PTR KIND; QCONJG;
CQCOS; INT1; QCOS;
CQEXP; INT2; QCOSD;
CQLOG; INT4; QCOSH;
CQSIN; INT8; QCOTANQCOTAND;
CQSQRT; INUM; QDIM;
CQTAN; IQINT; QERF;
CTAN; IQNINT; QERFC;
DACOSD; ISHA; QEXP;
DACOSH; ISHC; QEXT;
DASIND; ISHL; QEXTD;
DASINH; ISNAN; QFLOAT;
DATAN2D; IXOR; QIMAG;
DATAND; IZEXT; QINT;
DATANH; JFIX; QLOG:
DATE; JIABS; QLOGIO;
DBLE; JIAND; QMAX1;
DBLEQ; JIBCLR; QMIN1;
DCMPLX; JIBITS; QMOD;
DCONJG; JIBSET; QNINT;
DCOSD; JIDIM; QNUM;
DCOTAN; JIDINT; QREAL;
DCOTAND; JIDNNT; QSIGN;
DERF; JIEOR; QSIN;
DERFC; JIFIX; QSIND;
DFLOAT; JINT; QSINH;
DFLOTI; JIOR; QSQRT;
DFLOTJ; JIQINT; QTAN;
DFLOTK; JIQNNT; QTAND;
DIMAG; JISHFT; QTANH;
DNUM; JISHFTC; RAN;
DREAL; JISIGN: RANDU;
DSHIFTL; JIXOR; RNUM;
DSHIFTR; JMAXO; RSHFT;
DSIND; JMAXi; RSHIFT;
DTAND; •rv
JMINO; SECNDS;
Пртожеиия 461
EOF; JMIN1; SHIFTL;
ERF; JMOD; SHIFTR;
ERFC ; JMVBITS; SIND;
ERRSNS; JNINT; SIZEOF;
EXIT; JNOT; SNGLQ;
FLOATI; JNUM; TAND;
FLOATJ; JZEXT; TIME;
FLOATK; KDIM; TRAILZ:
FP CLASS; KIABS: XOR;
FREE; KIAND; ZABS;
GET COMMAND; KIBCLR; ZCOS;
GET COMMAND ARGUMENT: KIBITS, ZEXP;
GET ENVIRONMENT VARIABLE; K1BSET; ZEXT;
GETARG; KIDIM; ZLOG;
HABS; KID1NT; ZSIN;
HBCLR; KIDNNT; ZSQRT;
HBITS; KIEOR; ZTAN
HBSET:
П араметр K IN D является расш ирением, доступны м в следую щ их встроенны х проце­
дурах: CO U N T, ICHAR, IND EX , LBO U N D , LEN, L E N T R IM , M A X LO C , M IN LO C ,
SCAN, SHAPE, SIZE, U BO U N D V ERIFY .

F-16. Дополнительные языковые возможности


Следую щ ие правила являю тся расш ирениям и язы ка, которые облегчаю т совм ести­
мость с другими версиями Fortran:
■ У тверж дение D EFIN E FILE,
■ Утверждения EN CO D E и D ECO D E,
■ У тверж дение FIND,
■ У тверж дение IN TERFA CE ТО,
■ И нтерпретация Fortran 66 утверж дения EX TER N A L (см. "И нтерпретация Fortran 66
утверж дения EX TER N A L"),
■ А льтернативный синтаксис для утверж дения PA R A M ETER ,
■ У тверж дение V IRTUA L,
■ Встроенные подпрограммы A N D, OR, XO R, 1MAG, LSH1FT, RSH IFT (см. табл. 8.3),
■ А льтернативный синтаксис для восьм еричны х и ш естнадцатеричны х конс!ант,
■ А льтернативный синтаксис для специф икатора записи ввода/вы вода,
■ А льтернативный синтаксис для утверж дения DELETE,
■ А льтернативный формат для списка имен внеш них записей,
■ Ц елочисленное утверж дение POIN TER,
■ Структуры записи.

F-17. Подпрограммы библиотеки поддержки


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

Приложение G. Порядок байтов

П орядок байтов в инф орм атике - м етод записи многобайтовы х чисел.


В общ ем случае, когда нужно компактно записать число, больш ее 255 (28 - 1 = 255 -
м аксим альное целое число, записы ваем ое одним байтом (окгетом)), необходимо исполь­
зовать несколько байтов. Число М факторизуется по основанию 256:
М = А ()-256° + А |-2 5 6 1 + А2 -2562 + ... + А„-256"
Н абор чисел А 0 А п и является последовательностью байтов для записи.

Варианты записи
Порядок от младшего к старшему
П орядок от младш его к старш ему (англ. little-endian, о происхож дении термина
ниже): Ао, •• •? А п,запись начинается с младш его и заканчивается старш им. Этот порядок
записи принят в памяти персональны х компью теров с х86-процессорам и, в связи с чем,
иногда, его назы ваю т интсловский порядок байт (по названию фирмы-создателя
архитектуры х86).

Порядок от старшего к младшему


П орядок от старшего к младш ему (от англ. big-endian): А(), ..., А п, запись начинается
:о старш его и заканчивается младш им. Этот порядок является стандартны м для протоко­
тов TCP/IP, он используется в заголовках пакетов данны х и во многих протоколах более
высокого уровня, разработанны х для использования поверх TCP/IP. П оэтому, порядок
Зайгов от старш его к младш ему часто назы ваю т сетевым порядком байтов (англ. network
byte order). Этот порядок байт используется процессорами IBM 360/370/390, M otorola
38000, SPA RC (отсю да третье название - порядок байтов M otorola, M otorola byte order).
В этом же виде (но с факторизацией по основанию 10) записы ваю тся числа индийско-
грабскими цифрами.
П орядок байтов от старш его к младш ему ныне является кроссплатформенным
:тандартом и прим еняется в многих стандартизованны х ф орм а!ах файлов, таких как
3NG.

Переключаемый порядок
М ногие процессоры м огут работать и в порядке от м ладш ею к старш ему, и в обрат-
юм, такие как ARM , Pow erPC (но не Pow erPC 970), DEC A lpha. M IPS, РА-RISC и IA-64.
)бьгчно порядок байтов выбирается програм мно во время инициализации операционной
¡истемы, но м ож ет бы ть выбран и аппаратно перемычкам и на мат еринской плате. В этом
лучае правильнее говорить о порядке байтов операционной системы. П ереклю чаемый
ю рядок байтов иногда назы ваю !’ bi-endian или bytesexual (слово-пародия на bisexual -
•исексуальный).

Смешанный порядок
См еш анный порядок байтов (от анг л. middle-endian) иногда используется при работе с
ислами, длина которых превыш ает м аш инное слово. П роизводится факторизация числа
а м аш инны е слова, которые записы ваю тся в формате, естественном для данной архи-
ектуры , но сами слова записы ваю тся в обратном порядке.
И рт ож ет м 463
Классический пример m iddle-endian - представление 4-байговы х целых чисел на 16-
битовых процессорах семейства PDP-11 (известен как PD P-endian). Для представления
двухбайтных значений использовался порядок big-endian, но 4-байтовое двойное слово
записывалось от м ладш его слова к старш ему.
В процессорах VAX и A RM используется см еш анное представление для длинны х ве­
щ ественных чисел.
Пример
Д алее приведен пример, в котором описы вается разм ещ ение 4-байтового числа в ОЗУ
ЭВМ , доступ к которому может производиться как к 32-разрядному слову, так и ио-
байтово. Все числа записаны в 16-теричной системе счисления.
Число: 0xA lB 2C 3D 4
Ф акторизация: D4 + С3*100 + В2* 10000 + А1* 1000000
П орядок от м ладш ею к старш ему (litte-endian): 0xD 4, ОхСЗ, 0хВ2, 0хА1
Порядок от старш его к младш ему (big-endian): 0хА 1, 0хВ2, ОхСЗ, 0xD 4
Порядок, принятый в P D P -11 (PD P-endian): 0хВ2, O xA l, 0xD4, ОхСЗ
Сравнение
Big-endian Little-endian

Адреса+З Байт 0 Бейт 3


Адреса* 2 Байт 1 Бейт 2

Адреса* 1 Байт 2 Байт 1


Адреса*0 Байт 3 БвйтО

Размещение байтов слова в памяти Big-endian иLittle-endian ЭВМ


С ущ ественным достоинством little-endian по сравнению с big-endian порядком записи
считается возможность "неявной типизации" целых чисел при чтении меньш его объема
байт (при условии, что читаемое число помещ ается в диапазон). Так, если в ячейке п ам я­
ти содерж ится число 0x00000022, то прочитав его как in ti6 (2 байта) мы получим число
0x0022, прочитав 1 байт - число 0x22.
Обратно, считается ч то у little-endian, по сравнению с big-endian есть "неочевидность"
значения байтов памяти при отладке (последовательность байт (33, 44, 55, 12) на самом
деле значит 0x12554433, для big-endian эта последовательность (33, 44, 55, 12) читалась
бы "естественным" для арабской записи чисел образом: 0x33445512). Н аим енее удобным
в работе считается m iddle-endian ф орм ат записи; он сохранился только на старых п лат­
формах.

Проблемы совместимости
Запись м ногобайтового числа из памяти ком пью тера в файл или передача по сети
требует соблю дения соглаш ений о том , какой из байтов является старш им, а какой
младшим. П рямая запись ячеек памяти приводит к возможны м проблемам при переносе
приложения с платформы на платформу.

Определение порядка байтов


П орядок байтов в конкретной м аш ине можно определить с пом ощ ью програм мы на
языке Си (testendian.c):
# include <stdio h>
unsigned short x = 1; Г 0x0001 */
464 С Д A ic'ciiiui, В В Кондратьев Ирогралшроваиие на Visual FORTRAN

int main(void)
{
printfp/osta”, ‘ ((unsigned char *) &x) == 0 ? "big-endian little-endian”);
return 0;
}
Результаты запуска на big-endian машине (SPARC)
$ cat /proc/cpuinfo | grep Acpu
cpu : Tl UltraSparc Ili
$ gcc -o testendian testendian.c
$ ./testendian
big-endian

Результаты запуска на little-endian машине (x86)


$ cat /proc/cpuinfo | grep 'Amodel name'
model name : Intel(R) Pentium(R) 4 CPU 2.66GHz
$ gcc -o testendian testendian с
$ ./testendian
little-endian

Конвертация
Д ля преобразования между сетевым порядком байтов (англ. network byte order), кото­
рый всегда big-endian, и порядком байтов, использую щ имся на маш ине (англ. host byte
order), стандарт POSIX предусм атривает функции htonl(), htons(), ntohl(), ntohs():
uinl32 I htonl(uint32_t hostlong); - конвертирует из текущ его порядка байт в сетевой
32-бигную беззнаковую величину;
u in tl6 _ t h to n s(u in tl6 _ t hostshorl); - конвертирует из текущ его порядка байт в сетевой
16-битную беззнаковую величину;
uint32_t ntohl(uint32_t netlong); - конвертирует из сетевого порядка байт в текущ ий
32-битную беззнаковую величину;
u in tl6 _ t n to h s(u in tl6 I netshorl); - конвертирует из сетевого порядка байт в текущ ий
16-битную беззнаковую величину.
В случае совпадения текущ его и сетевого порядка байтов, функции м огут быть "пус­
ты м и" (т. е. не м енять порядка байтов). С тандарт такж е допускает, чтобы эти функции
были реализованы макросами.
Интересные факты
Т ерм ины big-endian и little-endian первоначально не имели отнош ения к информ ати­
ке. В сатирическом произведении Д ж онатана Свифта "П утеш ествия Гулливера" описы ­
ваю тся вы м ы ш ленны е государства Л илипу гия и Блефуску, в течение многих лет ведущ ие
между собой войны из-за разногласия по поводу того, с каког о конца следует разбивать
варены е яйца. Тех, кто считает, что их нужно разбивать с тупого конца, в произведении
назы ваю т "B ig-endians" (тупоконечники). Споры м еж ду сторонниками big-endian и little-
endian в инф орм атике такж е часто носят характер "религ иозных войн".
Словарь

Приводим перевод некоторы х терм инов РоЛгап. И з нескольких возм ож ны х переводов


приводится, как правило, одно значение соответствую щ ее тексту.
Access доступ.
actual processor value фактическое значение процессора,
adjacent date соседние данные,
advance продвижение,
advancing переместить.
aggregate множество, составное значение, составной,
alignment выравнивание.
allocatable array динамически размещаемый массив - именованный массив, имеющий атрибут
ALLOCATABLE. Его конфигурация определяется, и на него можно ссылаться или
он определен только тогда, когда ему отведена память.
append присоединенные записи.
arithmetic shifting арифметический сдвиг.
associated связанный.
assume предполагать.

assumed-shape array (массив, перенимающий конфигурацию) - формальный аргумент массива, кото-'


рый не является указателем, конфигурация которого определяется связанным с
ним фактическим аргументом.
assumed-size array (массив, перенимающий размер) - формальный массив, размер которого опреде­
ляется размером связанного с ним фактического аргумента (последняя верхняя
граница такого массива специфицируется звездочкой),
Barrier барьер,
bit-wise поразрядный.
buffering буферизация, промежуточное хранение,
Collating sequence последовательность упорядочивания.
critical section отрезок программы, который при параллельном программировании должен вы­
полняться без прерываний со стороны других процессов,
COM фирменное сокращение Microsoft - Component Object Model - модель компонент­
ных объектов,
conformable соответствующий,
consistent view of memory совместимый вид памяти,
console пульт (управления), консоль.
course-grain 'крупномодульный, крупноблочный,
Declared заявлять.
defererred-shape отложенной формы.
dereferences разыменовывать, получать значение объекта, на который указывает данный ука­
затель,
deferred отложенный,
directly непосредственно,
directory каталог.
dispatch организатор (программа размещения).
Effect результат.
embedded встроенный.
engineering notation техническая система обозначений,
entity объект.
evaluate вычислять. t
exclusive исключающий.

йтоттп 465
466 С. Д Алгазин, В. В. Кондратьев Програмироваиис на Visual FORTRAN

existing file существующий файл,


external внешний,
Factor коэффициент,
field data эксплуатационные данные,
file organization структура файла,
fit подходить, соответствовать.
focus активизироваться. Активное состояние конкретного элемента пользовательского
интерфейса (окна, кнопки и т. п.).
focus window активное окно.
for backwards compatibility для совместимости в обратном направлении,
fork ветвление, порождение параллельного процесса,
GUID globally unique identifier - глобально уникальный идентификатор (16-байтовая величина, генерируемая
утилитой и используемая для получения уникальных имен интерфейсов СОМ-
объектов).
Heap множество, куча; в программировании - область динамически распределяемой
(оперативной) памяти для структур данных, размер которых не может быть опре­
делен до момента исполнения программы,
hidden скрытый
host объемлющий контекст - главная программная единица или процедура, которая
содержит внутреннюю процедуру, называется объемлющим контекстом внутрен­
ней процедуры. Модуль, содержащий модульную процедуру, называется объем­
лющим контекстом модульной процедуры. Host association (связь по объемлюще­
му контексту) - процесс, посредством которого внутренняя процедура, модульная
процедура или описание производного типа осуществляют доступ к объектам
своего объемлющего контекста
ID (identifier) ID-идентификатор, признак, метка имени, присваиваемые переменным, констан­
там, структурам данных, классам, процедурам, функциям, методам и другим про­
граммным объектам. Некоторые языки программирования требуют объявления
идентификаторов до их использования в программе (explicit declaration),
identity тождество.
inline function встраиваемая функция, подставляемая функция (описатель inline применяется
для часто используемых функций с целью оптимизации, так как при компиляции
вызов такой функции заменяется ее кодом),
intend значение.
Lead byte ведущий байт (старший байт в DBCS и MBCS , указывающий на то, что он вместе
со следующим байтом должен интерпретироваться как один символ)
leading part главная, начальная часть,
leading межстрочный интервал,
level установленное значение.
line wrapping направление текста заверстанного вокруг иллюстрации (направление обтекания
текста),
literal константа.
logical compliment логическое отрицание,
login name имя входа,
Manipulation обработка,
master ведущий,
meaningful осмысленный
miscellaneous разнообразный.
modeless dialog box немодальное диалоговое окно - диалоговое окно, не зависящее от режима, т. е.
имеющее один и тот же вид при всех режимах работы,
multistatement множество утверждений,
must принудительное,
Non-blank character не пробельный символ.
С .ю аорь 467
notation обозначение.
Online интерактивный, диалоговый,
organization file структура файла,
Padding заполнение,
period точка.
PID (Process Identification Number) - идентификационный номер процесса, идентификатор процесса - уни­
кальный номер, который ОС назначает процессу при его создании,
pointee используется для обозначения объекта на который указывает указатель,
pointer dereferences разименованный указатель,
positional позиционное.
present 1) настоящий имеющийся; 2) присутствовать.
processed обработанный.
program unit программная единица.
Ranking упорядочивание.
relative • относительный, соответсвующий.
relative organization относительная организация
resets переустанавливать.
restricted ограниченный, ограниченного применения,
reversion возвращение (к прежнему состоянию).
run-time динамический, выполняемый или происходящий во время выполнения программы,
run-time environment среда выполнения, условия выполнения. Программные и аппаратные ресурсы,
с которыми взаимодействует программа во время выполнения,
run-time library библиотека поддержки,
Scale factor коэффициент масштабирования.
scientific notation -экспоненциальное представление.
scratch временный.
segmented сегментированный.
sequence ряд, последовательность.
sequential последовательный.
shape вид.
sign-extended доопределение знаком,
specifier описатель, спецификатор.
spooler система буферизации входных и выходных потоков.
standard input стандартное устройство ввода - устройство, с которого программа или ОС вводит
команды или данные. Обычно терминал или клавиатура. Термин появился в Unix.
storage association связь по памяти - отношение между двумя последовательностями памяти, когда
единица памяти одной из них совпадает с единицей памяти другой.
store запоминать, хранить, сохранять
succeed наследовать.
symbolic символический.
Terminating оконечный.
thing вещь.
transform преобразовывать.
truncated округлять.
truncates укорачивать, усекать
Unit единица измерения, устройство,
unless если не.
uppercase верхний регистр
Volatile изменчивый.
468 С. Д. Алгазин, В. В. Кондратьев. Програмирование на Visual FORTRAN

Литература

1. Горелик А. М. Программирование на современном Фортране. М.: Финансы


и статистика, 2006.
2. Немнюгин М. А., Стесик О. Л. Современный Фортран. Самоучитель. СПб.:
БХВ-Петербург, 2004.
3. Бартеньев О. В. Современный Фортран. М.Диалог-МИФИ, 2000.
4. Фортран 90. Международный стандарт / Пер. с англ. С. Г. Дробышевич, ред.
перевода А. М. Горелик. М.: Финансы и статистика, 1998.
Оглавление

Предисловие............................................................................................................................. 3
В в е д е н и е .............................................................................................................................................................3
Я зы ковое соответствие стан д артов......................................................................................................... 3
Язы ковая совм естим ость............................................................................................................................. 4
Н овые язы ковы е во зм о ж н о с ти ................................................................................................................. 4
В озмож ности Fortran 2003 ..........................................................................................................................4
Г л а в а 1. С т р у к т у р а п р о г р а м м ы , зн а к и и и с х о д н ы е ф о р м ы ................................................6
1.1. Структура п р о гр ам м ы ..........................................................................................................................6
1.2. У твер ж д ен и я............................................................................................................................................6
1.3. Наборы сим вол ов....................................................................................................................................8
1.4. Форматы исходного т е к с т а ................................................................................................................ 8
1.5. Ф иксированные и табулированны е ф о р м ы ............................................................................... 12
1.6. И ндикатор утверж дения о т л а д к и .................................................................................................. 13
1.7. Исходный текст, используем ы й для всех исходных ф о р м ................................................. 15
Г л а в а 2. Т и п ы д а н н ы х , к о н с т а н т ы и п е р е м е н н ы е .................................................................... 16
2.1. Встроенные гины д а н н ы х .................................................................................................................16
2.2. Логические типы д а н н ы х ................................................................................................................. 24
2.3. Символьный тип д ан н ы х ...................................................................................................................24
2.4. Д воичные, восьм еричны е, ш естнадцатеричны е и холеритовы е кон стан ты ................ 33
Г л а в а 3. В ы р а ж е н и я и о п е р а т о р ы п р и с в а и в а н и я .....................................................................4 6
3.1. В ы раж ения.............................................................................................................................................. 46
3.2. О ператоры п рисваи ван и я..................................................................................................................56
Г л а в а 4. О п и с а н и я .......................................................................................................................................66
4.1. Типы утверж дений о б ъ я вл ен и я......................................................................................................66
4.2. Утверждения объявления на м а с с и в ы ........................................................................................ 71
4.3. А трибут и утверж дение A L L O C A T A B L E ................................................................................. 76
4.4. А трибуты и утверж дения A U TO M A T IC и S T A T 1C .............................................................. 76
4.5. Утверж дение C O M M O N ...................................................................................................................78
4.6. Утверж дение D A T A ........................................................................................................................... 80
4.7. А трибут и утверж дение D IM E N S IO N ........................................................................................ 83
4.8. Утверждение E Q U IV A L E N C E .......................................................................................................83
4.9. А трибут и утверж дение E X T E R N A L ...........................................................................................88
4.10. У тверж дение 1MPL1C1T..................................................................................................................89
4.11. А трибут и утверж дение IN T E N T ............................................................................................... 90
4.12. А трибут и утверж дение 1NTR1NSIC (вст р о ен н ы й ).............................................................92
4.13. Утверж дение N A M E L 1S T ..............................................................................................................93
4.14. А трибут и утверж дение O PTIO N A L ......................................................................................... 95
4.15. А трибут и утверж дение P A R A M E T E R .....................................................................................96
4.16. А трибут и утверж дение P O IN T E R ....................................................................................:....... 97
4.17. А трибуты и утверж дения PR1VATE и P U B L IC ..................................................................... 98
4.18. А трибут и утверж дение P R O T E C T E D .................................................... -................................ 99
4.19. А трибут и утверж дение S A V E .................................................................................................. 100
4.20. А трибут и утверж дение T A R G E T ............................................................................................ 102

йШО(ШОП 469
470 С .Д A'i.YiJini, В В К он драт ьев П р о гр а м и р о в а н и е н а Visual FORTRAN

4.21. А трибут и утверж дение V O LA TILE (и зм енчи вы й ).......................................................102


Г л а в а 5. Д и н а м и ч е с к о е р а с п р е д е л е н и е ....................................................................................... 104
5.1. У тверж дение A L L O C A T E ............................................................................................................. 104
5.2. У тверж дение D E A L L O C A T E ...................................................................................................... 106
5.3. У тверж дение N U L L IF Y ................................................................................................................. 108
Г л а в а 6. У п р а в л е н и е в ы п о л н е н и е м ............................................................................................... 109
6.1. О ператоры в е тв л е н и я ...................................................................................................................... 109
6.2. У тверж дение C A L L ......................................................................................................................... 113
6.3. Конструкции C A S E ......................................................................................................................... 114
6.4. У тверж дение C O N T IN U E ................................ 117
6.5. Конструкции D O ............................................................................................................................... 118
6.6. У тверж дение DO W H IL E ......................................................... 122
6.7. У тверж дение C Y C L E ......................................................................................................................123
6.8. У тверж дение E X IT ...........................................................................................................................123
6.9. У тверж дение E N D ............................................................................................................................ 124
6.10. К онструкция и утверж дение I F ................................................................................................ 124
6.11. У тверж дение P A U S E .....................................................................................................................128
6.12. У тверж дение R E T U R N ................................................................................................................. 129
6.13. У тверж дение S T O P ........................................................................................................................ 130
Г л а в а 7. П рограхм м н ы е е д и н и ц ы и п р о ц е д у р ы ........................................................................131
7.1. О сновная програм м а........................................................................................................................ 132
7.2. М одули и процедуры м о д у л я ...................................................................................................... 132
7.3. Ссылки м о д у л я................................................................................................................................... 135
7.4. У тверж дение U S E ............................................................................................................................. 135
7.5. Блок данны х - програм мная е д и н и ц а ............................................. *........................................ 137
7.6. Ф ункции, подпрограммы и ф ункц и и -утверж ден и я............................................................ 138
7.7. О бщ ие правила для подпрограмм функции и п одп рограм м ы ........................................ 138
7.8. П о дп рограм м ы ................................................................................................................................... 146
7.9. Внеш ние п роц ед уры ........................................................................................................................ 149
7.10. Внутренние п р о ц ед у р ы ................................................................................................................ 149
7.1 I. С вязы вание п а р а м е тр о в ............................................................................................................... 150
7.12. У тверж дение C O N T A IN S ...............................................................................,........................... 165
7.13. У тверж дение E N T R Y ....................................................................................................................165
Г л а в а 8. В с т р о е н н ы е п р о ц е д у р ы .................................................................................................... 168
8.1. Клю чевые параметры во встроенны х п р о ц ед у р ах ............................................................... 169
8.2. Краткий обзор встроенны х процедур ....'.................................................................................. 169
8.3. В строенны е п о д п р о гр а м м ы .......................................................................................................... 176
8.4. П оразрядны е ф ун к ц и и .....................................................................................................................177
8.5. О писания встроенны х п роц ед ур ..................................................................................................179
Г л а в а 9. У т в е р ж д е н и я в в о д а /в ы в о д а п е р е д а ч и д а н н ы х ................................................... 2 69
9.1. Записи и ф а й л ы ..................................................................................................................................269
9.2. Компоненты утверж дений передачи д а н н ы х ........................................................................ 269
9.3. С писок управления в в о д а/вы во д а..............................................................................................270
9.4. С пециф икатор устройства............................................................................................................. 271
9.5. С пециф икатор ф о р м ата.................................................................................................................. 271
9.6. С пециф икатор списка и м е н ..........................................................................................................272
Оглашение 471
9.7. Спецификатор зап и си ......................................................................................................................272
9.8. Спецификатор состояния вв о д а/в ы в о д а.................................................................................. 273
9.9. Спецификаторы п ер е х о д а..............................................................................................................273
9.10. Спецификатор усоверш ен ствовани я.......................................................................................274
9.11. Спецификатор счётчика си м в о л о в ....................................................... 275
9.12. Списки ввода/вы вода.....................................................................................................................275
9.13. П ростые элементы списка в списках ввода/вы вода..........................................................276.
9.14. Неявные DO-списки в списках вв о д а/в ы в о д а.......................... 277
9.15. Утверж дения R E A D .......................................................................................................................278
9.16. У тверждение A C C E P T .................................................................................................................288
9.17. Утверж дения W R IT E .....................................................................................................................289
9.18. У тверждения PRINT и T Y P E ...............................................................................................'....2 9 4
9.19. Утверж дение R E W R IT E ...............................................................................................................295
Глава 10. Ф о р м а т и р о в а н и е в в о д а /в ы в о д а ..................................................................................2 9 6
10.1. С пецификации ф о р м а т а ...............................................................................................................296
10.2. Описатели редактирования д а н н ы х ........................................................................................299
10.3. Форматы для описателей редактирования д а н н ы х ........................................................... 299
Глава 11. У т в е р ж д е н и я в в о д а /в ы в о д а ф а й л о в ы х о п е р а ц и й .......................................... 3 2 6
11.1. У тверж дение B A C K S P A C E ........................................................................................................326
11.2. Утверж дение C L O S E .....................................................................................................................326
11.3. У тверж дение D E L E T E ................................................................................................................. 327
11.4. У тверж дение E N D F1LE................................................................................................................328
11.5. Утверждение IN Q U IR E ................................................................................................................329
11.6. Утверж дение O P E N .......................................................................................................................339
11.7. У тверж дение R E W IN D ................................................................................................................. 353
Глава 12. У т в е р ж д е н и я у п р а в л е н и я к о м п и л я ц и е й ............................................................ , 3 5 4
12.1. Утверж дение IN C L U D E ...............................................................................................................354
12.2. У тверж дение O P T IO N S .............................................................. :................................................355
Г л ава 13. Д и р е к т и в ы р а с ш и р е н н о й к о м п и л я ц и и .................................................................. 3 5 6
13.1. П равила синтаксиса для директив ком пилятора................................................................ 356
13.2. Д иректива A L IA S ...........................................................................................................................358
13.3. Д иректива A S S U M E A L IG N E D ..............................................................................................358
13.4. Д иректива A T T R IB U T E S ............................................................................................................ 359
13.5. Д ирективы D ECLA RE и N O D E C L A R E .................................................................................367
13.6. Д ирективы DEFINE и U N D E F 1N E .......................................................................................... 367
13.7. Д иректива D ISTRIBU TE P O IN T ..............................................................................................368
13.8. Д иректива F1X E D FO R M LIN E SIZ E ......................................................................................... 368
13.9. Директивы FREEFO RM и N O FR E E F O R M ...........................................................................369
13.10. Д иректива ID E N T ........................................................................................................................ 369
13.11. Директивы IF и IF D E F IN E D ...................................................................................................369
13.12. Д иректива IN T E G E R ...................................................................................................... ,...........371
13.13. Д иректива 1VDEP.............................................................. •.......................................................... 371
13.14. Д иректива LOOP C O U N T .........................................................................................................372
13.15. Д иректива M EM REF C O N T R O L (только i64)................................................................. 373
13.16. Д иректива M E SSA G E ................................................................................................................. 374
13.17. Д иректива O B JC O M M E N T ...................................................................................................... 374
472 С Д А чгапш , В В. К ондрат ьев П рогралт ровсш ие и a Visual FO RTRAN

13.18. Д иректива O P T IO N S ..................................................................................................................375


13.19. Д иректива P A C K .......................................................................................................................... 376
13.20. Д ирективы PA R A L L EL и N O PA R A L L E L ......................................................................... 377
13.21. Д ирективы PREFETCH и N O PR E F E T C H .......................................................................... 378
13.22. Д иректива P S E C T ........................................................................................................................379
13.23. Д иректива R E A L ..........................................................................................................................380
13.24. Д ирективы STR IC T и N O ST R 1C T .........................................................................................381
13.25. Д ирективы SW P и N O SW P (только ¿64).............................................................................381
13.26. Д ирективы U N R O LL и N O U N R O L L ...................................................................................382
13.27. Д ирективы V E C T O R A LIG N E D и V E C T O R U N A LIG N ED (i32, i3 2 em )..............383
13.28. Д ирективы V E C TO R A LW A Y S и N O V E C TO R (i32, i3 2 e m )....................................383
13.29. Д иректива V EC TO R N O N T EM PO R A L (i32, i3 2 em )......................................................384
13.30. Д ирективы ком пилятора Fortran O p e n M P * .................................................. 384
13.31. О ператоры атрибута области действия д а н н ы х .............................................................. 385
13.32. Д иректива D O ...............................................................................................................................394
13.33. Д иректива F L U S H ........................................................................................................................396
13.34. Д иректива M A S T E R ...................................................................................................................397
13.35. Д иректива O R D E R E D ............................................................................................................... 398
13.36. Д иректива P A R A L L E L .............................................................................................................. 398
13.37. Д иректива PA R A LLEL D O ......................................................................................................400
13.38. Д иректива P A R A L LE L S E C T IO N S ...................................................................................... 401
13.39. Д иректива PA R A L L E L W O R K S H A R E ............................................................................... 402
13.40. Д иректива S E C T IO N S ............................................................................................................... 402
13.41. Д иректива S IN G L E ..................................................................................................................... 403
13.42. Д иректива T H R E A D P R 1V A T E .............................................................................................. 404
13.43. Д иректива W O R K S H A R E ........................................................................................................404
Г л а в а 14. О б л а с т ь д е й с т в и я и с в я з ы в а н и е ................................................................................4 0 6
14.1. О бласть д е й ст в и я ........................................................................................................................... 406
14.2. О днозначны е родовы е процедурны е с с ы л к и .................... 408
14.3. Разреш ение процедурных с с ы л о к ........................................................................................... 408
14.4. Ссы лки на собственны е и м е н а .................................................................................................410
14.5. С сы лки на неустановленны е и м е н а ....................................................................................... 411
14.6. С в язы ван и е....................................................................................................................................... 411
14.7. С вязы вание и м е н и .........................................................................................................................412
14.8. Блоки памяти и последовательность пам яти.......................................................................414
14.9. С вязы вание м а с с и в а ..................................................................................................................... 415
П р и л о ж е н и е А . У д а л е н н ы е и у с т а р е в а ю щ и е язы к о в ы е в о з м о ж н о с т и ...................... 4 1 6
П р и л о ж е н и е В . Д о п о л н и т е л ь н ы е в о з м о ж н о с т и я з ы к а .....................................................418
П р и л о ж е н и е С . Н а б о р с и м в о л о в A S C II д л я С и с т е м L in u x * и M a c O S * ................4 3 4
П р и л о ж е н и е D . М о д е л и п р е д с т а в л е н и я д а н н ы х ................................................................... 435
П р и л о ж е н и е Е. П о д п р о г р а м м ы б и б л и о т е к и п о д д е р ж к и ..................................................43 8
П р и л о ж е н и е F. К р а т к о е и з л о ж е н и е р а с ш и р е н и й я з ы к а ................................................... 455
П р и л о ж е н и е G . П о р я д о к б а й т о в .....................................................................................................4 6 2
С л о в а р ь ..........................................................................................................................................................465
Литература........................................................................................................................... 468

Вам также может понравиться