Вы находитесь на странице: 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.
Если цель - выраж ение, результатом долж ен быть указатель.
Если цель не указател