Академический Документы
Профессиональный Документы
Культура Документы
Алгазин,
В. В. Кондратьев
Программирование
на
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
Редактор О. А. Голубев
Макет Н. В. Дмитриевой
Введение
Fortran 95 вклю чает Fortran 90 и больш инство возм ож ностей Fortran 77. Fortran 90 яв
ляется надмнож еством, которое вклю чает Fortran 77. Intel Fortran полностью поддерж и
вает Fortran 95, Fortran 90 и Fortran 77.
Ниже обсуждается соответствие стандартов Intel Fortran, язы ковая совм естим ость
и новый язык. О бсуждаю тся возм ож ности Fortran 2003, поддерж иваем ы е 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.
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.2. Утверждения
Утверждения программы группируются в 2 основных класса: выполнимый и невыполни
мый. Выполнимое утверждение определяет действие, которое будет выполнено. Невыполни
м ое утверж дение описывает атрибуты программы, такие как расположения и характеристи
ки данных, гак же как информацию преобразования данных и редактирования.
йтоттп 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. Обязательный порядок утверждений
Имена
Имена идентифицирую т объекты в пределах программной единицы Fortran (тип пе
ременных, результаты функции, им енованны е константы, процедуры, програм мны е м о
дули, группы списка имен и форм альны е параметры). В Fortran 77 имена назывались
"символическими именами".
Имя может содержать символы, цифры, символ подчеркивания (_) и знак доллара
( $ ) - специальный знак. П ервы й знак долж ен бы ть символом или знаком доллара.
В Fortran 95/90 имя может содерж ать до 31 знака. Fortran Intel разреш ает имена до
63 знаков.
Длина имени модуля (в утверж дениях M O D U LE и USE) может быть ограничена ва
шей файловой системой.
Примечание. Будьте внимательны, определяя имена, которые содержат долларовые признаки.
Знак доллара может быть символом для команды или замены символа в различных оболочках и
сервисных командах.
8 С .Д А ъчи ин, В В К ондрат ьев П рограм ирование на Visual FO RTRAN
И сходны й текст мож ет бы ть записан так, чтобы он был используемым для всех ис
ходны х форм (см. разд. 1.7).
Метки утверждения
Метка ут верж дения (или номер утверж дения) идентифицирует утверждение так,
чтобы другие утверж дения могли обратиться к нему, или получить информацию , или пе
редать управление. М етка м ож ет предш ествовать лю бом у утверж дению , которое не яв
ляется частью другого утверж дения.
М етка утверж дения долж на бы ть длины до пяти десятичны х цифр; пробелы и началь
ные нули игнорирую тся.
Все нулевы е метки утверж дения недействительны и пустой оператор не может быть
маркирован.
М аркированны й FO R M A T и м аркированны е вы полним ы е утверждения - единствен
ные утверж дения, которы е м огут бы ть упом януты другими утверждениями. Утвержде
ния F O R M A T упом януты только в специф икаторе ф ормата ввода/вывода или в утвер
ж дениях A SSIG N . Д ва утверж дения внутри модуля не могут иметь ту же самую метку.
Индикатор комментария
В свободной исходной форм е восклицательны й знак (!) указы вает ком м ентарий, если
он располож ен в пределах строки, или строку ком м ентария, если это первы й знак в ис
ходной строке.
Индикатор продолжения
В свободной исходной форме символ ам персанда (&) указы вает строку продолж ения
(если этот знак не появляется в холеритовой или сим вольной константе, или в пределах
комментария). Строка продолж ения - это первая строка неком м ентария после ам п ерсан
да. Хотя РогЧгап 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".
А мперсанд не м ож ет быть единственны м не знаком пробела в строке, или единствен
ном не знаком пробела перед комм ентарием ; ам персанд в комментарии игнорируется.
Индикатор комментария
В ф иксированном и табулированном исходных форматах символ (!) восклицательного
знака указы вает комм ентарий, если он находится внутри исходной строки. (Он не долж ен
появляться в столбце 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 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 где-
нибудь в исходной строке, или компилятор может интерпретировать порядковые номера как
часть области утверждения в вашей программе.
Каждая константа, переменная, массив, вы раж ение или ссы лка функции в утверж де
нии Fortran имею т тип данных. Тип данны х этих пунктов м ож ет бы ть врожденным из
конструкции, подразум еваем ой в соответствии с соглаш ением , или явно объявленным.
Каждый тип данных имеет следую щ ие свойства:
Имя. И мена встроенны х типов данны х предопределены , в то время как имена произ
водных типов определены определениями производного типа. О бъекты данных (констан
ты, переменны е или части констант или переменны х) объявлены , используя имя типа
данных.
Ряд связанных значений. Каждый тип данны х имеет ряд допустим ы х значений. Типы
данны х Integer и real имею т диапазон действительны х значений. C om plex и производные
тины им ею т наборы значений, которые являю тся комбинациям и значений их индивиду
альных компонент.
Способ представления значений констант. Константа - объект данных с ф икси
рованным значением , которое не может бы ть изменено в течение выполнения програм
мы. Значение константы м ож ет бы ть числовым значением , логическим значением или
знаком строки.
Константа, которая не имеет имени, - литеральная константа. Литеральная констан
та долж на иметь встроенны й 1 ип, но она не м ож ет бы ть массивом.
Константа, которая имеет имя, - именованная константа. И менованная константа
м ож ет им еть лю бой тип, включая производны й тип, и она м ож ет быть массивом. И м ено
ванная константа имеет атрибут PA R A M ET ER и определена в утверж дении объявления
типа или утверж дении PA R A M ETER .
Ряд операций для манипулирования этими значениями и их интерпретирования.
Тип данны х переменной определяет операции, которые могут использоваться, чтобы
управлять им.
П омим о встроенны х операторов и операций вы м ож ете также определить операторы
и операции.
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
Константы 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
[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, использую щ ую и символ экспоненты, и параметр
вида, но тогда символ экспоненты долж ен быть Е и параметр вида должен следовать за
частью экспоненты.
Недопустимо Объяснение
1. Q 5000 Слиш ком больш ое число.
1. Q -5000 Слиш ком м аленькое число.
Правильно
(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); допустим ая константа
с двойной точностью .
Логические константы
Логическая константа представляет только логические значения, истинные или лож
ные, и им еет одну из следую щ их форм:
.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).
Символьные константы
Символьная константа - строка сим волов, заклю ченная в разделители (апострофы
или кавы чки). П ринимает одну из следую щ их форм:
[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: " Н ачальный разделитель не соответствует второму разделителю .
Символьные подстроки
Символьная подст рока - непреры вная часть строки символов. П ринимает одну из
следую щ их форм:
v ( [ e 1Y[e 2])
a ( s [,s] . . . ) {[е 1]:[е2])
пате (имя) является именем производного типа. Это имя не долж но совпадать с име
нем лю бого встроенного типа, или именем производного типа, к которому можно полу
чить доступ из модуля.
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"))
Двоичные константы
Двоичная константа - альтернативный способ представить числовую константу.
Двоичная константа имеет одну из следую щ их форм:
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 символ.
Иначе используется наим еньш ий целочисленны й вид, достаточно больш ой, чтобы со
хранить значение.
■ Для холеритовых констант не принят никакой тип данных.
Н апример:
Утверждение Тип данных константы Длина константы, байт
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, такж е становятся неопределенными.
Массивы
Массив - это ряд скалярных элементов, которые имею т тот же самый тип и вид пара
метров. Лю бой объект, который объявлен со спецификацией массива, - массив. Массивы
могут быть объявлены при использовании утверждения объявления типа или при исполь
зовании утверж дения 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 элементами во втором измерении
Массив целиком
М ассив целиком (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.
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):* В
В = (/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
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
Круглые скобки могут использоваться в списках параметров, чтобы вынудить данный
параметр быть обработанным как выражение, вместо адреса пункта памяти.
1DOUBLE PRECISION.
2 DOUBLE COMPLEX
50 С Д. А лгаш н, В В Кондрат ьев. Программирование на Visual FO RTRAN
Символьные выражения
С им вольное вы раж ение состоит из сим вольного оператора (//), который связывает
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
Выражения инициализации
В ы раж ение инициализации долж но быть выполнено во времени компиляции с задан
ными константами. Оно используется, чтобы определить значение для объекта.
В выражении инициализации каж дая операция встроена и каждый операнд - одно из
следую щ их выражений:
■ К онстанта или подобъект константы.
■ Конструктор массива, где каждый элем ент и границы и результаты каждого неявного
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
Встроенные назначения
В строенное назначение используется для задания значения неуказательной перемен
ной. В случае указателей встроенное назначение используется, чтобы задать значение
цели, связанной с переменной указателя.
Значение переменной (или цели) определено в правой части от знака равенства.
Встроенный оператор присваивания принимает следую щ ую форму:
variable = expression (переменная = выражение)
где variable - имя скаляра или массива встроенного или производного типа (без опреде
ленного назначения). М ассив не может быть массивом перенимаю щ его размера. Ни ска
ляр, ни массив не могут быть объявлены с атрибутам и PA R A M ET E R или INTENT (В).
expression имеет встроенны й тип или тот ж е самый производны й тип, как и перемен
ная. Его форма долж на соответствовать переменной. Если необходим о, это выражение
преобразовы вается к том у же самом у типу и виду, как и переменная.
Правила использования
П реж де чем значение назначено на переменную , часть выраж ения оператора при
сваивания и лю бого выраж ения в пределах переменной долж ны быть выполнены. Н ика
кое определение вы раж ений в перем енной не мож ет затронуть выполнимой части вы ра
жения оператора присваивания.
Примечание. Когда систем а поддерж ки вы полнения н азначает скалярное целое число или сим
вольную перем енную и перем енную , которая короче, чем зн ачени е, оно м ож ет быть обрезано и
сущ ественн ы е биты (или сим волы ) потеряны . Это обрезание м ож ет произойти без предупреж
дения и м ож ет вы звать неправильную инф орм ацию в програм м е.
Гчава 3 Выраж ения и операт оры присваивания 57
Если переменная - указатель, он должен быть связан с определенной целью. Ф орма
цели и выражение, а такж е их тип и параметры вида долж ны соответствовать.
Не допустимо Объяснение
3.14 = А - В О бъект слева долж на бы ть переменной.
IC O U N T = А //В (3:7) Н еявно заданные типы данны х не соответствую т.
SC A LA R I = A R R A Y _A (:) Ф орм ы не соответствую т.
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
Определенные назначения
О пределенное назначение определяет операцию назначения. О но определяется п од
программой, содерж ащ ей блок родового интерф ейса со специф икатором A SS IG N
M E N T ^ ). П одпрограмма определена утверж дением SU B R O U TIN E или утверж дением
ENTRY, которое имеет 2 обязательны х форм альны х параметра.
О пределенное элементное назначение обозначается E L E M E N T A L в утверж дении
SUBRO U TIN E.
60 С Д Алгазин, В В К ондрат ьев П рограм ирование на Visual FORTRAN
Назначение указателя
О бъекты, которые указы ваю т на другие объекты, называю тся ссылками или указат е
лями. Более строгое определение: указателем называется переменная, диапазон значений
которой состоит из адресов ячеек памяти. Для описания ссылки используется атрибут
pointer. С сы лка м ож ет указы вать как на сущ ествую щ ий объект, так и на специально от
веденную область памяти. У казатели м ожно использовать для программирования дина
мических структур данны х, таких как списки, очереди, стеки и деревья, а такж е в других
случаях.
У казатель назначения связан с целью и несет в себе определение цели. Если цель не
определена или разъединена, указатель приобретает тот же статус, что и цель. Оператор
присваивания указателя имеет такую форму:
pointer-object => target
где poin ter-object - имя переменной или компонент структуры, объявленной с атрибутом
PO IN TER .
target (цель) является переменной или выражением. Его тип и параметры вида и ранг'
долж ны бы ть теми же самы ми, как и цель указателя. Это выражение не может быть сек
цией м ассива с векторны м нижним индексом.
Правила использования
Если цель - переменная, она долж на иметь атрибут PO IN TER или атрибут TARGET
или бы ть подобъектом , чей родительский объект имеет атрибут TARGET.
Если цель - выраж ение, результатом долж ен быть указатель.
Если цель не указатель (это вы раж ение имеет атрибут TA RG ET), объект указателя
связан с целью.
Если цель - указатель (это вы раж ение имеет атрибут POIN TER), его статус определя
ет статус объекта указателя, следую щ им образом:
■ Если указатель связан, объект указателя связан с тем же самым объектом, как и цель.
■ Если указатель разъединен, объект указателя становится разъединенным.
■ Если указатель не определен, объект указателя становится неопределенным.
На указатель нельзя сослаться или определяться, если это выражение не связано с це
лью , которая м ож ет быть ссылкой или определенным выражением.
Когда происходит назначение указателя, лю бое предыдущ ее связывание между объ
ектом указателя и адресатом заканчивается.
Г ш ва 3 В ыраж ения и операт оры присваивания 61
Указатели м огут такж е бы ть назначены для компонента с ф у к т у р ы указателя вы п ол
нением производного тина встроенного оператора присваивания или определенного опе
ратора присваивания.
Указатели могут такж е стать связанны ми при использовании утверж дения
A LLO CATE, для того чтобы пом естить указатель.
Указатели могут стать разъединенны м и освобож дением , нуллиф икацией указателя
(используя утверж дение D E A LLO C A TE или утверж дение N U LL IFY ) или ссы лкой на
встроенную функцию NULL.
Следую щ ие выражения - примеры назначений указателя:
HOUR => MINUTES(1:60) ! цель - массив
M_YEAR => MY_CAR%YEAR ! цель - компонент структуры
NEW_ROW%RIGHT => CURRENT_ROW 1 объект указателя - компонент структуры
PTR => М. ! цель - переменная
POINTER _С => NULL () ! ссылка к встроенному NULL
Следую щ ий пример показы вает цель как указатель:
INTEGER, POINTER:: Р, N
INTEGER, TARGET:: М.
INTEGER S
M = 14
N => М.! N связан с М.
Р => N! Р связан с М. через N
S=Р+5
Значение S = 19 (14 + 5).
Правила использования
Если имя конструкции определено в утверж дении FO R A LL, то же самое имя долж но
появит ься в конечном утверж дении END FORALL.
У тверж дение FO R A LL вы полняется первой оценкой всех границ и выражений боль
ш ого ш ага в специф икации триплета, давая ряд значений для каж дого имени нижнего
индекса. Н азначение утверж дения FO R A LL вы полняется для всех комбинаций значений
имени ниж него индекса, для которых выраж ение маски является верным.
О ператор присваивания FO R A L L выполняется, как будто все выражения (с обеих
сторон назначения) полностью выполнены прежде, чем лю бая часть левой стороны зам е
нена. П равильны е значения назначены на соответствую щ ие элементы назначаемого м ас
сива. Н икакой элем ент массива не мож ет быть назначен более одного раза.
К онструкция FO R A LL вы полняется так, как будто эго бы ли м ногократные утверж де
ния FO R A LL , с тем же триплетом спецификацией и вы раж ением маски. Каждое утвер
ж дение в геле FO R A LL выполняется полностью прежде, чем вы полнение начинается на
следую щ ем утверж дении гела FORALL.
Л ю бая процедура, на которую ссылаю тся в выражении маски или операторе присваи
вания F O R A LL долж на быть чистой.
Ф ункции без побочного эффекта могут' использоваться в вы раж ении маски или вы зы
ваться непосредственно в утверж дении FORALL. Чистые подпрограмм ы не могут вызы
ваться непосредственно в утверж дении FORALL, но м огут вызываться из другой чистой
процедуры.
Р ассм отрите пример:
FORALL(l = 1:N, J = 1 :N, A(l, J) .NE. 0.0) B(l, J) = 1 .0 1 A(l, J)
Глава 3 В ыраж ения и оп ерат оры присваивания 65
Это утверждение вы числяет обратную величину каж дого элем ента, отличного от нуля
массива A (1:N, 1:N), и назначает это выраж ение на соответствую щ ий элем ент массива В.
Элементы, которые являю тся нулем, не имею т обратной величины , и никакие назначения
не выполняю тся к соответствую щ им элементам В.
Каждый оператор присваивания массива и утверж дение W H ER E м огут бы ть записаны
как утверждения FORALL. Н екоторы е утверж дения FO R A L L не могут бы ть записаны
только при помощ и синтаксиса массива. Н априм ер, предш ествование утверж дению
FORALL эквивалентно:
W HERE(A/= 0.0) В = 1 .0 /А
О днако следую щ ий пример FO R A LL не м ож ет бы ть записан при помощ и синтаксиса
массива:
FORALL(l = 1:N, J = 1:N) H(l, J) = 1.0/REAL(I + J - 1 )
Это утверждение устанавливает элемент массива H(I, J) к значению 1.0/REAL(I + J - 1) для
значений 1 и J между 1 и N.
Рассмотрите следую щ ее выражение:
TYPE MONARCH
INTEGER, P O IN TER :: P
END TYPE MONARCH
TYPE(MONARCH), D IM E N S IO N ^ ):: PATTERN
INTEGER, DIMENSION^), TA R G ET:: OBJECT
FORALL(J=1:8) PATTERN(J)%P => OBJECT(1+IEOR(J-1,2))
Это утверж дение FO R A LL заставляет элементы 1-8 из м ассива PATTERN соответст
вовать элементам 3, 4, 1, 2, 7, 8, 5 и 6 м ассива O BJEC T. Здесь можно сослаться на ф унк
цию 1EOR, так как она не имеет побочного эффекта.
Следую щ ий пример показы вает конструкцию FORALL:
FORALL(l = 3:N + 1, J = 3:N + 1)
C(l, J) = C(l, J + 2) + C(l, J - 2) + C(l + 2, J) + C(l - 2, J)
D(l, J) = C(l, J)
END FORALL
Для каждого построения D используется одно из значений С, вычисленное в первом
утверждении конструкции (неважно, с чего конструкция начала выполнение).
Глава 4. Описания
Описание - невы полним ое утверж дение, которое объявляет атрибуты объектов дан
ных. В Fortran 95/90 есть м ного атрибутов, которые м огут быть определены в описаниях,
п роизвольно определенны х в утверж дениях объявления типа.
ûmommw 66
Г ia e a 4 . О писания 67
В больш инстве случаев, утверж дение объявления типа отм еняет (или подтверж дает)
неявный тип объекта.
О днако переменная, которая появляется в утверж дении D A TA и является переменной
неявного типа, мож ет появиться в последую щ ем объявлении типа, только если это о бъ
явление подтверж дает неявное задание типа.
Д войной разделитель двоеточие (::) требуется, только если объявление содерж ит сп е
цификатор (описатель) атрибута или инициализации; иначе этот знак является д о п олн и
тельным.
Если двойной разделитель двоеточие присутствует в вы раж ении, c-list (с-список) не
м ож ет бы ть определен; например:
INTEGER 1121 ! Допустимо
INTEGER, SAVE :: 1121 ! Недопустимо
Т от же самый атрибут не долж ен появиться более одного раза в данном утверж дении
объявления типа, и объекту нельзя дать тот же самы й атрибут более одного раза в м одуле
обзора.
Если определен атрибут PA R A M ETER , объявление долж но содерж ать вы раж ение
инициализации.
Если определен => NU LL () для указателя, его начальны й статус ассоциации - р азъ е
динен.
П еременная (или переменный подобъект) м ож ет бы ть инициализирована в вы п олн яе
мой программе только один раз.
Если объявление содерж ит вы раж ение инициализации, но никакой атрибут
PA R A M ET E R не определен, объект - переменная, значение которой первоначально о п
ределено. О бъект становится определенны м, со значением , определенны м вы раж ением
инициализации согласно правилам встроенного назначения.
П рисутствие инициализации подразум евает, что имя объекта сохранено, за исклю че
нием объектов в именованных общ их блоках или объектов с атрибутом PA R A M ETER .
С ледую щ ие объекты не м огут бы ть инициализированы в утверж дении объявления
типа:
■ формальный параметр;
■ результат функции;
■ объект в им енованном общ ем блоке (если объявление ти п а не находится в програм м е
данных блока модуля);
■ объект в непомеченном общ ем блоке;
■ размещ аем ы й массив;
■ внеш нее имя;
■ встроенное имя;
■ автом атический объект;
■ объект, который имеет атрибут A U TO M A TIC .
О бъект м ож ет иметь больш е чем один атрибут (табл. 4.1).
Атрибут Совместимость
INTENT DIMENSION, OPTIONAL, TARGET, VOLATILE
INTRINSIC PRIVATE, PUBLIC
OPTIONAL DIMENSION, EXTERNAL, INTENT, POINTER, TARGET, VOLATILE
PARAMETER DIMENSION, PRIVATE, PUBLIC
POINTER AUTOMATIC, DIMENSION (с задержанной формой), OPTIONAL, PRIVATE, PROTECTED,
PUBLIC, SAVE, STATIC, VOLATILE
PRIVATE ALLOCATABLE, DIMENSION, EXTERNAL, INTRINSIC, PARAMETER, POINTER,
PROTECTED, SAVE, STATIC, TARGET, VOLATILE
PROTECTED ALLOCATABLE, AUTOMATIC, DIMENSION, INTENT, OPTIONAL, POINTER, PRIVATE,
PUBLIC, SAVE, STATIC, TARGET, VOLATILE
PUBLIC ALLOCATABLE, DIMENSION, EXTERNAL, INTRINSIC, PARAMETER, POINTER,
PROTECTED, SAVE, STATIC, TARGET, VOLATILE
SAVE ALLOCATABLE, DIMENSION, POINTER, PROTECTED, PRIVATE, PUBLIC, SAVE, TARGET,
VOLATILE
STATIC ALLOCATABLE, DIMENSION, POINTER, PROTECTED, PRIVATE, PUBLIC, SAVE, TARGET,
VOLATILE
TARGET ALLOCATABLE, AUTOMATIC, DIMENSION, INTENT, OPTIONAL, PRIVATE, PROTECTED,
PUBLIC, SAVE, STATIC, VOLATILE
VOLATILE ALLOCATABLE, AUTOMATIC, DIMENSION, INTENT, OPTIONAL, POINTER, PRIVATE,
PROTECTED, PUBLIC, SAVE, STATIC, TARGET
С ледую щ ий пример показы вает допустимые утверж дения объявления типа:
DOUBLE PRECISION В(6)
INTEGER(KIND=2) I
REAL(KIND=4) X, Y
REAL(4) X, Y
LOGICAL, DIM ENSION(10,10):: ARRAY_A, ARRAY_B
INTEGER, PARAMETER :: SMALLEST = SELECTED_REAL_KIND(6, 70)
REAL(KIND (0.0)) M
COMPLEX(KIND=8):: D
TYPE(EMPLOYEE) ■: MANAGER
REAL, INTRINSIC :: COS CHARACTER(15) PROMPT
CHARACTERS2, SAVE :: HELLO_MSG
INTEGER COUNT, MATRIX(4,4), SUM
LOGICAL*2 SWITCH
REAL ::X = 2.0
TYPE (NUM), P O IN TE R :: FIRST => NULL()
Эта форма может такж е (произвольно) быть определена после имени объекта данных
или функции (v*len). В этом случае, определенная длина отм еняет лю бую длину после
специф икатора типа CH A RA CTER.
Н аибольш ее допустимое значение для len в обеих формах - 2 ** 31-1 на процессорах
1А-32; 2 ** 63-1 на процессорах Intel ЕМ 64Т и Intel Itanium . О трицательные значения об
рабаты ваю тся как нуль.
п - скалярное целочисленное выраж ение инициализации, определяю щ ее допустимый
параметр вида. В настоящ ее время единственны й доступны й вид - 1.
Правила использования
Автоматический объект может появиться в символьном объявлении. О бъект не может
быть формальным параметром и его длина долж ны бы ть объявлена с выражением спе
цификации, которое не является константой.
Длина, указанная для сим вольного утверж дения функции или утверждения функции
форм ального аргумента типа C H A RA CTER , долж на бы ть целочисленным константным
выражением.
Когда используется спецификация длины звездочка * (*) для имени функции или
форм ального параметра, это выраж ение принимает длину соответствую щ ей ссылки
функции или фактического параметра. Точно так же, когда спецификация длины звез
дочка используется для именованной константы, она принимает длину фактической кон
станты. Например, STRING принимает 9-байтовую длину в следую щ ем утверждении:
CHARACTER^*) STRING
PARAMETER (STRING = VALUE IS:’)
Имя функции не долж но быть объявлено с * длиной, если функция - внутренняя или
функция модуль, или если это значение - массив м одифицировано указателем рекурсив
но или чисто (без побочных эффектов).
Ф орма CH A RA CTER * (*) является устареваю щ ей возмож ностью в Fortran 95.
Следую щ ий пример показывает, что массив N A M ES содерж ит сто 32-символьных
элем ентов, массив SOCSEC содерж ит сто 9-сим вольных элементов и переменная
N A M ETY , которая является константой длиной в 10 сим волов и имеет начальное значе
ние A BC D EFG H 1J'.
CHARACTER*32 NAMES(100),SOCSEC(100)*9,NAMETY*10 /’ABCDEFGHIJV
С ледую щ ий пример вклю чает утверж дение CH A RA CTER , объявляя две 8-символь
ных переменные, LA ST и FIRST.
INTEGER, PARAMETER:: LENGTH=4
CHARACTER*(4+LENGTH) LAST, FIRST
С ледую щ ий пример показывает утверж дение CH A RA CTER , которое объявляет мас
сив LETTER , содерж ащ ий 26 односимвольны х элементов. Это утверждение такж е объяв
ляет формальный параметр BU B BLE, который имеет передаваемую длину, определяе
мую программой вызова.
SUBROUTINE S1(BUBBLE)
CHARACTER LETTER(26), BUBBLE*(*)
В следую щ ем примере N A M E2 - автом атический объект:
SUBROUTINE AUT0_NAME(NAME1)
CHARACTER(LEN = *) NAME1
CHARACTER(LEN = LEN(NAMEI)) NAME2
Глава 4. Описания 71
Утверждения объявления на производные типы
Производный тип (TY PE) - утверж дение объявления, которое определяет свойства
объектов и функций типа, определенного пользователем.
Производный тип должен быть определен прежде, чем вы можете определить объек
ты этого типа в утверждение объявления TYPE.
О бъект производного типа не долж ен иметь атрибута PUBLIC, если его тип -
PRIVATE.
Конструктор структуры определяет значения для объектов производного типа.
Следующие примеры - утверж дения объявления производного типа:
TYPE(EMPLOYEE) CONTRACT
Автоматические массивы
М ассивы, автом атически размещ аем ы е компилятором (автоматические массивы), -
это массивы , для которых память отводится при входе в процедуру и освобож дается при
вы ходе из нее. Границы измерений, а следовательно, к он ф ш урац и я и размер автом атиче
ского м ассива вы числяю тся при каждом обращ ении к процедуре. В процессе выполнения
процедуры границы не долж ны переопределяться.
Автоматический массив - массив явной форм ы , который является локальной пере
менной. А втом атические массивы - разреш аю тся в ф ункциях и подпрограммах и долж ны
бы ть объявлены в части специф икации подпрограмм ы . М инимум одна граница автом а
ти ческого м ассива долж на быть выражением непостоянной спецификации. Границы оп
ределяю тся при вы зове подпрограммы.
С ледую щ ий прим ер показывает автом атические м ассивы:
SUBROUTINE SUB1 (А, В)
INTEGER А, В, LOWER
COMMON /BOUND/ LOWER
¡NTEGER AUT0_ARRAY1(B)
где сИ - вы раж ение специф икации, указы ваю щ ее нижню ю границу измерения. Вы раж е
ние м ож ет иметь полож ительную величину, отрицательную или нулевое значение.
В случае необходим ости значение преобразовано в целочисленны й тип.
Если нижняя граница не указана, она предполагается равной 1.
Ранг массива - число указанны х двоеточий (:). Значение верхней границы является
степенью соответствую щ его изм ерения связанного фактического параметра массива +
нижняя граница - 1.
С ледую щ ее вы раж ение - прим ер спецификации предполагаемой формы:
INTERFACE
SUBROUTINE SUB(M)
INTEGER M (:,1:,5:)
END SUBROUTINE
END INTERFACE
INTEGER L(20, 5-25,10)
CALL SUB(L)
SUBROUTINE SUB(M)
INTEGER M(:, 1:,5:)
END SUBROUTINE
М ассив M имеет те же сам ы е степени, что и у массива L, но массив М имеет границы
(1:20, 1:21,5:14).
О братите вним ание на то, что явный интерфейс требуется для вызова подпрограммы,
которая ож идает переним аю щ ую форму или массив указателя.
Утверждение:
AUTOMATIC v[,v]...
STATIC vlv] . ..
где type - спецификатор типа данны х; att-ls - дополнительны й список специф икаторов
атрибута; v - имя переменной или специф икации массива; м ож ет иметь лю бой тип.
Правила использования
О бъявления A U TO M A TIC и STA TIC воздействую т на разм ещ енны е в памяти данны е,
следую щ им образом:
■ П еременная, объявленная как A U TO M A T IC и разм ещ енная в памяти, сохраняется
в стеке.
■ П еременная, объявленная как STA TIC и разм ещ енная в памяти, сохраняется в стати
ческой области памяти.
Если вы хотите сохранить определения переменны х после повторного входа к под
программам, вы долж ны использовать атрибут SAVE.
Д инам ические локальны е неременны е могут ум еньш ить объем использованной пам я
ти, потому что память под них выделяется только на время выполнения.
Д инам ические локальны е перем енны е допускаю т возм ож ную рекурсию . С рекурсией
подпрограмма может вы звать себя (прямо или косвенно), и получаю щ иеся значения д о с
тупны на последую щ ий вызов или возвращ аю тся к подпрограмм е. Д ля рекурсии н еобхо
димо указать оператор REC U R SIV E одним из следую щ их способов:
■ Как клю чевое слово в утверж дении FU N CTIO N или SU B RO U TIN E.
■ Как опция компилятора.
■ Как опция в утверж дении O PTIO N S.
По ум олчанию компилятор разм ещ ает локальны е переменны е нерекурсивны х п од
программ, за исклю чением разм ещ аем ы х массивов, в статической области памяти. К ом
пилятор может разместить переменную в регистре, если он замечает, что переменная все
гда определяется перед использованием.
С оответствую щ ее использование атрибута SA V E м ож ет предотвратить предуп реж де
ния компилятора, если переменная используется преж де, чем она определена.
Чтобы изменить значения по ум олчанию для переменны х, определите их как
A UTOM ATIC или определите R EC U R SIV E (одним из упом януты х выш е способов).
Чтобы отменить лю бую опцию компилятора, которая м ож ет воздействовать на пере
менные, явно определите переменные как A U TO M A T IC или STATIC.
Примечание. Переменные, которые инициализированы данны ми, и переменные в утверж дени
ях C O M M O N и S A V E являются всегда статическими, независимо от опции компилятора, оп
ределяющей рекурсию.
П еременная не мож ет бы ть указана как A U TO M A T IC или STA TIC более одного раза
в том же модуле обзора.
Если переменная - указатель, то A U TO M A TIC или STA TIC прим еняю тся только
к указателю непосредственно, а не к лю бой связанной цели.
78 С Д А 1гаш и, В В. Кондрат ьев. П рограм ироваине на Visual FO RTRAN
Н екоторые переменные не м огут быть указаны как A U TO M A TIC или STATIC. Сле
дую щ ая таблица показы вает соответствую щ ие ограничения.
Переменная AUTOMATIC STATIC
Формальный аргумент Нет Нет
Автоматический объект Нет Нет
Элемент общего блока Нет Да
Связанный использованием элемент Нет Нет
Функциональный результат Нет Нет
Компонент производного типа Нет Нет
П еременная мож ет быть указана и с атрибутами SAVE и с STATIC.
Если переменная находится во внешней области действия модуля, она может быть
указана как STA TIC, но не как A U TO M A TIC.
Следую щ ие примеры показы ваю т утверждения объявления типа, определяю щ ие ат
рибуты A U TO M A TIC и STATIC:
REAL, AUTOMATIC *: А, В, С
INTEGER, S TA T IC :: ARRAY_A
Следую щ ий прим ер показывает утверждения A U TO M A TIC и STATIC:
CONTAINS
INTEGER FUNCTION REDO_FUNC
INTEGER I, J(10), К
REAL C, D, E(30)
AUTOMATIC I, J, K(20)
STATIC C, D, E
END FUNCTION
П еременные могут быть связаны, если они имею т различный числовой тип. Н ап ри
мер, следующ ее выраж ение допустимо:
INTEGER (20)
REAL Y (20)
COMMON/QUANTA/A, Y
Если общ ие блоки от различных модулей программы имею т одно и то же имя, они
разделяю т одну ту же область памяти при условии объединения модулей в вы полним ую
программу.
Объектам память назначается общ ими блоками на взаимно однозначном основании.
Так, тип данных объектов, назначенный утверж дением C O M M O N в одном модуле про
граммы, должен согласовы ваться с типом данных объектов, помещ енным в общ ий блок
другим модулем программы. Н апример:
Программная единица Л Программная единица В
COMMON CENTS INTEGER(2) MONEY
COMMON MONEY
•
константа долж на бы ть целым числом, двоичной, восьмеричной или ш естнадцате
ричной константой и долж на иметь значение в диапазоне от 0 до 255.
■ Когда константа и переменная соответствую т этим ограничениям , переменная ини
циализирована с сим волом , который имеет код A SCII, определенны й константой.
(Это позволяет вам инициализировать символьный объект к лю бом у 8-битовому коду
A SC II.)
■ Если константа - холеритовая или символьная константа и переменная - числовая пе
рем енная или числовой элем ент массива, то число символов, которое может быть на
значено, зависит от типа данны х элем ента данных.
■ Если холеритовая или сим вольная константа содерж ит меньш е символов, чем вме
стим ость перем енной или элем ента массива, константа продлевается справа знаками
пробела. Если константа содерж ит больш е сим волов, чем м ож ет быть сохранено, кон
станта обрезается справа.
С ледую щ ий прим ер показы вает 3 способа, с помощ ью которых утверж дения DATA
м огут и нициализировать элем ент массива.
DIMENSION А(10,10)
DATA А/100*1.0/ ! инициализация по имени
DATA А(1,1), А(10,1), А(3,3) /2*2.5,2.0/ ! инициализация элементом
DATA ((A(I,J), 1=1,5,2), J=1,5) /15*1.0/ ! инициализация неявным DO-списком
С л едую щ и й п ри м ер п о к азы в ает утверж д ен и я D A T A , сод ер ж ащ и е ком п он ен ты
стр у кту р ы :
EMPLOYEE TYPE
ID INTEGER
CHARACTER (LEN=40) NAME
EMPLOYEE END TYPE
TYPE(EMPLOYEE) MAN_NAME, CON_NAME
DATA MAN_NAME / EMPLOYEE(417, ’Henry Adams’) I
DATA CON_NAME%ID, CON_NAME%NAME /891, "David James 7
В следую щ ем прим ере первое утверж дение D A TA назначает нуль на все 10 элементов
м ассива А и 4 звездочки, сопровож даем ы е 2 пробелами к символьным переменным
STA RS:
INTEGER А(10), В(10)
CHARACTER BELL, TAB, LF, FF, STARS*6
DATA A ,STA RS/10*0,’ **** ’/
DATA BELL,TAB,LF,FF /7,9,10,12/
DATA (B(l), 1=1,10,2) /5*1/
В этом случае второе утверж дение D A TA назначает коды управляю щ его символа
A SC II на сим вольны е перем енны е BELL, TA B, LF и FF. П оследнее утверж дение DATA
использует неявны й D O -список, чтобы назначить значение 1 к элементам с нечетным
ном ером в м ассиве В.
Как возм ож ность Fortran 95, указатель мож ет быть инициализирован как разъединен
ный при использовании утверж дения DATA. Например:
INTEGER, POINTER :: Р
DATA P/NULL( )/
END
Глава 4. Описании 83
где equiv-list - список двух или более переменных, элементов массива или подстрок, от
деленны х запяты м и (этот список указы вает эквивалентный набор). Если указан объект
производного типа, он долж ен бы ть типа последовательности. О бъект не может иметь
атрибута TA RG ET. Каждое вы раж ение в нижнем индексе или ссылке подстроки должно
быть целочисленны м выраж ением инициализации. П одстрока не долж на иметь длины
нуля.
Правила использования
Следую щ ие объекты не м огут бы ть указаны в утверж дениях EQ UIV A LEN CE:
■ форм альны й параметр;
■ разм ещ аем ы й массив;
■ указатель;
■ объект непоследовательного производного типа;
■ объект последовательного производного типа, содерж ащ его указатель в структуре;
■ функция, вход или имя результата;
■ им енованная константа;
■ компонен г структуры;
■ п одобъекг лю бого из вы ш еупомянуты х объектов;
■ объект с атрибутом D L LIM PO R T или D LLEX PO R T.
У тверж дение EQ U IV A LEN C E заставляет все объекты в одном введенном списке быть
разм ещ енны м и в памяти, начинаю щ емся в том же самом адресе памяти.
А ссоциация объектов зависит от их типов таким образом, как это показано в таблице.
Тип объекта Тип связанного объекта
Встроенное числовое значение1 или числовая Может иметь любой из этих типов
последовательность
Принимаемое по умолчанию символьное зна Может иметь любой из этих типов. Длины не должны
чение или символьная последовательность быть равными
Любой другой встроенный тип Должен иметь тот же самый тип и родовые параметры
Любой другой последовательный тип Должен иметь тот же самый тип
1Принимаемое по умолчанию целочисленное, действительное, действительное двойной точности, комплексное, комплекс
ное двойной точности или логическое.
О бъекты м огут быть связаны , если они им ею т различный числовой тип. Например,
следую щ ее утверж дение допустим о:
INTEGER А(20)
REAL Y(20)
EQUIVALENCE (A, Y)
Т екстовы е объекты по ум олчанию не долж ны иметь ту же длину. Следую щ ий при
мер - текстовая переменная D эквивалентна с последним и четырьмя символами (из 6)
текстового м ассива F:
CHARACTER(LEN=4) D
CHARACTER(LEN=3) F(2)
EQUIVALENCE^, F(1)(3:))
О бъекты , им ею щ ие различны е типы данны х, могут быть связаны, потому что повто
ряю щ иеся компоненты типа данны х м огут разделить память с отдельным компонентом
вы ш еупорядоченного типа данны х. Н апример, если вы сделаете целую переменную эк
вивалентной комплексной переменной, целая переменная разделяет память с вещ ествен
ной частью комплексной переменной.
Глава 4 Описании 85
Тот же модуль памяти не м ож ет встречаться более одного раза в последовательности
памяти, и последовательные модули памяти не могут б ь п ь указаны способом , который
сделал бы их непоследовательны ми.
Следую щ ее утверж дение EQ U IV A LE N C E недопустимо, потому что это определяет
тот же модуль памяти для X (1) и X (2):
REAL, DIMENSION^), *: X
REAL :: Y
E Q U IV A L E N C E S ), Y), (X(2), Y)
Следую щ ее утверж дение E Q U IV A LE N C E недопустимо, потому что А (1) и А (2) не
будут последовательными:
REAL А(2)
DOUBLE PRECISION D(2)
E Q U IV A L E N C E S ), D(1)), (A(2), D(2))
В следую щ ем примере утверж дение EQ U IV A LEN C E вы зы вает 4 элем ента целого
массива IARR, чтобы разделить гу ж е пам ять с вещ ественной перем енной D V A R д в о й
ной точности.
DOUBLE PRECISION DVAR
INTEGER (KIND=2) IARR (4)
EQUIVALENCE (DVAR, IARR (1))
В следующ ем примере утверж дение E Q U IV A LE N C E вы зы вает первый сим вол си м
вольных переменных KEY и STA R, чтобы разделить то же м естополож ение памяти.
Символьная переменная STA R эквивалентна подстроке (1:10) сим вольной переменной
KEY.
CHARACTER KEY*16, STAR*10
EQUIVALENCE(KEY, STAR)
Нижний F I E L D S
индекс Символьная позиция
ГО
Символьная
позиция
а - буква, знак доллара ($) или диапазон символов в алфавитном порядке. Ф орма для
диапазона из сим волов - а1 -а 2 , где второй символ следует за первым в алфавитном по
рядке (наприм ер, А -С ).
Знак доллара может использоваться в конце диапазона символов, так как IM PLICIT ин
терпретирует доллар, так что он в алфавитном порядке следует за символом Z. Например,
диапазон Х -$ обратился бы к идентификаторам, начинаясь с символов X, Y, Z или $.
Правила использования
У тверж дение IM PL IC IT назначает указанный тип данных (и параметр типа) ко всем
именам, не им ею щ им никакого явного типа данных и начинаю щ имся с указанного сим
вола или диапазона сим волов. Это правило не применимо для типов данных по ум олча
нию встроенны х процедур.
К огда тип данны х - C H A R A C T E R *1еп, где len - длина для сим вольного типа, целая
константа без знака или целочисленное вы раж ение инициализации, заклю ченное в круг
лы е скобки. Д иапазон для len составляет: 1-2 ** 31-1 на процессорах 1А-32 и 1-2 ** 63-1
на процессорах Itanium . И мена, начинаю щ иеся со знака доллара ($), - неявно IN TEG ER
У тверж дение IM PL IC IT N O N E отм еняет все неявные правила типа. Когда использу
ется IM PL IC IT N O N E, все имена в м одуле программы долж ны быть явно объявлены. У т
верж дение IM PL IC IT N O N E долж но предш ествовать лю бы м утверж дениям PA R A
M ETER , и не долж но бы гь никаких других утверждений IM PLIC IT в модуле обзора.
Примечание. Когда используются переменные, но нет объявлений, можно получать диагности
ческие сообщ ения, определив опцию компилятора вместо применения IM P L IC IT N O N E .
С ледую щ ее утверж дение IM PL IC IT представляет типизацию ум олчания для имен, ес
ли они явно не типизированы :
INTEGER IMPLICIT (l-N), REAL (A-H, 0-Z)
С ледую щ ие прим еры - утверж дения IM PLICIT:
IMPLICIT DOUBLE PRECISION (D)
IMPLICIT COMPLEX (S,Y), L0GICAL(1) (L.A-C)
IMPLICIT CHARACTER*32 (T-V)
IMPLICIT CHARACTER*2 (W)
IMPLICIT TYPE(COLORS) (E-F), INTEGER (G-H)
PROGRAM EXAMPLE
где group - имя группы; var-Iisí - список переменны х (отделенный запяты м и), которы е
должны бы ть связаны с именем преды дущ ей группы. П еременные м огут им еть лю бой
тип данных.
Правила использования
Имя N A M ELIST группы используется N A M ELIST утверж дениями ввода/вы вода вм е
сто списка ввода/вывода. У никальное имя группы идентиф ицирует список, объекты ко
торого могут быть изменены или переданы. В операторах ввода/вы вода специф икация
формата заменяется именем N A M E L lS T -списка (FM T = заменяется на N M L = с указан и
ем имени списка). Список ввода/вы вода заверш ается комбинацией сим волов
П еременная мож ет появиться больш е чем в одной N A M E L lST -rpynne.
К каждой переменной в var-list (переменном списке) нужно получить доступ и споль
зованием или ведущ ей ассоциацией (host), или эта переменная долж на им еть тот же тип,
параметры типа и форму, явно или неявно указанную в том 1же блоке области действия.
Если переменная неявного типа, она м ож ет появиться в последую щ ем объявлении типа,
только если оно подтверж дает неявный тип.
С ледую щ ие переменные не м огут бы ть указаны в N A M E L lST -rpynne:
■ формальный параметр массива с непостоянны м и границами;
■ переменная с принятой сим вольной длиной;
■ размещ аемый массив;
94 С Д Алгазин, В В. К он драт ьев FIрогр а м и р о ва н и е на Visual FORTRAN
Текст на вводе
&EXAMPLE N=12345, Х(1)=12345, Х(3:4)=2*1.6,
Р='ЭТО ПРИМЕР’/
П осле выполнения оператора REA D переменны е получат следую щ ие значения:
Переменная Значение
N 12345
Х (1) 12345
Х(2) не изменилось
Х (3),Х (4) 1.6
Х (5)-Х(8) не изменилось
Р ЭТО П РИ М ЕР
Глава 4 Описания 95
END MODULE M A H E R
В этом случае компоненты С и D являю тся private к типу E L E M E N T S, но тип
ELEM ENTS не private к M O D U LE M A TTER . Л ю бой м одуль програм мы , которы й ис
пользует модуль M A TTER , м ож ет объявить переменны е ти п а E L E M E N T S и передавать
как значения параметров типа ELEM EN TS.
Правила использования
А трибут PR O TEC TED мож ет появиться только в части спецификации модуля. Он
м ож ет бы ть указан только для именованной переменной, которая не находится в общем
блоке.
Н еуказательны й объект, который имеет атрибут PRO TECTED и получает доступ ас
социацией использования, м ож ет не появляться на переменном определении или как
цель в операторе присваивания указателя.
О бъект указателя, который им еет атрибут PRO TEC TED и получает доступ при помо
щи связывания использованием , не долж ен появиться как лю бое следую щ ее выражение:
■ объект указателя в утверж дении N U L L IFY ;
■ объект указателя в операторе присваивания указателя;
■ объект в утверж дении A L LO C A TE или D EALLO CA TE;
■ фактический параметр в ссы лке на процедуру, если связанный формальный пара
метр - указатель с атрибутом IN TEN T(O U T) или INTEN T (INOUT).
Следую щ ие ограничения применяю тся вне модуля, в котором задан объект атрибут
PRO TEC TED :
■ неуказательный объект, возмож но, не определен или переопределен;
■ объект указателя, возмож но, не изменили его статус ассоциации через указатель.
Следую щ ий прим ер показы вает утверж дение объявления типа, определяю щ ее атри
бут PRO TEC TED :
INTEGER, P R O TE C TED :: D, E
Рассмотрите следую щ ий пример:
MODULE counter_mod
INTEGER, P RO TEC TED :: current = 0
CONTAINS
INTEGER FUNCTION next()
current = current + 1 ! current может быть изменен здесь
next = current
RETURN
END FUNCTION next
END MODULE counterjnod
PROGRAM test_counter
USE counterjnod
PRINT *, next() ! Печатные издания 1
current = 42 ! Ошибка: переменная защищена
END PROGRAM test_counter
SUBROUTINE TESTO
REAL, SAVE :: X, Y
Следую щ ее предлож ение - пример утверж дения SAVE:
SAVE А, /ВЮ СК_В/, С, /BLOCK_D/, Е
О бъекты данны х м огут быть статическим и или динам ическим и. Если объект данных
является статическим , ему во времени компиляции вы деляется фиксированный объем
памяти, который не освобож дается до выхода из программы . Если объект данных являет
ся динам ическим , пам ять для объекта м ож ет бы ть создана (разм ещ ена) переменной или
освобож дена во время выполнения программы .
В Fortran 95/90 указатели, разм ещ аем ы е массивы и автом атические массивы - дина
м ические объекты данных.
П ространство памяти не вы деляется для указателя, пока он не размещ ен с утверж де
нием A L LO C A TE или до этого назначено разм ещ ение на цель. У казатель может быть
динам ически отсоединен от цели, используя утверж дения N U LLIFY .
У тверж дение A L LO C A TE м ож ет использоваться, чтобы вы делить память для разм е
щ аемого массива. У тверж дение D E A L L O C A TE используется, чтобы освободить про
странство памяти, зарезервированное в преды дущ ем утверж дении A LLO CATE.
А втом атические м ассивы отличаю тся от разм ещ аем ы х массивов тем, что они автом а
тически разм ещ ены и память освобож дается всякий раз, когда вы входите или выходите
из процедуры .
йтоттп 104
Глава 5. Д инам ическое распределени е 105
присваивается переменной. Если переменная STAT не указана и происходит ош ибка, вы
полнение программы заканчивается.
Следую щ ее выражение - пример утверж дения A LLO C A TE:
INTEGER J, N, ALLOC.ERR
REAL, ALLOCATABLE :: A(:), B(:,:)
Статус распределения
В течение выполнения программы статус распределения размещ аем ого массива явля
ется одним из следую щ их выражений:
■ Не в настоящ ее время размещ аем ый массив. М ассив никогда не размещ ался, или по
следняя операция на нем была освобож дением. Н а такой массив нельзя сослаться или
определить.
■ В настоящ ее время размещ аем ы й массив. М ассив был размещ ен утверж дением
A LLO CATE. На такой массив можно сослаться, определить или освободить.
Если размещ аемый массив имеет атрибут SAVE, он им еет начальный статус "не в на
стоящ ее время размещ енный". Если массив затем размещ ен, его статус изменяется на "в
настоящ ее время размещ енный". Этот статус сохраняется до освобож дения массива.
Если размещ аемый массив не имеет атрибута SAVE, он им еет статус "не в настоящ ее
время размещ енный" в начале каж дого вызова процедуры. Если статус массива изм еня
ется на "в настоящ ее время размещ аем ый", он изм еняется, если процедура закончена вы
полнением утверждения RETU RN или END.
Приводим программу, которая вы полняет виртуальное распределение памяти. Эта
программа использует стандарт Fortran 95/90 вместо того, чтобы вызывать подпрограмму
распределения памяти операционной системы.
! Программа получает целое число и отображает значения квадратного корня
INTEGER(4):: N
READ (5,*) N ! Читает целое значение
CALL MAT(N)
END
! Процедура МАТ использует типизированное целочисленное значение,
! чтобы отобразить значение квадратного корня чисел от 1 до I (прочитанное число)
SUBROUTINE MAT(N)
106 С. Д. А к а зн и , В В . К о н д р а т ьев . П рограм ирование на Visual FORTRAN
IF (ASSOCIATED(PTR.TAR))...
DEALLOCATE(PTR_A)
NULLIFY(PTR_A)
П осле того как эти утверж дения выполняю тся, PTR A разъединен, в то время как
PTR B остается связанны м с переменной TAR.
Глава 6. Управление выполнением
П рограмма обы чно вы полняет утверж дения в порядке, в котором они записаны . К он
струкции и утверждения управления вы полнением изм еняю т это норм альное вы полне
ние, передавая управление другом у утверж дению в программе или выбирая блоки (груп
пы) конструкций и утверж дений для вы полнения или повторения.
В Fortran 95/90 можно дать имя конструкции контроля (CA SE, DO и IF). Имя долж но
быть уникальным идентификатором в блоке области действия и долж но появиться на н а
чальной и конечной строках конструкции. На начальной строке имя отделено от клю че
вого слова утверж дения двоеточием (:).
Блок может содерж ать лю бое вы полним ое утверж дение Fortran, кроме утверж дения
END. Вы можете передать управление из блока, но вы не можете передать управление в
другой блок.
Циклы DO не м о у т частично налож иться на блоки. У тверж дение DO и его конечное
утверждение долж ны появиться вместе в блоке утверж дения.
Безусловное утверждение GO ТО
Безусловное утверж дение GO ТО передает управление целевому утверж дению во
время выполнения программы. Это утверж дение приним ает следую щ ую форму:
G 0 ТО labeI
где label - метка допустим ого целевого утверж дения перехода в том же блоке области
действия, что и утверж дение GO ТО.
Безусловное утверж дение GO ТО передает управление целевому утверж дению пере-
ходк, идентифицированному указанной меткой.
ámomwm 109
110 С Д Алгазин, В В К ондрат ьев П рогралш роаанив на Visual FORTRAN
Вычисляемое утверждение GO ТО
Вычисляемое утверж дение GO ТО передает управление одному из утверждений ряда
маркированной цели перехода, основанной на значении выражения. Это устареваю щ ая
возможность Fortran 95.
Вы числяемое утверж дение GO ТО принимает следую щ ую форму:
GO ТО (Iabel-list)[] ехрг
где label-list - список меток (отделенных запятыми) допустим ы х целевых утверждений
перехода в том же блоке области действия, что и вы числяемое утверждение GO ТО. (Так
называемый список перехода.) О дна и та же метка может появиться в этом списке боль
ше, чем один раз.
ехрг является скалярным числовым выражением в диапазоне от 1 до п, где п - число
меток утверждений в списке меток. При необходимости эго выражение преобразовано в
целочисленны й тип данных.
Правила использования
Когда выполняется вы числяемое утверждение GO ТО, сначала вычисляется выраже
ние ехрг. Значение выражения представляет порядковую позицию метки в связанном
списке меток. У правление передается утверждению , идентифицированному меткой. На
пример, если список содерж ит (30, 20, 30, 40) и значение выражения - 2, управление пе
редано утверждению , идентифицированном у с меткой 20.
Если значение выражения меньш е 1 или больш е, чем число меток в списке, управле
ние передано следую щ ему выполнимому утверж дению или конструкции после вычис
ляемого утверждения GO ТО.
С ледую щ ие примеры показы ваю т допустим ы е вычисляемы е утверждения GO ТО:
GO ТО (12,24,36), INDEX
GO ТО (320,330,340,350,360), SITU(J.K) + 1
Утверждение ASSIGN
Утверж дение A SSIGN назначает значение метки утверждения на целочисленную пе
ременную. П рименяется следую щ ая форма:
ASSIGN labeIJO var
где label - метка цели перехода или утверж дения FO RM A T в том же блоке области дей
ствия, что и утверждение A SSIG N ; var - скалярная целая переменная.
Гчави 6. Управление вы п от ен ием 111
Правила использования
Когда выполняется утверж дение ASSIG N , метка утверж дения назначена на целочис
ленную переменную.
Переменная затем не определена как целая переменная и может только использовать
ся как метка (если только она позже не переопределена с целочисленным значением).
Утверждение A SSIGN долж но быть выполнено перед утверж дениями, в которых ис
пользуется назначенная переменная.
Следующий пример показывает утверждения A SSIGN:
INTEGER ERROR
ASSIGN 10 ТО NSTART
ASSIGN 99999 TO KSTOP
ASSIGN 250 TO ERROR.
О братите внимание, что N STA RT и KSTOP - целые переменные неявно, но ERROR
должна быть предварительно объявлена как целая переменная.
Следую щ ее утверж дение связы вает переменную N U M B E R с меткой 100 утверж де
ния:
ASSIGN 100 ТО NUMBER
Если впоследствии выполнена арифметическая операция с переменной N U M BER (см.
ниже), поведение во время выполнения непредсказуемо:
NUMBER = NUMBER + 1
Чтобы возвратить N U M B ER к статусу целой переменной, вы можете использовать
следующ ее утверждение:
NUMBER = 10
Это утверждение отделяет N U M B ER от утверж дения 100 и назначает этой перемен
ной целочисленное значение 10.
Как только N U M BER возвращ ена к его статусу целой переменной, эта переменная
больше не может использоваться в назначенном утверж дении GO ТО.
Назначенное утверждение GO ТО
Н азначенное утверж дение GO ТО передает управление утверждению , метка которого
была последний раз назначена на переменную. Н азначенное утверж дение GO ТО прини
мает следую щ ую форму:
GO ТО var [[,] (label-list)]
где var - скалярная целая переменная; label-list - список меток (отделенных запятыми)
допустимых целевых утверждений перехода в том же блоке области действия, что и на
значенное утверждение GO ТО. Та же самая метка м ож ет появиться не один раз в этом
списке.
Правила использования
Переменная долж на иметь значение метки утверждения, назначенного на это утвер
ждением A SSIGN (неариф метический оператор присваивания) прежде, чем выполняется
утверждение GO ТО.
Если список меток задан, метка утверждения, назначенная на переменную , гллж на
быть одной из меток в этом списке.
112 C. Д А п г а з т . В В К ондрат ьев П р о гр а и и р о ва н и е на Visual FORTRAN
Арифметическое утверждение IF
А риф м етическое утверж дение IF условно передает управление одному из трех утвер
ждений, основанны х на значении ариф метического выражения. Это - устареваю щ ая воз
м ож ность в Fortran 95 и Fortran 90.
А риф м етическое утверж дение IF принимает следую щ ую форму:
IF (ехрг) labeH, /аЬе/2, /аЬе/3
где ехрг - скалярное числовое вы раж ение типа целое или действительное числовое вы
раж ение (заклю ченное в круглы е скобки).
label У, label2, label 3 являю тся метками допустим ы х целевых утверждений перехода,
которы е находятся в том же самом м одуле обзора, что и ариф метическое утверж дение IF.
Правила использования
Все 3 метки требую тся, но они не долж ны относиться к трем различным утверж дени
ям. Та же самая метка м ож ет появиться не один раз в том же ариф метическом утверж де
нии IF.
В течение вы полнения програм мы сначала вы полняется выражение ехрг. В зависим о
сти от значения вы раж ения управление затем передается таким образом:
Если значение ехрг: Управление переходит
М еньш е, чем 0 У тверж дению label 1
Равно 0 У тверж дению label2
Больш е, чем 0 У тверж дению label3
С ледую щ ий пример передает управление утверж дению 50, если действительная пе
ременная TETA меньш е или равна действительной переменной CHI. У правление переда
ется утверж дению с меткой 100, только если TETA больш е чем СН1.
IF (THETA-CHI) 50,50,100
С ледую щ ий прим ер передает управление утверж дению с меткой 40, если значение
целой переменной N U M B E R является четным и передает управление утверждению
с мечкой 20, если значение нечетно.
IF (NUMBER 12*2 - NUMBER) 20,40,20
Глава 6 Управ ление выполнением 113
JNO
Execute
block 4
6 .5 . Конструкции DO
Конструкция DO управляет повторным выполнением блока утверждений или конст
рукций (это повторное вы полнение называется циклом).
Число итераций цикла может быть указано в начальном утверждении конструкции
DO или число итераций можно оставить неопределенным простым D O -конструкции
(”DO навсегда”) или утверж дением DO WH1LE.
У тверж дения ЕХ1Т и CY C LE изм еняю т выполнение цикла. Утверж дение EXIT закан
чивает вы полнение цикла, в то время как утверж дение CY C LE заканчивает выполнение
текущ ей итерации в цикле. Например:
D0
READ (EUNIT, IOSTAT=IOS) Y
IF (IOS /= 0) EXIT
IF (Y <0) CYCLE
CALL SUB_A(Y)
END DO
Если происходят ош ибка или конец файла, конструкция DO заканчивается. Если про
читано отрицательное значение для Y, программа переходит к следую щ ему утверждению
READ.
Выполнение конструкций DO
Диапазон конструкции DO вклю чает все утверж дения и конструкции, которые сле
дую т за утверждением DO, вклю чая конечное утверждение. П ри наличии вложенной
конструкции она долж на полностью содерж аться в пределах конструкции DO.
Выполнение конструкции DO отличается в зависимости от управления циклом таким
образом:
■ Для простой конструкции DO нет никакого контроля цикла. У тверж дения в диапазоне
DO повторены, пока цикл DO не закончен явно утверж дением в пределах диапазона.
120 С Л Ачгатн, В В К ондрат ьев Программирование на УЫш1 ГОЯТЯАИ
■ Для итерационны х утверж дений ОО контроль цикла указан, как (1о-уаг = ехрт!, ехрг2
[. ехргЗ]. И теративны й счет определяет число повторений цикла ОО (см. разд. 6.5).
■ Для утверж дений Э О \VHILE контроль цикла указан как диапазон ОО. Д иапазон 0 0
повторяется, пока указанное условие остается верным. Как только условие - ложь,
конструкция 0 0 заканчивается.
Вложенные конструкции DO
Конструкция DO мож ет содерж ать 1 или более полны х циклов DO. Д иапазон внут
ренней вложенной конструкции DO долж ен находиться полностью в пределах диапазона
следующ ей внеш ней конструкции DO. В лож енны е конструкции неблока DO могут р аз
делить м аркированное конечное утверждение.
Рис. 6.2 показы вает правильно и неправильно влож енны е конструкции DO.
D O 4 5 K -1 J 0 D 0 15 K-1.10
г- D O 351*2,50,2 D O 25 L* 1,20
L .3 5 CO NTINUE — 15 CO N TIN UE
_ l_ 4 5 COlSffiNUE - 25 CO N TIN UE
D O Ю t*1,2Q -3 0 CO N TIN UE
Г 0 0 »М ,5 “ D 0 10
Г DO КИ,10 - DO J M ,10
L EN D D O -1 0 CO N TIN UE
L EN D DO _ ENDOO
_ 10 CONTINUE
a 6
Рис. 6.2. Вложенные конструкции ВО:
а - правильно; б - неправильно
Во влож енной конструкции ОО вы можете передать управление от внутренней конст
рукции до внеш ней конструкции.
О днако вы не можете передать управление от внеш ней конструкции к внутренней
конструкции.
Если две или больш е влож енных конструкций ОО разделяю т то же конечное утвер
ждение, вы можете передать управление на утверж дение только изнутри диапазона са
мой внутренней конструкции. Лю бая другая передача к этом у утверж дению составляет
передачу от внеш ней конструкции к внутренней конструкции, потом у что разделенное
утверждение - часть диапазона самой внутренней конструкции.
Расширенный диапазон
Конструкция ОО имеет расш иренны й диапазон, если оба из следую щ их утверж дений
верны:
■ Конструкция ОО содерж ит утверж дение управления, которое передает управление из
конструкции.
122 С Д Ачгазин, В В К ондрат ьев П рограм ирование на Visual FORTRAN
■ Д ругое утверж дение управления возвращ ает управление назад в конструкцию после
выполнения одного или более одного утверждений.
Д иапазон конструкции расш ирен, чтобы вклю чить все выполнимые утверждения м е
жду адресатом утверж дения первой передачи и утверж дением, которое возвращ ает
управление к конструкции.
С ледую щ ие правила обращ аю тся к конструкции ОО с расш иренным диапазоном:
■ П ередача в диапазон утверж дения ОО разреш ается, только если передача сделана от
расш иренного диапазона этого утверж дения ОО.
■ Р асш иренны й диапазон утверж дения ОО не долж ен изменить переменную управле
ния утверж дения ОО.
Рис. 6.3 иллю стрирует допустим ы е и недопустимые расш иренны е передачи управ
ления диапазона.
20
эо
.35
40
[_4б
во то зо L 50
1= 1
DO WHILE (LINE(I:I) E Q .M)
1 = 1 + 1
END DO
Примеры требуемы х и дополнительны х утверж дений EN D DO:
Требуемые Дополнительные
DO WHILE (I .GT. J) DO 10 WHILE (I .GT. J)
ARRAY(I.J) = 1.0 ARRAY(I.J) = 1 0
1 = 1 - 1 1 = 1 - 1
END DO 10 END DO
Правила использования
У тверж дение E X IT заканчивает вы полнение именованной (или самой внутренней)
конструкции DO.
Если имя конструкции DO указано, утверж дение EX IT долж но быть в пределах ди а
пазона той конструкции.
Лю бая переменная DO сохраняет ее последнее определенное значение.
У тверж дение E X IT м ож ет бы ть маркировано, но это выраж ение не мож ет использо
ваться, чтобы закончить конструкцию DO.
Следую щ ий прим ер показы вает утверж дение EXIT:
LOOP_A: DO I = 1,15
N= N+ 1
IF (N > I) EXIT LOOP.A
END DO LOOP.A
Конструкция IF
Конструкция 1F условно вы полняет один блок конструкций или утверж дений в зави
симости от значения логического выражения. (Эта конструкция назы валась утверж дени
ем IF блока в Fortran 77.)
Г ю в а б . Управление вы п о т ен и ем 125
Конструкция IF принимает такую форму:
[name:] IF (ехрг) THEN
block
[ELSE IF (ехрг) THEN [name]
block]...
[ELSE [name]
block]
END IF [name]
где name - имя конструкции IF; ехрг - скалярное логическое выраж ение, заклю ченное в
круглые скобки; block - пустая последовательность или последовательность некоторого
количества утверждений или конструкций.
Правила использования
Если имя конструкции указано в начале утверж дения IF TH EN , то же самое имя
долж но появиться в соответствую щ ем утверж дении END IF. Это имя конструкции не
долж но использоваться для других названных конструкций в этом же блоке области д е й
ствия.
В зависимости от значения логического выражения выполняется блок утверж дений.
Логические выражения вы полняю тся в порядке, в котором они появляю тся, пока и сти н
ное значение не найдено, или сталкиваю тся с утверж дением IF ELSE или END.
Как только истинное значение найдено или сталкиваю тся с утверж дением ELSE, блок
немедленно выполняется, и вы полнение конструкции заканчивается.
Если ни одно из логических вы раж ений не истина и никакое утверж дение E LSE не
появляется в конструкции, никакой блок в конструкции не вы полняется, и вы полнение
конструкции заканчивается.
Примечание. Никакое дополнительное утверждение не может быть помещено после утвержде
ния IF THEN в конструкции IF-блока. Например, следующее утверждение недопустимо в блоке
конструкции IF:
IF (е) THEN I = J
Это утверждение оттранслировано как следующее логическое утверждение IF:
IF (е) THEN! = J
Вы не можете использовать вы полняю щ ие переход утверж дения, чтобы передать
управление утверж дению IF ELSE или утверж дению ELSE. О днако вы м ож ете вы п ол
нить переход к утверж дению EN D IF изнутри конструкции IF.
Рис. 6.4 показывает поток управления в конструкциях 1F.
Вы можете вклю чить конструкцию IF в блок утверж дений другой конструкции 1F, ес
ли вложенная IF-конструкция полностью содерж ится в пределах блока утверж дения. Эта
конструкция не м ож ет налож иться на блоки утверж дения.
Следую щ ий пример показы вает самую простую форму конструкции IF:
Формат Пример
IF (ехрг) THEN IF (ABS(ADJU) .GE. 1.0E-6) THEN
block TOTERR = TOTERR + ABS(ADJU)
QUEST = ADJU/FNDVAL
END IF END IF
Эта конструкция условно вы полняет блок меж ду утверж дениями IF THEN и EN D IF.
Следую щ ий пример показы вает конструкцию IF, содерж ащ ую утверж дение ELSE:
126 с д . Алгазин, В В Кондрат ьев. Программирование на Visual FO RTRAN
Формат Прим ер
IF (ехрг) THEN IF (NAME .LT. 'N') THEN
block 1 IFRONT = IFRONT + 1
FRLET(IFRONT) = NAME(1:2)
ELSE ELSE
block 2 IBACK = IBACK + 1
END IF END IF
Block! состоит из всех утверж дений между утверж дениями ELSE и IF THEN. В1оск2
состоит из всех утверж дений между ELSE и утверж дениями EN D IF.
Если значение сим вольного переменного N A M E - меньш е, чем 'N', block 1 выполняет
ся. Если значение N A M E больш е или равно 'N', Ь1оск2 выполняется.
IF (в) TH EN
Ыоск
EN D IF
IF (в) TH EN
Fate
ELSE
г
Ыоск2
Execute
EN D IF Ыоскз
IF Ц ) TH E N
У Т в « \ Fdae / т « \ False
bfcck1
ELSE IF <*2 ) TH EN
Т тгш T thj &
btockj
Execute Execute
EN D IF btock-j Ыоск2
IF Щ TH EN
block-j Fdfe*
ELSE IF (e2) TH EN
block 2
T t ru e Т Тгш
ELSE IF (* 3 ) TH EN
bkxk 3
Execute Execute Execute Execute
ELSE Ыоск-j block 2 btock3 btoc* 4
biock 4
EN D F
Утверждение IF
Утверждение IF условно выполняет одно утверждение, основанное на значении логиче
ского выражения. (Это утверждение называлось логическим утверждением IF в Fortran 77).
У тверж дение IF приним ает следую щ ую форму:
IF (expr) stmt
где ехрг - скалярное логическое выражение, заклю ченное в круглы е скобки; stm t является
лю бы м полным, непом еченны м, выполнимым утверж дением Fortran, за исклю чением
следую щ его утверж дения: CA SE, DO, IF, FO R A LL или конструкция W HERE.
Д ругое утверж дение IF - утверж дение EN D на програм му, функцию или подпро
грамму.
При вы полнении утверж дения IF сначала вы полняется логическое выражение. Если
значение этого вы раж ения - истина, утверж дение вы полняется. Если значение - ложь,
утверж дение не вы полняется, и управление переходит к следую щ ему утверждению
в программе.
С ледую щ ие примеры показы ваю т допустим ы е утверж дения IF:
IF (J.GT.4 .OR. J.LT.1) GO TO 250
IF (REF(J.K) NE. HOLD) REF(J.K) = REF(J.K) * (-1.5D0)
IF (ENDRUN) CALL EXIT
Ю ...
2 0...
SUBROUTINE СНЕСК(Х, Y, *, *, С)
80 RETURN 2
END
Значение X определяет возвращ ение следую щ им образом:
Если X <0, происходит норм альное возвращ ение и управление передано первому вы
полнимом у утверж дению , следую щ ему за CA LL C H EC K в программе вызова.
Если X = = 0, происходит первое дополнительное возвращ ение (RETURN 1) и управ
ление передано утверж дению , идентиф ицированном у с меткой 10.
Если Х > 0, происходит второе дополнительное возвращ ение (RETURN 2) и управле
ние передано утверж дению , идентиф ицированном у с меткой 20.
О братите вним ание, что звездочка (*) определяет дополнительное возвращ ение. А м
персанд (&) м ож ет такж е определить альтернативное возвращ ение в утверждении CALL,
но не в списке форм альны х параметров подпрограммы.
П рограмма Fortran 95/90 состоит из одной или более програм м ны х единиц. Есть
4 типа модулей программы:
■ Программа M ain (основная программа). П рограм мная единица, которая обозначает
начало выполнения. Эта программная единица мож ет иметь утверж дение PR O G R A M
как ее первое утверж дение или, возмож но, не иметь этого утверж дения.
■ Процедуры External (внеш ние процедуры). П рограм м ны е единицы , которы е явл яю т
ся или написанными пользователем функциями или подпрограм м ам и.
■ М одули . П рограммные единицы, которы е содерж ат объявления, определения типов,
процедуры или интерфейсы, которы е м огут совместно использоваться другим и про
граммными единицами.
■ Программные единицы Block data (блока данны х). П рограм м ны е единицы , кото
рые обеспечиваю т начальные значения для перем енны х в пом еченны х общ их блоках.
Программная единица не долж на содерж ать вы полним ы е утверж дения, наприм ер м о
дуль, содерж ащ ий блоки интерфейса для подпрограмм .
П роцедура может бы ть вы звана в течение вы полнения програм м ы , для того чтобы
выполнить определенную задачу.
Есть несколько видов процедур, определяемы х следую щ им образом :
Вид процедуры Описание
Внешняя процедура Процедура, которая не является частью любой другой программной единицы
Модульная процедура Процедура, определенная внутри модуля
Внутренняя процедура1 Процедура (кроме функции утверждения), содержащаяся внутри основной про
граммы, функции или подпрограммы
Встроенная процедура Процедура, определенная языком Ро11гап
Формальная процедура Фактический параметр, указанный как процедура или появляющийся в обращении
к процедуре
Функция-утверждение Вычислительная процедура, определенная отдельным утверждением
1 Программная единица, которая содержит внутреннюю процедуру, называется ее хостом
йт от т 131
132 С Д . Алгазин, В. В. К он драт ьев П рогралш рование на Visual FORTRAN
CONTAINS
SUBROUTINE SUB_1 I Внутренняя подпрограмма
где пате - имя модуля; sp e c ific a tio n -p a r t является одним или более описаниям и, за ис
ключением следую щ их:
- ENTRY,
- FORM A T,
■ A U TO M A TIC (или его эквивалентног о атрибута),
■ INTENT (или его эквивалентного атрибута),
■ OPTION A L (или его эквивалентного атрибута),
■ функции утверждения.
А втоматический объект не долж ен появиться в описании модульной процедуры,
module-subprogram является функцией или подпрограмм ой, которая определяет про
цедуру модуля. Ф ункция долж на закончиться оператором EN D FU N C T IO N , подпро
грамма долж на закончиться оператором END SU B RO U TIN E. П одпрограм м а м одуля м о
жет содерж ать внутренние процедуры.
Правила использования
Если имя следует за утверж дением END, это имя долж но бы ть то же самое, что и ука
занное в утверж дении M O D ULE. Имя модуля считаю т глобальным, и оно долж но быть
уникальным. Это имя не может совпадать с лю бы м локальны м именем в основной про
грамме или именем лю бого другого модуля програм мы , внеш ней процедуры или общ его
блока в выполнимой программе.
М одуль, ведущ ий к лю бы м процедурам модуля, которые его содерж ат, и объекты в
модуле доступны для процедуры модуля через связы вание хостом.
М одуль не долж ен ссылаться на себя (прямо или косвенно).
Вы можете использовать атрибут PR IV A TE, чтобы ограничить доступ к процедурам
или переменным в пределах модуля.
Хотя утверждениям ENTRY, утверж дениям FO R M A T и функциям утверж дения не
разреш ается входить в часть спецификации модуля, им разреш ается входить в части спе
цификации подпрограммы модуля.
Лю бые выполнимые утверж дения в м одуле м огут бы ть только указаны в п одпро
грамме модуля.
М одуль может содерж ать один или более блоков интерфейса процедуры, которы е по
зволяю т вам определять явный интерфейс для внеш ней подпрограмм ы или формальной
подпрограммы.
Следую щ ий пример показы вает простой модуль, который м ож ет использоваться, что
бы определить глобальные данные:
MODULE MOD_A
134 С. Д. Алгазин, В . В. К ондрат ьев. Программирование на Visual FO RTRAN
INTEGER:: В, С
REAL Е (25,5)
END MODULE MOD_A
SUBROUTINE SUB_Z
USE MOD_A ! Делает скалярные переменные В и С и массив
! Е доступным для этой подпрограммы
END SUBROUTINE SUB_Z
С ледую щ ий пример показы вает процедуру модуля:
MODULE RESULTS
CONTAINS
FUNCTION MOD_RESULTS (X, Y) ! Процедура модуля
END MODULE M A H E R
В этом случае компоненты С и D являю тся частными, типа ELEM ENTS, но тип
ELEM EN TS не частный к M O D U L E M A TTER . Л ю бая программная единица, которая ис
пользует модуль M A TTER , м ож ет объявить переменны е типа ELEM EN TS и передать как
значения параметров E LEM EN TS типа. Этот проект позволяет изменять компоненты ти
па, не воздействуя на другие програм мны е единицы, используя модуль.
Если производный тип необходим больш е, чем в одном модуле программы, опреде
ление долж но бы ть пом ещ ено в м одуль и доступ долж ен обеспечиваться утверждением
USE всякий раз, когда это необходимо.
Глава 7 П рограм м ны е единицы и п роц едуры 135
MODULE STUDENTS
TYPE STUDENT_RECORD
END TYPE
CONTAINS
SUBROUTINE COURSE_GRADE(...)
TYPE(STUDENT_RECORD) NAME
END SUBROUTINE
END MODULE STUDENTS
PROGRAM SENIOR_CLASS
USE STUDENTS
TYPE(STUDENT_RECORD) ID
END PROGRAM
П рограмма S E N IO R C L A S S им еет доступ к типу S T U D E N T R E C O R D , потому что
этот тип использует модуль STU D EN TS. П роцедура C O U R SE G RA D E модуля такж е
имеет доступ к типу S T U D E N T R E C O R D , потому что определение производного типа
появляется в его хосте.
SUBROUTINE SUB_Y
USE MOD_A, DX => D, EX => E 1 Массив D был переименован DX, массивом E
... ! был переименован EX. Скалярные переменные В
END SUBROUTINE SUB_Y ! и С также доступны для этой подпрограммы
... ! (использующей их имена модуля).
SUBROUTINE S U B .Z
USE MOD_A, ONLY* В, С ! Только скалярные переменные В и С
.. ! доступны для этой подпрограммы
END SUBROUTINE SUB_Z
FUNCTION HUE(A, B)
USE COLORS
X=Y+Z
END
Утверж дение USE разреш ает доступ програм мы T O TA L S к типу ITEM и к расш ирен
ному встроенному operator + , чтобы вы полнить вы числения.
Если имя следует за утверж дением END, то это долж но быть то же имя, что и имя,
указанное в утверж дении BLO CK D A TA .
Блок интерф ейса не м ож ет присутствовать в модуле блока данных программной еди
ницы, и блок данны х програм м ной единицы не долж ен содерж ать никаких выполнимых
утверж дений.
Если утверж дение D A TA инициализирует какую -нибудь переменную в помеченном
общ ем блоке, програм м ная единица блока данны х долж на иметь полный набор описа
ний, устанавливаю щ их общ ий блок.
О днако все перем енны е в блоке не долж ны быть инициализированы.
П рограм м ная единица блока данны х м ож ет установить и определить начальные зна
чения для более чем одного общ его блока, но данный общ ий блок может появиться толь
ко в одном м одуле програм м ы блока данных в выполнимой программе.
Имя програм м ной единицы блока данны х, появляю щ ееся в утверждении EXTERNAL
другой програм мной единицы , вы зы вает поиск библиотек объектных модулей для про
грам мной единицы блока данны х во время редактирования.
П рограм м ная единица блока данных:
BLOCK DATA BLKDAT
INTEGER S,X
LOGICAL T,W
DOUBLE PRECISION U
DIMENSION R(3)
COMMON /AREA1/R.S Д Т /AREA2/W.X.Y
DATA R/1.0,2*2 0/, T/.FALSE./, U/0.214537D-7/, W/.TRUE./, Y/3.5/
END
Рекурсивные процедуры
Рекурсивная процедура может сослаться на себя прям о или косвенно. Рекурсия р аз
реш ается, если указано клю чевое слово R EC U R SIV E в утверж дении FU N C TIO N или
SU BRO U TIN E, если RECURSIV E указано как опция ком пилятора или в утверж дении
O PTIONS.
Если функция непосредственно рекурсивна и ее значение - массив, клю чевы е слова
R EC U R SIV E и RESU LT долж ны бы ть указаны в утверж дении FU N C TIO N .
И нтерф ейс процедуры явен в пределах подпрограм м ы в случаях:
■ REC U R SIV E указано для подпрограммы.
■ R EC U R SIV E и R ESU LT указаны для функции.
К лю чевое слово REC U R SIV E долж но бы ть указано, если вы полняется лю бое из со
бытий (непосредственно или косвенно):
■ П одпрограм м а вы зы вает себя.
■ П одпрограм м а вызы вает подпрограмму, определенную утверж дением EN TR Y в той
же самой подпрограмме.
■ П роцедура EN TRY в той же подпрограмм е вы зы вает одно из перечисленного:
■ непосредственно себя;
■ другую процедуру ENTRY в той же самой подпрограм м е;
■ подпрограмму, определенную утверж дением FU N C T IO N или SU B R O U TIN E.
Чистые процедуры
Чистая процедура - определенная пользователем процедура, которая указана при и с
пользовании префикса PURE (или E L EM E N T A L ) в утверж дении FU N C T IO N или
SUBRO U TIN E. Чистые процедуры - возм ож ность Fortran 95.
Чистая процедура не имеет никаких побочных эфф ектов. О на не им еет никакого
влияния на состояние программы, за исклю чением событий:
■ для функций: возвращ ает значение;
■ для подпрограмм: изм еняет параметры IN TEN T (IN O U T) и IN T EN T(O U T).
Следую щ ие встроенны е процедуры неявно чисты:
■ все встроенны е функции;
■ элементная встроенная подпрограмма M V BITS;
■ встроенная подпрограмма M OVE ALLOC.
■ Ф ункция оператор чиста, только если все ф ункции, на которы е она ссы лается, чисты.
140 С Д Алгазин, В . В . К ондрат ьев П рограм ирование на Visual FO RTRAN
Правила использования
За исклю чением парам етров процедуры и параметров указателя, следую щ ее намере
ние долж но бы ть указано для всех формальных параметров в части спецификации про
цедуры:
■ для функций: IN T E N T (IN);
■ для подпрограмм: лю бой IN T E N T (IN, O U T или 1NOUT).
Л окальная переменная, объявленная в чистой процедуре (вклю чая переменные, объ
явленные в лю бом внутренней процедуре), не должна:
■ иметь атрибут SAV E;
■ быть инициализирована в утверж дении объявления типа или утверждении DATA.
Следую щ ие перем енны е ограничиваю т использование чистых процедур (и лю бых
внутренних процедур):
■ глобальны е переменны е;
■ ф орм альны е параметры с IN T EN T (IN) (или с не заявленным намерением);
■ объекты, которы е являю тся пам ятью , связанной с какой-либо частью глобальной пе
ременной.
Эти объекты не долж ны использоваться ни в каком контексте, который выполняет
лю бое из следую щ их утверж дений:
■ Заставляет их значение изм еняться. Н апример, они не долж ны использоваться как:
■ левая сторона оператора присваивания или оператора присваивания указателя;
■ фактический параметр, связанны й с формальным параметром с INTEN T(O U T),
IN TEN T (IN O U T), или атрибут POIN TER;
■ индексная переменная в утверж дении DO или FORALL, или неявном D O -цикле;
■ переменная в утверж дении A SSIG N ;
■ пункт входа в утверж дении REA D ;
■ внутренний м одуль ф айла в утверж дении W RITE;
■ объект в утверж дении A L LO C A T E, D EA LLO C A TE или N U LLIFY ;
■ IO STA T или специф икатор SIZE в утверждении ввода/вывода, или спецификатор
STA T в утверж дении A L LO C A T E или D EA LLO CA TE.
■ С оздает указатель на эту переменную . Н апример, они не долж ны использоваться как:
■ цель в операторе присваивания указателя;
■ правая сторона назначения на переменную производного типа (вклю чая указатель
на производны й тип), если производный тип имеет компонент указателя на каком-
нибудь уровне.
■ Чистая процедура не долж на содерж ать:
■ лю бого внеш него утверж дения ввода/вы вода (вклю чая утверж дение REA D или
W RITE, модуль ввода/вы вода которого - внеш ний номер устройства файла или *);
■ утверж дения PA U SE;
■ утверж дения STO P.
■ Чистая процедура м ож ет использоваться в контекстах, в которых другие процедуры
ограничены ; например:
■ м ож ет вы зы ваться непосредственно в утверждении FO R A LL или использоваться в
вы раж ении маски утверж дения FORALL;
■ м ож ет вы зы ваться из чистой процедуры (чистые процедуры м огут вызвать только
другие чистые процедуры );
■ ее мож но передать как ф актический параметр к чистой процедуре.
Глава 7. П рограм м ны е единицы и процедуры 141
Если процедура используется в лю бом из этих контекстов, ее интерфейс долж ен бы ть
явным и она долж на бы ть объявлена как pure (чистая) в этом интерфейсе.
Следую щ ие примеры - функция без побочного эффекта:
PURE INTEGER FUNCTION MANDELBROT(X)
COMPLEX, IN TENT(IN):: X
COM PLEX:: XTMP
IN TEG ER :: К
! Предположить, что SHARED_DEFS включает объявление
! INTEGER ITOL
USE SHARED_DEFS
К=0
XTMP = -X
DO WHILE (ABS(XTMP)<2,0 .AND. K<ITOL)
XTMP = XTMP**2 - X
K=K+ 1
END DO
ITER = К
END FUNCTION
П римеры предыдущ ей функции использую тся в блоке интерфейса:
INTERFACE
PURE INTEGER FUNCTION MANDELBROT(X)
COMPLEX, IN TEN T(IN ):: X
END FUNCTION MANDELBROT
END INTERFACE
Конструкция FORALL, вызываю щ ая функцию M A N D ELB R O T для обновления эл е
ментов массива:
FORALL (I = 1:N, J = 1:M)
A(I,J) = MANDELBROT(COMPLX((I-1)*1.0/(N-1), (J-1)*1 0/(M-1))
END FORALL
Элементные процедуры
Элементная процедура - определенная пользователем процедура, которая является
ограниченной формой чистой процедуры.
Элементную процедуру можно передать массиву, и она действует на каж дый элем ент
одновременно. Элементные процедуры - возм ож ность Fortran 95.
Чтобы определить элементную процедуру, используйте преф икс E L E M E N T A L в у т
верждении FUNCTION или SU B RO U TIN E.
Явный интерфейс долж ен бы ть видимы м к вызываю щ ей програм м е процедуры
ELEM ENTAL.
Для функций результатом долж ен бы ть скаляр; не допускается атрибут P O IN T E R или
A LLO CATA BLE.
Ф ормальные параметры им ею т ограничения:
■ долж ны быть скаляром;
■ не могут иметь атрибута A L LO C A T A B L E или POIN TER;
■ они (или их подобъекты) не м огут появиться в выражении специф икации, кроме как
параметр к одной из встроенны х функций BIT SIZE, LEN, K IND или числовы е ф ун к
ции запроса;
■ не м о 1 ут быть *;
■ не могут быть ф ормальными процедурами.
142 С .Д Алгазин, В В. К ондрат ьев П роклам ирование на Visual FORTRAN
Функции
П одпрограм м а функции вызывается в выраж ении и возвращ ает единственное значе
ние (результат функции). О на используется для вычисления выражения.
У тверж дение FU N CTIO N - начальное утверж дение подпрограмм ы функции. П риме
няется следую щ ая форма:
[prefix] FUNCTION name [([d-arg-lis(\)] [RESULT (r-name)]
где prefix - одно из следую щ их выражений: type [keyw ord] или keyw ord [type], в которых
type является спецификатором типа данных; keyw ord является одним из следующ их вы
ражений:
Ключевое слово Смысл
RECURSIVE Допускает прямую рекурсию. Если функция непосредственно рекурсивна и значение -
массив, RESULT должен быть также указан
PURE Утверждает, что процедура не имеет никаких побочных эффектов (см. "Чистые проце
дуры")
ELEMENTAL Ограниченный формат чистой процедуры, которая действует на 1 элемент массива од
новременно
пате является именем функции. Если R E SU LT указан, имя функции не долж но поя
виться ни в каком описании в блоке области действия подпрограмм ы функции.
Имя ф ункции мож ет сопровож даться длиной типа данных. Д лина указана символом
звездочка (*), сопровож даемы м лю бым целым числом, отличным от нуля, без знака, ко
торое является допустим ой длиной для типа функции. Н апример, FUNCTION REAL
LG FU N C*8 (Y, Z) определяет результат функции как R EA L (8) (или REAL *8). Эта до
полнительная специф икация длины не разреш ается, если длина бы ла уже указана после
клю чевого слова CH A RA CTER .
d-arg-list является списком одного или более форм альных параметров. Если нет ника
ких форм альных параметров и переменной RESU LT, круглые скобки могу! быть опущ е
ны. Н апример, допустим о следую щ ее выражение:
FUNCTION F
где г-пате - имя результата функции. Оно долж но отличаться от имени функции.
Результат функции может быть объявлен с атрибутом A LLOCATABLE или POINTER.
Правила использования
Тип и лю бы е параметры вида результата функции м огут бы ть определены в утвер
ж дении FU N CTIO N или в утверж дении объявления типа в пределах подпрограммы
Г лава 7. П рограм м ны е единицы и п роц едуры 143
функции, но не одновременно. Если тип не указан, го он определяется по неявным п ра
вилам типа для функции подпрограммы.
Выполнение начинается с первой выполнимой конструкции или утверж дения после
утверждения FU N CTIO N . У правление возвращ ается к модулю программы вызова после
выполнения утверждения END (или RETU RN ).
Если вы определяете C H A R A C T E R * (*), функция принимает длину, объявленную
для этого в программном модуле, который ее вызывает. Э тот тип сим вольной функции
может иметь другие длины , если эта функция вы звана другим и програм мны ми единица
ми (устаревающ ая возмож ность Fortran 95). Если длина указана как целочисленная кон
станта, значение долж но бы ть согласовано с длиной функции, определенной в м одуле
программы, который вы зы вает функцию . Если длина не указана, она принимается равной
единице.
Если функция - динамически размещ аем ы й (allocatable array) массив или указатель,
атрибуты долж ны быть объявлены в пределах функции. Спецификация ф ункциональны х
атрибутов результата, атрибутов форм альных параметров и информация в заголовке
процедуры - все вместе - определяю т интерфейс функции.
Значение переменной результата возвращ ено функцией, когда закончено выполнение.
В зависимости от того, является ли результат указателем, применяю тся определенны е
правила.
■ Если результат - указатель, его статус распределения долж ен бы ть определен прежде,
чем функция заканчивает выполнение. (Ф ункция долж на связать цель с указателем,
или заставить указатель бы ть явно разъединенны м от цели.) Вид значения, возвра
щ енного функцией, определен видом результата переменной, когда функция заканчи
вает выполнение.
■ Если результат не указатель, его значение долж но быть определено прежде, чем
функция заканчивает выполнение. Если результат - массив, все элементы долж ны
быть определены; если результат - структура производного типа, все компоненты
должны быть определены.
Подпрограмма функции не мож ет содерж ать утверж дение SU B RO U TIN E, утверж де
ние BLO CK DATA, утверж дение PRO G R A M или другое утверж дение FUN CTIO N.
Утверждения EN TRY м огут быть вклю чены и обеспечивать многократны е точки входа к
подпрограмме.
Чтобы вызвать функцию , вы м ожете использовать утверж дение CA LL, но только если
функция не одного из следую щ их типов:
REAL (8)
REAL (16)
COMPLEX (8)
COMPLEX (16)
CHARACTER
Следующий пример использует метод итерации Н ью тона - Рапсона (F(X) = cosh(X ) +
+ cos(X) - А = 0), чтобы получить корень функции:
FUNCTION ROOT(A)
Х = 1.0
DO
EX = ЕХР(Х)
EMINX = 1 ./EX
ROOT = X - ((EX+EMINX)*.5+COS(X)-A)/((EX-EMINX)*.5-SIN(X))
IF (AB S((X-R 00T)/R 00T) I T . 1E-6) RETURN
144 С. Д А к а зи н , В В К он драт ьев . П р о гр а мнрование на Visual FO RTRAN
X = ROOT
END DO
END
В преды дущ ем иримере ф орм ула вы числена неоднократно до разницы между Xi
и X i+1, составляю щ им величину меньш е чем 1.0Е-6:
х = х co s(-y,.) + cos ( Х , ) - А
,и ' sinh(Ji'/ ) - s in ( A 'i )
С ледую щ ий пример показы вает сим вольную функцию предполагаемой длины:
CHARACTER^*) FUNCTION REDO(CARG)
CHARACTER*! CARG
DO 1=1 ,LEN(REDO)
REDO(hl) = CARG
END DO
RETURN
END FUNCTION
Эта функция возвращ ает значение ее параметра, повторенного для заполнения длины
функции.
В пределах лю бого данного модуля програм мы , все ссы лки на сим вольную функцию
предполагаем ой длины долж ны иметь ту же длину. В следую щ ем примере функция
RED O им еет длину 1000:
CHARACTERS ООО REDO, MANYAS, MANYZS
MANYAS = REDO('A’)
MANYZS = REDO('Z')
П рограм мная единица в пределах вы полним ой програм мы м ож ет определить другую
длину. Н априм ер, функция RED O имеет длину 2:
CHARACTER H0LD*6, RED0*2
HOLD = RED0('A')//RED0('B')//RED0('C')
Д инам ическая функция массива:
FUNCTION SUB (N)
REAL, D IM EN SIO N(N ):: SUB
END FUNCTION
Следующ ий иример показывает размещаемую функцию с размещаемыми параметрами:
MODULE АР
CONTAINS
FUNCTION ADD_VEC(P1,P2)
! Функция применяется, чтобы добавить 2 размещаемых массива
! возможно отличающихся длин.
• О массивах можно думать как полиномиальных (коэффициентах)
REAL, ALLOCATABLE :: ADD_VEC(:), Р1(:), Р2(:)
! Эта функция возвращает размещаемый массив, длина которого собирается
! из длины большего входного массива.
ALLOCATE(ADD_VEC(MAX(SIZE(P1), SIZE(P2))))
M = MIN(SIZE(P1),SIZE(P2))
! Составить в целом короче размер входного массива
ADD_VEC(:M) = Р1(:М) + Р2(:М)
!Использовать большие элементы массива на входе впоследствии (от Р1 или Р2)
IF(SIZE(P1) > М) THEN
Г чеша 7. П рограм м ны е единицы и п роц едуры 145
ADD_VEC(M+1:) = P1(M+1:)
ELSE IF(SIZE(P2) > М) THEN
ADD_VEC(M+1:) = P2(M+1:).
ENDIF
END FUNCTION
END MODULE
PROGRAM TEST
USEAP
REAL, ALLOCATABLE :: P(:), Q(:), R(:), S(:)
ALLOCATE(P(3))
ALLOCATE(Q(2))
ALLOCATE(R(3))
ALLOCATE(S(3))
! Обратить внимание, что P и Q отличаются по длине
Р = (/4,2,1/) ! Р = Х**2 + 2Х + 4
Q = (/-1,1/) ! Q = X - 1
PRINT Resuit should be: 3.000000 3.000000 1.000000'
PRINT V Coefficients are: ', ADD_VEC(P, Q) ! X**2 + 3X + 3
P = (/1,1,1/) ! P = X**2 + X + 1
R = (/2,2,2/) ! R = 2X**2 + 2X + 2
S = (/3,3,3/) ! S = 3X**2 + 3X + 3
PRINT Resuit should be: 6.000000 6.000000 6.000000'
PRINT*,' Coefficients are: ', ADD_VEC(ADD_VEC(P,R), S)
END
Ссылки функции
Ф ункции вызываю тся ссылкой функции в вы раж ении или определенной операции.
Ссылка функции принимает следую щ ую форму:
fun ([a-arg [, a-arg]..])
где fun - имя подпрограммы функции; a-arg является ф актическим параметром , которо
му произвольно предш ествует [keyworcl =], где keyw ord - имя ф орм ального параметра в
явном интерфейсе для функции. Значение keyw ord задается при вызове процедуры.
146 С. Д Алгазин, В . В. К ондрат ьев П рограм нрован ие на Visual FORTRAN
Каж дый ф актический парам етр долж ен бы ть переменной, выражением или именем
процедуры. (Он не долж ен бы ть именем внутренней процедуры, функции утверждения
или родового имени процедуры .)
Правила использования
Когда ссы лаю тся на ф ункцию , каж дый фактический параметр связан с соответст
вую щ им форм альны м параметром его позиции в списке параметров или именем пара
м етра keyw ord. Эти парам етры долж ны соответствовать в типе и параметрах вида.
В ы полнение ф ункции дает результат, который присваивается имени функции, или р е
зультат присваивается другом у имени в зависим ости от того, было ли указано клю чевое
слово RESU LT. П рограм м ная единица использует значение результата, чтобы закончить
вы числение вы раж ения, содерж ащ его ссы лку на функцию .
Если позиционны е параметры и клю чевы е слова параметра указаны, клю чевые слова
парам етра долж ны появиться последним и в фактическом списке параметров. Если ф ор
м альны й параметр является дополнительны м , фактический параметр может быть опу
щен. Если ф орм альны й парам етр указан с атрибутом IN TEN T, его использование может
бы ть ограничено. Ф орм альны й параметр, нам ерение которого не указано, подчинен ог
раничениям связанного с ним ф актического параметра.
Ф актический параметр, связанны й с ф орм альной процедурой, долж ен быть с собст
венным именем процедуры или бы ть другой форм альной процедурой. О пределенны е
имена встроенной функции не долж ны использоваться как фактические параметры (см.
табл. 8.1).
Р ассм отрите пример:
X = 2.0
NEW_COS = COS (X) ! Ссылка функции
CO S встроенной ф ункции вы числяет косинус 2.0. Значение -0 .4 1 6 1 4 6 8 возвращ ено
(вместо CO S (X)) и назначено на N EW COS.
7.8. Подпрограммы
П одпрограм м а вы зы вается утверж дением CA LL или определенным оператором при
сваивания и не возвращ ает специф ическое значение.
У тверж дение SU B R O U T IN E - начальное утверж дение подпрограммы. П рименяется
следую щ ая форма:
[prefix] SUBROUTINE name [([d-arg-list])]
где p r e f ix является одним из следую щ их выражений:
Ключевое слово Смысл
RECURSIVE Разрешает выполнить прямую рекурсию. Если функция непосредственно рекурсивна
и результат - массив, должен также быть указан RESULT (см. разд. 7.7)
PURE Говорит, что процедура не имеет никаких побочных эффектов (см. разд. 7.7).
ELEMENTAL Ограниченный формат чистой процедуры, которая действует на 1 элемент массива
одновременно (см. разд. 7.7)
п а т е - имя подпрограм м ы .
- список одного или более форм альны х параметров или дополнительны х
специф икаторов возвращ ения (*).
Глава 7. П рограм м ны е единицы и п роц едуры 147
Правила использования
П одпрограмма вызывается утверж дением CA LL или определенны м назначением . К о
гда вызвана подпрограмма, форм альны е параметры (если они присутствую т) становятся
связанными с фактическими параметрами, указанны ми в вызове.
В ы полнение начинается с первой вы полним ой конструкции или утверж дения после
утверждения SU BRO U TIN E.
Управление возвращ ается к м одулю програм мы вызова после вы полнения у тверж д е
ния END (или RETU RN ).
П одпрограмма не м ож ет содерж ать утверж дение FU N C T IO N , утверж дение B L O C K
DATA, утверж дение PRO G R A M или утверж дение SU B R O U TIN E. У тверж дения EN TR Y
могут быть вклю чены, чтобы обеспечить м ногократны е точки входа к подпрограмм е.
Следую щ ий пример показы вает подпрограмму:
Основная программа Подпрограмма
CA LL H E L L O W O R L D SU BR O U TIN E H E L L O W O R L D
PRIN T *, "Hello W orld"
END EN D SU B R O U TIN E
С ледую щ ий пример использует дополнительны е специф икаторы возвращ ения, чтобы
определить, куда управление переходит после заверш ения подпрограмм ы :
Основная программа П одпрограмм а
CALL СНЕСК(А,В.*Ю,*20,С) SUBROUTINE CHECK(X,Y,*.*.Q)
TYPE *, VALUE LESS THAN ZERO'
GO TO 30 50 IF(Z) 60,70,80
10 TYPE*, VALUE EQUALS ZERO' 60 RETURN
GO TO 30 70 RETURN
20 TYPE*, VALUE MORE THAN ZERO' 80 RETURN
30 CONTINUE END
Функция-утверждение
Ф ункция-утверж дение - процедура, определенная единственны м утверж дением в той
же программной единице, в которой ссылаю тся на процедуру. Это утверж дение п ри н и
мает следую щ ую форму:
fun ([d-arg [, d-arg] . ]) = expr
где/wtf - имя ф ункции-утверж дения.
d-arg является формальным параметром, который м ож ет появиться только однаж ды в
лю бом списке форм альных параметров и его возм ож ности являю тся локальны м и к ф ун к
ции утверждения.
148 С. Д. Алгазин, В. В . К ондрат ьев П рограм ирование на Visual FO RTRAN
GRADE = AVG(TEST1,TEST2,XLAB)
IF (AVG(P,D,Q) .LT. AVG(X,Y,Z)) STOP
FINAL = AVG(TEST3,TEST4,LAB2) ! Недопустимая ссылка; неявный тип третьего параметра
! не соответствует неявному типу формального параметра
Проблем неявного ти п а м ож но избеж ать, если все параметры явного типа.
С ледую щ ее определение ф ункции-утверж дения недопустимо, потому что она содер
ж ит константу, которая не м ож ет использоваться как формальный параметр:
Г ш ва 7. П рограм м ны е единицы и проц едуры 149
REAL COMP, С, D, Е
C0MP(C,D,E,3.) = (С + D - Е)/3.
CONTAINS
150 С Д Алгазин, В В. К ондрат ьев. Программирование на Visual FO RTRAN
PROGRAM TEST
USE M0D_A
CALL SUB_1 (B)
WRITE (*,*) F
END SUBROUTINE SUB_1
На переменную В нельзя непосредственно сослаться в течение выполнения SUB I,
потому что она определена через формальный параметр F. О днако на В мож но косвенно
сослаться через F (и непосредственно ссылаться, когда SUB I заканчивает выполнение).
Дополнительные параметры
Ф ормальные параметры м огут бы ть указаны дополнительно, если они объявлены с
атрибутом O PTIO NA L. В этом случае ф актический параметр не долж ен подставляться
для этого формального параметра в ссылке процедуры.
Лю бые позиционные параметры долж ны появляться первыми в фактическом списке
параметров, сопровож даемом лю бы ми key w ord-парам етрам и. Если дополнительны й па
раметр - последний позиционный параметр, он м ож ет бы ть просто опущ ен при желании.
Однако если дополнительны й параметр долж ен бы ть опущ ен, а это не последний п о
зиционный параметр, параметры keyw ord долж ны использоваться для лю бы х последую
щих параметров в списке.
Д ополнительные параметры долж ны иметь явны е интерфейсы процедуры так, чтобы
могли быть сделаны соответствую щ ие связывания параметров.
Встроенная функция PR ESEN T может использоваться, чтобы определить, связан ли
фактический параметр с дополнительны м ф ормальным параметром в специфической
ссылке.
Следующий пример показы вает дополнительны е параметры:
PROGRAM RESULT
TEST.RESULT = LGFUNC(A, B=D)
CONTAINS
FUNCTION LGFUNC(G, H, B)
OPTIONAL H, В
152 С Д Алгазин, В В К ондрат ьев П р о гр а ч и р о ва н и е на Visual FO RTRAN
END FUNCTION
END
В ссы лке функции А - позиционный параметр, связанны й с необходимым форм аль
ным параметром G. Второй ф актический параметр D связан с дополнительны м ф орм аль
ным параметром В его keyw ord имя (В). Никакой ф актический параметр не связан с д о
полнительны м параметром Н.
Параметры-массивы
М ассивы - последовательности элементов. Каждый элем ент фактического массива
связан с элем ентом из форм ального массива, который им еет ту же самую позицию в по
рядке элем ента массива.
Если ф орм альны й параметр - явная форма или массив перенимаю щ ий размер, размер
ф орм ального параметра м ассива не долж ен превы ш ать размер фактического параметра
массива.
Тип и параметры вида явной формы или форм ального параметра перенимаю щ его
разм ера долж ны соответствовать типу и параметрам вида фактического параметра, но их
ранги не долж ны соответствовать.
Если форм альны й параметр - массив, перенимаю щ ий форму, размер формального па
рам етра м ассива равен разм еру фактического параметра массива. Связанный ф актиче
ский параметр не долж ен бы ть массивом перенимаю щ его разм ера или скаляром (вклю
чая указатель для элем ента м ассива или элем ента массива).
Если ф актический параметр - секция массива с векторным нижним индексом, связан
ный форм альны й параметр не долж ен быть определен.
О бъявление м ассива использовано, поскольку форм альны й параметр может опреде
лить ниж ню ю границу массива.
Если форм альны й параметр - размещ аем ы й, фактический параметр долж ен бы ть раз
м ещ аемы м и тип параметра и ранги долж ны соответствовать. Пример размещ аю щ ейся
функции с размещ аем ы м массивом появляется в "Ф ункциях".
Ф орм альны е парам етры -м ассивы , объявленны е предполагаемой формы, отложенной
формы или массивы указателя, требую т явный интерфейс, видимый в вызываю щ ей про
грамме.
Параметры-указатели
П араметр - указатель, если он объявлен с атрибутом POIN TER.
К огда вы звана процедура, формальный указатель парам етра получает состояние свя
зы вания указателя из ф актического параметра. Если фактический параметр в настоящ ее
время связанны й, ф орм альны й параметр становится связанны м с той же самой целью.
С остояние связы вания ф орм ального параметра м ож ет изм ениться в течение выполне
ния процедуры , и лю бы е такие изменения отраж ены в фактическом параметре.
Если и форм альны е, и фактические параметры - указатели, требуется явный интер
фейс.
Ф орм альны й параметр, являю щ ийся указателем, м ож ет бы ть связан только с факти
ческим параметром , который является указателем. О днако фактический параметр, яв
ляю щ ийся указателем, м ож ет бы ть связан с неуказательны м формальным параметром.
В этом случае ф актический параметр, связанны й с целью и ф ормальным параметром че
рез связы вание параметра, такж е становится связанны м с той же целью.
Глава 7 П рограм м ны е единицы и п роц едуры 153
Если формальный параметр не имеет атрибута T A R G E T или PO IN TER , лю бы е указа
тели, связанные с ф актическим параметром, не становятся связанны ми с соответствую
щим формальным параметром при вызове процедуры.
Если формальный параметр имеет атрибут TARGET, и он - или скаляр, или массив пере
нимающей формы, и соответствующий фактический параметр имеет атрибут TARGET, но он
не секция массива с векторным нижним индексом, происходит следующее:
■ лю бой указатель, связанны й с фактическим параметром, становится связанным с со
ответствую щ им формальным параметром при вызове процедуры;
■ лю бы е указатели, связанны е с формальным параметром , остаю тся связанны ми с ф ак
тическим параметром, когда выполнение процедуры заканчивается.
Если формальный параметр имеет атрибут TA RG ET, и он - явной формы или массив
предполагаемого размера, и соответствую щ ий фактический параметр имеет атрибут
TA RG ET, но он не секция массива с векторным нижним индексом, связы вание ф актиче
ских и соответствую щ их формальных параметров, при вы зове процедуры или когда за
кончено выполнение, зависит от процессора.
Если формальный параметр имеет атрибут T A R G E T и соответствую щ ий фактический
параметр не имеет того же атрибута, или он - секция м ассива с векторным нижним ин
дексом, лю бой указатель, связанны й с формальным параметром , становится неопреде
ленным, когда заканчивается выполнение процедуры.
И= ICMAX(VAR)
12 = ICMAX(CARRAY(2,2))
13 = ICMAX(VAR(3:8))
14 = ICMAX(CARRAY(1,3)(5:15))
15 = IС МАХ( VAR (3:4)//CAR RAY (3,5))
SUBROUTINE MINN(A, B, *, *, C)
Формальные параметры-процедуры
Если ф актический парам етр - процедура, ее соответствую щ ий ф ормальный пара
м етр - форм альная процедура.
Глава 7 П рограм м ны е единицы и проц едуры 155
Ф орм альны е процедуры м огут появиться в подпрограмм ах или ф ункциях.
Ф актический параметр долж ен быть собственны м именем внеш него м одуля, встроен
ного или другой формальной процедуры. Если собственное имя - такж е родовое имя,
только собственное имя связано с формальным параметром . Не все определенны е встро
енные процедуры м огут появиться как фактические параметры . (Для получения доп о л
нительной информации см. табл. 8.1.)
Ф актический параметр и соответствую щ ая форм альная п роцедура долж ны бы ть п од
программами или оба бы ть функциями.
Если интерфейс формальной процедуры явен, тип и парам етры вида и ран г связанной
фактической процедуры долж ны бы ть теми же, что и у ф орм альной процедуры .
Если интерфейс формальной процедуры неявен и на процедуру ссы лаю тся как на
подпрограмму, ф актический параметр долж ен бы ть подпрограм м ой или ф орм альной
процедурой.
Если интерфейс формальной процедуры неявен и на процедуру ссы лаю тся как на
функцию или интерфейс явного типа, фактический парам етр долж ен бы ть функцией или
формальной процедурой.
Ф орм альны е процедуры м огут быть объявлены дополнительно, но они не долж ны
быть объявлены IN TEN T (с намерением).
Следую щ ий пример - процедура, используем ая как параметр:
REAL FUNCTION LGFUNC(BAR)
INTERFACE
REAL FUNCTION BAR(Y)
REAL, IN TEN T(IN ):: Y
END
END INTERFACE
LGFUNC = BAR(2.0)
от типа аргум ента соответственно со значением: REA L (4), REA L (8), REAL (16),
CO M PLEX (4), C O M PLE X (8) и CO M PLEX (16).
Если вы вы зы ваете функцию косинуса при использовании родового имени COS, ком
пилятор вы бирает соответствую щ ую подпрограмму, основанную на параметрах, которые
вы определяете. Н априм ер, если параметр REA L (4), выбран COS; если - REA L (8), вы
бран D CO S; и если - CO M PL E X (4), выбран CCOS.
Вы можете такж е явно обратиться к специфической подпрограмме. Н апример, вы
можете вы звать ф ункцию косинуса с двойной точностью , определяя DCOS.
Вы бор процедуры происходит независимо для каждой родовой ссылки. Таким обра
зом, чтобы получить доступ к различны м встроенны м процедурам, вы можете использо
вать родовое имя, неоднократно ссылаясь в одном модуле программы.
Вы не м ож ете использовать родовы е имена функции, чтобы выбрать встроенны е про
цедуры, если вы используете их таким образом:
■ имя ф ункции-утверж дения;
■ ф орм альное имя параметра, общ ее имя блока, переменная или имя массива.
Когда встроенную функцию передаю т как фактический параметр к процедуре, долж
но использоваться ее собственное имя, и при ее вызове параметры долж ны быть скаля
ром. Не все определенны е встроенны е функции могут появиться как фактические пара
метры. (Для получения дополнительной информации см. табл. 8.1.)
Родовы е имена процедуры являю тся локальны м и по отнош ению к модулю програм
мы, который обращ ается к ним. Таким образом, они м огут использоваться для других це
лей в других м одулях програм мы .
О бычно встроенное имя процедуры относится к библиотеке процедур Fortran 90 с тем
же именем.
О днако имя м ож ет обратиться к определенной пользователем процедуре, когда имя
появляется в утверж дении EX TER N A L.
Примечание. Если вы вызываете встроенную процедуру при использовании неправильного
числа параметров или неправильного типа параметра, компилятор предполагает, что вы обра
щаетесь к внешней процедуре. Например, встроенная процедура SIN требует одного параметра;
если вы определяете 2 параметра, типа SIN (10,4), компилятор предполагает, что SIN является
внешним, а не встроенным.
Кроме тех случаев, когда используем ы е в утверж дении EX TE R N A L встроенны е име
на процедуры являю тся локальны м и к модулю программы , который обращ ается к ним,
они м огут использоваться в других целях в других м одулях программы.
Тип данны х встроенной процедуры не изменяется, если вы используете утверждение
IM PLICIT и изм еняете неявны е правила типа данных.
В строенны е и определенны е пользователем процедуры не м огут иметь одинакового
имени, если они появляю тся в той же програм мной единице.
П риводим локальны е и глобальны е свойства имени встроенной функции. Пример ис
пользует встроенную ф ункцию SIN следую щ им образом:
■ имя ф ункции-утверж дения;
■ родовое имя встроенной функции;
■ собственное имя встроенной функции;
■ имя определенной пользователем функции.
Использование и переопределение имени встроенной функции
! Сравнить способы вычисления синуса
PROGRAM SINES
Глава 7. П рограм м ны е единицы и проц едуры 157
DOUBLE PRECISION X, PI
PARAMETER (PI=3.141592653589793238D0)
COMMON V(3)
1 ! Определите SIN как функцию утверждения
SIN(X) = COS(PI/2-X)
DO X = -PI, PI, 2*PI/100
2 •Сошлитесь на SIN функции утверждения
WRITE (6,100) X, V, SIN(X)
END DO
CALL COMPUT(X)
100 FORMAT (5F10.7)
END
SUBROUTINE COMPUT(Y)
DOUBLE PRECISION Y
3 ! SIN встроенной функции - использование как фактического параметра
INTRINSIC SIN
COMMON V(3)
4 ! Определите родовую ссылку на синус с двойной точностью
V(1) = SIN(Y)
5 ! Используйте встроенный SIN как фактический параметр
CALL SUB(REAL(Y),SIN)
END
SUBROUTINE SUB(A.S)
6 ! Объявите SIN как имя функции пользователя
EXTERNAL SIN
7 ! Объявите SIN как DOUBLE PRECISION тип
DOUBLE PRECISION SIN
COMMON V(3)
8 ! Оцените SIN встроенной функции
V(2) = S(A)
9 ! Оцените определенную пользователем функцию SIN
V(3) = SIN(A)
END
10 ! Определите пользовательскую функцию SIN
DOUBLE PRECISION FUNCTION SIN(X)
INTEGER FACTOR
SIN = X - X**3/FACTOR(3) + X**5/FACTOR(5) &
-X**7/FACTOR(7)
END
1. Ф ункция-утверж дение по имени SIN определена в терминах родового им ени ф унк
ции COS. Поскольку параметр COS удваивает точность, функция косинуса вы полнена с
двойной точностью . Ф ункция-утверж дение SIN - самостоятельно одинарная точность.
2. Вы зывается функция-утверж дение S1N.
3. Имя SIN объявлено встроенны м так, чтобы встроенная функция синуса с о ди н ар
ной точностью могла бы ть передана как фактический параметр в и. 5.
4. И спользуется родовое имя функции SIN, чтобы обратиться к ф ункции синуса с
двойной точностью .
5. Встроенная функция синуса с одинарной точностью используется как ф актический
параметр.
6. Имя SIN объявлено как определенное пользователем имя функции.
7. Тип SIN объявлен с двойной точностью .
158 С Д Алгазин, В В. Кондрат ьев. Программирование на Visual F O RTRAN
Функция %LOC
Встроенная функция % LO C вы числяет внутренний адрес пункта памяти. П рим еняет
ся следую щ ая форма:
%LOC (arg)
где a r g - имя фактического параметра. Это долж на бы ть переменная, вы раж ение или имя
процедуры. (Это выражение не долж но бы ть именем внутренней процедуры или ф унк
ции-утверждения.)
Функция % LOC производит целочисленное значение, которое представляет местопо
ложение данного параметра.
Значение - IN TEG ER (8) на процессорах Intel® Itanium и Intel® ЕМ 64Т; INTEG ER(4)
на процессоре IA-32. Вы м ож ете использовать это целочисленное значение как пункт в
арифметическом выражении. Встроенная функция LOC удовлетворяет той ж е цели, что и
встроенная функция % LOC.
Каждая процедура имеет интерфейс, который состоит из имени и характеристики
процедуры, имени и характеристики каж дого форм ального параметра и родового иден
тификатора (лю бого), которые позволяю т сослаться на процедуру. Х арактеристики п ро
цедуры фиксированы, но остаток от интерф ейса м ож ет измениться в других блоках об
ласти действия. Если все эти свойства известны в рамках программы вызова, интерфейс
160 С Д А ¡гат и, В В К ондрат ьев П р о гр а и и р о ва н и е на Visual FO RTRAN
процедуры явный; иначе - это неявный интерфейс (вы веденны й из его ссылки и объяв
ления). Таблица показывает, какие процедуры имею т неявны е или явны е интерфейсы:
Вид процедуры Интерфейс
Внешняя процедура Неявный, если блок интерфейса не поставляется для процедуры
Процедура модуль Явный
Внутренняя процедура Явный
Встроенная процедура Явный
Формальная процедура Неявный, если блок интерфейса не поставляется для процедуры
Функция-утверждение Неявный
И нтерф ейс рекурсивной подпрограмм ы или функции явен в пределах подпрограммы,
которая определяет эту процедуру.
Явный интерфейс мож ет появиться на определении процедуры , на блоке интерфейса
или в обоих случаях. (В нутренние процедуры не долж ны появиться в блоке интерфейса.)
С ледую щ ие разделы описы ваю т, когда требую тся явны е интерфейсы, как определить
явны й интерфейс и как определять родовы е имена, операторы и назначение.
Правила использования
Блоки интерфейса м огут появиться в части специф икации модуля програм мы , кото
рый вызывает внеш ню ю или ф орм альную процедуру.
Generic-spec (родовые спецификации) могут появиться только в утверж дении EN D
INTERFA CE (возможность Fortran 95), если одна из них появляется в утверж дении
INTERFA CE; они долж ны быть идентичными.
Х арактеристики, указанны е для внеш ней или ф орм альной процедуры , долж ны быть
совместимыми с теми, которые определены в определении процедуры .
Блок интерфейса не долж ен появиться в програм мной единице - блок данных.
Блок интерфейса вклю чает его собственны й блок области действия и не наследует
ничего от его хоста до связывания хостом.
П роцедура не долж на иметь больш е, чем одного явного интерф ейса в данном блоке
области действия.
Блок интерфейса, содерж ащ ий generic-spec (родовы е спецификации) определяет ро до
вой интерфейс для следую щ их процедур:
■ П роцедуры в пределах блока интерфейса.
■ Л ю бое родовое имя, определенны й оператор или сим вол равенства, которы й появля
ется в родовом идентификаторе для процедуры в блоке интерфейса. П равило: лю бы е
две процедуры с тем же самым родовы м идентиф икатором долж ны отличаться.
■ П роцедуры модуля, перечисленны е в утверж дении M O D U L E PRO CED U R E.
■ П роцедуры модуля долж ны быть доступны м и утверж дениям и USE. Чтобы сделать
блок интерфейса доступны м для многих програм мны х единиц (через утверж дение
USE), поместите блок интерфейса в модуль.
Следую щ ие правила применяю тся к блокам интерф ейса, содерж ащ им чистые проце
дуры:
■ Спецификацию интерфейса чистой процедуры долж ен объявить IN TEN T всех ф ор
мальных параметров, кроме указателя и параметров процедуры .
162 С Д . Алгазин, В В. К ондрат ьев. П рограм ирование на Visual FORTRAN
■ П роцедура, которая объявлена как чистая по ее определению , мож ет такж е быть объ
явлена чистой в интерф ейсном блоке. О днако если она не объявлена чистой по ее оп
ределению , она не долж на бы ть объявлена чистой в блоке интерфейса.
С ледую щ ий прим ер показы вает простой блок интерфейса процедуры без родовой
специф икации:
SUBROUTINE SUB_B (В, FB)
REAL В
In t e r f a c e
FUNCTION FB (GN)
REAL FB, GN
END FUNCTION
END INTERFACE
У тверж дение ENTRY мож ет сослаться на себя, если подпрограмм а ф ункции или п од
программы бы ла определена как REC U R SIV E.
Ф ормальные параметры могут использоваться в утверж дениях EN TR Y , даж е если они
отличаю тся в числе, типе, параметрах типа и имени от форм альны х параметров, исполь
166 С Д А 1га т и , В. В К ондрат ьев П рогралш рование на Visual FORTRAN
ENTRY SUBC(J, К, *, *, X)
RETURN 1
RETURN 2
END
О братите внимание, что утверж дение CA LL на точку входа SUBC вклю чает фактиче
ские дополнительные параметры возвращ ения.
Утверждение RETURN 1 передает управление утверж дению с меткой 100 и утверж де
ние RETURN2 передает управление утверж дению с меткой 200 в програм ме вызова.
Глава 8. Встроенные процедуры
ммотпт 168
Глава 8. В ст роенны е проц едуры 169
AMIN0; ICHAR; JIQINT; MINO;
AMIN1;, IDINT; JMAXO; M INI;
BADDRESS; IFIX; JMAX1; MULT HIGH;
CHAR; IIDINT; JMINO; NARGS;
CMPLX; IIFIX; JMIN1; QCMPLX;
COMMAND LINE ARGUMENT; IINT; JZEXT; QEXT;
DBLE; IIQINT; KIDINT; QEXTD;
DBLEQ; IJINT; KIFIX; QMAX1;
DCMPLX; IMAXO; KINT; QMIN1;
DFLOTI; IMAX1; KIQINT; QREAL;
DFLOTJ; IMINO; KIQNNT; RAN;
DFLOTK; IMIN1; KMAXO; REAL;
DMAX1; INT; KMAX1; SECNDS;
DMIN1; INT1; KMINO; SNGL;
DPROD; INT2; KMIN1; SNGLQ;
DREAL; INT4; KZEXT; ZEXT.
1Обратите внимание, что ключевые параметры могутбыть записаны влюбом порядке. Некото
рые ключевые параметры необязательны (обозначены квадратными скобками).
170 С. Д Ачгазин, В В Кондратьев. Програмирование на Visual FORTRAN
Табл. 8.2 обобщает родовые встроенные функции и указывает, являются ли они элемент
ными запроса или трансф орм ационны м и функциями. Н еобязательны е парам етры показа
ны внутри квадратных скобок.
Табл. 8.3 перечисляет собственные функции, которые не имеют никакой родовой функ
ции, связанной с ними, и указывав!', являются ли они элементными, неэлементными или
функциями запроса. Необязательные параметры показаны внутри квадратных скобок.
176 С Д. Алгазин, В В К ондрат ьев П рограм ирование на Visual FORTRAN
Вы м ож ете обратиться к битовом у полю, содерж авш ем уся в битах 3 -6 , указывая ис
ходную позицию 3 и длину 4.
О трицательны е целые числа представляю тся в двоичном дополнительном представ
лении. Н априм ер, целое число -4 7 представлено следую щ им образом:
Д воичны й образец: 1...1010001
Битовая позиция: п...6543210
где п - число битовы х позиций в числовом м одуле памяти.
Значение битовой позиции п определяется следую щ им образом: 1 - для отрицатель
ного числа; 0 - для неотрицательного числа.
Все старш ие биты в образце от последнего сущ ественного бита значения до бита п
являю тся теми же сам ы м и, что и бит п.
IBITS и MVB1TS работаю т в битовы х нолях общ его вида. Н ачальная позиция битово
го поля и его длина являю тся параметрами для этих встроенны х подпрограмм. 1BSET,
1BCLR и BTEST работаю т на 1-битовы х полях. Они не требую т параметра длины.
Для 1BSET, 1BCLR и B T E ST диапазон битовых позиций определяется таким образом:
0 -6 3 для IN T E G E R S ) и LO G IC A L (8)
0-31 для 1NTEGER(4) и L O G lC A L (4)
0 -1 5 для 1NTEGER(2) и L O G lC A L (2)
0 -7 для BYTE, IN T E G E R (l) и L O G lC A L (l)
Д ля 1B1TS, битовая позиция м ож ет бы ть лю бым числом. Д иапазон длины - от 0 до 63
на процессорах Intel ЕМ 64Т и Intel Itanium и от 0 до 31 на процессорах 1А-32.
С ледую щ ий прим ер показы вает использование 1BSET, 1BCLR и BTEST:
1=4
J = IBSET (1,5)
PRINT *, 'J = ',J
К = IBCLR (J.2)
PRINT*, 'К = ',К
PRINT *, ’Bit 2 of К is ’,BTEST(K,2)
END
Результаты: J = 36, К = 32 и B T E ST(K ,2) равно F.
Для вы бора оптим ального выполнения и требуемы х объемов и конфигурации памяти,
Intel Fortran обеспечивает целочисленны е типы данны х, представленны е в таблице.
Тип данных Необходимая память, байт
INTEGER0) 1
INTEGER® 2
INTEGERS) 4
INTEGER® 8
Каж дая функция побитовой обработки имеет родовой формат, который работает на
всех этих целочисленны х типах, и собственны й форм ат для каж дого типа.
К огда вы указы ваете встроенны е функции, которые ссылаются к битовым позициям
или сдвигаю т двоичны е образцы внутри модуля памяти, будьте вним ательны , чтобы не
создать значения, которое находится вне диапазона целых чисел, представимых типом
данны х. Если вы сдвигаете количеством , больш им или равным размеру объекта, вы по
лучите результат - 0.
Рассм отрите следую щ ий пример:
1ЫТЕ6ЕР(2) и
Гпава 8. В ст роенны е процедуры 179
J = 17
I = ISHFT(I.J)
П еременные 1 и J им ею т тип 1NTEGER(2). П оэтому родовая функция 1SHFT о тоб ра
жается на собственную функцию IISH FT, которая возвращ ает результат IN T E G E R (2). Р е
зультаты IN TEG ER(2) долж ны находиться в диапазоне от -3 2 7 6 8 до 32767, но зн аче
ние 1, сдвинутое влево на 17 позиций, приводит к двоичном у образцу 1 соп ровож даем о
му 17-ю нулями, который представляет целое число 131072. В этом случае результат в 1
равен 0.
П редыдущ ий пример был бы допустим ы м , если бы 1 был 1NTEGER(4), потому что
1SHFT затем отобразился бы на собственную функцию J1SHFT, которая возвращ ает зн а
чение 1NTEGER(4).
Если 1SHFT вызовется с первым параметром - константой, то результат по ум олча
нию будет размера целого числа или наим еньш его целочисленного размера, который
может содерж ать первый параметр, каким бы больш им он ни являлся.
ABS
Описание: вы числяет абсолю тное значение.
Синтаксис: result = ABS (а)
Класс: элементная функция; родовая.
Парам етр: а долж ен им еть тип "ц ел очи слен н о е", "д ей стви тел ьн о е" или "к о м
плексное".
Результаты : если а имеет целое или действительное значение, значение результата
равно | а |; если а имеет комплексное значение (X, Y), результат - действительное зн аче
ние SQRT (X ** 2 + Y ** 2).
Собственное имя Тип параметра Тип результата
BABS INTEGERO) INTEGER(I)
IIABS1 INTEGERS) INTEGER®
IABS2 INTEGERS) INTEGERS)
KIABS INTEGERS) INTEGERS)
ABS REAL(4) REAL(4)
DABS REAL(8) REAL(8)
QABS REAL(16) REAL(16)
CABS3 C0MPLEX(4) REAL(4)
CDABS4 C0MPLEX(8) REAL(8)
CQABS C0MPLEX(16) REAL(16)
1 Или HABS.
2 Или JIABS. Для совместимости со старыми версиями Fortran IABS может быть указана как родовая функция.
3 Параметры настройки опций компилятора, указывающих действительный размер могут затронуть CABS.
4 Эта функция может быть указанна как ZABS.
Примеры
ABS (-7 .4 ) имеет значение 7.4.
180 С. Д Алгазин, В В К о н д р а т ьев . П рограм ирование на Visual FO RTRAN
ACHAR
Описание: возвращ ает сим вол из указанной позиции набора сим волов ASCII, даже
если сим вольны й набор процессора по ум олчанию отличен от ASCII. Это - инверсия
функции 1ACHAR. В Intel F ortran A C H A R эквивалентен функции CHAR.
С ин та ксис: result = A C H A R (/)
Класс: элем ентная функция; родовая.
Параметр: / долж ен иметь тип "целочисленное".
Р езультаты . Тин результата - сим вольны й длины 1; он имеет родовое значение па
рам етра K IN D ('А').
Если / им еет значение внутри диапазона от 0 до 127, результат - символ в позиции /
набора сим волов A SCII. A C H A R (1ACHAR (С)) имеет значение С для лю бого символа С,
который мож но представить в процессоре.
Примеры
A C H A R (71) им еет значение 'G'.
A C H A R (63) им еет значение
ACOS
Описание: вы числяет arccos jc.
С ин та ксис: result = A C O S (jc )
Класс: элем ентная функция; родовая.
Параметры: х долж ен им еть тип " действительное "; | л* | долж ен бы ть меньш е или
равным 1.
Р езультаты . Тип результата - тот же, что и у х , и выражен в радианах. Значение на
ходится в диапазоне от 0 до я.
Собственное имя Тип параметра Тип результата
AC0S REAL(4) REAL(4)
DAC0S REAL(8) REAL(8)
QAC0S (или QARC0S) REAL(16) REAL(16)
Пример
A CO S (0.68032123) им еет значение .8225955.
ACOSD
Описание: вы числяет arccos jc.
С ин та ксис: result = A C O SD (jc )
Класс: элем ентная функция; родовая.
Параметры: jc долж ен иметь тип "действительное"; | х | долж ен бы ть меньш е или рав
ным 1.
Р езультаты . Тип результата - тот же, что и у х , и выражен в градусах. Значение на
ходится в диапазоне от -9 0 ° до 90°.
Собственное имя Тип параметра Тип результата
ACOSD REAL(4) REAL(4)
DACOSD REAL(8) REAL(8)
QACOSD REAL(16) REAL(16)
П ример
A C O SD (0.886579) им еет значение 27.55354.
Гпава 8. В ст роенны е п роц едуры 181
ACOSH
Описание: вы числяет гиперболический арккосинус х.
Синтаксис: result = A CO SH (jc )
Класс: Элементная функция; родовая.
Параметр: л*должен иметь тип "действительное" и должен быть больше или равным 1.
Результаты . Тип результата тот же, что и у х .
Собственное имя Тип параметра Тип результата
AC0SH REAL(4) REAL(4)
DAC0SH REAL(8) REAL(8)
QAC0SH REAL(16) REAL(16)
Пример
ACOSH (180.0) имеет значение 5.8861.
A D JU S T L
Описание: корректирует строку сим волов слева, удаляя начальны е пробелы и встав
ляя конечные пробелы.
Синтаксис: result = A D JU STL (string)
Класс: элементная функция; родовая.
Параметр: string долж ен иметь тип "символьное".
Результаты . Тип результата - сим вольны й с той же самой длиной и родовы м п ара
метром, что и у string.
Значение результата - та же самая ст рока, за исклю чением того, что лю бы е началь
ные пробелы удалены и вставлены как конечны е пробелы.
Пример
A D JU STL ('ДАДД SU M M ER TIM E') имеет значение 'SUM M ERTIM EAAAA
A D JU S T R
Описание: корректирует строку сим волов справа, удаляя конечны е пробелы и встав
ляя начальные пробелы.
Синтаксис: result = A D JU ST R (string)
Класс: Элементная функция; родовая.
Параметр: string долж ен иметь тип "символьное".
Результаты . Тип результата - сим вольны й с той же самой длиной и родовы м п ара
метром, что и у string.
Значение результата - та же самая ст рока, за исклю чением того, что лю бы е конечны е
пробелы удалены и вставлены как начальны е пробелы.
Пример
A D JU STR ('SUMMERTIMEAAAA ') им еет значение 'АЛЛА SU M M ER TIM E'.
A IM A G
Описание: возвращ ает мнимую часть комплексного числа. Эта функция м ож ет так
же быть указана, как 1MAG.
Синтаксис: result = A IM AG (z)
Класс: элементная функция; родовая.
Параметр: z долж ен иметь комплексны й тип.
Результаты . Тип результата действителен с тем же самым родовы м параметром , что
и у z. Если z имеет значение (jc, у ), результат им еет значение у.
182 С Д Алгазин, В В К о н д р а т ьев П рограм ированне на Visual FO RTRAN
Пример
A1MAG ((4.0, 5.0)) имеет значение 5.0.
A IN T
Описание: обрезает значение до целого числа.
Син та ксис: result = A IN T (а [, kind]).
Класс: элем ентная функция; родовая.
Параметры: а долж ен иметь тип "действительное"; hind долж ен быть инициализиро
ванным скалярным целочисленны м выраж ением.
Р езультаты : имеет тип "действительное". Если hind присутствует, родовой параметр
результата указывается kind; иначе родовой параметр - это родовой параметр а.
Р езультат определяется как наибольш ее целое число, величина которого не превыш а
ет величину а и чей знак - тот же самы й, что и у а. Если \ а \ - меньш е, чем 1, A1NT (а)
имеет значение нуль.
Собственное имя Тип параметра Тип результата
AINT REAL(4) REAL(4)
DINT REAL(8) REAL(8)
QINT REAL(16) REAL(16)
Примеры
A1NT (3.678) имеет значение 3.0.
A1NT (-1 .3 7 5 ) имеет значение -1 .0 .
A LL
Описание: определяет, все ли значения истинны во всем массиве или в указанном
измерении массива.
С ин та ксис: result = A L L (mask [, dim]).
К ласс: трансф орм ационная функция; родовая.
Параметры: mask долж ен бы ть логическим массивом; dim (opt) должен быть скаляр
ным целым числом со значением в диапазоне от 1 до п, где п - ранг' mask.
Р езультаты : массив или скаляр логического типа.
Р езультат - скаляр, если dim опущ ен или mask им еет ранг единица. Скалярный ре
зультат истинен, только если все элем енты mask истинны, или mask имеет размер нуль.
Р езультат им еет значения ложь, если какой-нибудь элем ент mask - ложь.
Р езультат - массив, который им еет тот же самы й тип и родовы е параметры, что и
mask, и ранг меньше, чем mask. Его форма (d h d2, ..., d DIM_|, d D1MH, ..., dn), где (d h d2, ...,
d n) является формой mask.
Каждый элем ент в массиве результата истинен, если только все элементы в одном из
мерении м ассива, определенном mask (si, s2, s D im - i , s D iivh ь —» sn), истинны.
Примеры
A LL ((/.TRU E., .FA LSE., .TR U E./)) имеет значения лож ь, потому что некоторые эле
менты M A SK неистинны.
Г лава 8 В ст роенны е проц едуры 183
ALL ((/.TRU E., .TRUE., .TRU E./)) имеет значения истина, потом у что все элементы
M A SK истинны.
I 57 05 7
Пусть А является массивом , а В массивом
368 269
ALL (A .EQ. В, D IM = l) проверяет, равны ли все элем енты в каждом столбце А эле
ментам в соответствую щ ем столбце В. Результат имеет значение (ложь, истина, ложь),
потому что только второй столбец имеет элем енты , которы е являю тся все равными.
A LL (A .EQ. В, DJM =2) проверяет, равны ли все элем енты в каж дой строке А элем ен
там в соответствую щ ей строке В. Результат имеет значение (ложь, ложь), потому что ка
ждая строка имеет некоторы е элементы, которые неравны.
A LLO CATED
Описание: указывает, распределен ли в настоящ ее время распределяемы й массив.
Синтаксис: result = A L LO C A TED {array)
Класс: функция запроса; родовая.
Параметр: array долж ен быть распределяемы м массивом.
Р езультаты : скаляр логического типа по умолчанию .
Результат имеет значение истина, если array в настоящ ее время распределен, и ложь,
если array в настоящ ее время не распределен, или не определено, если его состояние
распределения неопределенно.
Примеры
REAL, ALLOCATABLE, DIMENSION :: Е
PRINT *, ALLOCATED (Е) ! Возвращает значение ложь
ALLOCATE (Е (12,15, 20))
PRINT *, ALLOCATED (Е) ! Возвращает значение истина
A N IN T
Описание: вычисляет самое близкое целое число.
Синтаксис: result = A N IN T (а [, kind]).
Класс: элементная функция; родовая.
Параметры: а долж ен иметь тип "действительное"; kind (opt) долж ен быть инициали
зированным скалярным целочисленным выраж ением.
Результаты . Тип результата - "действительное". Если kind присутствует, родовой па
раметр указывается kind; иначе родовой параметр - это родовой параметр а. Если а
больше чем нуль, A N IN T (а) имеет значение A1NT {а + 0.5); если меньш е или равно ну
лю, AN1NT (а) имеет значение A1NT {а -0 .5 ).
Собственное имя Тип параметра Тип результата
ANINT REAL(4) REAL(4)
DNINT REAL(8) REAL(8)
QNINT REAL(16) REAL(16)
Примеры
AN1NT (3.456) имеет значение 3.0.
AN1NT (-2.798) имеет значение -3 .0 .
ANY
Описание: определяет, истинно ли какое-нибудь значение во всем массиве или в ука
занном измерении массива.
Синтаксис: result = ANY (mask [, dim]).
184 С // Алгазин, В. В К ондрат ьев. П рограм ирование на Visual FO RTRAN
A S IN
Описание: вы числяет арксинус jc.
С и н та кси с: result = ASIN (jc )
К ласс: элем ентная функция; родовая.
Параметры : jc долж ен иметь тип "действительное"; | х | долж ен быть меньш е или
равны м 1.
Р езультаты . Тип результата - тог же, что и у х, и выражен в радианах. Значение на
ходится в диапазоне от - я/2 до я/2.
Собственное имя Тип параметра Тип результата
ASIN REAL(4) REAL(4)
DASIN REAL(8) REAL(8)
QASIN REAL(16) REAL(16)
Пример
A SIN (0.79345021) им еет значение 0.9164571.
A S IN D
Описание: вы числяет арксинус х.
С и н та кси с: result = A SIN D (jc )
Класс: элем ентная функция; родовая.
Параметры : * долж ен иметь тип "действительное"; | х | долж ен быть меньш е или
равны м 1.
Г ю в а 8 В ст роенны е п роц едуры 185
Результаты . Тип результата - тот же, что и у х, и вы раж ен в градусах. Значение на
ходится в диапазоне от -9 0 ° до 90°.
Собственное имя Тип параметра Тип результата
ASIND REAL(4) REAL(4)
DASIND REAL(8) REAL(8)
QASIND REAL(16) REAL(16)
Пример
A SIN D (0.2467590) имеет значение 14.28581.
A S IN H
Описание: вычисляет гиперболический арксинус х.
Синтаксис: result = A SIN H (х)
Класс: элем ентная функция; родовая.
Параметр: jc долж ен иметь тип "действительное".
Результаты . Тип результата - тот же, что и у х.
Собственное имя Тип параметра Тип результата
ASINH REAL(4) REAL(4)
DASINH REAL(8) REAL(8)
QASINH REAL(16) REAL(16)
Пример
AS1NH (180.0) имеет значение 5.88611.
A S S O C IA T E D
Описание; возвращ ает состояние связы вания парам етра его указателя или указы вает,
связан ли указатель с адресатом.
Синтаксис: result = A SSO C IA T E D (pointer [, target]).
Класс: функция запроса; родовая.
Параметры: poin ter долж ен бы ть указателем (лю бого типа данны х); target (opt) до л
жен быть указателем или адресатом.
Р езультаты : скаляр логического типа по ум олчанию . У становка опций компилятора,
указываю щ их размер целого числа, м ож ет затронуть эту функцию .
Если присутствует параметр poin ter, результат истина, если он в настоящ ее время свя
зан с адресатом; иначе результат - ложь.
Если такж е присутствует параметр target и является адресатом , результат истина, если
poin ter в настоящ ее время связан с target’, иначе результат - ложь.
Если target является указателем, результат истина, если и p o in ter и target в настоящ ее
время связаны с одним и тем же адресатом; иначе результат - ложь. (Если или poin ter
или target разъединен, результат - лож ь.)
Примеры
REAL, TARGET, DIMENSION (0:50):: TAR
REAL, POINTER, DIMENSION (:):: PTR
PTR =>TAR
PRINT *, ASSOCIATED (PTR, TAR) ! Возвращает значение истина
Диапазон нижнего индекса для PTR - 0:50. Рассмотрите следую щ ие операторы п ри
сваивания указателя:
PTR => TAR (:)
PTR =>TAR (0:50)
PTR =>TAR (0:49)
186 С. Д . Алгазин, В. В. К о н д р а т ьев . П рограм ирование на Visual FORTRAN
NULLIFY (PTR2)
NULLIFY (PTR3)
PRINT *, ASSOCIATED (PTR2, P T R 3 )! Возвращает значение ложь
ATAN
Описание: вы числяет арктангенс х.
Си н та кси с: result = A TAN (х)
Класс: элем ентная функция; родовая.
Параметр: х долж ен иметь тип "действительное".
Р езультаты . Тип результата - тот же, что и у х, и выражен в радианах. Значение на
ходится в диапазоне от - л/2 до тс/2.
Собственное имя Тип параметра Тип результата
ATAN REAL(4) REAL(4)
DATAN REAL(8) REAL(8)
QATAN REAL(16) REAL(16)
П ример
A TA N (1.5874993) им еет значение 1.008666.
A TAN 2
Описание: вы числяет арктангенс. Р езультат - главное значение параметра комплекс
ного числа отличного от нуля {х,у).
С и н та кси с: result = A T A N 2 (у, х)
Класс: элем ентная функция; родовая.
Параметры : у долж ен иметь тип "действительное"; х долж ен иметь тот же тип и ро
довы е парам етры , как у у. Если у им еет значение нуль, jc не мож ет иметь значение нуль.
Результаты . Тип результата - то г же, что и у х, и выражен в радианах. Значение на
ходится в диапазоне - к <A TA N 2 (у, х) < к. Если х Ф нулю, результат приблизительно ра
вен значению arctan (у/х).
Если .у > нуля, результат полож ителен.
Если у < нуля, результат отрицателен.
Если у = нулю , результат - нуль (если jc > нуля) или л (если х < нуля).
Если х = нулю , абсолю тное значение результата я/2.
Собственное имя Тип параметра Тип результата
Собственное имя Тип Параметра Тип Результата
ATAN2 REAL(4) REAL(4)
DATAN2 REAL(8) REAL(8)
QATAN2 REAL(16) REAL(16)
Примеры
A T A N 2 (2.679676, 1.0) им еет значение 1.213623.
/ и к , а Л' / н i n / j o c i i i n u c n / x ) i u ’( ) \ ¡ >hi 187
" 1 г '-1 1
Если Y им еет значение , а X им еет значение
-1 1
Ък
4
то A TAN 2 ( Y, X) -
Зл-
’ 4
A TAN 2D
Описание: вы числяет арктангенс. Р езультат - главное значение парам етра ком плекс
ного числа, отличного от нуля (jc, у).
Синтаксис: result = A TA N 2D (у, х)
Класс: элем ентная функция; родовая.
Параметры: у долж ен иметь тип "действительное"; х долж ен им еть тот же тип и р о
довы е параметры, что и у. Если у им еет значение нуль значения, х не м ож ет иметь зн аче
ние нуль.
Р езультаты . Тип результата - то же самое, что и у jc , и вы раж ен в градусах. Значение
находится в диапазоне от -1 8 0 ° до 180°. Если х Ф нулю , результат приблизительно равен
значению arctan (у/х).
Если у > 0, результат положителен.
Если у < 0, результат отрицателен.
Если у = 0, результат равен нулю (если jc > 0) или 180° (если jc < 0).
Если jc —0, абсолю тное значение результата равно 90°.
Собственное имя Тип параметра Тип результата
Собственное имя Тип Параметра Тип Результата
ATAN2D REAL(4) REAL(4)
DATAN2D REAL(8) REAL(8)
QATAN2D REAL(16) REAL(16)
Пример
A TA N 2D (2.679676, 1.0) имеет значение 69.53546.
ATAN D
Описание: вы числяет арктангенс jc.
Синтаксис: result = A TA N D ( jc )
Класс: элем ентная функция; родовая.
Параметр: jc долж ен иметь тип "действительное" и долж ен бы ть больш е или равны м
нулю.
Р езультаты . Тип результата - тот же, что и у х, и выражен в градусах.
Собственное имя Тип параметра Тип результата
Собственное имя Тип Параметра Тип Результата
ATAND REAL(4) REAL(4)
DATAND REAL(8) REAL(8)
QATAND REAL(16) REAL(16)
Пример
A TA N D (0.0874679) имеет значение 4.998819.
ATAN H
Описание: вы числяет гиперболический арктангенс х.
188 С. Д . Алгазин, В В К он драт ьев П рограм ирование на Visual FO RTRAN
BADDRESS
Описание: возвращ ает адрес х. Ее нельзя передать как фактический параметр. Эта
функция мож ет такж е бы ть указанна как IADDR.
С интаксис: result = B A D D R E SS (х)
Класс: функция запроса; родовая.
Параметр: параметр х - это переменная, массив или ссы лка на поля записи, процеду
ра или константа; он м ож ет иметь лю бой тип данных. Он не долж ен быть именем внут
ренней процедуры или функции утверж дения. Если он - указатель, он долж ен быть оп
ределен и связан с адресатом.
Результаты . Тип результата - 1NTEGER(4) на процессорах 1А-32 и INTEG ER(8) на
процессорах Intel Itanium и Intel ЕМ 64Т. Значение результата представляет адрес объекта
данных или, в случае указателей, адрес связанного с ним адресата. Если параметр недо
пустим, результат неопределенны й.
Пример
PROGRAM batest
INTEGER Х(5), I
DO 1=1,5
PRINT*, BADDRESS(X(I))
END DO
END
B IT S IZ E
Описание: возвращ ает число битов в целочисленном типе.
Синтаксис: result = BIT SIZE (/')
Класс: функция запроса; родовая.
Параметр: / долж ен иметь тип "целочисленное".
Р езультаты : скалярное целое число с тем же самым родовым параметром, что и /'.
Значение результата - число битов, определенны х битовой м оделью для целых чисел с
родовым параметром параметра. Для информации относительно битовой модели (см.
прил. D-3).
Пример
BIT SIZE ( 1 2 ) имеет значение 16, потому что K IN D =2 целочисленного типа содер
ж ит 16 бит.
BTEST
Описание: тестирует бит ц ел оч и сленною параметра.
Г ю в а 8. В ст роенны е проц едуры 189
Синтаксис: result = BTEST {i, pos)
Класс: элементная функция; родовая.
Параметры: / долж ен иметь тип "целочисленное"; p o s долж ен иметь тип "целочис
ленное", не долж ен быть отрицательны м и долж ен быть меньш е, чем B IT S IZ E (i). Самый
правый (самый м ладш ий) бит / находится в позиции 0.
Результаты . Тип результата - логическое по умолчанию .
Результат - истина, если бит / на месте p o s имеет значение 1. Результат - ложь, если
бит /' на месте p o s им еет значение нуль. Д ля получения дополнительной информации о
битовых функциях (см. разд. 8.4).
Установка опций компилятора, указы ваю щ их размер целого числа, м ож ет затронуть
эту функцию.
Собственное имя Тип параметра Тип результата
Собственное имя Тип параметра Тип результата
BBTEST INTEGERd) L0GICAL(1)
BITEST (или HTEST) IN TE G E R ® LO G IC AL®
BTEST (или BJTEST) INTEGERS) L0GICAL(4)
BKTEST INTEGERS) L0GICAL(8)
Примеры
BTEST (9, 3) имеет значение истина.
1 2 fa ls e fa ls e
Если А им еет значение , значение B TEST (А, 2) равно и значение
3 4 fa ls e tru e
tru e false
BTEST (2, А) равно
false fa ls e
C A C H E S IZ E (то ль ко 164)
Описание: возвращ ает размер уровня кеш а памяти. Эта функция достунна только на
процессорах Intel Itanium.
Синтаксис: result = CA C H E SIZ E (/ 7 )
Класс: функция запроса; родовая.
Параметр: п долж ен быть скаляром и типа "целочисленное".
Результаты . Тип результата - тот же самы й, чго и у п. Значение результата - число
килобайт в уровне п кеш а памяти.
/7 = 1 указывает кеш первого уровня; п = 2 указы вает кеш второго уровня и т. д. Если
уровень кеш а п не сущ ествует, значение результата - 0.
Пример
CA CHESIZE (1) возвращ ает 16 для процессора с кеш ем памяти первого уровня 16 КБ.
C E IL IN G
Описание: возвращ ает наименьш ее целое число, больш ее или равное его параметру.
Синтаксис: result = C EILIN G (а [, kind]).
Класс: элементная функция; родовая.
Параметры: а долж ен иметь тип "действительное"; kind (opi) долж ен быть инициали
зированным скалярным целочисленны м выраж ением. Этот параметр является возм ож но
стью Fortran 95.
Результаты . Тип результата - целое число. Если kind присутствует, родовой пара
метр результата указывается kind; иначе родовой параметр результата - родовой пара
190 С А А и ч п и п .в В /\ 0 11()/)({III1>С(> 11/)()г/)(П111/и)(.(1111Н' IHI I l^lhl/ / ( )/\ I/\ \ \
метр целого типа по умолчанию . Если процессор не може* п р ед сгавш ь значение резуль
тата в kind, результат неопределенный.
Значение результата равно наим еньш ем у целому числу, больш ему или равному а. Ус
тановка опций компилятора, указы ваю щ их целочисленны й размер, мож ет затронуть эту
функцию .
Примеры
CEILIN G (4.8) имеет значение 5.
CEILIN G (-2.55) имеет значение -2 .0 .
CHAR
Описание: возвращ ает символ в указанной позиции набора символов процессора.
Ф ункция инверсная 1CHAR.
Синтаксис: result = CH A R (i [, kind]).
Класс: элементная функция; родовая.
Параметры: /' долж ен иметь тип "целочисленное" со значением в диапазоне от 0
до n - 1, где п - число сим волов в наборе сим волов процессора; kind (opt) должен быть
инициализированным скалярным целочисленны м выражением
Результаты : имеет тип "целочисленное" с длиной 1. Если kind присутствует, родовой
параметр результата указы вается kind\ иначе родовой параметр результата - родовой па
рам етр сим вольного типа по ум олчанию . Если процессор не м ож ет представить значение
результата в k in d , результат неопределенный.
Результат - символ в позиции /' набора сим волов процессора. ICH A R (CH A R (I, KIND
(С))) имеет значение I для 0 до п - 1 и C H A R (IC H A R (С), KIN D (С)) имеет значение С
для лю бого сим вола С, представляемого в процессоре.
Собственное имя Тип параметра Тип результата
Собственное имя Тип параметра Тип результата
INTEGER(I) L0GICAL(1)
INTEGERS) LOG ICAL®
CHAR1 INTEGERS) L0GICAL(4)
IN TE G E R ® LO GICAL®
1 Эту собственную функцию нельзя передать как фактический параметр.
Примеры
CH A R (76) имеет значение 'L'.
CH A R (94) имеет значение ,Л\
CM PLX
Описание: преобразовы вает параметр в комплексны й тип. Эту функцию нельзя пере
дать как фактический параметр.
С интаксис: result = CM PLX (х [,у ] [, kind]).
Класс: элементная функция; собственная.
Параметры: х долж ен иметь тип "целочисленное", "действительное" или "комплекс
ное"; v (opt) долж ен иметь тип "целочисленное" или "действительное" (не должен при
сутствовать, если х имеет комплексны й тип); kind (opt) долж ен быть инициализирован
ным скалярным целочисленны м выраж ением.
Р езультаты . Тип результата - комплексны й. Если kind присутствует, родовой пара
метр - указанное kind\ иначе родовой параметр - родовой параметр действительного типа
по умолчанию .
Гпава 8. В ст роенны е п роц едуры 191
Если появляется только один неком плексны й параметр, он преобразуется в вещ ест
венную часть значения результата, и мнимой части присваивается нуль. Если у не указан
и х - комплексное, значение результата - CM PLX (REA L (х), A IM AG (х)).
Если появляются 2 не комплексны х параметра, вы числяется комплексное значение,
преобразовывая первый параметр в вещ ественную часть значения, а второй параметр -
в мнимую часть.
CM PLX(x, у , kind) имеет комплексное значение, вещ ественная часть которого равна
REAL(x, kind), а мнимая часть - REAL(y, kind).
Установка опций компилятора, указы ваю щ их размер действительного числа, м ож ет
затронуть эту функцию.
Примеры
CM PLX (-3 ) имеет значение (-3 .0 , 0.0).
CM PLX (4.1, 2.3) имеет значение (4.1, 2.3).
CO M M AN D AR G UM EN TCOUN T
Описание: возвращ ает число параметров команды.
Синтаксис: result = CO M M A N D A RG U M E N T CO U N T ()
Класс: функция запроса; родовая.
Параметры: нет.
Результаты : скаляр целого типа по умолчанию . Значение результата равно числу
доступных параметров команды. Если нет никаких доступны х параметров команды, р е
зультат - 0.
Имя команды не считается за один из параметров команды.
Примеры
program echo_command Jine
integer i, cnt, len, status
character c*30, b*100
call get_command (b, len, status)
if (status .ne. 0) then
write (*,*) 'get_command failed with status = ', status
stop
end if
write (*,*) 'command line = b (1:len)
call get_command_argument (0, c, len, status)
if (status .ne. 0) then
write (*,*) 'Getting command name failed with status = ', status
stop
end if
write (*,*) 'command name = ', с (1 len)
cnt = command_argument_count ()
write (*,*) 'number of command arguments = ', cnt
do i = 1, cnt
all get_command_argument (i, c, len, status)
if (status .ne. 0) then
write (*,*) 'get_command_argument failed: status = ', status, ' arg = ', i
stop
end if
write (*,*) 'command arg ', i, ' = ', с (1:len)
end do
192 С Д . Алгазин, В В К он драт ьев П рограм ирование на Visual FORTRAN
C O N JG
Описание: вы числяет сопряж енное значение комплексного числа.
С и н та кси с: result = CO N JG (z).
К ласс: элем ентная функция; родовая.
Параметр: z долж ен иметь комплексны й тип.
Р езультаты . Тип результата - тот же, что и у z. Если z имеет значение (х, у), резуль
тат им еет значение (х, -у ).
Собственное имя Тип параметра Тип результата
Собственное имя Тип Параметра Тип Результата
CONJG COMPLEXE) REAL(4)
DCONJG COMPLEXE) REAL(8)
QCONJG COMPLEXO 6) REAL(16)
П римеры
C O N JG ((2.0, 3.0)) имеет значение (2.0,-3.0).
C O N JG ((1.0, -4 .2 )) имеет значение (1.0, 4.2).
COS
Описание: вы числяет косинус jc.
С ин та кси с: result = CO S (jc )
К ласс: элем ентная функция; родовая.
Параметр: jc долж ен иметь тип " действительное " или "ком плексное” и быть задан в
радианах по м одулю 2 *ти. Если jc имеет комплексны й тип, его вещ ественная часть рас
см атривается как значение в радианах.
Р езультаты . Тип результата - гот же, что и у х.
Собственное имя Тип параметра Тип результата
COS REAL(4) REAL(4)
DCOS REAL(8) REAL(8)
QCOS REAL(16) REAL(16)
CCOS1 COMPLEX(4) REAL(4)
CDCOS2 COMPLEX(8) REAL(8)
CQCOS COMPLEX(16) REAL(16)
1 Установка опций компилятора, указывающих действительный размер, может затронуть CCOS.
2 Эта функция может также быть указанна как ZCOS
Примеры
CO S (2.0) имеет значение -0.4161468.
CO S (0.567745) им еет значение 0.8431157.
Г лава 8. В ст роенны е п роц едуры 193
COSD
Описание: вычисляет косинус jc.
С интаксис: result = CO SD (jc)
Класс: элементная функция; родовая.
Параметр :х долж ен иметь тип " действительное "и задан в градусах по модулю 360.
Результаты . Тип результата - то же, что у х.
Собственное имя Тип параметра Тип результата
C0SD REAL(4) REAL(4)
DC0SD REAL(8) REAL(8)
QC0SD REAL(16) REAL(16)
Примеры
CO SD (2.0) имеет значение 0.9993908.
CO SD (30.4) имеет значение 0.8625137.
COSH
Описание: вы числяет гиперболический косинус.
Синтаксис: result = COSH (jc )
Класс: элементная функция; родовая.
Параметр: х долж ен иметь тип "действительное".
Результаты . Тип результата - тот же, что и у jc.
Собственное имя Тип параметра Тип результата
Собственное имя Тип Параметра Тип Результата
C0SH REAL(4) REAL(4)
DC0SH REAL(8) REAL(8)
QCOSH REAL(16) REAL(16)
Примеры
COSH (2.0) имеет значение 3.762196.
COSH (0.65893) имеет значение 1.225064.
С О Т AN
Описание: вычисляет котангенс х.
Синтаксис: result = CO TA N (х)
Класс: элементная функция; родовая.
Параметр: jc долж ен иметь тип " действительное "; не м ож ет бы ть нулем. Он долж ен
быть задан в радианах модулю 2 *я.
Результаты . Тип результата - тот же, что и у jc.
CO TAN D
Описание: вычисляет котангенс х.
Синтаксис: result = C O TA N D (х)
Класс: элементная функция; родовая.
194 СД Алгазин, В В К ондрат ьев. П рограм ирование на Visual FO RTRAN
Параметр: л: долж ен иметь тип "действительное ", долж ен быть задан в градусах по
м одулю 360.
Р езультаты . Тип результата - тот же, что и у х.
Собственное имя Тип параметра Тип результата
COTAND REAL(4) REAL(4)
DCOTAND REAL(8) REAL(8)
QCOTAND REAL(16) REAL(16)
Примеры
CO T A N D (2.0) имеет значение 0.2863625Е+02.
C O T A N D (0.6) им еет значение 0.9548947Е+02.
COUNT
Описание: считает число истинных элем ентов во всем м ассиве или в указанном из
мерении массива.
Си н та кси с: result = CO U N T (mask [, dim ] [, kind]).
К ласс: трансф орм ационная функция; родовая.
Параметры : mask долж ен бы ть логическим массивом; dim (opt) долж ен быть скаляр
ным целочисленны м вы раж ением со значением в диапазоне от 1 до п, где п - ранг m ask;
kind (opt) долж ен бы ть инициализированны м скалярным целочисленны м выражением.
Р езультаты : результат - м ассив или скаляр типа "целое". Если kind присутствует, р о
довой парам етр результата указы вается kind; иначе родовой параметр результата - родо
вой параметр целого типа по ум олчанию . Если процессор не мож ет представить значение
результата в kind, результат неопределенны й.
Результат - скаляр, если dim опущ ен или mask имеет ранг один. Скалярны й результат
им еет значение, равное числу истинных элем ентов mask. Если mask имеет размер нуль,
результат - нуль.
Результат - массив, который имеет ранг меньш е, чем mask, и форму (d |, d 2, dD|M-i>
dpiM+ь —5 d n), где (d |, d 2, ..., dn) - ф орм а mask. Каждый элемент в массиве результата рав
няется числу элем ентов, которые являю тся истинными в одномерном массиве, опреде
ленном mask («|, S2 , Sdim-i, Sdim+ь •••> sn). У становка опций компилятора, указываю щ их
разм ер целого числа, м ож ет затронуть эту функцию .
Примеры
C O U N T ((/.TR U E ., .FA LSE., .TRU E./)) имеет значение 2, потому что 2 элемента ис
тинны .
CO U N T ((/.TRUE., .TRUE., .TRUE./)) имеет значение 3, потому что 3 элемента истинны.
"15 7 ' '0 5 7 '
П усть А является массивом , а В - массивом
368 2 69
CO U N T (A .NE. В, D1M=1) проверяет, сколько элементов в каждом столбце А не равно
элементам в соответствующем столбце В. Результат имеет значение (2 ,0 , 1), потому что:
П ервы й столбец А и В имеет 2 элем ента, которы е не равны.
В торой столбец А и В имеет 0 элем ентов, которы е не равны.
Третий столбец А и В им еет 1 элемент, который не равен.
C O U N T (A .NE. В, D IM =2) проверяет, сколько элем ентов в каждой строке А не равно
элем ентам в соответствую щ ей строке В. Результат им еет значение (1 ,2 ) потому что:
П ервая строка А и В им еет 1 элемент, который не равен.
Вторая строка А и В им еет 2 элем ента, которы е не равны.
Глава 8 Встроенные процедуры 195
C P U T IM E
Описание: возвращ ает, зависим ое от процессора, приближ ение процессорного вре
мени в секундах. Это - новая встроенная процедура в Fortran 95.
Синтаксис: CA LL CPU TIM E (time).
Класс: подпрограмма.
Параметры: time долж ен бы ть скаляром и типа "действительное". Это - параметр
INTEN T (OUT). Если значим ое время не м ож ет бы ть возвращ ено, зависим ое от п роцес
сора отрицательное значение возвращ ается.
Пример
REAL t¡me_beg¡n, time_end
CALL CPU_TIME(time_begin)
CALL CPU_TIME(time_end)
PRINT (*,*) 'Time of operation w a s tim e _ e n d - time_begin,' seconds'
C S H IF T
Описание: вы полняет циклический сдвиг на одноранговом массиве, или вы полняет
циклические сдвиги на всех полных одноранговы х секциях (векторах) по данном у изм е
рению м ассива ранга 2 или больше.
Элементы, выдвинуты е в одном конце, вставляю тся в другом конце. Различны е сек
ции м огут быть выдвинуты разны ми количествами и в разны х направлениях.
Синтаксис: result = C SH IFT (array, shift [, dim]).
Класс: трансформ ационная функция; родовая.
Параметры: array долж ен быть массивом; мож ет иметь лю бой тип данны х; shift д о л
жен бы ть скалярным целым числом или массивом с рангом , м еньш им , чем ранг a rra y, и
формой (di, d2, d DiM_i, d DIM+i , d n), где ( db d2, d „ ) - ф орм а array.
dim (opt) долж ен быть скалярным целым числом со значением в диапазоне от 1 до п,
где п - ранг array. Если dim опущ ен, он, как предполагаю т, равен 1.
Р езультаты : массив с тем же самым типом и родовы м и парам етрам и и формой, что и
array.
Если array имеет ранг 1, элем ент i-й элемент м ассива результата равен (1 + M O D U L O
(i + shift - 1, SIZE (array))). (О динаковый сдвиг прим еняется к каж дом у элем енту.)
Если array имеет ранг больш е, чем единица, каж дая секция (si, S2, ..., sD|M- i, Sdim+ь •••>
sn) из результата выдвигается следую щ им образом:
■ значением shift, если shift - скаляр;
■ согласно соответствую щ ем у значению shift ( s b s2, ..., sDim-i,, sDim-h, •••, s„), если shift -
массив.
Значение shift определяет количество и направление циклического сдвига. П олож и
тельное значение shift является причиной сдвига влево (в строках) или вверх (в столбцах).
О трицательное значение shift является причиной сдвига вправо (в строках) или вниз
(в столбцах). Н улевое значение shift не вы зы вает никакого сдвига.
Примеры
П усть V является массивом (1, 2, 3, 4, 5, 6).
CSH IFT (V, SHIFT=2) выдвигает элементы V циклически влево на 2 позиции, полу
чаемые значения (3, 4, 5, 6, 1, 2). 1 и 2 вы двинуты из начала и вставлены в конце.
C SH IFT (V, SH IFT= - 2 ) вы двигает элементы V циклически вправо на 2 позиции, п о
лучаемые значения (5, 6, 1, 2, 3, 4). 5 и 6 выдвинуты из конца и вставлены вначале.
196 С Д Алгазин, В. В. К ондрат ьев. Программирование на Visual FO RTRAN
1 23
П усть М является м ассивом 456 . CSH1FT (М, SH IFT = 1, DIM = 2) производит
789
23 1
результат 564
897
Каждый элем ент в строках 1, 2 и 3 вы двинут влево на 2 позиции. Элементы, выдвину
ты е из начала, вставлены в конце.
"7 8 9 '
C SH IFT (М , SH IFT = - 1 , DIM = 1) производит результат 12 3
[4 5 6
Каждый элем ент в столбцах 1, 2 и 3 выдвинут вниз на 1 позицию . Элементы, выдви
нутые снизу, вставлены вверху.
[2 3 Г
CSH IFT (М, SH IFT = (/1, - 1 , О/), D IM = 2) производит результат 64 5
[_7 8 9
Каждый элем ент в строке 1 вы двинут влево на 1 позицию ; каждый элем ент в строке 2
выдвинут вправо на 1 позицию ; никакой элем ент в строке 3 не выдвинут вообщ е.
D ATE
Описание: возвращ ает текущ ую дату, установленную внутри системы.
С интаксис: C A LL D A TE (buf).
Класс: подпрограмм а.
Параметры: b u f является 9-байтовой переменной, массивом, элементом массива или
сим вольной подстрокой. Д ата возвращ ается как 9-байтовая строка сим волов ASCII, при
нимаю щ ая ф орм ат dd-m m m -yy, где dd - дата (2 цифры); mmm - название месяца (3 бук
вы); у у - последние 2 цифры года.
Если b u f им еет числовой тип и м еньш е 9 байт, мож ет произойти наруш ение целостно
сти данных.
Если b u f им еет сим вольны й тин, связанную с ним длину передаю т подпрограмме. Ес
ли b u f меньш е 9 байт, подпрограм м а обрезает дату, чтобы соответствовать указанной
длине. Если передается массив типа сим вольное, подпрограмм а запом инает дату в пер
вом элем енте м ассива, используя длину элем ента, а не длину всего массива.
Предостережение. В озвращ аем ое значение года с двумя цифрами мож ет явиться
причиной проблем с годом 2000 или более поздним. И спользуйте D A T E A N D T I M E
вместо нее (см. "D A TE A N D T IM E " ).
Пример
CHARACTER*! DAY(9)
D A T E A N D T IM E
Описание: возвращ ает сим вольны е данны е реального часа и даты в формате, совмес
тимом с представлениям и, определенны м и С тандартной м еж дународной организацией
по стандартизации 8601:1988.
Глава 8 Встроенные процедуры 197
Синтаксис: CA LL D A T E A N D T 1 M E ([date] [, time] [, zone] [, values]).
Класс: подпрограмма.
Параметры. Есть 4 необязательны х п арам етра':
date (opt) долж ен бы ть скаляром сим вольного типа по ум олчанию ; его длина долж на
быть rio крайней мере 8, чтобы содерж ать полное значение. Его крайние левы е 8 си м во
лов содерж ат значение в ф орм ате C C Y Y M M D D , где СС - столетие; YY - год; М М - м е
сяц года; DD - день месяца.
time (opt) долж ен бы ть скаляром сим вольного типа по ум олчанию ; его длина долж на
быть но крайней мере 10, чтобы содерж ать полное значение. Его крайние левы е 10 си м
волов содерж ат значение в ф орм ате hhm m ss.sss, где hh - час дня; mm - м инуты ; ss.sss -
секунды и м иллисекунды.
zone (opt) должен быть скаляром символьного типа по умолчанию; его длина должна быть
по крайней мере 5, чтобы содержать полное значение. Его крайние левые 5 символов содер
жат значение формата hhmm, где hh и mm - разница во времени относительно Коор
динированного среднегринвичского времени (UTC)“ в часах и минутах, соответственно.
values (opt) долж ен иметь тип "целочисленное" и ранга единица. Его разм ер долж ен
быть, по крайней мере 8. Значения, возвращ аем ы е в V A LU ES, определяю тся следую щ им
образом:
V ALUES (1) - год с 4 цифрами.
VALUES (2) - месяц.
V ALUES (3) - день месяца.
V ALUES (4) - разница во времени относительно Координированного ср едн егри н ви ч
ского времени (UTC) в минутах.
VALUES (5) - час (диапазон от 0 до 23).
V ALUES (6) - минуты (диапазон от 0 до 59).
V ALUES (7) - секунды (диапазон от 0 до 59).
V ALUES (8) - м иллисекунды (диапазон от 0 до 999).3
П редположим, что следую щ ий прим ер выполнялся 2000 г. 28 м арта в 11:04:14.5:
IN TEG ER D A TE TIM E (8) C H A R A C T E R (LEN = 12) R E A L C L O C K (3)
CALL D A TE_ AN D T 1ME (R E A L C L O C K (1), R E A L C L O C K (2), &
REAL CLO CK (3), D A TE TIM E)
Это определяет значение "20000328" REA L C L O C K (l), значение "110414.500"
REA L_CLO CK (2) и значению "-0500" REA L_CLO CK (3). С ледую щ ие значения о п ред е
лены на D A TE T1ME: 2000, 3, 28,-300, 11, 4, 14 и 500.
D BLE
Описание: преобразовы вает число в действительны й тип с двойной точностью .
Синтаксис: result = D BLE (а).
Класс: элементная функция; родовая.
Параметр: а должен иметь тип "целочисленное", "действительное" или "комплексное".
Результаты . Тип результата - действительное с удвоенной точностью (R E A L(8) или
REAL*8). Ф ункции, которые являю тся причиной преобразования одного типа данны х к
другому типу, имею т тот же самы й эффект, что и неявное преобразование в операторах
присваивания.
Примеры
DBLE (4) имеет значение 4.0.
DBLE ((3.4, 2.0)) им еет значение 3.4.
DCM PLX
Описание: преобразовы вает параметр к комплексном у типу удвоенной точности. Эту
функцию нельзя передавать как фактический параметр.
С интаксис: result = D CM PLX (jc [,>>])•
Класс: элем ентная функция; собственная.
Параметры: jc долж ен иметь тип "целочисленное", "действительное" или "комплекс
ное"; у долж ен иметь тип "целочисленное" или "действительное". Он не долж ен присут
ствовать, если х имеет комплексны й тип.
Результаты . Тип результата "комплексное" с удвоенной точностью (CO M PLEX (8)
или CO M PLEX * 16).
Если появляется только один неком плексны й параметр, он преобразуется в вещ ест
венную часть значения результата, и мнимой части присваивается нуль. Если у не указан,
а л ' комплексное, значение результата - CM PLX (R EA L (х), A1MAG ( х ) ) .
Если появляю тся 2 некомплексных параметра, комплексное значение создается пре
образованием первого параметра в вещ ественную часть и второго параметра в мнимую
часть.
D CM PLX ( jc , v ) имеет комплексное значение, вещ ественная часть которого - REAL ( jc ,
K IN D =8), а мнимая часть - REA L (у, K IN D =8).
Примеры:
D CM PLX (-3 ) имеет значение (-3 .0 , 0.0);
D CM PLX (4.1, 2.3) имеет значение (4.1, 2.3).
D FLOAT
Описание: преобразовы вает целое число в число с удвоенной точностью действи
тельное типа (REA L (8)).
Синтаксис: result = D FLO A T (а)
Глава 8 В ст роенны е проц едуры 199
Класс: элементная функция; родовая.
Параметр: а долж ен иметь тип "целочисленное".
Результаты . Тип результата - действительное с удвоенной точностью (Я Е А Ц 8 ) или
ЯЕА Ь*8).
Ф ункции, которые служ ат для преобразования одного типа данны х в другой, имею т
тот же самый эффект, что и неявное преобразование в операторах присваивания.
Собственное имя Тип параметра Тип результата
INTEGER(1) REAL(8)
DFL0TI INTEGERS) REAL(8)
DFL0TJ INTEGERS) REAL(8)
DFL0TK INTEGERS) REAL(8)
1 Эти собственные функции нельзя передать как фактические параметры.
Пример
D FLO A T (-4 ) имеет значение -4 .0 .
D IG IT S
Описание: возвращ ает число значащ их цифр для чисел того же самого типа и родо
вых параметров, что и аргумента.
С интаксис: result = D IG ITS (х).
Класс: функция запроса; родовая.
Параметр: * долж ен иметь тип "целочисленное" или "действительное"; он может
быть скаляром или массивом значений.
Результаты : скаляр целого типа по умолчанию . Результат имеет значение q, если jc
имеет тип "целочисленное"; он имеет значение р , если jc им еет тип "действительное". Ц е
лочисленный параметр q определен в прил. D; действительны й параметр р определен в
прил. D-2.
Пример
Если X имеет тип REA L(4), D IG ITS (X) имеет значение 24.
D IM
Описание: возвращ ает разность между двумя числами (если разность положительна).
Синтаксис: result = DIM (jc , v )
Класс: элементная функция; родовая.
Параметры: х долж ен иметь тип "целочисленное" или "действительное"; у долж ен
иметь тот же самый тип и родовы е параметры, что и у х .
Результаты . Тип результата - тот же, что и у х . Значение результата равно х - у , если
х больше, чем у\ иначе значение результата - нуль.
Собственное имя Тип параметра Тип результата
BDIM INTEGERS) INTEGERS)
IIDIM (или HDIM) INTEGER® INTEGER®
IDIM (или JIDIM)1 INTEGERS) INTEGERS)
KIDIMW ih KDIM) INTEGERS) INTEGERS)
DIM REAL(4) REAL(4)
DDIM REAL(8) REAL(8)
QDIM REAL(16) REAL(16)
1Для совместимости IDIM может быть указана так же, как родовая функция.
Примеры
DIM (6, 2) имеет значение 4.
200 С Д Алгазин, В В К он драт ьев Программирование на Visual FORTRAN
DNUM
Описание: преобразовы вает строку сим волов в действительное значение с двойной
точностью .
Син та кси с: result = DN UM (/)
Класс: элем ентная функция; собственная.
Параметр: / долж ен иметь тип "символьное".
Р езультаты . Тип результата "действительное" с удвоенной точностью . Значение ре
зультата - действительное значение с двойной точностью , представленное строкой сим
волов /.
Примеры
D N U M ("3.14159") имеет значение с двойной точностью 3.14159.
С ледую щ ее вы раж ение устанавливает х к 311.0:
C H A R A C TE R ® ¡
DOUBLE PRECISION x
¡ = "311"
x = DNUM(i)
D O TPRO D UCT
Описание: вы полняет скалярное ум нож ение числовы х или логических векторов (од
норанговы х массивов).
С ин та ксис: result = D O T PR O D U C T (vector_a, vecto rjb ).
К ласс: трансф орм ационная функция; родовая.
Параметры : vector а долж ен быть одноранговы м массивом числового (целочислен
ного, действительного или комплексного) или логического типа; vector b долж ен быть
одноранговы м массивом числового типа, если vector а им еет числовой тип, или логиче
ского типа, если vector a имеет логический тип. Он долж ен бы ть того же самого размера,
что и vector а.
Р езультаты : скаляр, тип которого зависит от типов vector а и vector Jb.
Если vector_a им еет тип "целочисленное" или "действительное", значение результа
та - SUM (vector _a*vector_b).
Если vector a им еет комплексны й тип, значение результата - SUM (CONJG
(vector_á) *vector_b).
Е сли vector a им еет логический тип, результат имеет значение A NY (vector a .AND.
vector_b).
Если такж е одноранговы й массив им еет нулевой размер, результат - нуль, если мас
сив им еет числовой тип, и результат - "лож ь", если массив имеет логический тип (см.
разд. 31).
Примеры
D O T PR O D U C T ((/1, 2, 3/), (/3, 4, 5/)) им еет значение 26, вы числяемое следующим
образом:
((1 х 3) + (2 х 4) + (3 х 5)) = 26
D O T PR O D U C T ((/ (1.0, 2.0), (2.0, 3.0) /), (/ (1.0, 1.0), (1.0, 4.0) /)) имеет значение
(1 7 .0 ,4 .0 ).
D O T PR O D U C T ((/ .TRU E., .FALSE. /), (/ .FA LSE., .TRUE. /)) имеет значение ложь.
Глава 8. В ст роенны е проц едуры 201
DPROD
Описание: вы числяет произведение более вы сокой точности. Это - собственная
функция, которая не имеет никакого родового имени, связанного с ней. Ее нельзя пере
давать как фактический параметр.
Синтаксис: result = D PROD (х ,у )
Класс: элементная функция; собственная.
Параметры: х долж ен иметь тип R EA L(4) или REA L(8); у долж ен иметь тот ж е са
мый тип и родовы е параметры, что и х.
Результаты . Если х и у имею т тип REA L(4), тип результата действительное с двой
ной точностью (REA L(8) или REA L*8). Если х и у имею т тип R EA L(8), результат имеет
тип REA L(16). Значение результата равно х*у.
У становка опций компилятора, указы ваю щ их размер дей ствительного числа, может
затронуть эту функцию.
Примеры
D PROD (2.0, -4 .0 ) имеет значение -8.00D 0.
D PROD (5.0D0, 3.0D0) имеет значение 15.00Q0.
С ледую щ ее выраж ение показы вает другой пример:
REAL(4) е
REAL(8) d
е = 123456.7
d = 1234567D0! DPROD (е,е) возвращает 15241557546.4944
! DPROD (d.d) возвращает 15241556774.8899992813874268904328
D REAL
Описание: преобразовы вает вещ ественную часть ком плексного парам етра с удвоен
ной точностью к действительном у типу с двойной точностью . Эта собственная функция
не имеет никакой родовой функции, связанной с ней. Ее нельзя передать как ф актиче
ский параметр.
С интаксис: result = D REA L (а)
Класс: элем ентная функция; собственная.
Параметр: а долж ен иметь тип - комплексное с удвоенной точностью (CO M PLEX (8)
или CO M PLEX* 16).
Результаты . Тип результата - действительное с удвоенной точностью (REA L(8) или
REAL*8).
Пример
D REA L ((2.0d0, 3.0d0)) имеет значение 2.0d0.
D S H IF T L
Описание: вы бирает левы е 64 бита после см ещ ения 128-битового целочисленного
значения влево.
Синтаксис: result = D SH IFTL (ileft, iright, ishift)
Класс: элементная функция; собственная.
Параметры: ileft долж ен иметь тип 1NTEGER(8); iright долж ен иметь тип
1NTEGER(8); ishift долж ен иметь тип 1NTEGER(8), долж ен бы ть неотрицательны м и
меньш е или равным 64 и является счетчиком сдвига.
Результаты . Тип результата 1NTEGER(8). Значение результата - 64-битовое значе
ние, начинаю щ ееся в бите (128 - ishift) 128-битовой конкатенации значений ileft и iright.
202 С Д Алгазин, В В К он драт ьев Программирование на Visual FO RTRAN
Пример
INTEGER(8) ILEFTI Z'111122221111222' I
INTEGER(8) IR IG H TI Z'FFFFFFFFFFFFF' /
PRINT *, DSHIFTL (ILEFT, IRIGHT, 16_8)! печатает 1306643199093243919
D S H IF T R
Описание: вы бирает левы е 64 бита после смещ ения 128-битового целочисленного
значения вправо.
Си н та кси с: result = D SH IFT R (/7eft, iright, ishift)
К ласс: элем ентная функция; собственная.
Параметры : ileft долж ен иметь тип 1NTEGER(8); iright долж ен иметь тип
1NTEGER(8); ishift долж ен иметь тип 1NTEGER(8), долж ен бы ть неотрицательным и
м еньш е или равны м 64 и является счетчиком сдвига.
Р езультаты . Тип результата 1NTEGER(8). Значение результата - 64-битовое значе
ние, начинаю щ ееся в бите (64 + ishift) 128-битовой конкатенации значений ileft и iright.
Пример
INTEGER(8) ILEFT I Z'111122221111222' I
INTEGER(8) IRIGHT I Z'FFFFFFFFFFFFF I
PRINT *, DSHIFTR (ILEFT, IRIGHT, 16_8)i печатает 1306606910610341887
EOF
Описание: проверяет, находится ли файл в позиции в или за записью конца файла.
Эта собственная ф ункция не им еет никакой родовой функции, связанной с ней. Ее нельзя
передавать как ф актический параметр.
С и н та кси с: result = EO F (а)
К ласс: функция запроса; собственная.
Параметр: а долж ен им еть тип "целочисленное". Он представляет спецификатор уст
ройства, соответствую щ ий откры том у файлу и не мож ет бы ть нулем, если вы не повтор
но подклю чили устройство нуль к устройству, отличному от экрана или клавиатуры.
Результаты . Тип результата является логическим. Значение результата - .TRUE., ес
ли файл, соединенны й с я, в или вне записи конца файла; иначе .FALSE..
Пример
! Создает файл случайных чисел и читает их назад
REAL х, total
INTEGER count
OPEN (1, FILE = 'TEST.DAT')
DO I = 1,20
CALL RANDOM_NUMBER(x)
WRITE (1 ,'(F 6 .3 )')x * 100.0
END DO CLOSE(1)
OPEN (1, FILE = 'TEST.DAT')
DO WHILE (.NOT. EOF(1))
count = count + 1
READ (1, *) value
total = total + value
END DO
100 IF ( count .GT. 0) THEN
WRITE (*,*) 'Average is:', total I count
ELSE
WRITE (*,*) 'Input file is em pty'
END IF
Г лава 8. В ст роенны е проц едуры 203
STOP
END
E O S H IF T
Описание: вы полняет сдвиг прерывания на одноранговом массиве, или вы полняет
сдвиг прерывания на всех полных одноранговы х сечениях (векторах) по данном у и зм ере
нию массива ранга 2 или больш е.
Элементы выдвигаю тся в одном конце сечения, а копии граничной величины вдви га
ются в другом конце. Различны е сечения могут им еть разны е граничны е величины и м о
гут быть выдвинуты разными количествами и в разны х направлениях.
С интаксис: result = EO SH IFT (array, shift [, bou ndaiy] [, dim]).
Класс: трансформационная функция; родовая.
Параметр: array долж ен быть массивом (лю бого типа данны х).
shift долж ен быть скалярным целым числом или м ассивом с рангом , которы й является
меньш е у array, и форма (d h d2, ..., d DIM-i, d DIMH, ..., d n), где ( d h d2, ..., dn) - ф орм а array.
boundary (opt) долж ен иметь тот же самый тип и родовы е парам етры что и array. Он
долж ен быть скаляром или массивом с рангом, который является м еньш е a rra y, и формой
(di, d2, ..., doiM-ь doiM+ь —» dn).
Если boundary не указан, он, как предполагаю т, им еет следую щ ие значения по ум ол
чанию (в зависимости от типа данны х array):
Тип ARRA Y Значение BOUNDARY
Integer 0.
Real 0.0.
Com plex (0.0,0.0).
Logical ложь.
Character(len) len пробелов.
dim (opt) долж ен быть скалярным целым числом со значением в ди ап азоне от 1 до п,
где п - ранг массива. Если dim опущ ен, он, как предполагаю т, равен 1.
Результаты : массив с тем ж е самым типом, родовы м и парам етрам и и форм ой, что и
array.
Если массив имеет ранг 1, тот ж е самый сдвиг прим еняется к каж дом у элем енту. Если
элем ент вы двинут в одном конце массива, граничная величина пом ещ ается в другом
конце массива.
Если массив имеет ранг больш е, чем 1, каждая секция (si, s2..., s Dim i -, Sdim+i —> s„) р е
зультата выдвинута следую щ им образом:
■ Значением сдвига, если сдвиг - скаляр.
■ Согласно соответствую щ ему значению в shift (s h s2..., sDim-i, Sdim-h—, s „ ) , если shift -
массив.
■ Если элем ент выдвинут в одном конце секции, граничная величина пом ещ ается в д р у
гом конце секции.
Значение сдвига определяет количество и направление прерывания сдвига. П олож и
тельное значение сдвига является причиной сдвига влево (в строках) или вверх (в столб
цах). О трицательное значение сдвига является причиной сдвига вправо (в строках) или
вниз (в столбцах).
Примеры
П усть V является массивом (1, 2, 3, 4, 5, 6).
204 С Д . Алгазин, В. В. К он драт ьев Программирование на Visual FORTRAN
23 *
EO SH IFT (М, SH IFT = 1, B O U N D A R Y = DIM = 2) производят результат 5 6 *
89*
Каждый элем ент в строках 1, 2 и 3 сдвинут влево на 1 позицию. Эта функция вы дви
гает первый элем ент в каж дой строке из начала, а значение BOUNDARY размещ ается в
конце.
000
EO SH IFT (М, SH IFT = - 1 , D IM = 1) производят результат 1 23
456
Каждый элем ент в столбцах 1, 2 и 3 сдвинут вниз на 1 позицию. Эта функция вы дви
гает последний элем ент в каж дом столбце из конца, а значение BO U N D A R Y разм ещ ает
ся вначале.
E O SH IFT (М, SH IFT = (/1, - 1 , 0/), BO U N D A R Y = (/ '*', '?', '/' /), DIM = 2) производят
"2 3 *1
результат ? 4 5
789
Каждый элем ент в строке 1 сдвинут влево на 1 позицию , заставляя первый элемент
бы ть выдвинуты м из начала и значение BO U N D A R Y - *, размещ ается в конце. Каждый
элем ент в строке 2 сдвинут вправо на 1 позицию , заставляя последний элемент быть вы
двинуты м из конца и значение BO U N D A R Y - ? размещ ается вначале. Н икакой элем ент в
строке 3 не сдвигается вообщ е, таким образом, указанное значение BO U N DA RY не ис
пользуется.
E P S IL O N
Описание: возвращ ает полож ительное м одельное число, которое является почти не
значащ им по сравнению с единицей в м одели, представляю щ ей вещ ественны е чи сла1.
Синтаксис: result = E PSILO N (jt).
Класс: функция запроса; родовая.
Параметр: х долж ен им еть тип "действительное"; может бы ть скаляром или м асси
вом значений.
Результаты : скаляр того ж е самого типа и родовы х параметров, что и jc. Результат
им еет значение Ь |_р. П арам етры b и р определены в прил. D-2.
Пример
Если X им еет тип R EA L(4), EPSILO N (X) им еет значение 2‘23.
ERF
Описание: возвращ ает интеф ал вероятности ошибок п арам етрах.
7Г 0J
П
Собственное имя Тип параметра Тип результата
ERF REAL(4) REAL(4)
DERF REAL(8) REAL(8)
QERF REAL(16) REAL(16)
Пример
ERF (1.0) имеет значение 0.842700794.
ERFC
Описание: возвращ ает дополнительны й интеграл вероятности ош ибок параметра.
С интаксис: result = ERFC (х).
Класс: элементная функция; родовая.
Параметр: х долж ен иметь тип "действительное".
Р езультаты . Тип результата - тот же, что и у х. Результат находится в диапазоне от 0
до 2. ERFC возвращ ает 1 - ERF (х) и определяется следую щ им образом:
Ц е ' -dt
7Г J
П 0
ERFC применяется при критической потери относительной точности, если у ERF (х)
задан больш ой х и результат вы читается из 1.
Собственное имя Тип параметра Тип результата
ERFC REAL(4) REAL(4)
DERFC REAL(8) REAL(8)
QERFC REAL(16) REAL(16)
Пример
ERFC (1.0) имеет значение 0.1572992057.
ER R SN S
Описание: возвращ ает инф орм ацию о последнем обнаруж енном ош ибочном условии
системы ввода/вывода.
Синтаксис: CALL ERR SN S ([io_err] [, sys_err] [, stat] [, unit] [, cond]).
Класс: подпрограмма.
Параметры. Есть 5 необязательны х параметров:
io err (opt) является целочисленной переменной или элем ентом м ассива, который за
поминает последний номер ошибки библиотеки поддерж ки, произош едш ей во время вы
полнения программы. Н уль указы вает, что ош ибка не произош ла, начиная с последнего
вызова ERRSN S или начиная с начала выполнения программы.
sys_err (opt) является целочисленной переменной или элем ентом массива, который
запоминает наиболее свежий системный ном ер ош ибки, связанны й с io_err. Этот код -
одно из следую щ их выражений:
На Linux* и системах M ac O S * - это значение erm o. (См. erm o(2)).
206 С. Д Ачгазин, В В. Кондрат ьев. П рограм ирование на Visual FORTRAN
На системах W indows* - это возвращ аем ое значение G etL astE rror () во время ошибки.
stat (opt) является целочисленной переменной или элементом массива, который запо
м инает значение состояния, которое произош ло во время выполнения программы. Это
значение - нуль.
unit (opt) является целочисленной переменной или элементом массива, который запо
м инает логический номер устройства, если последняя ош ибка бы ла ош ибкой вво
да/вывода.
cond (opt) является целочисленной переменной или элементом массива, который за
поминает фактическое значение процессора. Это значение - всегда нуль.
Если вы указы ваете параметр 1NTEGER(2), возвращ аю тся только младш ие 16 битов
информации, или соседние данны е м огут бы ть записаны поверх. И з-за этого, лучш е ис
пользовать параметры IN TEG ER(4).
Сохраненные сведения об ош ибке устанавливаю тся в нуль после каждого вызова
ERRSNS.
Пример
Лю бой из параметров м ож ет бы ть опущ ен. Н апример, следую щ ее допустимо:
CALL ERR SN S (SY S ERR, S T A T ,, UNIT)
E X IT
Описание: заканчивает вы полнение програм мы , закры вает все файлы и возвращ ает
управление операционной системе.
Синтаксис: CA LL EX IT ([status]).
Класс: подпрограмма.
Параметр: status (opt) является целочисленны м параметром, который вы можете ис
пользовать, чтобы указать значение состояния выхода.
Пример
CALL EXIT (100)
EXP
Описание: вы числяет значение экспоненты.
Синтаксис: result = EX P (л)
Класс: элементная функция; родовая.
Параметр: х долж ен им еть тип "действительное" или "комплексное".
Р езультаты . Тин результата - тот же, что и у х . Значение результата ех . Если jc имеет
комплексный тип, считается, что его мнимая часть задана в радианах.
Собственное имя Тип параметра Тип результата
ЕХР REAL(4) REAL(4)
DEXP REAL(8) REAL(8)
QEXP REAL(16) REAL(16)
СЕХР1 COMPLEX(4) REAL(4)
CDEXP2 COMPLEX(8) REAL(8)
CQEXP COMPLEX(16) REAL(16)
1 Установка опций компилятора, указывающих размер действительного, может затронуть СЕХР.
2 Эта функция может быть указанна так же, как ZEXP.
Примеры
ЕХ Р (2.0) им еет значение 7.389056.
ЕХР (1.3) имеет значение 3.669297.
Гпава 8 В ст роенны е проц едуры 207
EXPONENT
Описание: возвращ ает экспонентную часть параметра, м одельного числа.
Синтаксис: result = EX PO N E N T (х)
Класс: элементная функция; родовая.
Параметр: х долж ен иметь тин "действительное".
Результаты . Тип результата - целое по умолчанию . Если х не равен нулю, значение
результата - экспонентная часть х. Экспонента долж на бы ть в пределах диапазона целого
типа по умолчанию ; иначе результат неопределенный.
Если х - нуль, экспонента х - нуль. Для получения дополнительной информации о
экспонентной части (е) в действительной модели, см. прил. D-2.
Примеры
EX PO N EN T (2.0) имеет значение 2.
Если 4.1 является значением REA L(4), EX PO N E N T (4.1) имеет значение 3.
FLOOR
Описание: возвращ ает наибольш ее целое число, м еньш ее или равное его параметру.
Синтаксис: result = FLO O R (а [, kind]).
Класс: элементная функция; родовая.
Параметры: а долж ен иметь тин "действительное"; kind (opt) долж ен бы ть инициали
зированным скалярным целочисленны м выраж ением, является возм ож ностью Fortran 95.
Результаты . Тип результата - целое число. Если kind присутствует, родовой пара
метр результата указы вается kind\ иначе родовой параметр результата - это родовой па
раметр целого типа по умолчанию . Если процессор не м ож ет представить значение р е
зультата в kind, результат неопределенный.
Значение результата равно самому больш ому целому числу, меньш ему или равному а.
Установка опций компилятора, указы ваю щ их разм ер целого числа, м ож ет затронуть эту
функцию.
Примеры
FLOOR (4.8) имеет значение 4.
FLO O R (-5 .6 ) имеет значение -6 .
FPCLASS
Описание: возвращ ает класс IEEE* (S floating, Т floating или X flo a tin g ) действи
тельного параметра.
Синтаксис: result = FP CLA SS (х).
Класс: элементная функция; родовая.
Параметр: х долж ен иметь тип "действительное".
Результаты . Тип результата - целое по ум олчанию . В озвращ аем ое значение - одно
из следующих:
Класс параметра Возвращаемое значение
Сигнальный ИаИ FOR_K_FP_SNAN
Тихий ИаИ FOR_K_FP_QNAN
Положительная бесконечность F0R_K_FP_P0S_INF
Отрицательная бесконечность FOR К FP NEG INF
Положительное нормализованное число F0R_K FP_P0S_N0R M
Отрицательное нормализованное число FOR К FP NEG NORM
208 С Д Ачгазин, В В К ондрат ьев. П рограм ирование на Visual FO RTRAN
F R A C T IO N
Описание: возвращает дробную часть модельного представления значения параметра.
С и н та кси с: result = FRA CTIO N (х).
К ласс: элем ентная функция; родовая.
Параметр: jc долж ен иметь тип "действительное".
Р езультаты . Тип результата - тот же, что у х. Результат имеет значение х*Ье. П ара
м етры Ъ и е определены в прил. D-2. Если х имеет значение нуль, результат имеет значе
ние нуль.
Примеры
Если 3.0 является значением REA L(4), FRA CTIO N (3.0) имеет значение 0.75.
FR EE
О писание: освобож дает блок пам яти, которая в настоящ ее время распределена.
С и н та кси с: C A L L FREE (а).
Класс: подпрограмма.
Параметры : а долж ен иметь тип IN TEG ER(4) на процессорах 1А-32 и 1NTEGER(8)
на процессорах Intel Itanium и Intel ЕМ 64Т. Его значение является начальным адресом
пам яти, которая будет освобож дена, пам ять предварительно долж на быть распределена
M A LLO C . Если освобож даем ы й адрес не был предварительно распределен M ALLOC
или если адрес освобож дается более одного раза, результаты непредсказуемы.
Пример
INTEGER(4) SIZE
REAL(4) STORAGE^)
POINTER (ADDR, STORAGE) ! ADDR будет указывать на STORAGE
SIZE = 1024 ! Размер в байтах
ADDR = MALLOC(SIZE) ! Распределение памяти
CALL FREE(ADDR) ! Освободить ее
G ETAR G
Описание: возвращ ает указанны й параметр командной строки (где сама команда
им еет параметр с числом нуль). Эту подпрограмм у нельзя передать как фактический па
рам етр.
С и н та кси с: CA LL G ETA R G (л?, buffer [, status}).
К ласс: подпрограмма.
Параметры :
п долж ен быть скаляр типа "целочисленное". Это значение - позиция параметра ко
м андной строки для поиска. С ам а команда - параметр 0.
Глава 8. В ст роенны е проц едуры 209
buffer долж ен быть скаляром символьного типа по ум олчанию . Его значение - воз
вращ аемый параметр командной строки.
status (opt) долж ен быть скаляром типа "целочисленное". Если указан, его значение -
возвращ аемое состояние заверш ения.
Если не было никаких ош ибок, возвращ аем ое состояние - это число сим волов в най
денном параметре командной строки, обрезанное или дополненное пробелам и. (Таким
образом, status - оригинальное число сим волов в параметре командной строки.) Ош ибки
возвращ аю т значение - 1 . Ош ибки вклю чаю т определение позиции парам етра меньше,
чем 0, или больш е, чем значение возвращ аем ое IARGC.
GETARG возвращ ает п-й параметр командной строки. Если п - нуль, возвращ ается
имя вы полняю щ егося програм много файла.
G ETARG возвращ ает параметры командной строки, после того как они были введе
ны. Н ет никакой замены регистра.
Если параметр командной строки короче, чем buffer, буф ер G ETA R G добавляет спра
ва пробелы. Если параметр более длинны й, чем buffer, G E TA R G обрезает параметр спра
ва. Если обнаруж ена ош ибка, G ETA RG заполняет буф ер пробелам и.
Пример
П редположите вызов командной строки PROG1 -g -с -а и буфер длины но крайней
мере 5 символов. Следую щ ие вызовы в G ETA R G возвращ аю т соответствую щ ие пара
метры в buffer и status.
Утверждение Строка возвращаемая в buffer Длина возвращаемая в status
CALL GETARG (0, buffer, status) PROG1 5
CALL GETARG (1, buffer) -g Неопределенная
CALL GETARG (2, buffer, status) -с 2
CALL GETARG (3, buffer) -a Неопределенная
CALL GETARG (4, buffer, status) Все пробелы -1
G ETCO M M AN D
Описание: возвращ ает всю команду, которая использовалась, чтобы вызвать п ро
грамму.
Синтаксис: C A LL G ET C O M M A N D ([command, length, status]).
Класс: подпрограмма.
Параметры:
command (opt) долж ен быть скаляром сим вольного типа по ум олчанию . Если этот п а
раметр указан, его значение - вся команда, которая использовалась, чтобы вызвать про
грамму. Если команда не мож ет быть определена, ее значение - все пробелы.
length (opt) долж ен быть скаляром типа "целочисленное". Если этот парам етр указан,
его значение - значащ ая длина команды, которая использовалась, чтобы вызвать про
грамму. Эта длина вклю чает конечны е пробелы, но она не доп ускает никакого обрезания
или удлинения используемого в команде. Если длина команды не м ож ет бы ть определе
на, ее значение - нуль.
status (opt) долж ен быть скаляр типа "целочисленное".
Если параметр указан, его значение равно - 1 , если параметр команды присутствует и
имеет длину меньш е, чем значащ ая длина команды. Если ком анда не м ож ет быть найде
на, ее значение полож ительно; иначе ей назначается значение нуль.
Примеры
См. "CO M M A ND A RG U M EN T CO U N T".
210 С .Д Алгазин, В. В К он драт ьев П роклам ирование на Visual FO RTRAN
G ETCO M M AN D AR G UM EN T
Описание: возвращ ает параметр командной строки команды, которая вызвала про
грамму. Эту подпрограмм у нельзя передавать как фактический параметр.
С и н та кси с: C A L L G ET C O M M A N D A R G U M E N T (п [, value, length, status]).
К ласс: подпрограмм а.
Параметры :
п долж ен быть скаляром типа "целочисленное". Он долж ен быть неотрицательным и
меньш е или равны м значению , возвращ аем ому функцией CO M M A N D _A R G U M EN T _
CO U N T. Его значение - позиция параметра командной строки для поиска. С ама коман
да - параметр 0.
value (opt) долж ен быть скаляром сим вольного типа по умолчанию . Если он указан,
его значение - возвращ аем ы й параметр командной строки или все пробелы, если значе
ние - неизвестно.
length (opt) долж ен бы ть скаляром типа "целочисленное". Его значение - длина воз
вращ аемого парам етра командной строки или нуль, если длина параметра - неизвестна.
Эта дли н а вклю чает значащ ие конечны е пробелы. О на не вклю чает никакого обрезания
или удлинения, которое происходит, когда параметр назначен параметру value.
status (opt) долж но бы ть скаляром типа "целочисленное". Если параметр указан, его
значение - возвращ аем ое состояние заверш ения. Ему назначается значение - 1 , если па
раметр value присутствует и им еет длину меньш е, чем значащ ая длина параметра коман
ды, у к азан н о ю п. Ему назначается зависим ое от процессора полож ительное значение, ес
ли поиск парам етра терп ит неудачу. Иначе ему назначено значение нуль.
G ET C O M M A N D A R G U M E N T возвращ ает параметры командной строки, как они
были введены. Нет никакой замены регистра.
Примеры
См. "C O M M A N D A R G U M EN T CO U N T".
G E T E N V IR O N M E N T V A R IA B L E
Описание: получает значение переменной среды.
С и н та кси с: C A LL G ET EN V IR O N M E N T V A RIABLE (name [, value, length, status,
trim_name]).
Класс: подпрограм м а.
Параметры :
name долж ен бы ть скаляром сим вольного типа по умолчанию . Это - имя переменной
среды.
value (opt) долж ен бы ть скаляром сим вольного типа по умолчанию . Если параметр
указан, ему назначается значение переменной среды, указанной в пате. Если переменная
среды не сущ ествует, значению присваиваю тся все пробелы.
length (opt) долж ен бы ть скаляром типа "целочисленное". Если параметр указан, его
значение - длина перем енной среды , если она сущ ествует; иначе length равно 0.
status (opt) долж ен бы ть скаляром типа "целочисленное". Если параметр указан, ему
назначается значение 0, если переменная среды сущ ествует и/или не имеет никакого зна
чения, или ее значение успеш но - назначено value. Этому параметру назначается значе
ние 1, если переменная среды не сущ ествует. Для других ош ибочных условий ему назна
чается зависим ое от процессора значение, больш ее чем 2.
trim_name (opt) долж ен бы ть скаляром логического типа. Если его значение - FALSE,
то конечны е пробелы имени считаю тся значащ ими. И наче их не считаю т частью имени
перем енной среды.
Глава 8. В ст роенны е проц едуры 211
Примеры
Нижеприведенная програм ма спраш ивает имя переменной среды. Если переменная
среды сущ ествует в среде програм мы , програм ма распечаты вает ее значение:
program pr¡nt_env_var
character name*20, val*40
integer len, status
write (*,*) 'введите имя переменной среды'
read ( V ) name
call get_environment_variable (name, val, len, status, .true.)
if (status .ge. 2) then
write (*,*) 'get_environment_variable терпит неудачу: состояние = ', status
stop
end if
if (status .eq 1) then
write (*,*) 'перем. окружения величина не существует'
stop
end if
if (status .eq. -1) then
write (*,*) 'длина переменной окружения = ', len,' усечена до 40'
len = 40
end if
if (len .eq. 0) then
write (*,*)' переменной окружения существует, но не имеет значения'
stop
end if
write (*,*) 'значение перем. окружения = ', val (1:len)
end
Когда вызвана выш еупомянутая програм ма, отображ ается следую щ ая строка:
enter the name of the environment variable
(введите имя переменной среды)
Следую щ ий пример показы вает то, что могло бы ть отображ ено, если вы вводите
"НОМЕ".
■ На системе Linux или M ac OS значение переменной окруж ения = /hom e/our space/
usr4.
■ Н а системе W indow s значение переменной окруж ения = С:/.
Следую щ ий пример показы вает то, что могло бы бы ть отображ ено, если бы вы ввели
"PATH".
■ В системе Linux или M ac OS длина переменной окруж ения равна 307 усечена до 40,
значение переменной окруж ения равно /site/our_space/usr4/progs/build_area.
■ В системе W indows длина переменной окруж ения равна 829, усечена до 40, значение
переменной окружения равно C :\O U R _SP A C E \B U lL D _A R E A \build_objects\.
HUGE
О п и са н и е: возвращ ает наибольш ее число в м одели, представляю щ ей то т ж е самый
тип и родовые параметры, что и параметр.
С и н т а к с и с : result = H U G E (jc).
К ласс: функция запроса; родовая.
П а р а м е тр : х долж ен иметь тип целочисленное или действительное; он м ож ет бы ть
скаляром или массивом значений.
212 С Д Алгазин, В. В. К ондрат ьев. П рограм ирование на Visual FO RTRAN
Результаты : скаляр того же самого типа и родовых параметров, что и х. Если х имеет
тип целочисленное, результат им еет значение xq - 1. Если х имеет тип действительное,
результат имеет значение (1 - b 'p) b e,,m .
Значения целочисленны х парам етров г и q определены в прил. D; действительные па
рам етры Ь, р и етах определены в прил. D-2.
Пример
Если X им еет тип REA L (4), H U G E (X) имеет значение (1 - 2"^24) * 2 128.
IA C H A R
Описание: возвращ ает позицию сим вола в наборе сим волов A SCII, даже если набор
сим волов процессора по ум олчанию отличен от ASCII. В Intel Fortran IACH AR эквива
лентен функции 1CHAR.
Синтаксис: result = IA C H A R (с).
Класс: элем ентная функция; родовая.
Параметр: с долж ен им еть тип "символьное" длины 1.
Р езультаты . Тип результата - целое число по умолчанию . Если с находится в после
довательности упорядочения A SC II, результат является позицией с в этой последова
тельности и удовлетворяет неравенству (0<lA C H A R (c)< l27).
Результаты долж ны бы ть совм естим ы м и с лексическим и функциями сравнения LGE,
LG T, LLE и LLT. Н априм ер, если LLE (С, D) истинно, 1ACHAR (С) .LE. IA C H A R (D)
такж е истинно.
Примеры
IA C H A R ( ' Y ' ) им еет значение 89.
1ACHAR ( ' % ' ) им еет значение 37.
IA N D
Описание: вы полняет логическое A N D на соответствую щ их битах. Эта функция м о
ж ет бы ть указанна так же, как A ND.
С ин та ксис: result = I AND ( i , j ) .
К л асс: элем ентная функция; родовая.
Параметры: / долж ен им еть тип "целочисленное"; / долж ен иметь тип "целочислен
ное" с тем же самым родовы м параметром , что и /.
Р езультаты . Тип результата - ю т же, что и у и /. Значение результата получено поби
товой комбинацией / и j согласно следую щ им правилам:
1 J 1AND(1, J)
1 1 1
1 О О
О 1 О
О О О
М одели для интерпретации целочисленного значения как последовательность битов
см. в прил. D-3.
Собственное имя Тип параметра Тип результата
BIAND INTEGER(I) INTEGERS)
HAND (или HIAND) INTEGER® INTEGER®
JIAND INTEGERS) INTEGERS)
KIAND INTEGERS) INTEGERS)
/ 'пава 8. В ст роенны е процедуры 213
Примеры
IAND (2, 3) имеет значение 2.
1AND (4, 6) имеет значение 4.
IA R G C
Описание: возвращ ает индекс последнего параметра командной строки. Ее нельзя
передать как фактический параметр. Эта функция м ож ет бы ть указанна так же, как 1ARG
или NUM ARG.
Синтаксис: result = IARGC ( ) .
Класс: функция запроса; собственная.
Параметр: нет.
Результаты . Тип результата - INTEG ER(4). Результат является индексом последнего
параметра командной строки, который является такж е числом параметров в командной
строке. Команда не вклю чается в счегчик. Н апример, IARGC возвращ ается 3 для вызова
командной строки PROG1 -g -с -a.. IARG C возвращ ает значение, которое на I меньш е,
чем значение возвращ аемое N A RG S.
Пример
integer(4) no_of_arguments
no_of_arguments = IARGC ()
print *, total command line arguments are no_of_arguments
Для вызова командной строки PROG I -g -с -а, програм ма распечатает:
total command line arguments are 3
IA R G P T R
Описание: возвращ ает указатель на фактический список параметров для текущ ей
подпрограммы.
Синтаксис: result = IA R G PTR ( ) .
Класс: функция запроса; собственная.
Параметр: нет.
Результаты . Тип результата - IN TEG ER (4) на процессорах IA-32 и IN TEG ER (8) на
процессорах Intel Itanium и Intel ЕМ 64Т. Ф актический список параметров - массив зн а
чений того же самого тина.
Счетчик параметра не присутствует и первый элем ент им еет адрес первого параметра.
Ф ормальные параметры, которые м огут бы ть опущ ены , долж ны бы ть объявлены с
VOLATILE. Для получения дополнительной информ ации см. разд. 4.21.
Пример
WRITE (*,’(" Адрес списка параметров ".Z16.8)’) IARG PTR()
IB C H N G
Описание: реверсирует значение указанного бита в целом числе.
Синтаксис: result = IBCH N G (i, pos).
Класс: элементная функция; родовая.
Параметры: / долж ен иметь тип "целочисленное", содерж ит бит, который будет о б
ращен; p o s должен иметь тип "целочисленное", является позицией бита, который будет
изменен. Самый правый (самый м ладш ий) бит / находится в позиции 0.
Результаты . Тип результата - тот же, что и у /. Результат равен / с реверсированны м
битом в позиции pos.
214 С Д Алгазин, В В. К о н д р а т ьев . П рограм ирование на Visual FO RTRAN
Пример
INTEGER J, К
J = IBCHNG(10,2) ! возвращает 14 = 1110
К = IBCHNG(10,1) ! возвращает 8 = 1000
IB C L R
Описание: очищ ает 1 бит нулем.
Синтаксис: result = 1BCLR (i, pos).
Класс: элем ентная функция; родовая.
Параметры: / долж ен иметь тип "целочисленное"; p o s долж ен иметь тип "целочис
ленное", бы ть меньше, чем B1T S1ZE (/), и не долж ен бы ть отрицательным. Самый пра
вый (самый младш ий) бит / находится в позиции 0.
Результаты . Тип результата - тот же, что и у /. Результат имеет значение последова
тельности битов /, за исклю чением того, что бит в позиции p o s для / установлен в нуль.
М одели для интерпретации целочисленного значения как последовательность битов
показы ваю т в прил. D-3.
Собственное имя Тип параметра Тип результата
BBCLR INTEGERd) INTEGERd)
IIBCLR1 INTEGERS) INTEGERS)
JIBCLR INTEGERS) INTEGERS)
KIBCLR IN TE G E R ® IN TE G E R ®
1 Или HBCLR
Примеры
1BCLR (18, 1) имеет значение 16.
Если V имеет значение (1, 2, 3 ,4 ), значение IBCLR (POS = V, 1 = 1 5 ) равно (13, 11, 7, 15).
IB IT S
Описание: извлекает последовательность битов (битовое поле).
Синтаксис: result = 1B1TS (i, p os, len).
Класс: элем ентная функция; родовая.
Параметры: / долж ен иметь тип "целочисленное"; p o s долж ен иметь тип "целочис
ленное", не долж ен бы ть отрицательны м и p o s + len долж ен бы ть меньш е или равным
BIT SIZE (/’). Самы й правый (самый м ладш ий) бит / находится в позиции 0. len должен
иметь тип "целочисленное", не долж ен бы ть отрицательным.
Результаты . Тип результата - тот же, что и у /. Результат последовательности len би
тов в /, начинаю щ ейся в откорректированной правой позиции p o s и со всеми другими ну
левы ми битами.
М одели для интерпретации целочисленного значения как последовательность битов
показываю т в прил. D-3.
Собственное имя Тип параметра Тип результата
BBITS INTEGER(I) INTEG ERS)
IIB IT S (^ h HBITS) IN TE G E R ® IN TE G E R ®
JIBITS INTEGERS) INTEGERS)
KIBITS IN TE G E R ® IN TE G E R ®
Примеры
1B1TS (12, 1, 4) им еет значение 6.
IBITS (10, 1, 7) им еет значение 5.
Глава 8 В ст роенны е процедуры 215
IB S E T
Описание: устанавливает 1 бит в единице.
Синтаксис: result = IBSET (i, pos).
Класс: элементная функция; родовая.
Параметры: / долж ен иметь тип "целочисленное"; p o s долж ен иметь тип "целочис
ленное", не долж ен бы ть отрицательны м и долж ен бы ть меньш е, чем BIT SIZE (/). С а
мый правый (самый младш ий) бит / находится в позиции 0.
Результаты . Тип результата - тот же, что и у /. Результат имеет значение последова
тельности битов /, за исклю чением того бита, который находится позиции p o s /, установ
ленный в 1.
М одели для интерпретации целочисленного значения как последовательность битов
показывают в прил. D-3.
Собственное имя Тип параметра Тип результата
BBSET INTEGER(I) INTEG ERS)
МВЭЕКили HBSET) IN TE G E R ® IN TE G E R ®
JIBSET INTEGERS) INTEGERS)
KIBSET INTEGERS) INTEGERS)
Примеры
IBSET (8, 1) имеет значение 10.
Если V имеет значение (1, 2, 3, 4), значение IBSET (POS = V, 1 = 2) равно (2, 6, 10, 18).
IC H A R
Описание: возвращ ает позицию сим вола в наборе сим волов процессора.
Syntax: result = ICH A R (с [, kind]).
Класс: элементная функция; родовая.
Параметры: с долж ен иметь тип "символьное" длины 1; kind (opt) долж ен бы ть ини
циализированным скалярным целочисленны м выраж ением.
Р езультаты . Тип результата - целое число. Если kind присутствует, родовой пара
метр результата указывается kind; иначе родовой параметр результата - родовой п ара
метр целого типа по умолчанию .
Значение результата - позиция сим вола с в наборе сим волов процессора. П араметр с
находится в диапазоне от 0 до п - 1, где п - число сим волов в наборе символов.
Для лю бых сим волов С и D (способных к представлению в процессоре), С .LE. D и с
тина только, если 1CHAR (С) .LE. IC H A R (D) истина, и С .EQ. D истина, только если
1CHAR (С) .EQ. ICHAR (D) истина.
Собственное имя Тип параметра Тип результата
CHARACTER IN TE G E R ®
ICHAR1 CHARACTER INTEGERS)
CHARACTER IN TE G E R ®
1 Эту собственную функцию нельзя передавать как фактический параметр.
Примеры
ICHAR ( ' W ' ) имеет значение 87.
1CHAR ( ' # ' ) имеет значение 35.
ID A T E
Описание: возвращ ения 3 целочисленны х значений, представляю щ их текущ ий м е
сяц, день и год.
Синтаксис: CA LL 1DATE (/,_/, к).
216 С Д. Алгсиин, В В К ондрат ьев. П рограм ирование на Visual FO RTRAN
Класс: подпрограмм а.
Параметры: / должен иметь тип INTEGER(4) (текущий месяц); j должен иметь тип
INTEGER(4) (текущий день); к должен иметь тип 1NTEGER(4) (текущий год). Текущий ме
сяц возвращен в /; текущ ий день в j . Последние 2 цифры текущего года возвращаются в к .
П р едост ереж ен и е. В озвращ аем ое значение года с двумя цифрами может явиться
причиной проблем с годом 2000 или более поздним. И спользуйте D A TE AND TIM E
вместо нее (см. "D A TE A N D TIM E").
П ример
Если текущая дата - 16 сентября 1996, значения целых переменных по возвращении: 1 = 9,
J = 1 6 и К = 96.
IE O R
Описание: вы полняет исклю чительное O R на соответствую щ их битах. Эта функция
м ож ет бы ть указанна гак же, как X O R или 1XOR.
С и н та кси с: result = IEOR ( i j ) .
Класс: элем ентная функция; родовая.
Параметры : / долж ен иметь тип "целочисленное"; j долж ен иметь тип "целочислен
ное" с тем же самы м родовым параметром , что и /.
Р езультаты . Тип результата - тот же, что и у /. Значения результата получаю тся, по
битовой комбинацией / и j согласно следую щ ей таблице:
I J lE O R (l, J)
1 1 0
1 0 1
0 1 1
О О О
М одели для интерпретации целого значения как последовательность битов показаны
в прил. D-3.
Собственное имя Тип параметра Тип результата
B IE0R (или BIX0R) INTEGERS) INTEG ERS)
IIEOR (HIEOR, H IX 0R или IIX0R) INTEGERS) INTEGERS)
ЛЕ(Ж (или JIX0R) INTEGERS) INTEGERS)
K IE 0R 1 INTEGERS) IN TE G E R ®
1 Для совместимости эта собственная функция может быть указанна как IX0R .
Пример
1EOR (12, 7) им еет значение 11; двоичное 1100 исклю чительное O R с двоичными
0111 дает двоичное 1011.
IL E N
Описание: возвращ ает длину (в битах) двоичного представления дополнения целого
числа.
С и н та кси с: result = 1LEN (/).
К ла сс: элем ентная функция; родовая.
Параметр: / долж ен им еть тип "целочисленное".
Р езультаты . Тип результата - тот же, что и у /. Значение результата - (LOG2 (/ + 1)),
если / не отрицателен; иначе значение результата (LO G 2( - I )).
Примеры
1LEN (4) им еет значение 3.
1LEN (-4) имеет значение 2.
IN D E X
Описание: возвращ ает исходную позицию подстроки внутри строки.
Синтаксис: result = IN D EX (string, substring [, back ] [, kind]).
Класс: элементная функция; родовая.
Параметры: string долж ен иметь тип "символьное"; substring долж ен иметь тип
"символьное"; back (opt) долж ен иметь логический тип; kind (opt) долж ен бы ть инициали
зированным скалярным целочисленны м выражением.
Результаты . Тип результата - целое число. Если параметр kind присутствует, р о д о
вой параметр результата указывается kind\ иначе родовой параметр результата - родовой
параметр целого типа по умолчанию . Если процессор не м ож ет представить значение р е
зультата в kind, результат неопределенный.
Если back не присутствует (или присутствует со значением лож ь), возвращ аем ое зн а
чение - м инимальное значение 1 такое, что string ( 1 : 1 + LEN (substring) - 1) = substring
(или нуль, если нет такого значения). Если LEN (string) <LEN (substring ), возвращ ается
нуль. Если LEN (substring) - нуль, возвращ ается 1.
Если back присутствует со значением истина, возвращ аем ое значение - м аксим альное
значение 1 такое, что string ( 1 : 1 + LEN (substring) ~ 1) = substring (или нуль, если нет т а
кого значения). Если LEN (string) <LEN (substring), возвращ ается нуль. Если LEN (sub
string) - нуль, возвращ ается LEN (string) + 1.
Собственное имя Тип параметра Тип результата
INDEX1 CHARACTER INTEGERS)
CHARACTER INTEGERS)
1 Установка опций компилятора, указывающих размер целого числа, может затронуть эту функцию.
Примеры
INDEX ('FO RTRA N ', 'O', BA CK - .TRUE.) имеет значение 2.
INDEX ('X X X X '," " , BA CK - .TRU E.) имеет значение 5.
IN T
Описание: преобразовы вает значение в целочисленны й тип.
Синтаксис: result = 1NT (а [, kind]).
Класс: элементная функция; родовая.
Параметры: а должен иметь тип "целочисленное", "действительное" или "комплексное";
kind (opt) должен быть инициализированным скалярным целочисленным выражением.
Результаты . Тип результата - целое число. Если параметр kind присутствует, р о д о
вой параметр результата указывается kind\ иначе родовой парам етр результата такой, как
показано в следую щ ей таблице. Если процессор не м ож ет представить значение р езу ль
тата в kind, результат неопределенный.
Ф ункции преобразования одного типа данных в другой тип им ею т тот ж е самы й эф
фект, что и неявное преобразование в операторах присваивания.
Значение результата зависит от типа и абсолю тного значения а следую щ им образом:
■ Если а имеет тип "целочисленное", INT (а) = а.
■ Если а имеет тип "действительное" и | а | < 1, 1NT (а) им еет значение нуль.
■ Если а имеет тип " действительное " и | а \ > 1 , 1NT (а) является целым числом, вели
чина которого - наибольш ее целое число, которое не превы ш ает величину а и чей
знак - тот же, что и знак а.
218 С Д . Алгазин, В. В К ондрат ьев. Программирование на Visual FORTRAN
■ Если а имеет комплексный тип, 1NT (а) = а является значением, полученным применени
ем предыдущих правил (для действительного параметра) к вещественной части а.
Собственное имя1 Тип параметра Тип результата
INTEGERd), INTEGERS), INTEGER(4) INTEGER(4)
INTEGER(I), INTEGER®, INTEGER(4), INTEGER(8) INTEGER(8)
IJINT INTEGER(4) INTEGERS)
IIFIX2 REAL(4) INTEGER(2)
IINT REAL(4) INTEGER(2)
IFIX3-4 REAL(4) INTEGER(4)
JFIX INTEGER(1), INTEGER(2), INTEGER(4), INTEGER(8), REAL(4), INTEGER(4)
REAL(8), REAL(16), COMPLEX(4), COMPLEX(8), COMPLEX(16)
INT5-6-7 REAL(4) INTEGERS)
KIFIX REAL(4) INTEGER(8)
KINT REAL(4) INTEGER(8)
IIDINT REAL(8) INTEGER(2)
IDINT6-8 REAL(8) INTEGER(4)
KIDINT REAL(8) INTEGERS)
IIQINT REAL(16) INTEGER(2)
IQINT6-9 REAL(16) INTEGER(4)
KIQINT REAL(16) INTEGER(8)
INT110 INTEGER(1), INTEGER(2), INTEGER(4), INTEGER(8), REAL(4), INTEGER(1)
REAL(8), REAL(16), COMPLEX(4), COMPLEX(8), COMPLEX(16)
INT210 INTEGER(1), INTEGER(2), INTEGER(4), INTEGER(8), REAL(4), INTEGER(2)
REAL(8), REAL(16), COMPLEX(4), COMPLEX(8), COMPLEX(16)
INT410 INTEGER(1), INTEGER(2), INTEGER(4), INTEGER(8), REAL(4), INTEGER(4)
REAL(8), REAL(16), COMPLEX(4), COMPLEX(8), COMPLEX(16)
INT810 INTEGER(1), INTEGER(2), INTEGER(4), INTEGER(8), REAL(4), INTEGER(8)
REAL(8), REAL(16), COMPLEX(4), COMPLEX(8), COMPLEX(16)
1 Эти собственные функции нельзя передавать как фактические параметры.
2 Эта функция может быть указанна как HFIX
3 Установка опций компилятора, указывающих размер целого или действительного числа, может затронуть IFIX.
4 Для совместимости со старыми версиями Fortran, IFIX может быть указана как родовая функция
5 Или JINT.
6 Установка опций компилятора, указывающих размер целого числа, может затронуть INT, IDINT и IQINT.
7 Или JIFIX.
8 Или JIDINT Для совместимости со старыми версиями Fortran IDINT может быть указана как родовая функция.
9 Или JIQINT. Для совместимости со старыми версиями Fortran IQINT может быть указана как родовая функция.
10 Для совместимости, эти функции могут быть указаны как родовые функции.
П римеры
IN T (-4 .2 ) им еет значение -4 .
1NT (7.8) им еет значение 7.
IN U M
Описание: преобразовы вает строку сим волов в значение 1NTEGER(2).
Синтаксис: result = 1NUM (/).
Класс: элементная функция; собственная.
Параметр: / долж ен иметь тип "символьное".
Р езультаты . Тип результата - 1NTEGER(2). Значение результата - IN T E G E R (2) зн а
чение, представленное строкой сим волов /.
Пример
1NUM ("451.92") имеет значение 451 типа 1NTEGER(2).
IO R
Описание: вы полняет вклю чаю щ ее ИЛИ на соответствую щ их битах. Эта ф ункция
мож ет быть указанна как OR.
Синтаксис: result = IO R ( i j ) .
Класс: элементная функция; родовая.
Параметры: / долж ен иметь тип "целочисленное"; j долж ен им еть тип "целочи слен
ное" с тем же самым родовым параметром , что и у /.
Р езультаты . Тип результата - тот же, что и у /. Значение результата получено п о би
товой комбинацией / и j согласно следую щ ей таблице истинности:
1 J к
1 1 1
1 0 1
0 1 1
0 0 0
М одели для интерпретации целого значения как последовательность битов показаны
в прил. Э-3.
Собственное имя Тип параметра Тип результата
BIOR INTEGER0) INTEGER(I)
IIOR (или HIOR) INTEGER® INTEGER®
JIOR INTEGERS) INTEGERS)
KIOR INTEGERS) INTEGERS)
Примеры
10R (1 ,4 ) имеет значение 5.
10R (1 ,2 ) имеет значение 3.
220 С. Д Алгазин, В. В К ондрат ьев. П рограм ирование на Visual FO RTRAN
IS H A
Описание: ариф м етически сдвигает целое число, влево или вправо на указанное чис
ло битов.
Синтаксис: result = 1SHA (/, shift).
Класс: элем ентная функция; родовая.
Параметры: / долж ен иметь тип "целочисленное", является параметром, значение ко
торого будет сдвинуто; shift долж ен иметь тип "целочисленное", является параметром
направления и величины сдвига. П олож ительны е сдвиги влево (к наиболее значимому
биту); отрицательны е сдвиги вправо (к наименее значим ому биту).
Результаты . Тип результата - тот же, что и у /. Результат равен / ариф метически
сдвинутому на shift бит. Если shift положителен, сдвиг - влево; если shift отрицателен,
сдвиг - вправо. Если shift - нуль, никакого сдвига не выполняется.
Биты, вы двинуты е влево или вправо, соответственно, потеряны. Если сдвиг - влево,
справа вставлены нули. Если сдвиг - вправо, копии знакового разряда (0 для неотрица
тельного /; 1 для отрицательного /) вставлены слева.
Вид целого числа важен в ариф метическом сдвиге, потому что знак изменяется среди
целочисленны х представлений (см. следую щ ий пример). Если вы хотите сдвигать 1-бай
товы й или 2-байтовы й параметр, вы долж ны объявить его как IN T E G E R (l) или
1NTEGER(2).
Пример
INTEGER(1)i,res1
IN TE G E R ® j,res2
¡ = -128 ! равно 10000000
j = -32768 ! равно 10000000 00000000
res1 = ISHA (i, -4) ! возвращает 11111000 = -8
res2 = ISHA (j, -4) ! возвращает 11111000 00000000 = -2048
IS H C
Описание: циклически сдвигает целое число влево или вправо на указанное число
битов. Биты, вы двинуты е в одном конце, вдвигаю тся в другом конце. Никакие биты не
теряю тся.
Синтаксис: result = 1SHC (/', shift).
Класс: элем ентная функция; родовая.
Параметры: / долж ен иметь тип "целочисленное", является параметром, значение ко
торого будет циклически сдвинуто; shift долж ен иметь тип "целочисленное", является па
раметром направления и величины вращ ения. П олож ительны е циклические сдвиги влево
(к наиболее значим ом у биту); отрицательны е циклические сдвиги вправо (к наименее
значимому биту).
Результаты . Т ип результата - тот же, что и у /. Р езультат равен /' циклически сдвину
том у на shift бит.
Вид целого числа важен при циклическом смещ ении. С параметром 1NTEGER(4),
сдвигаю тся все 32 бита. Если вы хотите циклически сдвинуть 1-байтовый или 2-бай-
товый параметр, вы долж ны объявить его как IN T E G E R (l) или 1NTEGER(2).
Пример
INTEGER(1)i,res1
IN TE G E R ® j,res2
i = 10 ! равно 00001010
Г лава 8 В ст роенны е проц едуры 221
j = 10 ! равно 00000000 00001010
res1 = ISHC (i, -3) ! возвращает 01000001 = 65
res2 = ISHC (j, -3) ! возвращает 01000000 00000001 = 16385
IS H F T
Описание: вы полняет логический сдвиг.
Синтаксис: result = 1SHFT (/', shift)
Класс: элементная функция; родовая.
Параметры: i долж ен иметь тип "целочисленное"; shift долж ен иметь тип "целочис
ленное". А бсолю тное значение для shift долж но б ь п ь меньш е или равным B 1 T S 1 Z E (/).
Результаты . Тип результата - гот же, что и у /. Результат получает значение / битами,
сдвинутыми на shift позиций. Если shift полож ителен, сдвиг - влево; если shift отри ц ате
лен, сдвиг - вправо. Если shift - нуль, никакого сдвига не вы полняется. Биты, вы дви н у
тые слева или справа, соответственно, потеряны. Нули вдвигаю тся с противополож ного
конца. 1SHFT с положительны м сдвигом м ож ет быть указан как LSH1FT (или LSH FT).
ISHFT с отрицательным сдвигом м ож ет бы ть указан как RSH1FT (или RSH FT) с | shift |.
М одели для интерпретации ц ел оч ислен ною значения как последовательность битов
показаны в прил. D-3.
Собственное имя Тип параметра Тип результата
BSHFT INTEGER(I) INTEGER(I)
IIS H F T M n HSHFT) IN TE G E R ® INTEGERS)
JISHFT INTEGERS) INTEGERS)
KISHFT INTEGERS) IN TE G E R ®
Примеры
1SHFT (2, 1) имеет значение 4.
1SHFT (2, - 1 ) имеет значение 1.
IS H F T C
Описание: Вы полняет циклический сдвиг самых правых битов.
Синтаксис: result = ISHFTC (/, shift [, size]).
Класс: элементная функция; родовая.
Параметры: /' долж ен иметь тип "целочисленное"; shift долж ен иметь тип "целочис
ленное". А бсолю тное значение для shift долж но бы ть меньш е или равным size\ size (opt)
должен иметь тип "целочисленное". Значение size долж но быть полож ительны м и не
долж но превыш ать BIT_SIZE(/'). Если size опущ ен, он, как предполагаю т, им еет значение
BIT_SIZE(/).
Результаты . Тип результата - тот же, что и у /. Значение результата получено цикличе
ским сдвигом size самых правых битов / на shift позиций. Если shift полож ителен, сдвиг -
влево; если shift отрицателен, сдвиг - вправо. Если shift - нуль, никакой сдвиг не вы п ол
няется.
Н икакие биты не теряю тся. Биты в i вне значения, указанного size не затрагиваю тся.
М одели для интерпретации целочисленного значения как последовательность битов
показаны в прил. D-3.
Собственное имя Тип параметра Тип результата
BSHFTC INTEGER(1) INTEGER(I)
1ISHFTC (или HSHFTC) INTEGERS) IN TE G E R ®
J ISHFTC INTEGERS) INTEGERS)
KISHFTC INTEGERS) INTEGERS)
222 С Д А лгазин, В В К ондрат ьев. П рограм ирование на Visual FO RTRAN
Примеры
1SHFTC (4, 2, 4) имеет значение 1.
1SHFTC (3, 1, 3) им еет значение 6.
HL
Описание: логически сдвигает целое число влево или вправо на указанное число би
тов. Нули вдвигаю тся с противополож ного конца.
Синтаксис: result = 1SHL (/, shift).
Класс: элем ентная функция; родовая.
Параметры: / долж ен иметь тип "целочисленное", является параметром, значение ко
торое будет сдвинуто; shift долж ен иметь тип "целочисленное", является параметром на
правления и величины сдвига. Если shift полож ительно, / сдвигается влево (к наиболее
значимому биту). Если shift отрицательно, / сдвигается вправо (к наименее значимому
биту).
Результаты . Тип результата - тот же, что и у /. Результат равен / логически сдвину
тому на shift бит. Нули вдвигаю тся с противополож ного конца.
В отличие от циклических или ариф метических сдвигов, которые могут вдвигать вы
двигаемые биты, логический сдвиг вдвигает только нули, независимо от направления или
размера сдвига. Вид целого числа, однако, все ещ е определяет конец, из которого выдви
гаю тся биты, что может привести к различиям в результате (см. следую щ ий пример).
Пример
INTEGER(1)i,res1
INTEGER(2)j,res2
i = 10 ! равно 00001010
j = 10 ! равно 00000000 00001010
res1 = ISHL (i, 5)! возвращает 01000000 = 64
res2 = ISHL (j, 5)! возвращает 00000001 01000000 = 320
IS N A N
Описание: проверяет, является ли действительное IEEE (S floating, Т floating и
X iloating) числом со значением H e-Число (NaN).
Синтаксис: result = ISNAN (jc ) .
Класс: элем ентная функция; родовая.
Параметр: jc долж ен иметь тип "действительное".
Результаты . Тип результата - логическое по умолчанию . Результат - .TRUE., если
х - IEEE NaN; иначе, результат - .FALSE..
Пример
LOGICAL А
DOUBLE PRECISION В
А = ISNAN(B)
А назначается значение .TRU E., если В - IEEE NaN; иначе назначаемое значение -
.FALSE.
JN U M
Описание: преобразовы вает строку символов в значение 1NTEGER(4).
Синтаксис: result = JN U M (/)
Класс: элем ентная функция; собственная.
Параметр: / долж ен иметь тип "символьное".
Гпава 8. В ст роенны е процедуры 223
Результаты . Тип результата - 1NTEGER(4). Значение результата - целочисленное
значение, представленное строкой сим волов /.
Пример
JNUM ("4 6 6 16.725м) им еет значение 46616 типа 1NTEGER(4).
K IN D
Описание: возвращ ает значение типа родового параметра для параметра. (Для полу
чения дополнительной информации о родовы х параметрах тина см. разд. 2.1.)
Синтаксис: result = K IN D (jc).
Класс: функция запроса; родовая.
Параметр: х м ож ет иметь лю бой встроенны й тип.
Результаты : скаляр целого тина по умолчанию . Результат имеет значение, равное
значению типа родового параметра для х.
Примеры
KIND (0.0) имеет родовое значение действительного типа по умолчанию .
KIND (12) имеет родовое значение целого типа по умолчанию .
LBOUND
Описание: возвращ ает нижние границы для всех измерений м ассива или нижню ю
границу для указанного измерения.
Синтаксис: result = L B O U N D (array [, dim] [, kind]).
Класс: функция запроса; родовая.
Параметры: array долж ен бы ть массивом (лю бого типа данны х), не долж ен быть
распределяемым массивом, который не распределен, или разъединенны м указателем; dim
(opt) должен бы ть скалярным целым числом со значением в диапазоне от 1 до п, где п -
ранг array:; hind (opt) долж ен бы ть инициализированны м скалярным целочисленны м вы
ражением.
Результаты . Тип результата - целое число. Если kind присутствует, родовой пара
метр результата указывается kind; иначе родовой параметр результата - родовой пара
метр целого типа по умолчанию . Если процессор не м ож ет представить значение резуль
тата в kind результата, результат неопределенный.
Если dim присутствует, результат - скаляр. И наче результат - одноранговы й массив с
одним элементом для каж дого измерения array. Каждый элем ент в результате соответст
вует измерению array.
Если array - секция массива или выраж ение м ассив, которое не является целым м ас
сивом или компонент структуры массив, каждый элем ент результата имеет значение 1.
Если array - целый массив или компонент структуры массив, LBO U N D (array, dim)
имеет значение, равное нижней границе для нижнего индекса для dim из array (если dim
отличен от нуля, или array - массив предполагаемого разм ера ранга dim). И наче соответ
ствующ ий элем ент результата им еет значение 1.
Установка опций компилятора, указы ваю щ их размер целого числа, м ож ет затронуть
эту функцию.
Примеры
REAL A RRAY A (1:3, 5:8)
REAL ARRAY B (2:8, -3:20)
LBOUND (ARRA Y A) равно (1 ,5 ). L B O U N D (A R RA Y A, D1M=2) равно 5.
224 С. Д. A ic o пт, В В К ондрат ьев. П рограм ирование на Visual FO RTRAN
LEAD Z
Описание: возвращ ает число начальных нулевых битов в целом числе.
С ин та кси с: result = L EA D Z (/).
К ласс: элем ентная функция; родовая.
Параметр: / долж ен иметь тип "целочисленное" или "логическое".
Р езультаты . Тип результата - тот же, что и у /. Значение результата - число началь
ных нулей в двоичном представлении целого числа /.
М одели для интерпретации целочисленного значения как последовательность битов
показаны в ирил. D-3.
Пример
INTEGEFT8 J, TWO
PARAMETER (TW 0=2)
DO J = -1 ,4 0
TYPE *, LEADZ(TW O**J)! Печатает с 64 вниз до 23 (начальные нули)
ENDDO
END
LEN
Описание: возвращ ает длину сим вольного выражения.
С ин та ксис: result = LEN (string [, kind]).
Класс: функция запроса; родовая.
Параметры : string долж ен иметь тип "символьное"; он м ож ет быть скаляром или
м ассивом значений; kind (opt) долж ен бы ть инициализированны м скалярным целочис
ленны м выраж ением.
Р езультаты . Тип результата - целое число. Если kind присутствует, родовой пара
м етр результата указы вается kind\ иначе родовой параметр результата - родовой пара
м етр целого типа по ум олчанию . Если процессор не м ож ет представить значение резуль
тата в kind, результат неопределенный.
Результат им еет значение, равное числу сим волов в string (если это - скаляр), или в
элем енте string (если это - массив значений).
Собственное имя Тип параметра Тип результата
LEN1 CHARACTER INTEGERS)
CHARACTER INTEGERS)
1Установка опций компилятора, указывающих размер целого числа, может затронуть эту функцию.
Пример
C H A R A C T E R (15) С (50)
C H A R A C T E R (25) D
LEN (С) им еет значение 15, а LEN (D) имеет значение 25.
L E N T R IM
Описание: возвращ ает длину сим вольного параметра, не считая конечных знаков
пробела.
С ин та ксис: result = LEN TRIM (string [, kind]).
К ласс: элем ентная функция; родовая.
Параметры : string долж ен иметь тип "символьное"; kind (opt) долж ен быть инициа
лизированны м скалярны м целочисленны м выражением.
Г лава 8 В ст роенны е проц едуры 225
Результаты . Тип результата - целое число. Если kind присутствует, родовой пара
метр результата указы вается kind; иначе родовой парам етр результата - родовой пара
метр целого числа по умолчанию . Если процессор не м ож ет представить значение р е
зультата в kind, результат неопределенный.
Результат имеет значение, равное числу сим волов, остаю щ ем уся после того, как л ю
бые конечные пробелы в string удалены. Если параметр содерж ит только знаки пробела,
результат - нуль.
Установка опций компилятора, указы ваю щ их разм ер целого числа, м ож ет затронуть
эту функцию.
Примеры
LEN TR1M ('ДДД СДД ЭДДД ') имеет значение 7.
LEN TRIM ('ДДДДД ') имеет значение 0.
LG E
Описание: определяет, больш е или равна одна строка другой строке лексически, о с
новываясь на A SCII, сопоставляю щ ей последовательности, даж е если принимаемая по
умолчанию сопоставляю щ ая последовательность процессора отлична от нее. В Intel For
tran LGE эквивалентен оператору > (.GE.).
Синтаксис: result = LGE (strin gja, string_b).
Класс: элементная функция; родовая.
Параметры: siring a долж ен иметь тип "символьное"; string_b долж ен иметь тип
"символьное".
Р езультаты . Тип результата - логическое по ум олчанию . Если строки имею т нерав
ную длину, сравнение делается так, как будто более короткая строка бы ла расш ирена
справа пробелами до длины более длинной строки. Результат - истина, если строки р ав
ны, обе строки имею т нулевую длину или если siring a следует за string_b в сопостав
ляю щ ей последовательности A SCII; иначе результат - ложь.
Собственное имя Тип параметра Тип результата
LGE1 CHARACTER L0GICAL(4)
1Эту собственную функцию нельзя передавать как фактический параметр.
Примеры
LGE ( 'ONE', 'S I X ') имеет значение ложь.
LGE ( 'TW O', 'T H R E E ') имеет значение истина.
LGT
Описание: определяет, больш е ли строка, чем другая строка лексически, основываясь
на сопоставляю щ ей последовательности A SC II, даж е если приним аем ая по умолчанию -
сопоставляю щ ая последовательность процессора отлична от нее. В Intel Fortran, LG T эк
вивалентен оператору > (.GT.).
Синтаксис: result = LGT (siring a, stringJb).
Класс: элементная функция; родовая.
Параметры: siring a долж ен иметь тип "символьное"; string b долж ен иметь тип
"символьное".
Результаты . Тип результата - логическое по ум олчанию . Е сли строки им ею т нерав
ную длину, сравнение делается, как будто более короткая строка бы ла расш ирена справа
пробелами до длины более длинной строки.
226 С Д Алгазин, В. В К ондрат ьев П рограм ирование на Visual FORTRAN
LLE
Описание: определяет, м еньш е или равна строка другой строке лексически, основы
ваясь на сопоставляю щ ей последовательности ASCII, даж е если последовательность
упорядочения но ум олчанию процессора отлична от ASCII. В Intel Fortran LGT эквива
лентен оператору < (.LE).
С и н та кси с: result = LLE (string_a, string Jb).
Класс: элем ентная ф ункция; родовая.
Параметры : string_a долж ен иметь тин "символьное"; string_b долж ен иметь тип
"символьное".
Результаты . Тип результата - лог ическое по умолчанию . Если строки имею т нерав
ную длину, сравнение делается, как будто более короткая строка бы ла расш ирена справа
пробелам и до длины более длинной строки.
Результат - истина, если строки равны, или обе строки имею т нулевую длину или ес
ли siring a предш ествует string_b в сопоставляю щ ей последовательности ASCII; иначе
результат - ложь.
Собственное имя Тип параметра Тип результата
LLE1 CHARACTER L0GICAL(4)
1 Эту собственную функцию нельзя передавать как фактический параметр
Примеры
LLE ( 'TW O ', 'T H R E E ') им еет значение ложь.
LLE ( 'ON E', 'F O U R ') им еет значение ложь.
LLT
Описание: определяет, является ли строка меньш е, чем другая строка лексически,
основы ваясь на сопоставляю щ ей последовательности A SCII, даже если сопоставляю щ ая
п оследовательность процессора по ум олчанию отлична. В Intel Fortran LG T эквивалентен
оператору < (.LT).
Си н та кси с: result = LLT (string_a, string b)
Класс: элем ентная функция; родовая.
Параметры : str in g jx долж ен иметь тип "символьное"; string_b долж ен иметь тип
"символьное".
Р езультаты . Тип результата - логическое по умолчанию . Если строки имеют нерав
ную длину, сравнение делается, как будто более короткая строка была расш ирена справа
пробелам и до длины более длинной строки.
Результат' - истина, если strin g jx предш ествует string Jb в сопоставляю щ ей последова
тельности A SC II; иначе результат - ложь. Если обе строки имею т нулевую длину, ре
зультат - ложь.
Глава 8. В ст роенны е проц едуры 227
LO C
Описание: возвращ ает внутренний адрес элем ента памяти. Эту ф ункцию нельзя п е
редавать как фактический параметр.
Синтаксис: result = LOC (х).
Класс: функция запроса; родовая.
Параметр: х является переменной, массивом или ссы лкой на поле записи, п роцеду
рой или константой; он может иметь лю бой тип данны х, не долж ен бы ть именем внут
ренней процедуры или функции утверж дения. Если этот парам етр - указатель, он долж ен
быть определенным и связанным с адресатом.
Результаты . Тип результата - 1NTEGER(4) на процессорах 1А-32 и 1NTEGER(8) на
процессорах Intel Itanium и Intel ЕМ 64Т. Значение результата представляет адрес объекта
данных или, в случае указателей, адрес связанного с ним адресата. Если параметр недо
пустим, результат неопределенный.
Эта функция удовлетворяет той же самой цели, что и встроенная ф ункция % LO C.
LOG
Описание: возвращ ает натуральный логариф м параметра.
Синтаксис: result = LOG (х).
Класс: элементная функция; родовая.
Параметр: х долж ен иметь тип "действительное" или "ком плексное". Если х дей стви
тельное, его значение долж но бы ть больш е, чем нуль. Если х ком плексное, его значение
не долж но бы ть нулем.
Р езультаты . Тип результата - тот же, что и y i . Значение результата приблизительно
равно loggX.
Если параметры комплексны е, результат - главное значение м нимой части омеги в
диапазоне -к < с о < п . М нимая часть результата п , если вещ ественная часть парам етра -
меньше, чем 0, а мнимая часть параметра - 0.
Собственное имя Тип параметра Тип результата
A L0G 1’2 REAL(4) REAL(4)
DL0G REAL(8) REAL(8)
QL0G REAL(16) REAL(16)
CLOG C0MPLEX(4) C0MPLEX(4)
CDL0G3 C O M P LEX ® C0MPLEX(8)
CQL0G C0MPLEX(16) C0MPLEX(16)
1Эта функция может быть указанна как LOG.
2 Установка опций компилятора, указывающих размер действительного, может затронуть ALOG, LOG и CLOG.
3 Эта функция может быть указанна как ZL0G.
Примеры
LOG (8.0) имеет значение 2.079442.
LOG (25.0) имеет значение 3.218876.
228 С Д. Ачгазин, В. В. К ондрат ьев. П рограм ирование на Visual FORTRAN
L O G IO
Описание: возвращ ает десятичны й логарифм параметра.
Синтаксис: result = LO G 10 (х).
Класс: элем ентная функция; родовая.
Параметр: х долж ен им еть тип "действительное". Значение х долж но бы ть больше,
чем нуль.
Результаты . Тип результата - такой же, как у х. Значение результата приблизительно
равно logio*.
Собственное имя Тип параметра Тип результата
ALOGIO1 REAL(4) REAL(4)
DLOGIO REAL(8) REAL(8)
QL0G1Q REAL(16) REAL(16)
1 Эта функция может также быть указанна как LOGIO. Установка опций компилятора, указывающих размер действительного
числа может затронуть ALOGIO и LOG 10.
Примеры
LOGIO (8.0) им еет значение 0.9030900.
LOG 10 (15.0) им еет значение 1.176091.
L O G IC A L
Описание: преобразовы вает логическое значение параметра к логическому же значе
нию, но с другим и родовы м и параметрами.
Синтаксис: result = L O G IC A L (/ [, kind]).
Класс: элем ентная ф ункция; родовая.
Параметры: / долж ен им еть логический тип; kind (opt) долж ен быть инициализиро
ванным скалярным целочисленны м выражением.
Результаты . Тип результата является логическим. Если kind присутствует, родовой
параметр результата указы вается kind\ иначе родовой параметр результата - родовой па
рам етр логического ти па по ум олчанию . Значение результата - значение /.
У становка опций ком пилятора, указы ваю щ их размер целого числа, м ож ег затронуть
эту функцию.
Примеры
LO G ICA L (L .OR. .NOT. L) им еет значение истина и имеет тип логического типа по
умолчанию независим о от родового парам етра логической переменной L.
LO G ICA L (.FA LSE., 2) им еет значение ложь, с параметром вида 1NTEGER(K1ND=2).
M ALLO C
Описание: распределяет блок памяти. Эту собственную функцию нельзя передавать
как фактический параметр.
С интаксис: result = M A L L O C (/).
Класс: элем ентная функция; собственная.
Параметр: / долж ен им еть тип "целочисленное", размер (в байтах) памяти, которая
будет р асп редел ен а.
Результаты . Тип результата - 1NTEGER(4) на процессорах 1А-32 и IN TEG ER (8) на
процессорах Intel Itanium и Intel ЕМ 64Т. Результат - начальный адрес распределенной
памяти. Распределенная пам ять м ож ет бы ть освобож дена использованием встроенной
функции FREE.
Глава 8 В ст роенны е процедуры 229
Пример
INTEGER(4) SIZE
REAL(4) STORAGE(*)
POINTER (ADDR, STORAGE) ! ADDR указывает на STORAGE
SIZE = 1024! Размер в байтах
ADDR = MALLOC(SIZE) • Распределяет память
CALL FREE(ADDR) ! Освобождает ее
M ATM UL
Описание: вы полняет м атричное ум нож ение числовых или логических матриц.
Синтаксис: result = M A T M U L (m a tr ix a , m a tr ix b )
Класс: трансф орм ационная функция; родовая.
Параметры: matrix a долж ен бы ть массивом ранга 1 или 2, долж ен им еть числовой
(целочисленное, действительное или комплексное) или логический тип; m atrix_Ь долж ен
быть массивом ранга I или 2, долж ен иметь числовой тип, если matrix a им еет числовой
тип или логический тип, если matrix а им еет логический тип. По крайней мере 1 п ара
метр должен иметь ранг 2. Размер первого измерения matrix b долж ен равняться разм еру
последнего измерения matrix a.
Результаты . Результат - массив, тип которого зависит от типа данны х параметров,
согласно правилам, описанным в "Тип данны х числовых вы ражений". Ранг и ф орм а р е
зультата зависят от ранг а и форм параметров следую щ им образом:
■ Если matrix a имеет форму (n, m), a matrix b им еет форму ( т , к), результат - д в у х
ранговый массив с формой (п, к).
■ Если matrix a им еет форму (m), a matrix b имеет форму ( т , к), результат - о дн о р ан
говый массив с формой (к).
■ Если matrix a имеет форму (n, m), a matrix b имеет форму ( т ) , результат - одн о р ан
говый массив с формой (п).
Если параметры имеют числовой тип, элем ент (i, j) результата им еет значение SUM
((строка i из matrix a) * (столбец j matrix b)). Если параметры им ею т логический тип,
элемент (i, j) результата имеет значение ANY ((строка i из matrix a) .AND. (столбец j
matrix_b)).
Примеры
"2 3"
"2 3 4 “
А является матрицей , В является матрицей 34 X является вектором ( 1, 2) ,
_3 4 5_
_4 5_
a Y является вектором (1, 2 3). Результат M A T M U L (А, В) является м атрично-
29 38
матричным произведением AB со значением
38 50
Результат M A TM U L (X, А) является векторно-м атричны м произведением ХА о зн а
чением (8, 11, 14). Результат M A T M U L (A, Y) является м атрично-векторны м п рои зведе
нием AY со значением (20, 26).
М АХ
Описание: возвращ ает м аксим альное значение параметров.
Синтаксис: result = М А Х (<а ! , а2 [, а З ,...]).
Класс: элементная функция; родовая.
230 С Д А 1газип, В В К ондрат ьев Программирование на Visual FORTRAN
M A XEXPONENT
Описание: возвращ ает максим альную экспоненту в модели, представляю щ ей тот же
самый тип и родовы е параметры, что и параметр.
С ин та ксис: result = M A X EX PO N E N T (jc).
Класс: функция запроса; родовая.
Параметр: х долж ен иметь тип "действительное"; он мож ет быть скаляром или мас
сивом значений.
Р езультаты : скаляр целого типа по умолчанию . Результат имеет значение етах> как
определено в прил. D-2.
Пример
Если X имеет тип REA L(4), M A X E X PO N EN T (X) имеет значение 128.
M AXLOC
Описание: возвращ ает местополож ение м аксим ального значения всех элементов в
массиве, ряда элем ентов в м ассиве или элем ентов в указанном измерении массива.
Син та ксис: result = M A X LO C (array [, dim] [, mask] [, kind]).
Гпава 8 Встроенные процедуры 231
Класс: трансформ ационная функция; родовая.
Параметры: array долж ен быть массивом тина "целочисленное" или "действитель
ное"; dim (opt) долж ен бы ть скалярным целочисленны м со значением в диапазоне от 1 до
п, где п - ранг array, является возм ож ностью Fortran 95. mask (opt) долж ен быть логи че
ским массивом, который соответствует array.
kind (opt) долж ен бы ть инициализированны м скалярным целочисленны м выражением.
Результаты . Тип результата - целое число. Если kind присутствует, родовой п ара
метр результата указы вается kind', иначе родовой параметр результата - родовой пара
метр целого типа по умолчанию . Если процессор не мож ет представить значение резуль
тата в kind результата, результат неопределенный.
П рименяются следую щ ие правила, если опущ ен dim :
■ Результат массива имеет ранг единица и размер, равны й рангу array.
■ Если M AXLOC (array) указано, элементы в м ассиве результата форм ирую т нижний
индекс м естоположения элем ента с м аксимальны м значением в array. /-й нижний ин
декс возвращ ает лож ь в диапазоне от 1 до е„ где е, - предел /-го измерения array.
Если M AXLOC (array, M A SK ^m ask) указано, элементы в массиве результата ф орм и
рую т нижний индекс местополож ения элем ента с м аксим альны м значением, соответст
вующим условию, указанному mask.
Если указан dim, применяю тся такие правила:
■ Результат массива имеет ранг, который на единицу м еньш е, чем у array, и форму (d |,
d2, d D|M i, dD|M+1, ..., d„), где (d,, d2, d n) является формой array.
■ Если array имеет ранг единица, M A X LO C (array, dim [,mask]) имеет значение, равное
M AXLOC (array [,M A SK = mask]). И наче значение элем ента (s b s2, s D im i , s D i m + i , •••,
sn) из M AXLOC (array, dim [,mask]) равно M A X LO C (array (si, s2, ..., S d i m - i , •, S d i m m , •••,
sn) [,M ASK = mask (s,, s2, ..., sDllvI- i , s D i m + i , sn)]).
■ Если больш е чем 1 элем ент им еет максим альное значение, элемент, нижние индексы
которого возвращ аю тся, является первым таким элем ентом, взятый в порядке элем ен
тов массива. Если array имеет нулевой размер или каж дый элем ент array имеет зна
чение .FALSE., значение результата не определено.
Установка опций компилятора, указы ваю щ их размер целого числа, м ож ет затронуть
эту функцию.
Примеры
Значение M A X LO C ((/3, 7, 4, 7/)) равно (2), которое является нижним индексом м е
стоположения первого возникновения м аксим ального значения в одноранговом массиве.
4 0 -3 2 “
Пусть А является массивом 3 1-26
-1 -4 5 -5
М АХЬОС (А, М А 5К=А ХТ. 5) имеет значение (1, 1), потому что они являются нижними
индексами местоположения максимального значения (4), которое является меньше, чем 5.
М АХЕОС (А, 01М =1) имеет значение (1, 2, 3, 2). 1 является нижним индексом м есто
положения м аксимального значения (4) в столбце 1; 2 является нижним индексом м есто
положения м аксимального значения (1) в столбце 2; и т. д.
М АХЕОС (А, 01М =2) имеет значение (1, 4, 3). 1 является нижним индексом местопо
ложения максимального значения в строке 1; 4 является нижним индексом м естополож е
ния максимального значения в строке 2; и т. д.
232 С Д Аъ'азии, В В Кондратьев Програмирование на Visual FORTRAN
MAXVAL
Описание: возвращ ает максим альное значение всех элем ентов в массиве, ряда эле
ментов в массиве или элем ентов в указанном измерении массива.
С ин та ксис: result = M A X V A L (array [, dim] [, mask]).
Класс: трансф орм ационная функция; родовая.
Параметры: array должен быть массив типа "целочисленное" или "действительное"; dim
(opt) должен быть скалярным целочисленным со значением в диапазоне от 1 до п, где п - ранг
array\ mask (opt) должен быть логическим массивом, который соответствует array.
Р езультаты : является м ассивом или скаляром того же самого типа данных, что и ar
ray. Результат - скаляр, если dim опущ ен или array им еет ранг 1.
П рименяю тся следую щ ие правила, если опущ ен dim:
■ Если M A X V A L (array) указано, результат им еет значение, равное максимальному
значению всех элем ентов в array.
■ Если M A X V A L (array, MASK=was&) указано, результат имеет значение, равное мак
сим альном у значению элементов в array, соответствую щ ем у условию , указанному
mask.
П рименяю тся следую щ ие правила, если указан dim :
■ Результат м ассива им еет ранг, который на единицу меньш е чем у array, и форму (d h
d[)|M i, d DIM, i, ..., dn), где (d,, d2, d n) является формой array.
■ Если array имеет ранг единица, M A X V A L (array, dim [,mask]) имеет значение, кото
рое равно M A X V A L (array [,M A SK = mask]). И наче значение элемента (s b s2, ...,
S d i m - i > Sd i m m , sn) из M A X LO C (array, dim [,mask]) равно M A X LO C (array (s b s2, ...,
Sdim ь sD|m+i, sn) [,M A SK = mask (s b s2, ..., sD|M- 1, sD|M+ i , s n)]).
■ Если array им еет разм ер нуль или если нет никаких истинных элем ентов в mask, ре
зультат (если dim опущ ен), или каж дый элем ент в массиве результата (если dim ука
зан), им еет значение отрицательного числа наибольш ей величины, поддерж иваемой
процессором для чисел типа и родовых парам етров array.
Примеры
Значение M A X V A L ((/2, 3, 4/)) равно 4, потом у что это - максим альное значение в
одноранговом массиве.
M A X V A L (В, MASKHB .LT. 0.0), находит м аксим альное значение отрицательных
элем ентов В.
"2 3 4 '
П усть С является массивом
_5 6 7 _
M A X V A L (С, D IM =1) имеет значение (5, 6, 7). 5 - максим альное значение в столб
це 1; 6 - м аксим альное значение в столбце 2; и т. д.
M A X VA L (С, D1M=2) имеет значение (4, 7). 4 - максимальное значение в строке 1; 7 -
м аксим альное значение в строке 2.
M CLOCK
Описание: возвращ ает время, подсчитанное для программы .
С ин та ксис: result = M C LO C K ( ) .
Класс: функция запроса; собственная.
Параметры : нет.
Глава 8 Встроенные процедуры 233
Результаты . Тип результата - целое число. Результат - сум м а (в м икросекундах)
пользовательского времени текущ его процесса и пользователя и системного времени
всех его дочерних процессов.
M ERGE
Описание: выбирает между двум я значениям и или м еж ду соответствую щ им и эл е
ментами в двух массивах, согласно условию , указанному логической маской.
С интаксис: result = M ERG E (tsou rce,/source, mask)
Класс: элем ентная функция; родовая.
Параметры: tsource долж ен бы ть скаляром или м ассивом (лю бого ти п а данных).
/so u rce долж ен быть скаляром или м ассивом того же самого ти п а и парам етров типа, что
и tsource; mask долж ен быть логическим м ассивом.
Результаты . Тип результата - тот же, что и у tsource. Значение mask определяет, б е
рется ли значение результата из tsource (если mask - истинна) или /so u rc e (если mask -
ложь).
Примеры
Д ля R = - 3 M ERG E (1.0, 0.0, R <0) имеет значение 1.0, а для R = 7 им еет значение 0.0.
"13 5 “ "8 9 0"
П усть TSO U RC E является м ассивом , FSO U R C E является м ассивом
_2 4 6 _
! 23
FTT
a M A SK является массивом
TTF
835
M ERG E (TSO U RCE, FSO U RCE, M A SK ) производит результат:
243
M IN
Описание: возвращ ает минимальное значение параметров.
С интаксис: result = MIN (a l , а2 [, а З,...]).
Класс: элементная функция; родовая.
Параметры: a l, а2 и аЗ (opt) все долж ны им еть один и тот ж е тип (целочисленное
или действительное) и одинаковы е родовы е параметры.
Результаты : для MINO, AM1N1, DM1N1, QM 1N1,1M 1N0, JM1N0 и KM1N0 тип резуль
тата - тот же, что и у параметров. Д ля MI NI , 1M1N1, JM IN1 и KM IN1 тип результата -
"целочисленное". Для AM1N0, A1M1N0, AJM1N0 и AKM1N0 результат им еет тип "дейст
вительное". Значение результата - значение наим еньш его параметра.
Собственное имя1 Тип параметра Тип результата
INTEGERd) INTEGERd)
INTEGERd) REAL(4)
IMIN0 INTEGER® INTEGER®
AIMIN0 INTEGER® REAL(4)
MINO2 INTEGERS) INTEGERS)
AMINO3-4 INTEGERS) REAL(4)
KMINO INTEGERS) INTEGER®
AKMINO INTEGER® REAL(4)
IMIN1 REAL(4) INTEGER®
MINI4-5-6 REAL(4) INTEGERS)
234 С. Д Алгашн, В В. Кондратьев. Программирование на Visual FORTRAN
Примеры
MIN (2.0, -8 .0 , 6.0) им еет значение -8 .0 .
M IN (14, 32, -5 0 ) им еет значение -5 0 .
M IN E X P O N E N T
Описание: возвращ ает м иним альную экспоненту в модели, представляю щ ей гот же
самый тип и родовы е парам етры , что и параметр.
Си н та кси с: result = M IN EX PO N E N T (.v).
Класс: функция запроса; родовая.
Параметр: х долж ен им еть тип "действительное"; м ож ет бы ть скаляром или м асси
вом значений.
Р езультаты . Р езультат - скаляр целого типа по умолчанию . Результат имеет значение
emin, как определяется в прил. D-2.
Пример
Если X имеет тип R E A L (4), M IN EX PO N E N T (X) им еет значение -125.
M IN L O C
Описание: возвращ ает м естополож ение минимального значения всех элементов в
м ассиве, ряде элем ентов в м ассиве или элем ентов в указанном измерении массива.
С ин та ксис: result = M IN LO C (array [, dim] [, mask] [, kind]).
Класс: трансф орм ационная функция; родовая.
Параметры : array должен быть массивом типа "целочисленное" или "действительное";
dim (opt) должен быть скалярны м целочисленны м со значением в диапазоне от 1 до п, где
п - ранг а\тау\ является возм ож ностью Fortran 95. mask (opt) должен бы ть логическим мас
сивом, который соответствует' airay. kind (opt) долж ен б ь п ь инициализированным скаляр
ным целочисленны м вы раж ением .
Р езультаты . Результат - массив т ипа "целочисленное". Если параметр kind присутст
вует, родовой параметр результата указы вается kind\ иначе родовой параметр результа
та - родовой парам етр целого типа по умолчанию . Если процессор не может представить
значение результата в kind, результат неопределенны й.
П рименяю тся следую щ ие иравила, если опущ ен dim :
■ Результат м ассива им еет ранг единица и размер, равный рангу array.
■ Если M IN LO C (array) указано, элем енты в м ассиве результата формирую т нижний
индекс м естополож ения элем ента с минимальны м значением в array. /-й нижний ин
декс возвращ ает лож ь в диапазоне от 1 д о г,, где е} - предел /-го измерения array.
Г iaea 8 Встроенные процедуры 235
■ Если M 1N L 0C (array, M ASK=/m s&) указано, элем енты в м ассиве результата ф орм и
рую т нижний индекс м естополож ения элем ента с м иним альны м значением , соответ
ствую щ им условию , указанному mask.
Применяю тся следую щ ие правила, если указан dim:
■ Результат массив им еет ранг, который на единицу м еньш е, чем у a rra y, и ф орм у (d b
d2, ..., d D|M-i, d D|M+ i , d „ ) , где ( d h d2, d n) является форм ой array.
■ Если array имеет ранг единица, M1NLOC (array, dim [,mask]) им еет значение, равное
M1NLOC (array [,M A SK = mask]). И наче значение элем ента ( s h s2, ..., sD|M-i, Sdim+i, •••,
sn) из M1NLOC (array, dim [,mask]) равно M IN LO C (array (si, s2, ..., sD|M-i, sD|M+i,
sn) [,M ASK = mask (si, s2, s Dim-i, sDim+i? •••, sn)]).
■ Если больш е чем 1 элем ент им еет минимальное значение, элем ент, ниж ние индексы
которого возвращ аю тся, является первым таким элем ентом , взятым в порядке эле
ментов массива. Если array имеет нулевой разм ер или каж ды й элем ент array им еет
значение .FA LSE., значение результата не определено.
У становка опций компилятора, указы ваю щ их разм ер целого числа, м ож ет затронуть
эту функцию.
Примеры
Значение M IN LO C ((/3, 1, 4, 1/)) равно (2), которое является нижним индексом м есто
положения первого появления минимального значения в одноранговом массиве.
" 4 0 -3 2
П усть А является массивом 3 1 -2 6
УП
-1
1
1
M IN LO C (A, M A SK =A .GT. - 5 ) им еет значение (3, 2), потому что они являю тся н иж
ними индексами м естополож ения минимального значения (-4 ), которое больш е, чем - 5 .
M IN LO C (A, D IM =1) имеет значение (3, 3, 1, 3). 3 является нижним индексом м есто
положения м инимального значения (-1 ) в столбце 1; 3 является нижним индексом м есто
положения м инимального значения (-4 ) в столбце 2; и т. д.
M IN LO C (A, D1M=2) имеет значение (3, 3, 4). 3 является ниж ним индексом м естоп о
ложения минимального значения (-3 ) в строке 1; 3 является ниж ним индексом м естопо
ложения минимального значения (-2 ) в строке 2; и т. д.
M IN V A L
О п и сан и е: возвращ ает минимальное значение всех элем ентов в м ассиве, ряде эле
ментов в массиве или элем ентов в указанном измерении м ассива.
С и н т а к с и с : result = M IN V A L (array [, dim] [, mask]).
К л асс: трансф орм ационная функция; родовая.
П а р а м е т р ы : array долж ен бы ть массивом типа "целочисленное" или "действитель
ное"; dim (opt) долж ен бы ть скалярным целочисленны м со значением в диапазоне от 1 до
п, где п - ранг array, mask (opt) долж ен бы ть логический массив, которы й является со о т
ветствую щ им с array.
Р е зу л ь та т ы . Результат - массив или скаляр того же самого типа данны х, что и array.
Результат - скаляр, если dim опущ ен, или array имеет ранг единица.
Применяю тся следую щ ие правила, если опущ ен dim :
■ Если M INVAL (array) указано, результат имеет значение, равное м иним альном у зн а
чению всех элементов в array.
236 С. Д. Алгазин, В. В. Кондратьев. Программирование на Visual FORTRAN
■ Если M 1NVAL (array, M A SK =mask) указано, результат имеет значение, равное мини
м альному значению элем ентов в array, соответствую щ ем условию , указанному mask.
П рименяю тся следую щ ие правила, если указан dim :
■ Результат м ассив им еет ранг, которы й на единицу меньш е, чем у array, и форму (d|,
d2, d D|M_,, d D|M+ i , d n), где ( d h d2, d n) является формой array.
■ Если array имеет ранг единица, M 1NVAL (array, dim [,mask]) имеет значение, равное
M1NVAL (array [,M A SK = mask И наче, значение элем ента (si, s2, ..., Sdim-i» sD|M+i,
sn) из M 1NVAL (array, dim [,mask]) равно M 1NVAL (array (si, s2, ..., sDim-i, Sdim+i, —,
sn) [,M A SK = mask (si, s2, ..., sD|M- i , s Dim+i, sn)]).
■ Если array имеет разм ер нуль или если нет никаких истинных элементов в mask, ре
зультат (если dim опущ ен) или каж дый элем ент в м ассиве результата (если dim ука
зан) им еет значение полож ительного числа наибольш ей величины, поддержанной
процессором для чисел типа и родовы х параметров array.
Примеры
Значение M 1NVAL ((/2, 3, 4/)) равно 2, потому что оно является минимальным значе
нием в одноранговом массиве.
Значение M 1NVAL (В, M A SK =В .GT. 0.0), находит м инимальное значение положи-
'2 3 4"
тельны х элем ентов В. С является массивом
567
M1NVAL (С, D1M=1) имеет значение (2, 3, 4). 2 является минимальным значением
в столбце 1; 3 является м инимальны м значением в столбце 2; и т. д.
M1NVAL (С, D IM =2) им еет значение (2, 5). 2 является минимальным значением
в строке 1 и 5 является м инимальны м значением в строке 2.
MMPREFETCH
О п и са н и е: данны е предвы борок из указанного адреса на одной строке кеш а памяти.
С и н т а к с и с : C A LL M M _PR EFET C H (address [, hint] [, fault] [, exclusive]).
К л асс: подпрограмма.
П а р а м е т р ы : address является именем скаляра или массива; мож ет иметь любой тип
или ранг; указы вает адрес данны х в строке кеш а для предварительной выборки; hint (opt)
является необязательной константой целого типа по ум олчанию с одним из следующ их
значений:
Значение Константа предвыборки Описание
0 f o r _ k _ p r e f e t c h _ to Предвыборки в кеше И (и 12 и 1.3 кеше). Используйте это для цело
численных данных
1 FOR_K_PREFETCH_T 1 Предвыборки в кеше 12 (и кеше 1.3); данные с плавающей точкой ис
пользуются из кеша 12, но не кеша И . Используйте это для действи
тельных данных
2 F0R_K_PREFETCH_T2 Предвыборки в кеше 12 (и кеше 1.3); эта линия будет отмечена для
раннего смещения. Используйте ее, если вы не собираетесь часто
повторно использовать строку кеша
3 f o r _k_p r e f e t c h _n ta Предвыборки в кеше 12 (но не кеше 1.3); эта линия будет отмечена
для раннего смещения. Используйте ее, если вы не собираетесь по
вторно использовать строку кеша
П реды дущ ие возвращ аем ы е значения определены в файле fordef.f на системах Linux*
и M ac OS* и файле fordef.for на системах W indows*.
Гпава Н. Встроенные процедуры 237
Если параметр hint опущ ен, предполагается значение 0.
fa u lt (opt) является необязательной константой логического типа по ум олчанию . Если
.TRUE, указано, отсутствие страницы допускается в случае необходим ости; если .FALSE,
указано, отсутствие страницы не допускается. Если fa u lt опущ ен, .FALSE, предполагает
ся. Этот параметр игнорируется на процессорах Intel ЕМ 64Т и 1А-32.
exclusive (opt) является необязательной константой логического типа по ум олчанию .
Если .TRUE, указано, вы получаете исклю чительное монопольное использование строки
кеша, потому что вы предполагаете назначить ей значение; если .FA LSE, указан, нет ни
какого исклю чительного м онопольного использования. Если exclusive опущ ен, .FALSE,
предполагается. Этот параметр игнорируется на процессорах Intel ЕМ 64Т и 1А-32.
Пример
subroutine spread J f (a, b)
PARAMETER (n = 1025)
real*8 a(n,n), b(n,n), c(n)
do j = 1,n
do i = 1,100
a(i,j) = b(i-1, j) + b(i+1, j)
call mm_prefetch (a(i+20, j), 1))
call mm_prefetch (b(i+21, j), 1))
enddo
enddo
print *, a(2, 567)
stop
end
MOD
Описание: возвращ ает остаток от деления первого параметра на второй.
Синтаксис: result = M O D (а , р ).
Класс: элементная функция; родовая.
Параметры: а долж ен иметь тип "целочисленное” или "действительное"; р долж ен
иметь тот же самый тип и родовы е параметры , что и а.
Результаты . Тип результата - тот же, что и у а. Если р не равен нулю , значение р е
зультата а - lN T (a/p) х р. Если р равен нулю, результат неопределенны й.
Собственное имя Тип параметра Тип результата
BMOD INTEGERd) INTEGER(1)
IMOD ((или HMOD) IN TE G E R ® IN TE G E R ®
MOD (или JMOD) INTEGERS) INTEGERS)
KMOD INTEGERS) INTEGERS)
AMOD1 REAL(4) REAL(4)
DMOD REAL(8) REAL(8)
QMOD REAL(16) REAL(16)
1 Установка опций компилятора, указывающих размер действительного числа, может затронуть AMOD.
Примеры
MOD (7, 3) - значение 1.
M OD (9, -6 ) - значение 3.
M OD (-9 , 6) - значение - 3 .
238___________ с д А чгат н .В В Кондратьев Программирование на Visual FORTRAN
M ODULO
Описание: возвращ ает м одуль параметров.
Синтаксис: result = M O D U LO (а ,р ).
Класс: элем ентная функция; родовая.
Параметры: а долж ен иметь тип "целочисленное” или "действительное"; р должен
бы ть инициализированным скалярным целочисленны м выраж ением а.
Результаты . Тин результата - тот же, что и у а. Значение результата зависит от типа
а следую щ им образом:
■ Если тип "целочисленное" и р не равен нулю, значение результата а - FLOOR(REAL(¿z)/
REAL(p)) * p.
■ Если типа "действительное" и р не равен нулю, значение результата а - FLOOR(a/p) * р.
■ Если р равен нулю (независим о от типа а), результат неопределенный.
Примеры
M O D ULO (7, 3) - значение 1.
M O D ULO (9, - 6 ) - значение - 3 .
M O D ULO (-9 , 6) - значение 3.
M OVEALLOC
Описание: перем ещ ает распределение из одного распределяем ого объекта в другой.
S yntax: CA LL M O V E _A L L O C (from, to).
Класс: подпрограмма.
Параметры: from м ож ет иметь лю бой тип и ранг; долж ен бы ть распределяемы м; to
долж ен быть совместим с типом from и иметь тот ж е самый ранг; долж ен быть распреде
ляемым.
■ Если to в настоящ ее время распределен, он освобож дается.
■ Если from распределен, to распределяется с тем ж е самым типом, параметрами типа,
границами м ассива и значением , что и from . Потом fro m освобож дается.
■ Если to им еет атрибут T A R G ET, лю бой указатель, связанны й с fro m во время вызова,
M OVE A LLO C становится соответственно связанны м с to. Если to не имеет атрибута
TA RG ET, состояние связывания лю бого указателя, связанного с from на входе, стано
вится неопределенным.
Во время реализации M O V E A LLO C , внутреннее дескрипторное содерж имое кото
рой копируется т fro m в to так, чтобы память, указанная to , бы ла той же самой.
Как правило, M O V E A L LO C используется, чтобы обеспечить эффективный способ
перераспределить переменную к больш ем у размеру, не копируя данны е дважды.
Примеры
Пример того, как увеличивать распределенны й разм ер А и сохранить старые значения
только в одной копии:
integer,allocatable::a(:),b(:)
п=2
allocate (a(n), Ь(п*2))
a=(/(i,i=1,n)/)
b=-1
print *,' Old а = ',а
print * ,' Old b = \b
print * ,' Allocated(a), allocated(b) = allocated(a), allocated(b)
Глава <У Встроенные процедуры 239
end
Вывод для предыдущ его примера:
распределен X - Т
распределен Y - Т
старый X - 1.0000002.000000
старый Y - -1.000000 -1.000000 -1.000000 -1.000000
новый Y -1 .0 0 0 0 0 0 2.000000 -1.000000 -1.000000
распределен X - Т
распределен Y - F
новый X - 1.000000 2 000000 -1.000000 -1.000000
M U L T H I G H (то ль ко ¡64)
Описание: ум нож ает два 64-битовы х целых числа без знака. Эта собственная ф унк
ция не имеет никакой родовой ф ункции, связанной с ней и доступна только на п роцессо
рах Intel Itanium. Ее нельзя передавать как фактический параметр.
Синтаксис: result = M U LT HIGH (/,_/).
Класс: элементная функция; собственная.
Параметры: I долж ен иметь тип IN TEG ER(8); j долж ен иметь тип IN TEG ER(8).
240 С. Д Алгазин, В. В. Кондратьев Программирование на Visual FORTRAN
M V B IT S
Описание: копирует последовательность битов (битовое поле) из одного м естополо
жения в другое.
С ин та кси с: C A L L M V BITS (from, from pos, len, to, topos).
Класс: элем ентная подпрограмма.
Параметры. И меет 5 парам етров':
from мож ет иметь лю бой целочисленны й тип, представляет местополож ение, из кото
рого передается битовое поле.
frompos м ож ет иметь лю бой целочисленны й тип; не долж ен бы ть отрицательным. Он
идентиф ицирует первую битовую позицию в поле, переданном из from, frompos + len
долж но бы ть м еньш е или равным B1T S1ZE (from).
len м ож ет иметь лю бой целочисленны й тип; не долж ен бы ть отрицательным. Он
идентиф ицирует длину поля, переданного из from.
to мож ет иметь лю бой целочисленны й тип, но долж ен иметь тот же родовой пара
метр, что vi from . Он представляет м естополож ение, в которое передается битовое поле;
to устанавливается копированием последовательности битов длины len , начинаю щ ейся в
позиции from pos from , в позицию topos to. Н икакие другие биты to не изменяю тся. По
возвращ ении len битов, to (начинаю щ ихся в topos) равны значению , которое биты len
from (начинаю щ иеся в frompos) имели на входе. (М одели для интерпретации целочис
ленного значения как последовательности битов показаны в прил. D-3.)
topos м ож ет иметь лю бой целочисленны й тип; он не долж ен бы ть отрицательным. Он
идентиф ицирует исходную позицию (внутри to) для передаваем ы х битов, topos + len
долж но бы ть м еньш е или равным B1T S1ZE (to).
Вы м ож ете такж е использовать следую щ ие собственны е подпрограммы:
BM VB1TS - парам етры from и to долж ны бы ть IN T E G E R (l).
HM VB1TS - параметры from и to долж ны бы ть 1NTEGER(2).
1MVB1TS - все парам етры долж ны бы ть 1NTEGER(2).
JM VB1TS - парам етры могут бы ть 1NTEGER(2) или IN TEG ER(4); по крайней мере
один долж ен бы ть ÍN TEG ER(4).
KMVB1TS - параметры могут бы ть 1NTEGER(2), 1NTEGER(4) или INTEGER(8); rio
крайней мере один долж ен бы ть 1NTEGER(8).
1FROM; FROMPOS, LENи TOPOS - параметры INTENT (IN); TO - параметр INTENT (INOUT).
Для получения дополнительной информации о INTENTсм. разд. 4.11.
Глава 8. Встроенные процедуры 241
Пример
Если ТО имеет начальное значение 6, его значение после того, как вы зов в MVB1TS
(7, 2, 2, ТО, 0) равно 5.
NARGS
Описание: возвращ ает общ ее количество параметров ком андной строки, вклю чая
команду. Эту функцию нельзя передавать как ф актический параметр.
Синтаксис: result = NA RG S ( ) .
Класс: функция запроса; собственная.
Параметры: нет.
Результаты . Тип результата - 1NTEGER(4). Результат - число парам етров командной
строки, включая команду. Н априм ер, N A RG S возвращ ается 4 для вы зова командной
строки PROG 1 -g -с -а.
Пример
IN TE G ER ® result
result = RUNQQCmyprog', '-с -г')
END
! MYPROG F90 отвечает на переключатели команды -г, -с, и/или -d
INTEGER(4) count, num, i, status
C H A R A C TE R S ) buf
REAL r1 10 .0 1
COMPLEX c1 / (0.0,0 .0 )/
REAL(8) d1 / 0 .0 1
num = 5
count = NARGS()
DO i = 1, count-1
CALL GETARG(i, buf, status)
IF (status .It. 0) THEN
WRITE (*,*) 'GETARG error - exiting*
EXIT
END IF
IF (buf(2:status) .EQ.'r') THEN
r1 = REAL(num)
WRITE (*,*) Y1 = \r1
ELSE IF (buf(2:status) .EQ.'c') THEN
c1 = CMPLX(num)
WRITE (*,*) *c1 = ', c1
ELSE IF (buf(2:status) .EQ.'d') THEN
d1 = DBLE(num)
WRITE (*,*)'d1 = ', d1
ELSE
W R ITE (Y ) 'Invalid command switch:', buf (1:status)
END IF
END DO
END
NEAREST
Описание: возвращ ает самое близкое число (представим ое на процессоре) в данном
направлении.
Синтаксис: result = N E A R EST (х, s).
Класс: элементная функция; родовая.
242 С Д Ачгатн, В В. Кондратьев. Програмирование на Visual FORTRAN
N IN T
Описание: возвращ ает сам ое близкое целое число к параметру.
С и н та кси с: result = N IN T (а [, kind]).
К ласс: элементная функция; родовая.
Параметры : а долж ен иметь тип "действительное", kind (opt) долж ен быть инициали
зированны м скалярны м целочисленны м выражением.
Р езультаты . Тип результата - целое число. Если kind присутствует, родовой пара
метр результата указы вается kind; иначе родовой параметр результата - родовой пара
метр целого типа по ум олчанию . Если процессор не мож ет представить значение резуль
тата в kind, результат неопределенны й.
Если а больш е, чем нуль, N IN T (а) имеет значение INT (а + 0.5); если а м еньш е или
равно нулю , N IN T (а) имеет значение INT (а - 0.5).
Собственное имя Тип параметра Tun результата
ININT REAL(4) INTEGER®
NINT1-2 REAL(4) INTEGER(4)
KNINT REAL(4) INTEGER(8)
IIDNNT REAL(8) INTEGER(2)
IDNINT2-3 REAL(8) INTEGER(4)
KIDNNT REAL(8) INTEGER(8)
IIQNNT REALO 6) INTEGER(2)
IQNINT2-4 REAL(16) INTEGER(4)
KIQNNT5 REALO 6) INTEGER(8)
1 Или JNINT
2 Установка опций компилятора, указывающих размер целого числа, может затронуть NINT, IDNINT и IQNINT.
3 Или JIDNNT. Для совместимости со старыми версиями Fortran, IDNINT может быть указана как родовая функция
4 Или JIQNNT. Для совместимости со старыми версиями Fortran, IQNINT может быть указана как родовая функция.
5 Эту собственную функцию нельзя передавать как фактический параметр.
Примеры
N1NT (3.879) им еет значение 4.
N1NT (-2 .7 8 9 ) имее '1 зн а ч е н и е - 3 .
NOT
Описание: возвращ ает логическое отрицание параметра.
С и н та кси с: result = N O T (/).
К ласс: элем ентная ф ункция; родовая.
Параметр: / долж ен им еть тин "целочисленное".
Р езультаты . Т ип результата - тот же, что и у /. Значение результата получается поби
товы м дополнением / согласно следую щ ей таблице истинности:
Глава 8 Встроенные процедуры 243
1 N01(1)
1 О
О 1
М одели для интерпретации целочисленного значения как п оследовательность битов
показаны в прил. 0 -3 .
Собственное имя Тип параметра Тип результата
B N0T INTEGER(I) IN TEG ER 0)
IN 0T (или HN0T) IN TE G E R ® IN T E G E R ®
JN 0T INTEGERS) INTEGERS)
KNOT IN TE G E R ® IN TE G E R ®
Пример
Если 1 им еет значение, равное 10101010 (основание 2), N O T (l) им еет значение
01010101 (основание 2).
NULL
Описание: инициализирует указатель как разъединенны й, когда он заявляется. Это -
новая встроенная процедура в Fortran 95.
Синтаксис: result = N U LL ([mold]).
Класс: трансф орм ационная функция; родовая.
Параметр: m old (opt) долж ен бы ть указателем; он м ож ет им еть лю бой тип. Его со
стояние связывания м ож ет быть: связанны й, разъединенны й или неопределенны й. Если
его состояние - связанны й, адресат не долж ен бы ть определен со значением .
Результаты . Тип результата - тот же, что и у m old (если он присутствует); иначе он
определяется так, как показано в таблице.
Если появляется NULLQ: Тип определяется из'
На правой стороне назначения указателя Указателя на левой стороне
Объект
Как инициализация для объекта в объявлении
Компонент
Как инициализация по умолчанию для компонента соответст Соответствующий компонент
вующий макет Соответствующий формальный аргумент
В конструкторе структуры
Как фактический параметр Соответствующий указатель объекта
В утверждении DATA
Результат - указатель с разъединенны м состоянием связы вания.
Пример
INTEGER, PO IN TER :: P0INT1 => NULL()
Это утверж дение определяет начальное состояние связы вания для PO IN T 1, которы й
будет разъединенным.
PACK
Описание: берет элементы из массива и упаковы вает их в одноранговы й массив под
управлением маски.
Синтаксис: result = PACK (array, mask [, vector]).
Класс: трансформ ационная функция; родовая.
Параметры: array долж ен бы ть массивом (лю бого типа данны х); m ask долж ен им еть
логический тип и соответствовать array, определяет, какие элем енты взяты из a rra y; vec
tor (opt) долж ен бы гь одноранговым массивом с тем и же сам ы м и параметрами ти п а и ти
244 С. Д. А казни, В. В Кондратьев Програмирование на Visual FORTRAN
пом что и array. Его разм ер долж ен бы ть по крайней мере t, где t - число истинных эле
ментов в mask. Если mask - скаляр со значением истина, vector долж ен иметь по крайней
мере столько элем ентов, сколько есть в array. Элементы в vector использую тся, чтобы
заполнить м ассив результата, если в нем недостаточно м ного элем ентов для отобранных
mask.
Р езультаты . Результат - одноранговы й массив с теми же самы ми параметрами типа и
того же типа что и у array. Если vector присутствует, размер результата - размер vector.
И наче, размер результата - число истинных элем ентов в mask или число элементов в ar
ray (если mask - скаляр со значением истина).
Элементы в array обрабаты ваю тся в порядке элем ентов массива, чтобы сф ормировать
массив результата. Э лем ент / результата является элементом array , который соответству
ет i-му истинному элем енту mask. Если vector присутствует и имеет больш е элементов,
чем в mask есть истинны х значений, лю бы е элементы результата, которые являю тся пус
ты м и (потому что они не бы ли истинны согласно mask), собираю тся в соответствую щ ие
значения vector.
Примеры
080
П усть N является массивом ООО
700
PACK (N, M A SK EN .NE. 0, V E C T O R ^ /l, 3, 5, 9, 11, 13/)) производит результат (7, 8,
5 ,9 , 11, 13).
PACK (N, M A SK EN .NE. 0) производит результат (7, 8).
POPCNT
Описание: возвращ ает число единичны х битов в целочисленном параметре.
С ин та ксис: result = PO PC N T (/).
Класс: элем ентная ф ункция; родовая.
Параметры : / долж ен им еть тип "целочисленное" или "логическое".
Р езультаты . Тип результата - тот же, что и у /. Значение результата - число первых
битов в двоичном представлении целого числа /.
М одели для интерпретации целочисленного значения как последовательность битов
показаны в прил. D-3.
Пример
Если значение 1 - В '0 ...0 0 0 1 1010110', значение PO PCN T (1) равно 5.
POPPAR
Описание: возвращ ает четность целочисленного параметра.
С ин та ксис: result = PO PPA R (/).
К ласс: элем ентная ф ункция; родовая.
Параметр: / долж ен им еть тип "целочисленное" или "логическое".
Р езультаты . Тип результата - гот же, что и у /. Если число единичны х битов в двоич
ном представлении целого числа / - нечетное, значение результата равно 1. Если четное
число, значение результата равно нулю.
PO PPA R (/) является тем же самым что и 1 .AND. POPCN T(/).
М одели для интерпретации целочисленного значения как последовательность битов
показаны в прил. D-3.
Глава 8 Встроенные процедуры 245
Пример
Если значение I - В '0...00011010110', значение PO PPA R (I) равно 1.
P R E C IS IO N
Описание: возвращ ает десятичную точность в модели, представляю щ ей вещ ествен
ные числа с тем же самым родовы м параметром, что и исходный параметр.
Синтаксис: result = PRECISIO N (л).
Класс: функция запроса; родовая.
Параметр: х долж ен иметь тип "действительное" или "ком плексное"; м ож ет бы ть
скаляром или массивом значений.
Результаты . Результат - скаляр целого типа по умолчанию . Результат им еет значение
INT((D IG ITS(X ) - 1) * LOG 10(RAD1X(X))). Если RA D IX(X ) является интегральной сте
пенью 10, единица добавляется к результату.
Пример
Если X - значение REA L(4), PRECISIO N (X) имеет значение 6. Значение 6 получено
из 1NT ((24-1) * LOGIO (2.)) = 1NT (6.92 ...). Для получения дополнительной информ ации
о модели для REAL (4) см. прил. D-2.
PRESENT
Описание: возвращ ает, действительно ли необязательный ф орм альны й параметр
присутствует, т. е. имеет ли он связанны й фактический параметр.
Синтаксис: resu lt = PR E SE N T (¿7 ).
Класс: функция запроса; родовая.
Параметр: а долж ен бы ть параметром текущ ей процедуры и долж ен иметь атрибут
OPTIONAL. Явный интерфейс для текущ ей процедуры долж ен бы ть видимы м для вы зы
вающей ее программы (см. разд. 7.11).
Результаты . Результат является скаляром логического типа по ум олчанию . Результат
равен .TRUE., если ф орм альны й параметр присутствует; иначе - .FALSE.
Пример
MODULE MYM0D
CONTAINS
SUBROUTINE CHECK (X, Y)
REAL X ,Z
REAL, OPTIONAL:: Y
USE MYMOD
CALL CHECK (15.0,12.0)! Устанавливает Z равным 12 0
CALL CHECK (15.0) ! Устанавливает Z равным 30.0
PRODUCT
Описание: возвращ ает произведение всех элементов во всем массиве или в указан
ном измерении массива.
246 С Д А чгазии, В В Кондратьев. Програмировануе на Visual FORTRAN
Q CM PLX
Описание: преобразовы вает параметр в тип CO M PL E X (16). Эту функцию нельзя пе
редавать как фактический параметр.
С ин та кси с: result = Q C M PL X (х [,у]).
Класс: элем ентная функция; собственная.
Параметры : х долж ен иметь тип "целочисленное", "действительное" или "комплекс
ное"; v (opt) долж ен иметь тип "целочисленное" или "действительное", не должен при
сутствовать, если х им еет комплексны й тип.
Р езультаты . Тип результата - CO M PL E X (16) (или C O M PLEX *32).
Если появляется только один не комплексны й параметр, он преобразовывается в ве
щ ественную часть значения результата и нуль присваивается мнимой части. Если у не
указано, а х комплексное, значение результата равно C M PL X (R E A L (X ), A IM AG(X)).
Гпава 8 Встроенные процедуры 247
Если появляю тся 2 не комплексны х параметра, создается комплексное число, преоб
разовывая первый параметр в вещ ественную часть значения, а второй параметр в м ни
мую часть.
QCM PLX (X, Y) имеет комплексное значение, вещ ественная часть которого равна
REA L(X , KIN D =16), а мнимая часть - REA L(Y , K IN D =16).
Примеры
Q CM PLX (-3 ) имеет значение (-3 .0 Q 0 , 0.0Q0).
QCM PLX (4.1, 2.3) им еет значение (4.1Q 0, 2.3Q0).
QEXT
Описание: преобразовы вает число в действительны й тип учетверенной точности
(REA L (16)).
Синтаксис: result = Q EX T (а).
Класс: элем ентная функция; родовая.
Параметр: ¿/должен иметь тип "целочисленное", "действительное" или "комплексное".
Результаты . Тип результата - REA L(16) (REA L* 16). Ф ункции, которы е применяю тся
для преобразования одного типа данны х в другой тип, им ею т гот же эффект, что и неяв
ное преобразование в операторах присваивания.
Если а имеет тип REAL( 16), результат имеет значение без преобразования (QEXT (а) - а).
Если а имеет тип "целочисленное" или "действительное", результат имеет такую
больш ую точность значащ ей части а , какую мож ет содерж ать значение REA L(16).
Если а имеет комплексны й тип, результат имеет такую больш ую точность значащ ей
части вещ ественной части а , какую значение RE A L (16) может содерж ать.
Собственное имя1 Тип параметра Тип результата
INTEGER(I) REAL(16)
INTEGER® REAL(16)
INTEGERS) REAL(16)
INTEGERS) REAL(16)
QEXT REAL(4) REAL(16)
QEXTD REAL(8) REAL(16)
REAL(16) REAL(16)
COMPLEX(4) REAL(16)
C0MPLEX(8) REAL(16)
C0MPLEX(16) REAL(16)
1 Эти собственные функции нельзя передавать как фактические параметры.
Примеры
Q EX T (4) имеет значение 4.0 (округленно; имеется 32 места справа ог десятичной
точки).
Q EX T ((3.4, 2.0)) имеет значение 3.4 (округленно; имеется 32 места справа от деся
тичной точки).
Q FLO AT
Описание: преобразовы вает целое число в действительны й тип учетверенной точно
сти (REAL (16)).
Синтаксис: result = Q FLO A T (а).
Класс: элементная функция; родовая.
Параметр: о д о л ж ен иметь тип "целочисленное".
Результаты . Тип результата REA L(16) (REA L* 16).
248 С Д A ’U'cHiifi, В В Кондратьев Програмированне на Visual FORTRAN
Ф ункции, которы е преобразовы ваю т один тип данны х в другой тип, имею т тог же
эффект, что и неявное преобразование в операторах присваивания.
Пример
Q FL O A T (-4 ) им еет значение-4.0 (округленно; им еется 32 знака справа от десятичной
точки).
QNUM
Описание: преобразовы вает строку сим волов в значение R EA L (16).
Син та ксис: result = Q N U M (/).
Класс: элем ентная функция; собственная.
Параметр: / долж ен иметь тип "символьное".
Р езультаты . Тип результата R EA L(16). Значение результата является действитель
ным значением , представленны м строкой сим волов /.
Пример
Q N U M ("-174.23") им еет зн ач ен и е-174.23 типа R EA L(16).
QREAL
Описание: преобразовы вает вещ ественную часть параметра CO M PLEX (16) в тип
REA L(16). Это - собственная функция, которая не им еет никакой родовой функции, свя
занной с ней. Ее нельзя передавать как фактический параметр.
С и н та кси с: result = Q R E A L (а).
Класс: элем ентная функция; собственная.
Параметр: а долж ен иметь тип C O M PL EX (16) (или CO M PL E X *32).
Р езультаты . Т ип результата - действительное учетверенной точности (REAL(16) или
REAL* 16).
Пример
Q RE A L ((2.0q0, 3.0q0)) имеет значение 2.0q0.
R A D IX
Описание: возвращ ает основание м одели, представляю щ ей числа того же самого ти
па и родовы х параметров, что и параметр.
С ин та ксис: result = RA D IX (х).
К ласс: функция запроса; родовая.
Параметр: х долж ен иметь тип "целочисленное" или "действительное"; он может
быть скаляром или массивом значений.
Результаты . Результат - скаляр целого типа по ум олчанию . Д ля целочисленного па
рам етра, результат им еет значение г (как определено в прил. D). Д ля действительного па
рам етра результат имеет значение b (как определено в прил. D-2).
Пример
Если X - значение REA L(4), RA D IX (X) имеет значение 2.
RA N
Описание: возвращ ает следую щ ее число из последовательности псевдослучайных
чисел однородного распределения в диапазоне от 0 до 1. Это - собственная функция, ко
торая не имеет никакой родовой функции, связанной с ней. Ее нельзя передавать как
ф актический параметр.
RAN не является функцией без побочного эффекта.
Си н та кси с: result = RAN (/).
Глава 8. Встроенные процедуры 249
Класс: неэлементная функция; собственная.
Параметры: / является начальным числом, долж ен бы ть перем енной или элем ентом
м ассива IN TEG ER(4). Значение / первоначально устанавливается в больш ое, нечетное
целочисленное значение. Ф ункция RAN запом инает значение в параметре, который поз
же используется, чтобы вычислить следую щ ее случайное число. Н ет никаких огран и че
ний на начальное число, хотя оно долж но бы ть инициализировано разны ми значениями
при различных выполнениях, для того чтобы получить другие случайны е числа.
Результаты . Т ип результата - REA L(4). Р езультат - число с плаваю щ ей точкой, ко
торое однородно распределено в диапазоне между 0.0 вклю чая и 1.0 исклю чая. О но уста
навливается равным значению , связанном у с параметром /.
Пример
В RAN (I), если переменная / имеет значение 3, RAN им еет значение 4 .8 2 2 0 158Е-05.
RANDOM SEED
Описание: изм еняет или запраш ивает начальное число (отправную точку) для гене
ратора псевдослучайны х чисел, используем ого R A N D O M N U M B E R .
С и н та кси с: C A LL R A N D O M S E E D ([size] I put] I get]).
К ласс: подпрограмм а.
Параметры : м ож ет бы ть указано не более одного параметра. Если никакой параметр
не указан, назначается случайное число, основанное на дате и времени как начальном
числе. И меется 3 необязательны х п арам етра':
■ size (opt) долж ен бы ть скаляром типа "целочисленное". Он устанавливает число целых
чисел (N), которые процессор использует, чтобы п о д д е р ж и в а в значение начального
числа.
■ p u t (opt) долж ен бы ть целочисленны м массивом ранга единица и размера > N. Он ис
пользуется, чтобы сбросить значение н ачальн ою числа.
■ g e t (opt) долж ен бы ть целочисленны м массивом ранга единица и размера > N. Он ус
танавливает текущее значение начального числа.
Вы м ож ете определить размер массива, используем ого процессором, чтобы запом
нить начальное число, вызывая RA N D O M SEED с параметром size (см. второй пример
ниже).
Пример
CALL RANDOM_SEED ! Процессор инициализирует начальное число
1беспорядочно из даты и времени
CALL RANDOM.SEED (SIZE = М) ! Устанавливает М в N
CALL RANDOM.SEED (PUT = SEED (1 : M)) ! Устанавливает начальное число пользователя
CALL RANDOM_SEED (GET = OLD (1 : M)) ! Читает текущее начальное число
Рассм отрим другой пример:
INTEGER I
RANDU
Описание: вы числяет псевдослучайное число как значение с одинарной точностью .
Синтаксис: C A LL RANDU (/7, i2 ,x ).
Класс: подпрограмма.
Параметры: /7, ¡2 - переменные или элементы массива 1NTEGER(2), которы е сод ер
жал начальное число (seed) для того, чтобы вы числить случайное число. Эти значения о б
новляю тся во время вычислений так, чтобы они содерж али обновленное начальное чис
ло; х - переменная или элем ент массива R EA L(4), в котором вы численное случайное
число будет возвращ ено. Результат возвращ ается в jc, который долж ен иметь тип
REAL(4). Значение результата - псевдослучайное число в ди ап азоне от 0.0 к 1.0. А лго
ритм для того, чтобы вычислять значение случайного числа, основы вается на значениях
для /7 и 12.
Если /7=0 и /2=0, база генератора устанавливается следую щ им образом:
Х(п + 1) = 2**16 + 3
И наче она устанавливается следую щ им образом:
Х(п + 1) = (2**16 + 3) * X(n) mod 2**32
База генератора X(n + 1) запоминается в /7, /2. Р езультат X (n + 1) м асш табируется к
действительном у значению Y(n + 1), для 0.0 < Y(n + 1) < 1.
Пример
REALX
INTEGER® I, J
CALL RANDU (I, J, X)
Если 1 и J имею т значения 4 и 6, в X запоминается значение 5.4932479Е-04.
RANGE
Описание: возвращ ает десятичны й диапазон экспоненты в модели, представляю щ ей
числа с тем же самым родовым параметром, что и исходный параметр.
Синтаксис: result = RA N G E (х)
Класс: функция запроса; родовая.
Параметры: х долж ен иметь тип "целочисленное", "действительное" или "ком плекс
ное"; он может быть скаляром или массивом значений.
Результаты . Результат - скаляр целого типа по ум олчанию .
Для целочисленного параметра результат имеет значение 1NT (LO G 10 (H U G E (X))).
Для информации относительно целочисленной модели см. прил. D.
Для действительного или комплексного параметра результат им еет значение 1NT
(M IN (LOGIO (HU G E (X )),-LO G 10 (TINY (X)))). Для информ ации относительно дей стви
тельной модели см. прил. D-2.
252 С Д Алгазин, В В. Кондратьев Програмированис на Visual FORTRAN
Пример
Если X - значение REA L (4), RANGE (X) им еет значение 37. (H U G E (X) = (1 - 2“
24)*2 128 и t i n y (X) = 2~126).
REAL
Описание: преобразовы вает значение в действительны й тип.
Син та кси с: result = R EA L (а [, kind]).
К ласс: элем ентная ф ункция; родовая.
Параметры : а долж ен иметь тип "целочисленное", "действительное" или "комплекс
ное"; kind (opt) долж ен бы ть инициализированны м скалярным целочисленны м вы раж е
нием.
Результаты . Тип результата "действительное". Если параметр kind присутствует, ро
довой парам етр результата указы вается kind\ иначе родовой параметр результата - родо
вой параметр дей стви тельн ого типа по умолчанию . Если процессор не мож ет предста
вить значение результата в kind, результат неопределенный.
Ф ункции, которы е преобразовы ваю ! один тип данных в другой тип, имею т тот же
эффект, что и неявное преобразование в операторах присваивания.
Если а является целочисленным или действительным, результат равен приблизительно а.
Если а является комплексным, результат равен приблизительно вещественной части а.
Собственное имя1 Тип параметра Тип результата
INTEGER(I) REAL(4)
FL0ATI INTEGER® REAL(4)
FLOAT2-3 INTEGERS) REAL(4)
REAL2 INTEGERS) REAL(4)
FL0ATK INTEGERS) REAL(4)
REAL(4) REAL(4)
SNGL2-4 REAL(8) REAL(4)
SNGLQ REAL(16) REAL(4)
C0MPLEX(4) REAL(4)
C0MPLEX(8) REAL(8)
1 Эти собственные функции нельзя передавать как фактические параметры.
2 Задание опций компилятора, указывающих размер действительного числа, может затронуть FLOAT, REAL и SNGL.
3 Или FLOATJ. Для совместимости со старыми версиями Fortran FLOAT может быть указана как родовая функция
4 Для совместимости со старыми версиями Fortran SNGL может быть указана как родовая функция Родовая SNGL включа
ет собственную функцию REAL, которая берет параметр REAL(4) и вычисляет результат REAL(4).
Примеры
REA L (-4 ) им еет значение -4 .0 .
REA L (Y) им еет тот же самый родовой параметр и значение, что и вещ ественная
часть ком плексной переменной Y.
REPEAT
Описание: конкатенирует несколько копий строки.
С ин та кси с: result = R E PE A T (strin g, ncopies).
Класс: трансф орм ационная функция; родовая.
Параметры : string долж ен быть скаляром типа "символьное"; ncopies долж ен быть
скаляром тип а "целочисленное", не долж ен быть отрицательным.
Результаты ю Результат - скаляр типа "символьное" и длнны ncopies * LEN (string).
Родовой параметр - гот же, что и у string. Значение результата - конкатенация ncopies
КТИ 1И И с t r in < r
Глава 8. Встроенные процедуры 253
Примеры
REPEA T ('S', 3) имеет значение SSS.
R EPEA T ('ABC', 0) им еет значение строки нулевой длины .
RESHAPE
Описание: конструирует массивы с различны м и формами.
Синтаксис: result = RESH A PE (source, shape [,p a d ] [, order]).
Класс: трансформ ационная функция; родовая.
Параметры:
source долж ен быть массивом (лю б о ю типа данны х). Он поставляет элем енты для
массива результата. Его размер долж ен быть больш е или равны м ?R O D \JC T (shape), если
p a d оиуихън или иметь размер нуль.
shape долж ен быть целочисленны м массивом до 7 элем ентов, с рангом единица и п о
стоянным размером. Он определяет форму м ассива результата. Его размер долж ен быть
положительным; е ю элемент ы не долж ны иметь отрицательны х значений.
p a d (opt) долж ен быть массивом с тем же самым типом и родовы м и парам етрам и, чго
и source. Он используется, чтобы запомнить дополнительны е значения, если массив р е
зультата больш е чем source.
order (opt) должен быть целочисленны й массив с той же форм ой, чго и shape. Его
элементы должны быть перестановкой (1,2, ..., п), где п - размер shape. Если order оп у
щен, он, как предполагаю т, равен (1,2..., п).
Результаты . М ассив формы shape с тем же типом и родовы м и параметрами, что и
source. Размер результата - произведение значений элем ентов shape.
В массиве результата, элементы массива source помещ ены в порядке изм ерений, у к а
занных в соответствии с order. Если order опущ ен, элементы массива помещ аю тся
в обычном порядке элем ентов массива.
Элементы массива source (источника) сопровож даю тся (в случае необходим ости)
элементами массива p a d (т клавиатуры) в порядке элем ентов массива. В случае необхо
димости дополнительны е копии p a d (клавиатуры) не следую т, пока все элемент ы м асси
ва р е з у л ь т а т не получат значения.
Примеры
"3 5 7]
RESH APE ((/3, 4, 5, 6, 7, 8/), (/2, 3/)) имеет значение
4(3 8
34 56
RESH A PE ((/3, 4, 5, 6, 7, 8/), (/2, 4/), (/1, 1/), (/2, 1/)) имеет значение
7 8 11
RNUM
Описание: преобразовывает строку сим волов в значение REA L(4).
Синтаксис: result = RNUM (/).
Класс: элементная функция; собственная.
Параметр: / долж ен иметь тин "символьное".
Результаты . Тин результата - R £A L (4). Значение результата - действительное зн аче
ние, представленное строкой сим волов /.
Пример
RNUM ("821.003") имеет значение 821.003 типа REA L(4)
254 С Д Алгазин, В В Кондратьев Програмированне на Visual FORTRAN
R R S P A C IN G
Описание: возвращ ает обратную величину относительного интервала модельных чи
сел около значения параметра.
С интаксис: result = R R SPA C IN G (х).
Класс: элементная функция; родовая.
Параметр: х долж ен им еть тип "действительное".
Р езультаты . Тип результата - тот же, что и у х. Результат имеет значение | х*Ь~е |*ЬР.
П араметры Ь ,е н р определены в прил. D-2.
Пример
Если - 3 .0 является значением одинарной точности, т.е. REA L(4), RRSPA CING (-3.0)
им еет значение 0.75*224.
SCA LE
Описание: возвращ ает значение экспонентной части (модели для параметра), изме
ненное при помощ и указанного значения.
Синтаксис: result = SCA LE (х, /)
Класс: элем ентная функция; родовая.
Параметры: х долж ен иметь тип "действительное"; / долж ен иметь тип "целочислен
ное".
Результаты . Тип результата - тот же, что и у х. Результат имеет значение х*Ь'. П ара
метр b определен в прил. D-2.
Пример
Если 3.0 является значением одинарной точности, т. е. REA L(4), SCALE (3.0, 2) имеет
значение 12.0, a SCALE (3.0, 3) им еет значение 24.0.
SCAN
Описание: просм атривает строку для поиска лю бого сим вола в ряде символов.
Син та ксис: result = SCAN (string, set [, back] [, kind]).
Класс: элем ентная функция; родовая.
Параметры: string долж ен иметь тип "символьное"; set долж ен иметь тип "символь
ное" с тем ж е самым родовы м параметром что и strin g; back (opt) долж ен иметь тип "ло
гическое"; kind (opt) долж ен бы ть инициализированны м скалярным целочисленным вы
раж ением.
Р езультаты . Тип результата - целое число. Если параметр kind присутствует, родо
вой параметр результата указы вается kind\ иначе родовой параметр результата - родовой
параметр ц ел о ю типа по ум олчанию . Если процессор не м ож ет представить значение ре
зультата в kind, результат неопределенны й.
Если back опущ ен (или присутствует со значением ложь), a string имеет по крайней
мере 1 символ, который находится в se t, значение результата - это позиция крайнего ле
вого сим вола string, который находится в set.
Если back присутствует со значением истина, a string имеет по крайней мере 1 сим
вол, который находится в se t, значение результата - это позиция сам о ю правого символа
strin g, который находится в set.
Если никакой символ string не находится в set или длине строки, или set - нуль, зна
чение результата - нуль.
Установка опций компилятора, указы ваю щ их разм ер целого числа, может затронуть
эту функцию .
Глава 8 Встроенные процедуры 255
Примеры
SCAN ('A STRIN G ', 'ST') им еет значение 2.
SCAN ('A STRIN G ', 'ST', B A C K =.TR U E .) им еет значение 3.
SCAN ('A STRIN G ', 'CD') им еет значение нуль.
S EC N D S
Описание: обеспечивает системное время дня или прош едш ее время, как значение с
плавающей точкой в секундах. Эго - собственная функция, которая не имеет никакой ро
довой функции, связанной с ней. Ее нельзя передавать как фактический параметр.
SECNDS не является функцией без побочного эффекта, таким образом , на нее нельзя
ссылаться в конструкции FORALL.
Синтаксис: result = SECN DS (х).
Класс: элементная функция; собственная.
Параметр: х долж ен иметь тип REA L(4).
Результаты . Тип результата - тот же, что и у х. Значение результата равно времени в
секундах с полуночи - х . (Ф ункция такж е вычисляет правильны е результаты для интерва
лов времени, которые охватывают полночь.)
Значение SECNDS имеет точность равную 0.01 секундам , которая являю тся разре
ш ающей способностью системны х часов. В течение приблизительно одного дня точность
для разреш аю щ ей способности системны х часов обеспечиваю т 24 бита. О днако мож ет
произойти потеря точности, если вы пы таетесь вычислит ь очень м аленькие прош едш ие
времена в конце дня.
Пример
Демонстрирует как использовать SEC N D S, чтобы выполнить вычисления п рош едш е
го времени:
С НАЧАЛО ВРЕМЕННОЙ ПОСЛЕДОВАТЕЛЬНОСТИ
Т1 = SECNDS(O.O)
С КОД ДЛЯ ПОДСЧЕТА ВРЕМЕНИ
S E L E C T E D IN T K IN D
Описание: возвращает значение родового параметра целочисленного типа данных.
Синтаксис: result = SELECTED INT K IN D (/;)
Класс: трансформационная функция; родовая.
Параметры: р должен быть скаляром типа "целочисленное".
Результаты : скаляр целого типа но умолчанию . Результат имеет значение, равное
значению родового параметра ц ел оч ислен ною типа данны х, который представляв! все
значения п в диапазоне значений п с - 1 0 р < п < 10р.
Если никакой такой тип родового параметра не доступен на процессоре, результат р а
вен -1 . Если больш е чем 1 тип р о д о в о ю параметра удовлетворяет критериям, возвращ ае
мое значение - тип родового параметра с наим еньш им десятичны м диапазоном экспо
ненты (см. прил. D).
Пример
SELECTEDJNTKIND (6) = 4
S E L E C T E D R E A L K IN D
Описание: возвращ ает значение родового парам етра действительного типа данных.
Синтаксис: result = SELECTED REA L KIN D ([р] [, г]).
256 г д л.,.’азин . 5 # К он драт ьев . П роклам ирование на Visual FORTRAN
SETEX PO N EN T
Описание: возвращ ает значение экспонентной части (модели для параметра) уста
новленной к указанном у значению .
Син та ксис: result = SET E X PO N E N T (jc, /').
Класс: элем ентная функция; родовая.
Параметры: jc долж ен иметь тип "действительное"; / долж ен иметь тип "целочислен
ное".
Р езультаты . Тип результата - то т же, что и у х. Результат имеет значение jc*b,_e. П а
рам етры b и е определены в прил. D-2. Если л* имеет значение нуль, результат - нуль.
Пример
Если 3.0 - значение R EA L(4), SET EX PO N EN T (3.0, 1) им еет значение 1.5.
SHAPE
Описание: возвращ ает форму м ассива или скалярного параметра.
С ин та кси с: result = SH A PE (source [, kind]).
Класс: функция запроса; родовая.
Параметры:
source - скаляр или массив лю бого типа данных. Он не долж ен быть массивом пере
ним аю щ его размера, разъединенны м указателем или м ассивом, который не размещен.
kind (opt) долж ен бы ть инициализированны м скалярным целочисленны м выражением.
Результаты : одноранговы й целочисленны й м ассив, разм ер которого равен рангу
source.
Если параметр kind присутствует, родовой параметр результата указывается kind\
иначе родовой параметр результата - родовой параметр целого типа по умолчанию . Если
процессор не может' представить значение результата в kind, результат неопределенный.
Значение результата - форм а source.
У становка опций компилятора, указы ваю щ их размер целого числа, может затронуть
эту функцию .
Глава 8 Встроенные процедуры 257
Пример
SHA PE (2) имеет значение однорангового м ассива нулевого размера.
Если В объявлен как В (2 :4 -3 :1 ), то SH A PE (В) им еет значение (3, 5).
S H IF T L
Описание: логически сдвигает целое число влево на указанное число битов.
С интаксис: result = SHIFTL (ivalue, ishift).
Класс: элементная функция; собственная.
Параметры: ivalue долж ен иметь тип 1NTEGER(4), значение которого будет сдвину
то. ishift долж ен иметь тип 1NTEGER(4) и бы ть полож ительны м ; его значение равно чис
лу позиций для сдвига.
Результаты . Тип результата - 1NTEGER(4). Результат - значение ivalue, сдвинутое
влево на ishift битовых позиций. Биты, вы двинуты е в левом конце, потеряны ; нули вдви
гаю тся с противополож ного конца. SH IFTL (i, j) является тем же, что и 1SHA (i, j).
S H IF T R
Описание: логически сдвигает целое число вправо на указанное число битов.
С интаксис: result = SH IFTR (ivalue, ishift).
Класс: элементная функция; собственная.
Параметры: ivalue долж ен иметь тип 1NTEGER(4), значение которого будет сдвину
то; ishift долж ен иметь тип IN TEG ER(4) и бы ть полож ительны м ; его значение равно чис
лу позиций для сдвига.
Результаты . Т ип результата - 1NTEGER(4). Результат - значение ivalue, сдвинутое
вправо на ishift битовых позиций. Биты, вы двинуты е в правом конце, потеряны; нули
вдвигаю тся с противополож ного конца.
SH IFTR (i, j) является тем же, что и 1SHA (i, -j).
S IG N
Описание: возвращ ает абсолю тное значение а со знаком Ь.
С интаксис: result = SIGN (а , b).
Класс: элементная функция; родовая.
Параметры: а долж ен иметь тип "целочисленное" или "действительное"; b долж ен
иметь тот же тип и родовы е параметры, что и а.
Результаты . Тип результата - тот же, что и у а. Значение результата | а |, если b > О
и - | а |, если b < 0.
Если b имеет тип "действительное" и значение нуль, значение результата равно | а |.
О днако если процессор мож ет различить полож ительны й и отрицательны й дей стви тель
ные нули, и указана соответствую щ ая опция компилятора, происходит следую щ ее:
Если b является положительны й действительны й нуль, значение результата | а |.
Если b является отрицательный действительны й нуль, значение результата - \ а \ .
Собственное имя Тип параметра Тип результата
BSIGN INTEGER(I) INTEGER(I)
IISIGN (или HSIGN) INTEGER® INTEGER®
ISIGN1 INTEGERS) INTEGERS)
KISIGN INTEGER® INTEGER®
SIGN REAL(4) REAL(4)
DSIGN REAL® REAL®
QSIGN REAL(16) REAL(16)
1Или ЛБЮМ. Для совместимости со старыми версиями Ро11гап 1БЮМ может быть указана как родовая функция.
258 С Д. Ачгспии, В В Кондратьев Програмированые на Visual FORTRAN
Примеры
SIGN (4.0, -6 .0 ) им еет значение -4 .0 .
SIGN (-5 .0 , 2.0) им еет значение 5.0.
SIN
Описание: вы числяет синус х.
С и н та кси с: result = SIN {.v).
Класс: элем ентная функция; родовая.
Параметры : х долж ен иметь тип "действительное" или "комплексное", долж ен быть
задан в радианах и обработан по модулю 2 *ти. Если jc имеет комплексны й тип, его вещ е
ственная часть расценивается как значение в радианах.
Результаты . Тип результата - гот же, что и у х.
Собственное имя Tun параметра Tun результата
SIN REAL(4) REAL(4)
DSIN REAL(8) REAL(8)
QSIN REAL(16) REAL(16)
CSIN1 C0MPLEX(4) C0MPLEX(4)
CDSIN2 COMPLEX® COMPLEX®
CQSIN C0MPLEX(16) C0MPLEX(16)
1 Установка опций компилятора, указывающих размер действительного, может затронуть CSIN.
2 Эта функция может быть указанна как ZSIN
Примеры
SIN (2.0) им еет значение 0.9092974.
S1N (0.8) им еет значение 0.7173561.
S IN D
Описание: вы числяет синус .y.
С и н та кси с: result = SIN D (.y).
Класс: элем ентная функция; родовая.
Параметры : х долж ен иметь тип "действительное"; долж ен бы ть задан в градусах и
обработан по м одулю 360.
Р езультаты . Тип результата - тот же, что и у jc .
Собственное имя Tun параметра Tun результата
SIND REAL(4) REAL(4)
DSIND REAL® REAL®
QSIND REAL(16) REAL(16)
Примеры
SIN D (2.0) им еет значение 3.4899496Е -02.
SIN D (0.8) им еет значение 1.3962180Е-02.
S IN H
Описание: вы числяет гиперболический синус.
С и н та кси с: result = SIN H (*).
Класс: элем ентная функция; родовая.
Параметр: х долж ен иметь тип "действительное".
Результаты . Тип результата - тот же, что и у х.
Глава 8 Встроенные процедуры 259
S IZ E
Описание: возвращ ает общ ее количество элем ентов в м ассиве или предел м ассива по
указанному измерению.
Синтаксис: result = SIZE ( a r r a y [, d im ] [, k in d ] ).
Класс: ф ункция запроса; родовая.
Параметры:
array долж ен бы ть массивом (лю бого типа данны х); не долж ен бы ть разъединенны м
указателем или распределяемы м м ассивом, который не распределен. Он м ож ет бы ть м ас
сивом предполагаемого размера, если присутствует d im со значением м еньш им , чем ранг
array.
d im (opt) долж ен бы ть скалярным целым числом со значением в диапазоне от 1 к п,
где п - ранг array.
k in d (opt) долж ен быть инициализированны м скалярны м целочисленны м вы раж ением .
Результаты . Тип результата - целое число. Если k i n d присутствует, родовой п ара
метр результата указы вается k in d \ иначе родовой параметр результата - родовой п ара
метр целого тина по умолчанию . Если процессор не м ож ет представить значение р езу ль
тата в k in d результата, результат неопределенный.
Если d im присутствует, результат - предел изм ерения d im в a rra y; иначе результат -
общ ее количество элементов в array.
У становка опций компилятора, указы ваю щ их разм ер целого числа, м ож ет затронуть
эту функцию.
Пример
Если В объявлен как В (2:4,-3:1), то SIZE (В, D IM =2) им еет значение 5, a SIZE (В)
имеет значение 15.
S IZ E O F
Описание: возвращ ает число байтов памяти, используем ой параметром . Его нельзя
передавать как фактический параметр.
Синтаксис: result = SIZEO F (л).
Класс: функция запроса; родовая.
Параметр: jc является скаляром или массивом (лю бого типа данны х); не долж ен бы ть
массивом предполагаемого размера.
Результаты. Тип результата - 1NTEGER(4) на процессорах 1А-32 и INTEG ER (8) на про
цессорах Intel Itanium. Значение результата равно числу байтов памяти, используемой jc .
Примеры
S1ZEOF (3.44) имеет значение 4.
SIZEO F ('SIZE') имеет значение 4.
260 С .Д Алгсичн, В В. Кондратьев. Програмирование на Visual FORTRAN
S P A C IN G
Описание: возвращ ает обратную величину из относительного интервала модельных
чисел около значения параметра.
Син та ксис: result = SPA CIN G (л).
Класс: элем ентная ф ункция; родовая.
Параметр: х долж ен им еть тип "действительное".
Результаты . Тин результата - тот же, что и у х. Результат имеет значение Ье р. П ара
метры Ь ,е и р определены в прил. D-2.
Если значение результата - вне действительного модельного диапазона, то результат
равен TIN Y (X).
Пример
Если 3.0 - значение RE A L (4), SPACING (3.0) имеет значение 2 -2 2 .
SPREAD
Описание: создает копию м ассива с добавленны м измерением, делая копии сущ ест
вую щ их элем ентов по указанном у измерению .
С ин та ксис: result = SPR E A D (source, dim , ncopies).
Класс: трансф орм ационная функция; родовая.
Параметры: source долж ен бы ть скаляром или массивом (лю бого типа данных); его
ранг долж ен бы ть м еньш е чем 7.
dim долж ен бы ть скаляром типа "целочисленное"; долж ен иметь значение в диапазоне
от 1 до n + 1 (вклю чая), где п - ранг source.
ncopies долж ен бы ть скаляром типа "целочисленное"; становится пределом дополни
тельного изм ерения результата.
Результаты . М ассив того же типа, что и sou rce, и ранга, который на единицу больш е,
чем у source.
Если source - массив, каж дый элем ент массива в измерении, dim результата равен со
ответствую щ ем у элем енту м ассива source.
Если source - скаляр, результат - одноранговы й массив с ncopies элементами, каждый
со значением source.
Если ncopies < нуля, результат - массив нулевого размера.
Примеры
SPREA D ("В", 1, 4) является сим вольны м массивом (/"В", "В", "В", "В"/).
П усть В является массивом (3, 4, 5) и NC им еет значение 4.
"3 4 5
3 4 5
SPREA D (В, D1M=1, N C O P IE S ^N C ) производит массив
3 4 5
3 4 5
3333
SPREA D (В, D I M ^ , N C O P IE S ^N C ) производит массив 4444
5555
SQRT
Описание: вы числяет квадратны й корень параметра.
С ин та ксис: result = SQ R T (х).
Класс: элем ентная ф ункция; родовая.
Гит а 8 Встроенные процедуры 261
П а р а м е тр : х д олж ен иметь ти п "действительное" или "ком пл ексное". Е сли х им еет
ти и "действительное", то его значение д о л ж н о быть больш е или равным нулю .
Р е зу л ь т а т ы . Т и п результата - то т ж е, что и у х . Результат имеет значение, равное
квадратному ко р ню х . Результат ко м п л екс н о го ти п а равен главном у зн ач ению , с в ещ ест
венной частью , больш ей или равной нулю . К о гд а вещ ественная часть результата - нуль,
мнимая часть больш е или равна нулю .
Собственное имя Тип параметра Тип результата
SQRT REAL(4) REAL(4)
DSQRT REAL(8) REAL(8)
QSQRT REAL(16) REAL(16)
CSQRT1 C0MPLEX(4) C0MPLEX(4)
CDSQRT2 COMPLEX® C0MPLEX(8)
CQSQRT C0MPLEX(16) C0MPLEX(16)
1 Установка опций компилятора, указывающих размер действительного числа, может затронуть CSQRT.
2 Эта функция может быть указанна как ZSQRT
Примеры
SQRT (16.0) имеет значение 4.0.
SQRT (3.0) имеет значение 1.732051.
SUM
Описание: возвращ ает сумму всех элем ентов во всем м ассиве или в указанном изм е
рении массива.
Синтаксис: result = SUM (array [, dim] [, mask]).
Класс: трансформ ационная функция; родовая.
Параметры: array долж ен бы ть м ассив типа "целочисленное", "действительное" или
"комплексное"; dim (opt) долж но бы ть скалярное целое число со значением в диапазоне
от 1 до п, где п - ранг array; mask (opt) долж ен иметь логический тип и соответствовать
array.
Результаты . М ассив или скаляр того же самого типа, что и array. Результат - скаляр,
если dim опущ ен или array имеет ранг 1.
Если dim опущ ен, прим еняю тся такие правила:
■ Если SUM (array) указано, результат - сум м а всех элем ентов array. Если array имеет
размер нуль, результат равен нулю.
■ Если SUM (array, M A SK =rnask) указано, результат - сум м а всех элем ентов array, со
ответствую щ их истинным элем ентам mask. Если array имеет размер нуль или каждый
элемент mask имеет значение .FA LSE., результат равен нулю.
Если dim указан, применяю тся такие правила:
■ Если array имеет ранг 1, значение является тем же, что и SUM (array [,MASK=/was&]).
■ Результат м ассива имеет ранг, который меньш е, чем arra y, и имеет форму (d |, d 2, ...,
^DiM-h dniM+ь •••> dn)> где (d |, d 2, d n) —форма array.
Значение элемента (si, S2, Sdim-i> Sqimh. ..., sn) из SUM (array, dim [,mask]) является
равным SUM (array ( s h s2, ..., sD|M^i, sD|M+i, sn) [,M A SK = mask (s h s2, ..., Soim-i,
Sdimh» —» s„)]).
Примеры
SUM ((12, 3, 4/)) возвращ ает значение 9 (сумма 2 + 3 + 4).
SUM ((/2, 3, 4/), D IM -1 ) возвращ ает тот ж е самый результат.
SUM (В, M A SK =B .LT. 0.0) возвращ ает ариф метическую сум м у отрицательны х эле
ментов В.
262 С Д А'¡газин. В В Кондратьев Програмирование па Visual FORTRAN
'1 2 3 "
П усть С является массивом
456
SUM (С, D1M =1) возвращ ает значение (5, 7, 9), которое является суммой всех элемен
тов в каж дом столбце: 5 - сумма 1 + 4 в столбце 1; 7 - сумма 2 + 5 в столбце 2 и т. д.
SUM (С, D IM :=2) возвращ ает значение (6, 15), которое является суммой всех элементов в
каж дой строке: 6 - сумма 1 + 2 + 3 в строке 1; 15 - сумма 4 + 5 + 6 в строке 2.
SYSTEM C L O C K
Описание: возвращ ает целочисленны е данны е из реальны х часов. S Y S T E M C L O C K
возвращ ает число секунд ирош едш их от 00:00 К оординированного среднегринвичского
времени (CU T) 1 января 1970. Число возвращ ается без смещ ения. Чтобы иолучить про
ш едш ее время, надо вызвать SYSTEM C LO CK дваж ды и вычесть начальное значение
времени из конечного значения.
Син та ксис: CA LL SY ST E M _C L O C K ([count] [, count rate] [, count max]).
Класс: подпрограмма.
Параметры. Есть 3 необязательны х п арам етра1:
count (opt) долж ен бы ть скаляром типа "целочисленное". Он устанавливает значение,
основанное на текущ ем значении часов процессора. Значение увеличивается на единицу
для каж дого счетчика часов, пока значение count max не будет достигнуто и сбрасывает
ся к нулю в следую щ ем счетчике (count находиться в диапазоне от 0 до count max).
count rate (opt) долж ен бы ть скаляром типа "целочисленное", устанавливает число
отсчетов времени часов процессора в секунду. Если тип IN TEG ER(2), conut_rate равен
1000. Если тип 1NTEGER(4), conut rate равен 10000. Если тип 1NTEGER(8), conut rate
равен 1000000.
count max (opt) долж ен бы ть скаляром типа "целочисленное"; устанавливает м акси
м альное значение, которое conut м ож ет иметь, HUGE (0).
Все используем ы е параметры долж ны иметь одинаковый целочисленны й родовой па
раметр.
Пример
¡nteger(2):: ic2, crate2, cmax2
¡nteger(4) ic4, crate4, cmax4
cali system_clock(count=ic2, count_rate=crate2, count_max=cmax2)
cali system_clock(count=ic4, count_rate=crate4, count_max=cmax4)
print *, ¡c2, crate2, cmax2
print *, ic4, crate4, cmax4
end
Эта програм ма бы ла вы полнена в четверг 11 декабря 1997 в 14:23:55 по восточному
стандартном у времени и произведенный вывод следую щ ий:
13880 1000 32767
112949880710000 2147483647
TAN
Описание: вычисляет тангенс х.
С ин та ксис: result = TAN (x).
Класс: элем ентная функция; родовая.
Параметр: х долж ен иметь тип "действительное" или "комплексное"; долж но быть
задан в радианах и обработан по модулю 2 *тг. Если х имеет комплексны й тип, его вещ е
ственная час ib расценивается как значение в радианах.
Р езультаты . Тип результата - гот же, что и у л\
Примеры
TAN (2.0) имеет значение -2.185040.
TAN (0.8) имеет значение 1.029639.
TA N D
Описание: вычисляет тангенс х.
Синтаксис: result = TA N D (.г)
Класс: элементная функция; родовая.
Параметр: х долж ен иметь тип "действительное". Он долж ен бы ть задан в градусах и
обработан по модулю 360.
Результаты . Тип результата - тот же, что и у л.
Собственное имя Тип параметра Тип результата
TAND REAL(4) REAL(4)
DTAND REAL® ¡R E A L®
QTAND REAL(16) REAL(16)
Примеры
TAND (2.0) имеет значение 3.4920771 Е -02.
TA ND (0.8) имеет значение 1.3963542Е-02.
TAN H
Описание: вычисляет гиперболический тангенс.
Синтаксис: result = TANH (х).
Класс: элементная функция; родовая.
Параметр: х долж ен иметь тип "действительное".
Результаты . Тип результата - тот же, что и у х.
Собственное имя Тип параметра Тип результата
TANH REAL(4) REAL(4)
DTANH REAL(8) REAL®
QTANH REAL(16) REAL(16)
Примеры
TANH (2.0) имеет значение 0.9640276.
TANH (0.8) имеет значение 0.6640368.
T IM E
Описание: возвращ ает текущ ее время, как установлено внутри системы.
Синтаксис: C A LL TIM E ( h u f).
Класс: подпрограмма.
Параметр: bu f является 8-байтовой переменной, массивом, элем ентом массива или
символьной подстрокой. Д ата возвращ ается как 8-байтовая строка сим волов ASCII,
имеющая формат hh:m m :ss, где: hh - час (2 цифры); m m - минуты (2 цифры); ss - секун
ды (2 цифры).
264 С Д А ¡гати, В В Кондратьев Програлтрованне на Visual FORTRAN
Если b u f имеет числовой тип и меньш е, чем 8 байт, мож ет возникнуть наруш ение це
лостности данных.
Если b u f им еет сим вольны й тип, связанная с ним длина передается подпрограмме. Ес
ли buf меньш е, чем 8 байт, подпрограмм а обрезает дату, чтобы соответствовать указан
ной длине. Если передается м ассив типа C H A RA CTER , подпрограмм а запоминает дату в
первом элем енте массива, используя длину элемента, а не длину всего массива.
Примеры
П ример возвращ аем ого значения из вызова TIM E - 13:45:23 (24-часовы е часы исполь
зую тся). 1
CHARACTERS H0UR(8)
TR AN SFER
Описание: преобразовы вает битовую комбинацию source согласно типу и родовым
параметрам wold.
С и н та кси с: result = T R A N SFER {source, m old [, size]).
Класс: трансформационная функция; родовая.
Гит а 8 Встроенные процедуры 265
Параметры: source долж ен бы ть скаляром или м ассивом (лю бого типа данны х); m old
должен бы ть скаляром или массивом (лю бого типа данны х), обеспечивает характеристи
ки типа (не значение) для результата.
size (opt) долж ен быть скаляром типа "целочисленное". Он обеспечивает число эл е
ментов для результата вывода.
Результаты . Имеет те же самы е тип и параметры типа, что и mold.
Если m old - скаляр и size опущ ен, результат - скаляр.
Если m old - массив и size опущ ен, результат - одноранговы й массив. Его размер явл я
ется наименьш им, который м ож ет содерж ать весь source.
Если size присутствует, результат - одноранговы й массив разм ера size.
Если ф изическое представление результата больш е, чем sou rce, результат содерж ит
битовую комбинацию source в своих крайних правых битах; крайние левы е биты резуль
тата неопределенные.
Если физическое представление результата меньш е, чем sou rce, результат содерж ит
крайние правые биты битовой комбинации source.
Примеры
T R A N SFE R (1082130432, 0.0) им еет значение 4.0 (на процессорах, которы е представ
л яю т значения 4.0 и 1082130432, как строку двоичны х знаков 0100 0000 1000 0000 0000
0000 0000 0000).
TRANSFER ((/2.2, 3.3,4.4/), ((0.0, 0.0))) приводит к скаляру, значение которого (2.2, 3.3).
TR A N SFE R ((/2.2, 3.3, 4.4/), (/(0.0, 0.0)/)) приводит к ком плексном у одноранговом у
массиву длины 2. Его первый элем ент - (2.2, 3.3) и его второй элем ент им еет вещ ествен
ную часть со значением 4.4 и неопределенной мнимой частью .
TR A N SFE R ((/2.2, 3.3, 4.4/), (/(0.0, 0.0)/), 1) приводит к ком плексном у одноранговом у
массиву, имею щ ему 1 элем ент со значением (2.2, 3.3).
TRA N SPO SE
Описание: транспонирует массив ранга два.
Синтаксис: result = T R A N SPO SE (matrix).
Класс: трансформ ационная функция; родовая.
Параметры: matrix долж ен бы ть двухранговы м массивом (лю бого типа данных).
Р езультаты . Д вухранговы й массив с тем же самы м типом и родовы м и параметрами
что и matrix. Его форма - (n, т ) , где ( т . , п) - форма matrix. Н априм ер, если форма
matrix - (4,6), форма результата - (6,4).
Элемент (i, j) результата имеет значение matrix (j, i), где i находится в диапазоне от 1
до п, ау в диапазоне от 1 до т .
Примеры
[2 3 4] Г2 5 8]
П усть В является массивом 5 6 7 . T R A N SPO SE (В) им еет значение 3 6 9
89 1 47 1
T R IM
Описание: возвращ ает параметр с удаленны м и конечны ми пробелам и.
Синтаксис: result - TRIM (string).
Класс: трансформ ационная функция; родовая.
Параметры: string долж ен бы ть скаляр ш п а "символьное".
Р езультаты . Тип результата - сим вольное с тем же самы м родовы м параметром , что
и у string. Его длина равна длине string минус число конечны х пробелов в string.
Значение результата - та же самая ст рока, кроме лю бы х удаленны х конечны х пробе
лов. Если string содержит только знаки пробела, результат им еет нулевую длину.
266 С Д Алгсиин, В В Кондратьев. Програмирование на Visual FORTRAN
Примеры
TRIM ('ДА NAMEAAAA ') имеет значение 'ДА NAM E'.
TRIM ('ДА САД DAAAAA ') имеет значение 'АД CAA D'.
UBOUND
Описание: возвращ ает верхние границы для всех измерений массива или верхнюю
границу для указанного измерения.
С ин та кси с: result = U BO U N D (array [, dim] [, kind]).
К ласс: функция запроса; родовая.
Параметры :
array долж ен бы ть м ассив (лю бого типа данны х); не долж ен быть размещ аемым м ас
сивом, которы й не разм ещ ен или разъединенны м указателем. Он может быть массивом
перенимаю щ ег о размера, если присутствует dim со значением меньшим, чем ранг array.
dim (opt) долж но бы ть скалярны м целым числом со значением в диапазоне от 1 до п,
где п - ранг array.
kind (opt) долж ен бы ть инициализированны м скалярным целочисленным выражением.
Р езультаты . Тип результата - целое число. Если kind присутствует, родовой пара
метр результата указы вается kind; иначе родовой параметр результата - родовой пара
метр целого типа но ум олчанию . Если процессор не может представить значение резуль
тата в kind, результат неопределенны й.
Если dim присутствует, результат - скаляр. И наче результат - одноранг овый массив с
одним элем ентом для каж дого изм ерения array. Каждый элем ент в результате соответст
вует изм ерению array.
Если array - секция массива или вы раж ение массив, которое не является целым мас
сивом или ком понент структуры массив, U B O U N D (array, dim) имеет значение, равное
числу элем ентов в данном измерении.
Если array является целым массивом или компонент структуры массив, U BOUND
(array, dim) им еет значение, равное верхней границе для нижнего индекса dim из array, если
изм ерение dim отлично от нуля. Если изм ерение dim имеет размер нуль, соответствую
щ ий элем ент результата им еет значение нуль.
У становка оггций ком пилятора, указы ваю щ их размер целого числа, может затронуть
эту функцию .
Примеры
REA L A R R A Y A (1 :3, 5:8)
REA L A R R A Y B (2:8, -3:20)
U B O U N D (A R RA Y A) равно (3, 8). U B O U N D (A R RA Y A, DIM =2) равно 8.
U B O U N D (A R R A Y В) равно (8, 20). U BO U N D (A RRA Y B (5:8, :)) равно (4,24) пото
му что число элем ентов является значащ им для параметров секции массива.
UNPACK
Описание: берет элементы из однорангового массива и распаковы вает их в другой
(возм ож но больш ий) м ассив под уггравлением маски.
С и н та кси с: result = U N PA C K (vector, mask, field).
Класс: трансф орм ационная функция; родовая.
Парам етры : vector долж ен бы ть одноранговы м массивом (лю бого типа данных); е ю
разм ер долж ен бы ть 1, г де t - число истинных элем ентов в mask; mask долж ен бы ть логи
ческим массивом ; определяет куда помещ аю тся элементы vector, когда они распаковы
ваю тся.
Гпава 8. Встроенные процедуры 267
field долж ен иметь те же самы е тип и параметры типа, что и vector и соответствовать
mask. Элементы в fie ld вставляю тся в массив результата, когда соответствую щ ий элем ент
mask имеет значение ложь.
Результаты : массив с той ж е самой формой, что и mask , и тем же самы м типом и п а
раметрами типа, что и vector.
Элементы в м ассиве результата заполняю тся в порядке элем ентов массива. Если i-й
элемент из mask истина, соответствую щ ий элем ент результата заполняется следую щ им
элементом vector. И наче он заполняется fie ld (если fie ld - скаляр), или i-м элем ентом field
(если f i e l d - массив).
Примеры
Го о Г
Пусть N является массивом 1 0 1 , Р является м ассивом (2, 3, 4, 5), a Q является мас-
100
TFF 20 1
сивом F T F U N PA CK (Р, M A S K -Q , F IE L D ^N ) п роизводит результат 14 1
TTF 3 50
2 11
U N PA CK (Р, M A SK ^Q , FIELD =1) производит результат 14 1
3 5 1
V E R IF Y
Описание: проверяет, что ряд сим волов содерж ит все сим волы в строке, иден ти ф и
цируя первый символ в строке, который не находится в наборе.
Синтаксис: result = V ERIFY (string, set [, back ] [, kind]).
Класс: элементная функция; родовая.
Параметры: string долж ен иметь тип "символьное"; set долж ен им еть тип "си м воль
ное" с тем же самым родовы м параметром , что и у string ; back (opt) долж ен им еть л о ги
ческий тип; kind (opt) долж ен быть инициализированны м скалярны м целочисленны м вы
ражением.
Результаты . Тип результата - целое число. Если kind присутствует, родовой пара
метр результата указы вается kind ; иначе родовой парам етр результата - родовой п ара
метр целого типа по умолчанию . Если процессор не мож ет представить значение р езу ль
тата в kind результата, результат неопределенный.
Если back опущ ен (или присутствует со значением лож ь) и string им еет по крайней
мере 1 символ, который не находится в set , значение результата - позиция крайнего л ев о
го символа string , который не находится в set.
Если back присутствует со значением истина и string им еет по крайней мере 1 сим вол,
который не находится в set , значение результата - позиция самого правого сим вола
string , которая не находится в set.
Если каждый символ string находится в set , или длина string - нуль, значение резуль
тата - нуль.
У становка опций компилятора, указы ваю щ их разм ер целого числа, м ож ет затронуть
эту функцию.
Примеры
VERIFY ('CDD D C', 'С') имеет значение 2.
VERIFY ('CDD D C', 'С', BA C K =.TR U E.) имеет значение 4.
VERIFY ('CDD D C', 'CD') им еет значение нуль.
268 С. Д. Алгазин, В В Кондратьев. Програмирование на Visual FORTRAN
ZEXT
, О писание: расш иряет параметр нулями. И спользуется преж де всего для бит-
ориентированны х операций. Ее нельзя передавать как фактический параметр.
С и н т а к с и с : result = Z E X T (х [, k in d ]).
К л а с с : элем ентная ф ункция; родовая.
П а р а м е т р ы : х долж ен им еть логический или целочисленны й тип; k in d (opt) должен
бы ть инициализированны м скалярны м целочисленны м выражением.
Р е з у л ь т а т ы . Тип результата - целое число. Если k in d присутствует, родовой пара
метр результата указы вается k in d ; иначе родовой параметр результата - родовой пара
м етр целого типа по ум олчанию . Если процессор не мож ет представить значение резуль
тата в k in d , результат неопределенны й.
Значение результата - х , расш иренное нулями и обработанное как значение без знака.
Требования памяти для целочисленны х констант никогда не меньш е чем 2 байта. Ц е
лочисленны е константы внутри диапазона констант, которы е могут бы ть представлены
1 байтом все ещ е требую т 2 байта памяти.
У становка опций ком пилятора, указы ваю щ их размер ц ел о ю числа, может затронуть
эту функцию .
Собственное имя1 Тип параметра Тип результата
IZEXT LOGICAL0) IN TE G E R ®
LO G IC AL® IN TE G E R ®
INTEGER(1) I IN TE G E R ®
IN TE G E R ® IN TE G E R ®
JZEXT L0GICAL(1) INTEGERS)
LO G IC AL® INTEGER(4)
L0GICAL(4) INTEGER(4)
INTEG ER(I) INTEGER(4)
IN T E G E R ® INTEGER(4)
INTEGERS) INTEGER(4)
KZEXT LOGICAL(l) INTEGER(8)
LO G IC AL® INTEGER(8)
L0GICAL(4) INTEGER(8)
LO G IC A L® IN TE G E R ®
INTEG ER(l) IN TE G E R ®
IN TE G E R ® IN TE G E R ®
INTEGERS) IN TE G E R ®
INTEGER(8) IN TE G E R ®
1 Эти собственные функции нельзя передавать как фактические параметры.
Пример
11МТЕ6ЕР(2) \ZV_VAR Г???Р)Ц
11МТЕ6ЕР(4) Ц/АР
1__УАР = 1ЕХТ(^УЩ
Э тот пример запом инает величину 1МТЕСЕЯ(2) в младш их 16 битах величины
11^ТЕСЕЕ1(4), со значением результата Ь У А Я равным 'ООООРРТР'Х. Если бы функция
Z EX T не использовалась, то получаю щ ееся значение бы ло бы Т РР РР Р РР 'Х , потому чго
\V _V A R бы ло бы преобразовано в тип данны х левого операнда расш ирением знака.
Глава 9. Утверждения ввода/вывода
передачи данных
Утверж дения ввода/вы вода м огут использоваться для передачи данных, соединения с
файлом, запроса к файлу и позиционирования файла.
Утверж дения ввода/вы вода соединения с файлом, запроса к ф айлу и пози ц и он и рова
ния файла обсуж даю тся в гл. 11.
1де io-keyword - одно из следую щ их утверж дений: A CC EPT, PRIN T (или TY PE), REA D ,
REW RITE или WRITE.
io-control-list является одним или нескольким из следую щ их специф икаторов у п рав
ления ввода/вывода:
[U N IT = ]/o -w 7 /i [Ш 1=]дгоир END ERR REC
[m i= ]fo rm a t ADVANCE EOR IO S T A T S IZ E _______________________________ ___________________________________
йтотпт 269
270 С Д Алгал/н. В В Кондратьев. Програмирование на Visual FORTRAN
где io -lis t - список ввода/вы вода, который м ож ет содерж ать переменные (за исклю чени
ем массивов, перенимаю щ их размер) или неявные D O -списки. Утверж дения вывода мо
гут содерж ать константы или вы раж ения; f o r m a t является неклю чевой формой специфи
катора форм ата списка управления (нет FM T=).
Если присутствует специф икатор форм ата ( [ ¥ M T = ] f o r m a t ) или спецификатор списка
имен ([NML=]grow/?), утверж дение передачи данны х называется форматным утверж дени
ем ввода/вы вода; иначе, это - неф орматное утверж дение ввода/вывода.
Если присутствует специф икатор записи (REC), утверж дение передачи данных - ут
верж дение ввода/вы вода с прямым доступом ; иначе, оно является утверждением вво
да/вы вода с последовательны м доступом.
Если во время передачи данны х происходят ош ибки конца записи или конца файла,
позиционирование файла и выполнение повреждены, и вы полняю тся некоторы е специ
фикаторы списка управления (если они представлены) (Для получения дополнительной
информации см. разд. 9.9.)
где г - скалярное числовое выражение, указы ваю щ ее номер записи. Значение выражения
долж но бы ть больш е или равным 1 и меньш е или равным м аксимальному номеру записи,
допустим ом в файле.
В случае необходим ости значение преобразовы вается в целочисленны й тип данных
перед использованием.
Если REC присутствует, никакой специф икатор END, спецификатор формата * или
имя группы списка имен не мож ет появиться в том же самом управляю щ ем списке.
Г лава 9. У т верж дения вво д а /вы во д а передачи данны х 273
■ У словие конца ф айла происходит, когда в файле не сущ ествует больш е записей во
время последовательного чтения или когда сталкиваю тся с записью "конец ф айла”,
созданной утверж дением EN DFILE.
■ У словия конца файла не возникаю т в утверж дениях READ с прямым доступом.
■ Если возникает условие конца файла, файл позиционируется после записи конца ф ай
ла, и вы полнение утверж дения заканчивается.
■ Если был указан IO STA T, переменная 10STA T становится определенной как отрица
тельное целочисленное значение.
■ Если бы ло указано E N D = label, вы полнение продолж ается с помеченного оператора.
EOR
■ С пециф икатор конца записи м ож ет появиться только в форматном утверждении
REA D последовательного доступа, которое имеет спецификатор A D V A N C E -N O '
(неусоверш енствованны й ввод).
■ У словие конца записи возникает, когда неусоверш енствованное утверж дение READ
пробует передать данны е от позиции с конца записи.
■ Если возникает условие конца записи, файл позиционируется после текущ ей записи, и
выполнение утверж дения заканчивается.
■ Если был указан 10STA T , переменная 10STA T становится определенной как отрица
тельное целочисленное значение.
■ Если бы ло указано PAD - YES' при соединении с файлом, запись дополняется пробе
лами (по мере необходим ости), чтобы удовлетворить входной список элементов и со
ответствую щ ий описатель редактирования данных. Если был указан SIZE, перемен
ная SIZE становится определенной как целочисленное значение. Если было указано
E O R = label, вы полнение продолж ается с пом еченного оператора.
■ Если возникает одно из условий и никакой специф икатор перехода не был указан в
управляю щ ем списке, но появляется специф икатор 10STA T, вы полнение продолж а
ется с утверж дения, следую щ его за утверж дением ввода/вывода. Если не указан ни
специф икатор перехода, ни специф икатор IO STA T, программа заканчивается.
где с-ехрг - скалярное сим вольное выражение, которое задается 'YES' для того, чтобы
у соверш енствовать ввод/вы вод, или 'N 0 ' для того, чтобы не усоверш енствовать ввод/вы
вод. Значение по ум олчанию - 'YES'. К онечны е пробелы в выражении игнорирую тся.
С пециф икатор A D V A N C E м ож ет появиться только в форм атном , последовательном
утверж дении передачи данны х, которое указы вает внеш нее устройство. Он не должен
бы ть указан для передачи данны х списком имен или управляю щ его списка.
У соверш енствованны й ввод/вы вод всегда позиционирует файл в конце обработанной
записи, если не возникает ош ибочное условие. Н еусоверш енствованны й ввод/вывод м о
ж ет позиционировать файл в позицию сим вола внутри текущ ей записи.
Гчава 9 У т верж дении вво д а /вы во д а п ередачи данны х 275
READ *, В(В)
READ *, В(В(1):В(10))
Если элем ент ввода или вывода - динам ически разм ещ аем ы й м ассив, он долж ен бы ть
в настоящ ее время размещ енным. Если элем ент ввода или вы вода им еет производны й
тип, применяю тся следую щ ие правила:
Л ю бой компонент производного типа долж ен бы ть в блоке области действия, содер
жащ ем утверж дение ввода/вывода.
276 С. Д А 1га ш н , В В К ондрат ьев. Программирование на Visual FO RTRAN
са (К). Это нормальный порядок элементов массива. Обратите внимание, что К увеличивает
ся на 2, таким образом, выводятся только строки с нечетным номером массива.
В следую щ ем примере будет прочитан весь список неявного D O -списка (Р (1), Q (1,1),
О (1,2) . . . , Q (1,10)) преж де, чем 1 увеличивается на 2:
READ (5,999) (P(l), (Q(l,J), J=1,10), 1=1,5)
Следую щ ий пример использует ф иксированны е нижние индексы и нижние индексы,
которые изменяю тся согласно неявному D O -списку:
READ (3,5555) (B0X(1,J), J=1,10)
Входные значения назначаю тся BOX (1,1) до BO X (1,10), но другие элементы массива
не изменяю тся.
С ледую щ ий прим ер показывает, как переменная DO м ож ет сама непосредственно вы
водиться:
WRITE (6,1111) (1,1=1,20)
Ц елые числа 1-20 записываю тся.
Если вводится пробел и комбинация сим волов (=?), отображ аю тся такие значения:
&NLIST
А = 1.500000 ,
В = 2,
С = ABCDE
/
П редполож им , что указаны утверж дения:
NAMELIST /CONTROL/ TITLE, RESET, START, STOP, INTERVAL
CHARACTER*! 0 TITLE
REAL(KIND=8) START, STOP
LOGICAL(KIND=4) RESET
INTEGER(KIND=4) INTERVAL
READ (UNIT=1, NML=CONTROL)
У тверж дение N A M E LIST ассоциируется с именем группы C O N TR O L со списком из
5 объектов. У тверж дение R EA D читает входные данны е с устройства 1:
&CONTROL
TITLE-TESTT002AA',
INTERVALS,
RESET=.TRUE.,
START=10.2,
STOP =14.5
I
С ледую щ ие значения заданы объектам в группе CO N TRO L:
Объект списка имен Назначенное значение
TITLE TESTT002AA
RESET T
START 102
STOP 14.5
INTERVAL 1
Нет необходим ости определять значения всем объектам, объявленны м в соответст
вую щ ей группе N A M E LIST. Если объект списка имен не появляется во входном утвер
ждении, его значение (если оно есть) не изменяется.
Точно так же, когда указаны сим вольны е подстроки и элементы массива, изменяю тся
только значения указанны х переменны х подстрок и элем ентов массива. П редположим,
что прочитан следую щ ий ввод:
&CONTROL TITLE(9:10)='BB'/
Н овым значением для T IT L E является T E STT002B B ; изменяю тся только последние
2 сим вола в переменной. С ледую щ ий прим ер показы вает массив как объект:
DIMENSION ARRAY_A(20)
NAMELIST/ELEM/ARRAY_A
READ (UNIT=1,NML=ELEM)
П редполож им , что ввод прочитан:
&ELEM
ARRAY_A=1.1,1.2,, 1.4
I
С ледую щ ие значения задаю тся элементам A RR A Y А:
Г лава 9 Утверж дения вво д а /вы в о д а передачи данных 285
Ф орм атны е, внутренние утверж дения READ преобразовы ваю т данны е из сим вольно
го в бинарны й форм ат, используя спецификации ф орм ата (если они есть), для редактиро
вания. П реобразованны е данны е назначаю тся объектам в списке ввода/вывода в порядке,
в котором объекты появляю тся, слева направо.
Этот форма! утверж дения READ ведет себя так, как будто ф орм ат начинается с опи
сателя редактирования BN. М ожно отменить это поведение, явно указав описатель ре
дактирования BZ.
Значения м огут бы ть переданы объектам встроенного или производного типа. Для
производны х типов, значения встроенны х типов передаю тся компонентам встроенных
типов, которые, в конечном счете, составляю т эти структурированны е объекты.
П реж де чем происходит передача данны х, файл позиционируется в начало первой за
писи. Эта запись становится текущ ей записью.
Если число элем ентов списка ввода/вы вода меньш е, чем число полей во входной за
писи, утверж дение игнорирует лиш ние ноля.
Если число элем ентов списка ввода/вы вода больш е, чем число нолей во входной за
писи, входная запись дополняется пробелами. О днако если бы PAD - NO' было указано
при соединении с файлом, то входной список и спецификация файла не долж ны требо
вать больш его количества сим волов из записи, чем она содерж ит.
В списке управления форм атированием строки сим волов не имею т никаких раздели
телей.
С ледую щ ий сегмент программы читает' запись и исследует первый символ, чтобы оп
ределить, долж ны ли остаю щ иеся данны е интерпретироваться как десятичны е, восьме
ричны е или ш естнадцатеричны е. Затем это использую т внутренние утверж дения READ,
чтобы сделать соответствую щ ие преобразования из представлений строки символов к
двоичном у.
INTEGER IVAL
CHARACTER TYPE, RECC)RD*80
CHARACTERS*) AFMT, IFMT, OFMT, ZFMT
PARAMETER (AFM T-fQ .A)', IFMT= '(110)', OFMT= '(011)', &
ZFMT= '(Z8)')
ACCEPT AFMT, ILEN, RECORD
TYPE = REC0RD(1:1)
IF (TYPE .EQ. 'D') THEN
READ (REC0RD(2:MIN(ILEN, 11)), IFMT) IVAL
ELSE IF (TYPE .EQ *0') THEN
READ (REC0RD(2:MIN(ILEN, 12)), OFMT) IVAL
ELSE IF (TYPE EQ. 'X') THEN
READ (REC0RD(2 MIN(ILEN, 9)),ZFMT) IVAL
ELSE
PRINT*, 'ERROR*
END IF
END
Символ (*) является специф икатором формата, указы ваю щ им форматирование управ
ляю щ им списком. (Он мож ет бы ть такж е указан как FM T =*.)
nml-group - специф икатор списка имен ([NML=]gr<w/?), указываю щ ий ф орм атирова
ние списком имен.
Правила для форматных последовательных ут верж дений WRITE
Ф орм атны е, последовательны е утверж дения W RITE преобразовы ваю т данные из
двоичного в сим вольны й ф орм ат, используя специф икации форм ата (если они есть) для
редактирования. П реобразованны е данны е записы ваю тся во внеш ний файл, который свя
зан для последовательного доступа.
Значения могут бы ть переданы из объектов встроенного или производного типа. Для
производны х типов, значения встроенны х типов передаю тся из компонентов встроенных
типов, которые, в конечном счете, составляют эти структурированны е объекты.
С писок вывода и специф икация формата не долж ны указы вать больш е символов для
записи, чем размер записи. (Размер записи указы вается спецификатором RECL в утвер
ж дении O PEN .)
Если файл связан для неф орматного ввода/вы вода, форматная передача данных за
прещ ена.
С ледую щ ее прим еры показы ваю т примеры форматны х, последовательных утверж де
ний W RITE:
WRITE (UNIT=8, FM T-(B )', A D V A N C E -N0') С
WRITE (*, "(F6 5)", ERR=25,10STAT=I0_STATUS) А, В, С
Правила для управляемых списком последовательных ут верж дений WRITE
У правляем ы е списком последовательны е утверж дения W RITE передаю т данные из
двоичного в сим вольны й ф орм ат, используя тип данны х соответствую щ его элемента
списка ввода/вы вода, чтобы определить ф орм ат данных. П реобразованные данные затем
записы ваю тся во внеш ний файл.
Значения передаваем ы е как вывод, имею т те же форматы , что и значения, передавае
мые как ввод. Табл. 9.1 показы вает значения по ум олчанию выходных форматов для ка
ж дого встроенного тип а данных.
1LITERAL CONSTANT (литеральная константа) - константа без имени. Заметим, что в языке
Фортран 77 это называлось прост о константой.
292 С. Д Алгазин, В В К ондрат ьев. П рограм ирование на Visual FO RTRAN
С пециф икатор формата, появляю щ ийся в утверж дении ввода или вывода, указывает
ф орм ат передаваем ы х данны х и необходим ое преобразование данных (редактирование)
в соответствии с этим форматом. У казанный ф орм ат мож ет быть явным или неявным.
Я вны й ф орм ат обозначен в спецификации формата, которая появляется в утверж де
нии F O R M A T или сим вольном выражении. В ы раж ение долж но быть допустимой специ
фикацией формата.
С пециф икация форм ата содерж ит описатели редактирования, которые могут быть
описателям и редактирования данны х, описателями редактирования управления или опи
сатели редактирования строк символов.
Н еявный ф орм ат определяется процессором и указы вается при помощ и управляю щ е
го списка или списка имен форматирования.
С писок управления ф орм атированием указы вается звездочкой (*); список имен ф ор
м атирования (N am elist) указывается именем группы списка имен (Namelist).
С писок управления ф орм атированием м ож ет бы ть указан для того, чтобы перемес
тить последовательны е файлы и внутренние файлы. С писок имен форматирования может
бы ть указан только для того, чтобы переместить последовательны е файлы.
где form at-H st - список с одним или больш им количеством описателей редактирования,
разделенны х запяты м и или слеш ами (/):
О писатели редактирования данных: I, В, О, Z, F, Е, EN, ES, D, G, L и А..
О писатели редактирования управления: Т, TL, TR, X, S, SP, SS, BN, BZ, Р , :, /, $, \ и Q.
О писатели редактирования строки: Н, 'с' и "с", где с - сим вольная константа.
Запятая м ож ет бы ть опущ ена в случаях:
■ М ежду описателем редактирования Р и нем едленно после описателя редактирования
F, Е, EN, ES, D или G.
■ П еред описателем редактирования слеш (/), когда не присутствует необязательная
специф икация повторения.
■ П осле описателя редактирования слеш (/).
■ П еред или после описателя редактирования двоеточие (:).
О писатели редактирования м огут быть влож ены и спецификация повторения может
предш ествовать описателям редактирования данны х, описателю редактирования слеш
или заклю ченном у в скобки списку описателей редактирования.
Правила использования
У тверж дение FO R M A T долж но быть помечено.
И м енованны е константы не разреш аю тся в специф икациях формата.
Если связанное утверж дение ввода/вы вода содерж ит список ввода/вывода, специфи
кация форм ата долж на содерж ать по крайней мере 1 описатель редактирования данных
или описатель редактирования управления Q.____________________________________________
йш от \т 296
Глава 10 Ф орм ат ирование вво д а /вы во д а 297
Знаки пробела м огут п ред ш ествовать о тк ры ваю щ ей круглой ско б ке, и д о п о л н и
тельны е пробелы м огут появиться где-н и б удь внутри сп ец и ф и к ац и и ф орм ата. Эти
пробелы не им ею т н икакого см ы сла, если они не вн утри о п и сателя р ед ак ти р о в ан и я
строки сим волов.
Когда выполняется форматное утверж дение ввода, установка специф икатора BLA N K
(для соответствую щ его логического устройства) определяет интерпретацию пробелов в
пределах спецификации. Если указаны описатели редактирования BN или BZ для ф ор
матного утверждения ввода, они заменяю т принимаем ую по ум олчанию интерпретацию
пробелов. (О принимаемых по умолчанию специф икаторах B LA N K см. разд. 11.5.)
Для форматного ввода используйте запятую как внеш ний разделитель поля. Запятая
заканчивает ввод полей (для несимвольных типов данны х), которы е короче, чем ож идае
мое число символов. Он мож ет такж е определять пустой указатель (нулевая длина) поля.
Первый символ записи, переданной на устройство построчной печати или терминал,
обычно используется для управления кареткой; он не печатается. П ервы й символ такой
записи долж ен быть пробелом, нулем, единицей, знаком доллара, плю сом или A SC II
NUL. Лю бой другой символ обрабаты вается как пробел.
Спецификация формата не м ож ет указать больш е сим волов вывода, чем может со
держать внеш няя запись. Н апример, запись устройства построчной печати не может со
держать больш е, чем 133 символа, вклю чая сим вол управления кареткой.
Табл. 10.1 обобщ ает описатели редактирования, которые м огут использоваться в сп е
цификациях формата.
Знак минус долж ен предш ествовать отрицательному значению во внеш нем поле; знак
плю с необязателен перед полож ительны м значением.
Во входных записях константы могут вклю чать лю бой допустимый родовой пара
метр. Именованные константы не разреш аю тся.
Гчааа 10. Ф орм ат ирование вво д а /вы во д а 301
Если иоле данных в записи будет содерж ать м еньш е, чем и* сим волов, то утверж дение
ввода прочитает символы из следую щ его поля данных в записи. Вы м ож ете п редотвра
тить эго, дополняя короткое поле пробелами или нулями или используя запяты е, чтобы
разделить входные данные. Запятая заканчивает поле данны х и мож ет такж е использо
ваться для определения пустого указателя (нулевая длина) поля.
Правила для обработки вы вода
Ш ирина поля и' долж на быть достаточно больш ой, чтобы вклю чать лю бой ведущ ий
знак плюс или минус и лю бую десятичную точку или эксп о н еш у . Н апример, ш ирина по
ля для описателя редактирования данных Е долж на быть д о стаю ч н о больш ой, чтобы со
держать следую щ ее:
■ Для положительны х чисел: ¿/+5 или ¿/4 е+ 3 символов.
■ Для отрицательных чисел: с/4 6 или с!+е+4 символов.
П оложительное или нулевое значение (нуль допускается для описателей I, В, О, Z и Р)
может иметь знак плюс, в зависим ости от того, какой описатель редактирования знака
действует. Если значение отрицательно, крайний левый не знак пробела является знаком
минус. Если значение меньше, чем указанная ш ирина поля, вставляю тся начальны е про
белы (значение выравнивается по правому краю). Если значение является слиш ком
больш им для указанной ширины поля, все поле вывода заполняется звездочками (*).
Когда значение ширины поля - нуль, ком пилятор выбирает наим еньш ую полож и
тельную ф актическую ширину поля, которая не приводит к полю , заполненном у звездоч
ками.
Редактирование целых чисел. Редактированием целых чисел управляю т: I (десяти ч
ный), В (двоичный), О (восьмеричны й) и Ъ (ш естнадцатеричны й) описатели редакти ро
вания даных.
Редактирование /. О писатель редактирования 1 передает десятичны е целочисленны е
значения. Он имеет следую щ ий формат:
Щ.т]
Значение т (миним альное число цифр в константе) не долж но превыш ать значение IV
(ш ирина поля) и игнорируется при вводе (применяется только при выводе).
Указанный элемент списка ввода/вы вода долж ен иметь тип целочисленное или ло ги
ческое. О писатель редактирования в может использоваться, чтобы редактировать ц ело
численные данные; он следует тем ж е самым правилам, что и 1и\
Правила д. ¡я обработки ввода
При вводе описатель редактирования данных 1 передает и* сим волов из внеш него поля
и определяет их целочисленное значение соответствую щ ем у элем енту списка вво
да/вывода. Внеш ние эксплуатационны е данные долж ны быть целочисленной коне I ант ой.
Если значение превы ш ает диапазон соответствую щ его входного элем ента списка,
возникает ошибка.
Поле состоит из нуля или больш ого количества пробелов, сопровождаемых знаком
(знак плюс необязателен, а знак минус для отрицательны х требуется) и целочисленной
константой без знака и начальны х нулей.
Если /77 указан, целочисленная константа без знака долж на иметь минимум т цифр.
В случае необходим ости она дополняется начальными нулями. Если т равен нулю и
элемент списка вывода имеет нулевое значение, внеш нее поле заполняется пробелами.
Следую щ ая таблица показы вает вывод, использую щ ий описатель редактирования I
(символ А представляет непечатаем ы й знак пробела):
Формат Значение Вывод
13 284 284
14 -284 -284
14 0 ДАЛО
15 174 АА174
12 3274 **
13 -473 ***
17 29.812 Ошибка; десятичная точка недопустима
14.0 01 АААА
14.2 АА01
144 1 0001
Редактирование В. О писатель редактирования данных В передает двоичные (по ос
нованию 2) значения. Он имеет следую щ ий формат:
В1л/[т]
Значение т (миним альное число цифр в константе) не долж но превысить значение
(ш ирина поля); т игнорируется при вводе (применяется только при выводе). Указанный
элем ент списка ввода/вы вода м ож ет иметь тип целочисленное, действительное или логи
ческое.
Правила для обработки ввода
При вводе описатель редактирования данных В передает символов из внеш него по
ля и назначает их двоичное значение соответствую щ ем у элементу списка ввода/вывода.
Внеш нее поле долж но содерж ать только двоичны е знаки (0 или 1) или пробелы.
Если значение превы ш ает диапазон соответствую щ его входного элемента списка,
возникает ош ибка.
Знак "минус"Еило([Ее]
0)мс1
Для описателя редактирования Е, значение с1 (число цифр после десятичной точки)
плю с е (число цифр в экспоненте) не долж но превыш ать значения (ш ирина поля).
Д ля описателя редактирования О, значение с/ не долж но превыш ать значения
Указанный элем ент списка ввода/вы вода долж ен иметь тип "действительное", или он
долж ен бы ть действительной или мнимой частью комплексного типа.
Правила для обработ ки ввода
П ри вводе описатели редактирования данных Е и О передаю т \\> сим волов из внеш не
го поля и назначаю т их действительное значение соответствую щ ем у элементу списка
ввода/вы вода. О писатели Е и О интерпретирую т и назначаю т входные данны е таким же
образом , что и описатель редактирования данны х Р.
Если значение экспоненты является слиш ком больш им, чтобы быть преобразованным
в один из этих форматов, возникает ош ибка.
Ш ирина поля экспоненты (е) необязательна; если она опущ ена, значение по ум олча
нию равно 2. Если е указан, долж ен бы ть больш е или равным ¿/+е+5.
ЕБуИЕе]
Значение (число цифр после десятичной точки) плю с е (число цифр в экспоненте) не
долж но превы ш ать значение и> (ш ирина поля).
У казанны й элем ент списка ввода/вы вода долж ен иметь тип действительное, или он
долж ен бы ть действительной или мнимой частью комплексного типа.
Правила для обработки ввода
При вводе описатель редактирования данных Е8 передает символов из внешнего
ноля и назначает их действительное значение соответствую щ ем у элементу списка
ввода/вы вода. О писатель Е8 интерпретирует и назначает входные данные таким же обра
зом как описатель редактирования данны х Р.
в)л/.с1[Её\
Значение (число цифр после десятичной точки) плюс е (число цифр в экспоненте) не
долж но превыш ать значение \\> (ш ирина поля).
Указанный элемент списка ввода/вы вода м ож ет иметь лю бой встроенный тип.
Когда используется этот описатель, чтобы указать ввод/вы вод для целочисленны х,
логических или символьных данны х, описатель редактирования следует тем же п рави
лам, что и 1и*, Ь и’ и Аи’ соответственно, и и е игнорирую тся.
Правила для обработки ввода действительных чисел
При вводе описатель редактирования данны х в передает сим волов из внеш него по
ля и назначает их действительны е значения соответствую щ ем у элем енту списка вво
да/вывода. О писатель в интерпретирует и назначает входны е данны е таким ж е образом ,
как описатель редактирования данны х Р.
Правила для обработки вы вода действительных чисел
При выводе описатель редактирования данны х в передает действительное значение
соответствую щ его элем ента списка ввода/вы вода, вы ровненное но правому краю и ок
ругленное до десятичны х позиций, во внеш нее поле, которое состоит из п> символов.
Ф ормат, в котором записано значение, является функцией величины значения, как
описано в табл. 10.2.
3 1 0 _______ С Д Алгаши, В В Кондратьев. Програмнрование на V¡.ниа! ГОЯТЯАИ
роткое поле пробелам и или нулями или используя запятые, чтобы разделить входные
данные.
Заполнение коротких полей. Вы можете использовать спецификатор P A D -Y E S ' утвер
ждения OPEN, чтобы указать заполнение пробелами коротких полей входных данных. Одна
ко пробелы могут интерпретироваться как пробелы или как нули, в зависимости от трго, ка
кое значение по умолчанию действует в это время. Рассмотрите следующий пример:
READ (2, '(15)') J
Если 3 будет задано для J, то значение J будет равно 30000 или 3 в зависимости от то
го, какое действует значение по ум олчанию (B L A N K -N U L L ' или B L A N K -Z E R O '). Это
м ож ет дать неож иданны е результаты.
Чтобы гарантировать ж елательное поведение, явно укаж ите описатель редактирова
ния BN или BZ. Н априм ер, следую щ ий оператор гарантирует, что пробелы интерпрети
рую тся как пробелы (а не как нули):
READ (2, '(BN, 15)') J
Использование запятых для разделения входных данных. Вы можете использовать
запятую , чтобы заверш ить короткое поле данных. Запятая не имеет никакого эффекта на
d часть специф икации (число сим волов справа от десятичной точки).
Запятая отменяет и \ указанное для описателей редактирования 1, В, О, Z, F, Е, D, EN,
ES, G и L. П редполож им , что выполняю тся следую щ ие утверждения:
READ (5,100) l,J,А,В
100 FORMAT (2I6.2F10.2)
П редполож им , что прочитана запись, содерж ащ ая значения:
1,-2,1.0, 35
В этом случае прим еняю тся такие назначения:
1= 1
J = -2
А= 10
В = 0.35
Запятая м ож ет заверш ить только поля длины меньш е, чем и’ символов. Если запятая
следует за полем w или больш его количества сим волов, запятую считаю т частью сле
дую щ его поля.
П устое поле (нулевая длина) определяется двумя последовательными запятыми или
запятой после поля w сим волов. В зависим ости от указанного описателя поля, получаю
щ ееся назначаем ое значение равно 0, 0.0, 0.0D 0, 0.0Q 0 или .FALSE..
Описатели редактирования управлением. О писатель редактирования управления
или непосредственно определяет, как отображ ается текст или воздействует на преобразо
вания, вы полненны е последую щ им и описателями редактирования данных.
Этот раздел описы вает форм аты для описателей редактирования управления и непо
средственно индивидуальны е описатели.
Форматы для описателей редактирования управлением. О писатель редактирова
ния управления описы вается одним из следую щ их форматов:
с
сп
пс
где с - одно из следую щ их кодов формата: Т, TL, TR, X, S, SP, SS, BN, BZ, Р, :, /, \, $ и Q.
п - число сим вольны х позиций; долж ен быть положительной целочисленной литераль
Глава 10 Ф орм ат ирование вво д а /вы во д а 315
ной константой или выражением переменного формата. Родовой парам етр не м ож ет бы ть
указан и не мож ет быть именованной константой.
Д иапазон п изменяется от 1 до 2147483647 (2**31-1 ) на Intel процессорах Itanium ; от
I до 32767 (2** 15-1) на процессорах 1А-32. Ф актически полезны е диапазоны м огут быть
ограничены размерами записи (RECL) и файловой системой.
Правила использования
Вообщ е говоря, описатели редактирования управления неповторяем ы . Е динственное
исклю чение - описатель редактирования слеш (/), которому м ож ет предш ествовать сп е
цификация повторения.
О писатели редактирования управления им ею т собственны е форматы :
■ П озиционный: Tn, TLn, TRn и пХ
■ Знаковый: S, SP и SS
■ И нтерпретации пробелов: BN и BZ
■ К оэф фициент м асш табирования: кР
■ Разнообразные: :, /, \, $ и Q
О писатель редактирования Р является исклю чением из общ его синтаксиса описателя
редактирования управления. Ему предш ествует коэф ф ициент м асш табирования, а не
спецификатор символьной позиции.
О писатели редактирования управления м огут бы ть сгруппированы в круглых скобках
и предш ествовать спецификации повторения группы.
Позиционное редактирование. О писатели редактирования Т, TL, TR и X указы ваю т
позицию , из которой передается следую щ ий символ в запись или из записи.
При выводе эти описатели самостоятельно не передаю т.си м волы и не воздействую т
на длину записи. Если символы перемещ аю тся в позиции после того, как позиция указа
на одним из этих описателей, пропущ енны е и предварительно не заполненны е позиции
заполняю тся пробелами. Результат состоит в том, как будто вся запись бы ла первон а
чально заполнена пробелами.
О писатели редактирования TR и X даю т одинаковы е результаты .
Редактирование Т. О писатель редактирования Т указы вает сим вольную позицию в
записи ввода/вывода. Он имеет формат:
Тп
Спецификатор п является полож ительной целочисленной литеральной константой
(без родового параметра), указы ваю щ ей сим вольную позицию в записи, относительно
левого табулированного предела. При вводе описагель Т п ози ционирует внеш ню ю за
пись в символьную позицию , указанную п. При выводе описатель Т указы вает, что п ере
дача данных начинается с я-й сим вольной позиции во внеш ней записи.
Примеры
П редположим, что файл имеет запись, содерж ащ ую значение ABCAAAXYZ, и вы пол
няются утверждения:
READ (11,10) VALUE1, VALUE2
10 FORMAT (T7.A3J1, АЗ)
Читаются значения, сначала - X Y Z, затем ABC. П редполож им , что вы полняю тся та
кие утверждения:
PRINT 25
25 FORMAT (*1',Т51 ,'COLUMN 2\Т21/COLUMN Г)
316 С .Д Ачгазин, В В К он драт ьев П рограм ирование на Visual FORTRAN
TLn
С пециф икатор п является полож ительной целочисленной литеральной константой
(без родового параметра), указы ваю щ ей п-ю сим вольную позицию слева от текущ его
символа. Если п больш е или равен текущ ей позиции, следую щ им доступны м символом
является первый сим вол записи.
Редактирование TR. О писатель редактирования TR указы вает сим вольную позицию
справа от текущ ей позиции в записи ввода/вывода. Он имеет формат:
TR п
С пециф икатор п является полож ительной целочисленной литеральной константой
(без родового параметра), указы ваю щ ей п-ю сим вольную позицию справа от текущ его
символа.
Редакт ирование X. О писатель редактирования X указывает сим вольную позицию
справа от текущ ей позиции в записи ввода/вывода. Он имеет формат:
пХ
С пециф икатор п является полож ительной целочисленной литеральной константой
(без родового параметра), указы ваю щ ей п-ю сим вольную позицию справа от текущ его
символа. При вы воде описатель редактирования X не вы водит каких-либо символов, ко
гда он появляется в конце спецификации формата; например:
WRITE (6,99) К
99 FORMAT (А К - J6.5X)
В этом прим ере записы вается только 9 символов. Чтобы вывести п конечных пробе
лов в конце записи, укаж ите ф орм ат п('Д').
Редактирование знака. О писатели редактирования S, SP и SS управляю т выводом
необязательного знака плюс внутри выводимых числовых полей. Эти описатели игнори
рую тся во время вы полнения утверж дений ввода.
Внутри специф икации ф орм ата описатель редактирования знака воздействует на все
последую щ ие описатели 1, F, Е, EN, ES, D и G до появления другого описателя редакти
рования знака.
Редактирование SP. О писатель редактирования SP заставляет процессор создавать
знак плюс в лю бой последую щ ей позиции, где он был бы иначе необязательным. Он
им еет ф орм ат:
SP
Редактирование SS. О писатель редактирования SS заставляет процессор подавлять
знак плю с в лю бой последую щ ей позиции, где он был бы иначе необязательным. Он
им еет формат:
SS
Г лава 10 Ф орм ат ирование вво д а /вы во д а 317
Редактирование S. О писатель редактирования S восстанавливает печать знака плюс
как дополнительного для всех последую щ их полож ительны х числовы х нолей. Он имеет
формат:
S
О писатель редактирования S восстанавливает на усм отрение процессора создания
знака плюс на необязательной основе.
Редактирование пробелов. О писатели управления BN и BZ интерпретирую т встро
енные и конечные пробелы внутри входных числовых полей. Эти описатели игнориру
ются во время выполнения утверж дений вывода.
Внутри спецификации формата, описатель редактирования пробелов воздействует на
все последую щ ие описатели I, В, О, Z, F, Е, EN, ES, D и G до появления другого оп и сате
ля редактирования пробелов.
О писатели редактирования пробелов отм еняю т эффект специф ика ю р а BL A N K во
время выполнения отдельного входного утверж дения передачи данны х. (О спец и ф и като
ре BLANK в утверждениях OPEN см. разд. 1 1.5.)
Редактирование BN. О писатель редактирования BN заставляет процессор игнориро
вать все встроенные и конечны е пробелы в числовых входных полях. Он имеет формат:
BN
Входное поле обрабаты вается так, как будто все пробелы были удалены , и остаток от
поля выравнивается по правому краю. П олностью пустое иоле обрабаты вается, как нуль.
Редактирование BZ. О писатель редактирования BZ заставляет процессор интерпре
тировать все встроенны е и конечны е пробелы в числовых входных полях как нули. Он
имеет ф орм ат:
BZ
Редактирование коэффициентом масштабирования (Р). О писатель редакти рова
ния Р указывает коэффициент масш табирования, который перемещ ает местополож ение
десятичной точки в действительны х значениях и двух вещ ественных частях ком плекс
ных значений. Он имеет формат:
кР
Спецификатор к является знаковой (знак необязателен, если он - плю с), целочислен
ной литеральной константой, указываю щ ей число позиций, влево или вправо на которое
долж на переместиться десятичная точка (коэффициент масш табирования). Д иапазон /с
о т -1 2 8 до 127.
В начале форматного утверж дения ввода/вывода, значение коэф ф ициента м асш таби
рования равно нулю. Если указан описатель редактирования масш таба, коэф ф ициент
масш табирования устанавливается в новое значение, которое воздействует на все после
дую щ ие действительны е описатели редактирования, пока не появляется другой оп иса
тель редактирования масш таба.
Чтобы восстановить нулевое значение коэффициента масш табирования, вы долж ны
явно указать ОР.
Возвращ ение к преж нем у состоянию формата не воздействует на коэф ф ициент мас-
шт абирования.
Правила для обработки ввода
При вводе полож ительны й коэффициент м асш табирования перем ещ ает десятичную
точку влево, а отрицательны й коэф ф ициент масш табирования перемещ ает десятичную
точку вправо. (При выводе эф ф ект обратны й.)
318 С Д А лгазин . В В К ондрат ьев П рограм ирование на Visual FORTRAN
Ввод9использующий редактирование Р
Формат Ввод Значение
ЗРЕЮ 5 ДДД37.614Д .037614
ЗРЕЮ.5 - ДД37 614Е2 3761.4
ЗРЕ10 5 ДДДД37.614 37614.0
Коэф фициент м асш табирования долж ен предш ествовать первому действительному
описателю редактирования, ассоциированном у с ним, но он не долж ен немедленно
предш ествовать описателю . Н апример, все следую щ ие выраж ения имею т одинаковый
эффект:
(ЗР, 16, Р6.3, Е 81)
(16, ЗР, Р6.3, Е8.1)
(16, ЗРР6Д Е8.1)
О братите вним ание на то, что, если коэф ф ициент масш табирования немедленно
предш ествует связанном у действительном у описателю редактирования, то разделитель
запятая необязателен.
Правила для обработки вывода
При выводе полож ительны й коэффициент масш табирования перемещ ает десятичную
точку вправо, а отрицательны й коэф ф ициент м асш табирования перемещ ает десятичную
точку влево. (П ри вводе, эф ф ект обратный.)
При выводе коэф ф ициент масш табирования зависит от того, какой вид действитель
ного редактирования ассоциирован с ним.
■ Для редактирования Р внеш нее значение равняется внутреннем у значению элемента!
списка ввода/вы вода, ум нож енном у на 10к. Это редактирование изменяет величину
данных.
■ Для редактирования Е и О, внешнее десятичное поле элем ента списка ввода/вывода
умножается на 10к, и к вычитается из экспоненты. Это редактирование изменяет вид
данных.
■ П олож ительный коэф ф ициент м асш табирования ум еньш ает экспоненту; отрицатель
ный коэф ф ициент м асш табирования увеличивает экспоненту. Д ля положительного
коэффициент масш табирования, к долж ен бы ть меньш е, чем ¿/ + 2 или возникает
ош ибка преобразования вывода.
■ Для редактирования в , коэф ф ициент масш табирования игнорируется, если величина
данных для вы вода находится внутри диапазона измерений описателя (описатель в
обеспечивает свое собственное м асш табирование). Если величина поля данных нахо
дится вне диапазона описателя в , используется редактирование Е, и коэффициент
м асш табирования имеет тот же эффект, как при редактировании вывода Е.
■ Д ля редактирования В и Е 8 коэффициент масш табирования игнорируется.
V ia e a 10 Ф орм ат ирование вво д а /вы вод а 319
В ы вод, использую щ ий редакт и ровани е Р
Формат Ввод Значение
1РЕ12.3 -2 7 0 139 ДД-2.701Е+02
1Р.Е12.2 - -270.139 ДДД-2.70Е+02
1РЕ12.2 -270.139 ДД Д-0.03Е+04
Следую щ ий пример показы вает утверж дение FORM A T, содерж ащ ее коэффициент
масш табирования:
DIMENSION А(6)
DO 101=1,6
10 A(l) = 25.
WRITE (6,100) А
100 FORMATf F8.2, 2PF8.2, F8.2)
П редыдущ ие утверж дения даю г следую щ ие результаты:
25.00 2500 00 2500.00
2500 00 2500.00 2500.00
Редакт ирование слеш (/). О писатель редактирования слеш заверш ает передачу дан
ных для текущ ей записи и разреш ает передачу данны х для новой записи. Он имеет ф ор
мат:
и/
где г - спецификация повторения, долж на бы ть полож ительной литеральной константой
целого тина но умолчанию ; родовой параметр не мож ет бы ть указан.
Диапазон г изменяется от 1 до 2147483647 (2**31—1) на процессорах In te l ЕМ 64Т и
In te l Ita n iu m ; от 1 до 32767 (2** 15-1) на процессорах 1А-32. Если г опущ ен, он предпола
гается равным 1.
М ногократные слеш и заставляю т систему пропускать входные записи или выводить
пустые записи, следую щ им образом:
Когда п последовательные слеш и появляю тся между двумя описателями редактиро
вания, п - 1 запись пропускается при вводе, или п - 1 пустая запись вы водится. Первый
слеш заверш ает текущ ую запись. Второй слеш заверш ает первую , пропущ енную , или
пустую запись и т. д.
Когда п последовательных слеш ей появляю тся в начале или в конце специф икации
формата, /? записи пропускается, или п пустых записей вы водится, потому что откры
вающие и закрываю щ ие круглые скобки спецификации ф орм ата самостоятельно являю т
ся признаком начала и конца записи, соответственно. Н апример, предполож им , что ука
заны следую щ ие утверждения:
WRITE (6,99)
99 FORMAT ('Г,Т51,'HEADING LINEV/T51,'SUBHEADING LINE'//)
Следую щ ие строки записаны:
Столбец 50, верх страницы
1
HEADING LINE
(пустая строка)
SUBHEADING LINE
(пустая строка)
(пустая строка)
О братите внимание, что первый символ напечатанной записи был зарезервирован как
управляю щ ий символ.
320 С Д А лгапш , В В К ондрат ьев П роклам ирование на Visual FORTRAN
15 FORMAT (Е7.2Д12,(А5,16))
35 FORMAT (A6,(L8(3I2)),A)
С пециф икация повторения группы м ож ет предш ествовать влож енной группе описа
телей редактирования. Н априм ер, следую щ ие утверж дения эквивалентны, а второе у т
верж дение дем онстрирует специф икацию повторения группы:
50 FORMAT (18,18^8.3^15.7^8.3^15.7^8.3^15.7,15,15)
50 FORMAT (2I8,3(F8.3,E15.7),2I5)
Если влож енная группа не показы вает счетчик повторений, предполагается значение
но ум олчанию равное 1.
О бы чно описатели редактирования строк и описатели редактирования управления не
м огут бы ть повторены (за исклю чением слеш а), но лю бой из этих описателей может
бы ть заклю чен в круглы е скобки с предш ествую щ ей спецификацией повторения группы.
Н априм ер, следую щ ие утверж дения допустимы:
76 FORMAT (’MONTHLY',3(TOTAL'))
100 FORMAT (I8,4(T7),A4)
В ы раж ени е перем енного ф орм ат а - это числовое выражение, заклю ченное в угло
вые скобки (< >), которое м ож ет использоваться в утверж дении FO R M A T или в сим
вольны х специф икациях формата.
Числовое вы раж ение м ож ет бы ть лю бым допустим ы м выражением Fortran, включая
ф ункциональны е вызовы и ссылки на форм альны е аргументы.
Если вы раж ение не им еет типа целочисленное, оно, преж де чем использоваться, пре
образуется в целочисленны й тип.
Если значение вы раж ения переменного форм ата не удовлетворяет условиям ограни
чений на величину, прим еняю щ ую ся для ее использования в формате, возникает ошибка.
В ы раж ения перем енного ф орм ата не могут использоваться с описателем редактиро
вания Н и они не допускаю тся в сим вольны х специф икациях формата.
В ы раж ения перем енного ф орм ата вычисляю тся каждый раз, когда с ними сталкива
ю тся при просм отре формата. Если значение переменной, используемой в выражении,
изм енилось во время вы полнения утверж дения ввода/вы вода, в следую щ ий раз использу
ется новое значение, когда обрабаты вается элем ент формата, содерж ащ ий выражение.
Р ассм отрите следую щ ее утверж дение:
FORMAT (l<J+1>)
При просм отре ф орм ата преды дущ ее утверж дение вы полняет I (целочисленную ) пе
редачу данны х с ш ириной поля J + 1 . Вы раж ение вычисляется каждый раз, когда с ним
сталкиваю тся при норм альном просм отре формата.
Рассм отрите утверж дения:
DIMENSION А(5)
DATA А/1.,2.,3.,4.,5./
DO 10 1=1,10
WRITE (6,100)1
100 FORMAT (l<MAX(l,5)>)
10 CONTINUE
DO 20 1=1,5
WRITE (6,101) (A(I),J=1,1)
101 FORMAT (<I>F10.<M >)
20 CONTINUE '
END
Гчава 10. Ф орм ат ирование вво д а /вы во д а 323
При выполнении эти утверж дения создаю т следую щ ий вывод:
1
2
3
4
5
6
10
1.
2.0 2.0
3.0 0 3 .0 0 3 .00
4.000 4.000 4.000 4.000
5.0000 5.0000 5.0000 5.0000 5.0000
Печать форматных записей. При выводе, если в результате файл был откры т с
С А К Ю А С Е С О Э Т Я О Ь ^ О К Т К А ]^ или файлом, обработанны м утилитой ф орм ата ГоПрг,
первым символом записи, переданной на устройство построчной печати или терм инал,
обы чно является символ, который не напечатается, но используется для управления ин
тервалом строк (табл. 10.5).
вует описателю редактирования управления (X, Р, Т, TL, TR, SP, SS, S, BN, BZ, $ или :)
или описателю редактирования строк сим волов (Н и сим вольные константы). Для описа
телей редактирования строк сим волов передача данны х возникает непосредственно м еж
ду внеш ней записью и специф икацией формата.
Когда управление ф орм атом сталкивается с описателем редактирования данных в
спецификации форм ата, оно определяет, указан ли соответствую щ ий элемент списка вво
да/вы вода. Если такой элем ент есть, он передается под управлением описателя редакти
рования и затем обрабатывается управление форматом. Если нет никакого соответствую
щ его элем ента списка ввода/вы вода, управление форматом заверш ается.
Если нет никаких других элем ентов списка ввода/вы вода, которые будут обрабаты
ваться, управление ф орм атом также заверш ается, когда возникает следую щ ее событие:
■ сталкивается с описателем редактирования двоеточие;
■ достигнут конец специф икации формата.
Если остаю тся дополнительны е элементы списка ввода/вывода, часть или вся специ
фикация ф орм ата используется повторно.
При повторном использовании спецификации формата заканчивается текущ ая запись
и начинается новая. У правление форматом затем возвращ ается к одному из следую щ его
выражений (по порядку) и продолж ается из этой точки:
■ С пецификации повторения группы, откры ваю щ аяся круглая скобка которой соответ
ствует предпоследней закры ваю щ ей круглой скобке спецификации формата.
■ Н ачальной откры ваю щ ейся круглой скобки спецификации формата.
П овторное использование спецификации форм ата не действует на коэффициент м ас
ш табирования, описатели редактирования управления знака (S, SP или SS) или описатели
редактирования интерпретации пробелов (BN или BZ).
Пример
Д анны е в файле FO R 002.D A T долж ны обрабаты ваться по 2 записи одновременно.
Каждая запись начинает с числа, пом ещ аемого в элем ент вектора В, сопровож даем ою
пятью числами, которы е будут помещ ены в строку в матрице А.
FOR002. D A T содерж ит следую щ ие данные:
001 0101 0 1 0 2 0 1 0 3 0 1 0 4 0 1 0 5
002 0201 0202 0203 0 2 0 4 0205
003 0301 0 302 0 3 0 3 0 3 0 4 03 0 5
004 0401 0402 0403 0 4 0 4 0 405
005 0501 0502 0503 0 5 0 4 0 505
006 0601 0602 0603 0 6 0 4 0 605
007 0701 0702 0703 0 7 0 4 0705
008 0801 0802 0803 0 8 0 4 0 805
009 0901 0902 0903 0 9 0 4 0 905
0 1 0 1001 1002 1003 1 0 0 4 1 005
П ример взаим одействия меж ду специф икациям и форм ата и списками ввода/вывода,
для обработки данны х в файле FOR002. DAT.
I N T E G E R I, J, A ( 2 ,5 ) , B ( 2 )
O P E N (u n it= 2 , a c c e s s - s e q u e n t i a l ' , f il e - F O R 0 0 2 . D A T ' )
1 R E A D ( 2 ,1 0 0 ) ( B (l), (A (I,J ), J = 1 ,5 ) ,l = 1 ,2 )
2 100 F O R M A T ( 2 (13, X , 5 ( I 4 ,X ) , /))
3 W R IT E ( 6 ,9 9 9 ) B , ( (A ( I ,J ) ,J = 1 ,5 ) ,I = 1 ,2 )
999 F O R M A T (' В i s ', 2 (1 3 , X ) , '; A is', I
1 ( '' , 5 (14, X ) ) )
4 R E A D ( 2 ,2 0 0 ) ( B (l), (A (I ,J ), J = 1 ,5 ),1 = 1 ,2 )
Глава К) Форматирование ввода/вывода 325
200 F O R M A T ( 2 ( 1 3 , X , 5 (1 4 ,X ) , : / ) )
5 W R IT E ( 6 ,9 9 9 ) B , ( ( A ( I ,J ) ,J = 1 ,5 ) ,l = 1 ,2 )
6 R E A D ( 2 ,3 0 0 ) ( B (l), (A (I ,J ), J = 1 ,5 ) ,l = 1 ,2 )
300 F O R M A T ((1 3 , X, 5 ( I 4 ,X ) ) )
7 W R IT E ( 6 ,9 9 9 ) B , ( ( A ( I ,J ) ,J = 1 ,5 ) ,I = 1 ,2 )
8 R E A D ( 2 ,4 0 0 ) ( B (l), (A (I,J ), J = 1 ,5 ) ,l = 1 ,2 )
400 FO R M A T (1 3 , X, 5 ( I 4 ,X ) )
9 W R IT E ( 6 ,9 9 9 ) B , ( ( A ( I ,J ) ,J = 1 ,5 ) ,I = 1 ,2 )
END
Это утверж дение читает В(1); затем элементы от А( 1,1) до А (1,5); затем В (2) и эл е
менты от А (2,1) до А(2,5). Первая прочитанная запись (начинается с 001) запускает о б р а
ботку списка ввода/вывода.
Есть две записи, каж дая в ф орм ате 13, X, 5 (14, X). Слеш (/) вызывает чтение второй
записи после того, как элем ент А (1,5) обработан. Это такж е вызывает чтение третьей за
писи после того, как элем ент А (2,5) обработан; никакие данны е не берутся из этой зап и
си. Это утверж дение создает следую щ ий вывод:
B is 1 2; A is
101 102 103 104 105
201 202 203 204 205
Это утверж дение читает запись, начинаю щ ую ся с 004. Слеш (/) вы зывает чтение сл е
дующ ей записи после того, как элем ент А (1,5) обработан. Д воеточие (:) о сш н авли вает
чтение после того как элемент А (2,5) обработан, но прежде, чем слеш (/) вы нуж дает чи
тать другую запись. Это утверж дение создает следую щ ий вывод:
В is 4 5 ; A is
401 402 403 404 405
501 502 503 504 505
Это утверж дение читает запись, начинаю щ ую ся с 006. После того, как элем ент А (1,5)
обработан, возвращ ение ф орм ата заставляет прочитать следую щ ую запись и обработка
формата начинается с левой круглой скобки перед 13.
Э ю утверж дение создает следую щ ий вывод:
В is 6 7; A is
601 602 603 604 605
701 702 703 704 705
Это утверж дение читает запись, начинаю щ ую ся с 008. П осле того, как элемент А (1,5)
обработан, повторное использование спецификации ф орм ата заставляет прочитать сл е
дую щ ую запись и обработка ф орм ата начинается с левой круглой скобки перед 14.
Это утверж дение создает следую щ ий вывод:
B is 8 90; A is
801 802 803 804 805
90109020 9030 9040 100
Запись 009 0901 0902 0903 0904 0905 обработана с 14 как "009" для элем ента В(2), ко
торый равен 90. X пропускает следую щ ий "О". Затем "901" обработано для элем ента
А (2,1), который равен 9010, "902" для элем ента А (2,2), "903" для элем ента А (2,3) и "904"
для элемента А(2,4). С пециф икация повторения 5 теперь исчерпана и ф орм ат заканчива
ется. П овторное использование специф икации ф орм ата заставляет читать другую запись
и обработка ф ормата начинается в левой круглой скобке перед 14, таким образом "010"
прочитан для элем ента А (2,5), который равен 100.
Глава 11. Утверждения ввода/вывода
файловых операций
Эта глава содерж ит информ ацию об утверж дении соединения с файлом, запроса и по
зиционировании.
дт от ш 326
Г лава I /. Ут верж дения вво д а /вы во д а ф ай ю аых операций 327
р - по умолчанию скалярное вы раж ение сим вольного типа, указы ваю щ им состояние
файла после того, как он закрыт. Он имеет одно из следую щ их значений:
'KEEP' или 'SA V E' сохраняет файл после закрытия устройства.
'DELETE' удаляет файл после закрытия устрой ства1.
'PR IN T' п ред оставл яет ф айл сп ул еру (spooler) у стр о й ства п о строчн ой п ечати , за
тем сохран яет его.
'PR IN T/D ELETE'2 предоставляет файл спулеру устройства построчной печати, затем
удаляет его.
'SUBM IT' разветвляет (fork) процесс, чтобы выполнить файл.
'SU BM IT/D ELETE' разветвляет процесс, чтобы выполнить файл, затем удаляет файл
после того, как разветвление закончено.
По умолчанию принимается 'D ELETE' для рабочих файлов и приложений Q uickW in
(W *32, W *64). Для всех других файлов по ум олчанию принимается 'SAVE'.
label является меткой утверж дения адресата перехода, которое получает управление,
если возникает ошибка.
i-var является скалярной целочисленной переменной, которая определяется как поло
жительное целое число, если возникает ош ибка, и нуль, если ош ибки не возникает.
Правила использования
Спецификаторы утверж дения C LO SE м огут появиться в лю бом порядке. У стройство
ввода/вывода долж но б ь п ь указано, но клю чевое слово UN IT необязательно, если специ
фикатор устройства является первым элем ентом в управляю щ ем списке ввода/вывода.
Состояние, указанное в утверж дении CLO SE зам еняет состояние, указанное в утвер
ждении OPEN, за исклю чением того, что файл откры ты й, как рабочий файл не м ож ет
быть сохранен, напечатан или выполнен, а файл, откры ты й только для чтения, не может
быть удален.
Если утверждение CLO SE указанно для устройства, которое не откры то, оно не вы
полняется.
Пример
CLOSE (UNIT=J, STATUS-DELETE', ERR=99)
Это утверж дение закры вает файл, связанны й с устройством J, и удаляет его. Если
возникает ош ибка, управление передается утверж дению , помеченному меткой 99.
1ЕслидействуетOPEN(READONLY).
‘Используйте только для последовательных файлов.
328 C .J l Л 1гаш н, В. В. К о н д р а т ьев П р о гр а и и р о ва ц п е на Visual FORTRAN
Правила использования
В файле прям ого доступа, утверж дение D ELETE удаляет запись прямого доступа,
указанную в г. Если R E O r опущ ен, удаляется текущ ая запись. Когда удалена запись
прям ого доступа, лю бая связанная переменная устанавливается к номеру следую щ ей за
писи.
У тверж дение D ELETE логически удаляет соответствую щ ую запись из указанного
файла, определяя м естонахож дение записи и отм ечая ее как удаленную запись. Оно затем
освобож дает позицию , преж де занятую удаленной записью так, чтобы новая запись мог
ла бы ть записана в этой позиции.
Примечание. Вы должны использовать опцию компилятора, указывающую по умолчанию
OpenVMS для READ, чтобы обнаружить, что запись была удалена.
Примеры
С ледую щ ее утверж дение удаляет пятую запись в файле, связанном с устройством
ввода/вы вода 10:
DELETE (10, REC=5)
П редполож им , что указано следую щ ее утверж дение:
DELETE (UNIT=9, REC=10,10STAT=I0S, ERR=20)
Д есятая запись в файле, связанном с устройством 9 удаляется. Если возникает ош иб
ка, управление передается утверж дению , помеченному меткой 20, и полож ительное це
лое число запоминается в переменной IOS.
Спецификатор ACCESS
С пециф икатор A C C E SS запраш ивает, как связан файл. Он имеет следую щ ий формат:
ACCESS = асс
где асс - по ум олчанию скалярная переменная сим вольного типа, которой назначается
одно из следую щ их значений:
'SE Q U EN T IA L ' - если файл связан для последовательн ою доступа;
'D IR E C T' - если файл связан для прям ого доступа;
'U N D E FIN E D ' - если файл не связан.
Глава 11. Утверждения ввода/вывода файловых операций 331
Спецификатор ACTION
Спецификатор A CTIO N запраш ивает, какие операции ввода/вы вода допускаю тся для
файла. Он имеет следую щ ий формат:
ACTION = act
где act - скалярная переменная сим вольного типа по ум олчанию , которой назначается
одно из следую щ их значений:
'REA D' - если файл связан только для ввода;
'W RITE' - если файл связан только для вывода;
'REA D W RITE' - если файл связан для ввода и вывода;
'U N D EFIN ED ' - если файл не связан.
Спецификатор BLANK
Спецификатор B LA N K запраш ивает, какое управление пробелам и действует для ф ай
ла. Он имеет следую щ ий формат:
BLANK = Ыпк
где blnk - по умолчанию скалярная переменная сим вольного типа, которой назначается
одно из следую щ их значений:
'NU LL' - если пустое управление пробелами действует для ф айла (файл заполняется
пробелами);
'ZERO' - если нулевое управление пробелами дей ствует для ф айла (файл заполняется
нулями);
'U N D EFIN ED ' - если файл не связан или он не связан для ф орм атной передачи дан
ных.
Спецификатор BLOCKSIZE
Спецификатор BLO C K SIZE запраш ивает размер буф ера ввода/вы вода. Он имеет сле
дую щ ий формат:
BLOCKSIZE = bks
где bks - скалярная целочисленная переменная; назначается текущ ий разм ер буф ера вво
да/вывода. Если устройство или файл не связаны, заданное значение равно нулю.
Спецификатор BUFFERED
С пецификатор BU FFERED запраш ивает, действует ли во время вы полнения буф ери
зация (промеж уточное хранение). Он имеет следую щ ий формат:
332 С Д Алгазин, В. В Кондратьев . Программирование на Visual FORTRAN
BUFFERED = bf
где b f - no ум олчанию скалярная переменная сим вольного типа, которой назначается од
но из следую щ их значений:
'YES' - если файл или устройство связаны и буферизация действует;
'N 0 ' - если файл или устройство связаны, а буф еризация не действует;
'U N K N O W N ' - если файл или устройство не связаны.
Спецификатор CARRIAGECONTROL
С пецификатор C A R R IA G E C O N T R O L запраш ивает, какое управление кареткой дей
ствует для файла. Он им еет следую щ ий формат:
CARRIAGECONTROL = сс
где сс - по ум олчанию скалярная переменная сим вольного типа, которой назначается од
но из следую щ их значений:
'FO RTR A N ' - если файл связан с управлением кареткой Fortran в действии.
'LIST' - если файл связан с неявным управлением кареткой в действии.
'NONE' - если файл связан без управления кареткой в действии.
'U N K N O W N ' - если файл не связан.
Спецификатор CONVERT
С пециф икатор C O N V E R T запраш ивает, какое преобразование данных действует для
файла. Он имеет следую щ ий формат:
CONVERT = fm
где fm - по ум олчанию скалярная переменная сим вольного типа, которой назначается
одно из следую щ их значений (см. прил. G):
'L1TTLE END1AN' - если файл связан с little-endian (порядок представления целых
чисел от младш его к ст арш ему - интеловский порядок байт) и задано 1ЕЕЕ преобразо
вание данны х с плаваю щ ей точкой.
'B IG JE N D IA N ' - если файл связан с big-endian (порядок представления целых чисел
от старшего к младш ему - сетевой порядок байт) и задано 1ЕЕЕ преобразование дан
ных с плаваю щ ей точкой.
'CRA Y ' - если файл связан с big-endian (порядок представления целых чисел от
старшего к младш ему - сетевой порядок байт) и задано CRAY преобразование данных
с плаваю щ ей точкой.
'FDX' - если файл связан с little-endian (порядок представления целых чисел от млад
шего к старшему - интеловский порядок байтов) и задан процессор VAX* F flo a tin g ,
D floating и IEEE X floating преобразование данных.
'FGX' - если файл связан с little-endian (порядок представления целых чисел от млад
шего к ст арш ему - интеловский порядок байтов) и задано VAX F floating, G floating и
IEEE X floating преобразование данных.
'IBM ' - если файл связан с big-endian (порядок представления целых чисел от ст ар
шего к младш ему - сетевой порядок байтов) и задано IBM* System \370 преобразование
данных с плаваю щ ей точкой в действии.
'VA X D ' - если файл связан с little-endian (порядок представления целых чисел от
младш его к ст арш ему - интеловский порядок байтов) и задан процессор VAX
F floating, D _fIoating и H flo a tin g .
Глава 1 1 Утверждении ввода/вывода фай итых операции 333
'VAXG' - если файл связан с little-endian (порядок представления целыхчисел от
младшего к старшему - интеловский порядок байтов) и задан процессор VAX
F flo a tin g , G floating и Н floating.
'NA TIVE' - если файл связан без преобразования данных.
'UNKNOW N' - если файл или устройство не связаны для неформатной передачи данных.
Спецификатор DELIM
Спецификатор DEL1M запраш ивает, как разграничиваю тся сим вольны е константы
при выводе списком имен и управляю щ им списком. Он им еет следую щ ий формат:
DELIM = del
где del - по ум олчанию скалярная переменная сим вольного типа, которой назначается
одно из следую щ их значений:
'A PO STRO PH E' - если использую тся апострофы , чтобы разграничивать сим вольны е
константы при выводе списком имен и управляю щ им списком.
'QU O TE' - если использую тся кавы чки, чтобы разграничивать сим вольны е константы
при выводе списком имен и управляю щ им списком.
'NONE' - если никакие разделители не исгюльзуюгся.
'U N D EFIN ED ' - если файл не связан или не связан для форматной передачи данных.
Спецификатор DIRECT
Спецификатор D IR ECT запраш ивает, связан ли файл для прям ого доступа. Он им еет
следую щ ий формат:
DIRECT = dir
где dir - по ум олчанию скалярная переменная сим вольного типа, которой назначается
одно из следую щ их значений:
'YES' - если файл связан для прям ого доступа.
'N 0 ' - если файл не связан для прямого доступа.
'UN K N O W N ' - если файл вообщ е не связан.
Спецификатор EXIST
Спецификатор EX IST запраш ивает, сущ ествует ли файл и м ож ет ли он быть открыт.
Он имеет следую щ ий формат :
EXIST = ex
где ex - по ум олчанию скалярная переменная лог ического типа, которой дается одно из
следую щ их значений:
.TRUE. - если указанны й файл сущ ествует и мож ет быть открыт, или если указанное
устройство сущ ествует.
.FALSE. - если указанный файл или устройство не сущ ествую т или если файл сущ е
ствует, но не может бы г ь о ткрыт.
Устройство сущест вует', если оно задано числом в диапазоне, допускаемом процессором.
Спецификатор FORM
С пецификатор FORM запраш ивает, связан ли файл для форм атной, неф орматной или
двоичной (W *32, W *64) передачи данных. Он имеет следую щ ий формат:
FORM = fm
334 С Д Ачгазин, В В Кондратьев Програмирование на Visual FORTRAN
Спецификатор MODE
M O D E является нестандартны м синоним ом для A CTIO N (см. "Спецификатор
A C TIO N ").
Спецификатор NAME
С пециф икатор N A M E возвращ ает имя файла, имеет следую щ ий формат:
NAME = пте
где пте - по умолчанию скалярная переменная символьного типа, которой назначается имя
файла, с которым связано устройство. Если файл не имеет имени, пте - неопределено.
Значение, назначаем ое пте, - не обязательно то же значение, что и заданное в специ
фикаторе FILE. О днако значение, которое назначается, всегда допустим о для использо
вания со специф икатором FILE в утверж дении O PEN , если значение не было обрезано
способом, который делает его недопустимы м . (Значения обрезаю тся, если объявление
пте является слиш ком маленьким , чтобы содерж ать все значение.)
Глава II. Утверждения ввода/вывода файловых операций 335
Примечание. Спецификаторы F IL E и N A M E являются синонимами когда используются с ут
верждением O P EN , но не когда используется с утверждением IN Q U IR E .
Спецификатор NAMED
Спецификатор NAM ED запрашивает, именован ли файл. Он имеет следующий формат:
NAMED = nmd
где nmd - по ум олчанию скалярная переменная логического типа, которой назначается
одно из следую щ их значений:
.TRUE. - если файл им еет имя.
.FALSE. - если файл не имеет имени.
Спецификатор NEXTREC
Спецификатор N EX TR EC запраш ивает, откуда м ож ет бы ть прочитана следую щ ая за
пись или куда она записана в файл, связанны й для прям ого доступа. Он имеет следую
щий формат:
NEXTREC = nr
где n r - скалярная целочисленная переменная, значение которой назначается следую щ им
образом:
■ Если файл связан для прямого доступа и запись (г) бы ла предварительно прочитана
или записана, назначаем ое значение равно г + 1.
■ Если никакая запись не бы ла прочитана или записана, назначаем ое значение равно 1.
■ Если файл не связан для прямого доступа или если позиция файла не м ож ет быть оп
ределена из-за ош ибочного условия, назначаем ое значение равно нулю.
■ Если файл связан для прямого доступа и на файле был вы полнен REW IN D , назначае
мое значение равно 1.
Спецификатор NUMBER
Спецификатор N U M B ER запраш ивает номер устройства, связанного с файлом. Он
имеет следую щ ий формат:
NUMBER = пит
где пит - скалярная целочисленная переменная.
П еременной пит назначается номер устройства, в настоящ ее время связанного с ука
занным файлом. Если нет никакого устройства, связанного с файлом, назначаем ое значе
ние равно -1 .
Спецификатор OPENED
Спецификатор O PEN ED запраш ивает, связан ли файл. Он им еет следую щ ий формат:
OPENED = об
где o d - по ум олчанию скалярная переменная логического типа, которой назначается од
но из следую щ их значений:
.TRUE. - если указанный файл или устройство связаны.
.FALSE. - если указанный файл или устройство не связаны.
336 С Д Апгазии, В В Кондратьев . Програмироваиие на Visual FORTRAN
Спецификатор ORGANIZATION
С пециф икатор O R G A N IZA TIO N запраш ивает, как организован файл. Он имеет сле
дую щ ий формат:
ORGANIZATION = org
где org - по ум олчанию скалярная переменная сим вольного типа, которой назначается
одно из следую щ их значений:
'SE Q U EN TIA L ' - если файл является последовательны м файлом.
'RE L A T IV E' - если файл является файлом прямого доступа.
'U N K N O W N ' - если процессор не мож ет определить организацию файла.
Спецификатор PAD
С пециф икатор PAD запраш ивает, было ли указанно для файла заполнение пробелами.
Он имеет следую щ ий формат:
PAD = pd
где p d - по ум олчанию скалярная переменная сим вольного типа, которой назначается
одно из следую щ их значений:
'YES' - если файл или устройство не связаны или были связаны с P A D -Y E S '.
'NO' - если файл или устройство были связаны с P A D - N 0 '.
Спецификатор POSITION
С пециф икатор POSITIO N запраш ивает позицию файла. Он им еет следую щ ий формат:
POSITION = pos
где p o s - по ум олчанию скалярная переменная сим вольного типа, которой назначается
одно из следую щ их значений:
'R E W IN D ' - если файл связан с позицией в начальной точке.
'A PPEN D ' - если файл связан с позицией в конечной точке (или перед записью конца
файла, если она есть).
'A SIS' - если файл связан, без изменения его позиции.
'U N D E FIN E D ' - если файл не связан, или связан для передачи данных прямого досту
па и на устройстве не бы ло вы полнено утверж дение REW IN D .
Спецификатор READ
Специф икатор REA D запраш ивает, мож ет ли файл бы ть прочитан. Он имеет следую
щий формат:
READ = rd
где rd - по ум олчанию скалярная переменная сим вольного типа, которой назначается од
но из следую щ их значений:
'YES' - если файл м ож ет быть прочитан.
'N 0 ' - если файл не м ож ет бы ть прочитан.
'U N K N O W N ' - если процессор не м ож ет определить, м ож ет ли файл быть прочитан.
Спецификатор READWRITE
С пециф икатор RE A D W R IT E запраш ивает, мож ет ли файл бы ть и прочитан и записан.
Он имеет следую щ ий формат:
Глава 11 Утверждения ввода/вывода файловых операций 337
READWRITE = rdwr
где rdw r - по умолчанию скалярная переменная сим вольного типа, которой назначается
одно из следующ их значений:
'YES' - если файл мож ет бы ть прочитан и записан.
'N 0 ' - если файл не м ож ет бы ть прочитан и записан.
'UNKNOW N' - если процессор не м ож ет определить, м ож ет ли файл бы ть прочитан и
записан.
Спецификатор RECL
Спецификатор RECL запраш ивает м аксим альную длину записи в файл. Он имеет сле
дую щ ий формат:
RECL = гс/
где rcl - скалярная целочисленная переменная, значение которой назначается следую
щим образом:
■ Если файл или устройство связаны, назначаем ое значение является максимальной
разреш енной длиной записи.
■ Если файл не сущ ествует или не связан, назначаем ое значение является нулем.
Н азначаемое значение выраж ается в блоках 4-байтовой длины , если файл связан в на
стоящ ее время (или был предварительно связан), для неф орматной передачи данных;
иначе, значение выражается в байтах.
Спецификатор RECORDTYPE
Спецификатор REC O R D TY PE запраш ивает, какой тип записей находятся в файле. Он
имеет следующий формат:
RECORDTYPE = rtype
где rtype - по умолчанию скалярная переменная сим вольного типа, которой назначается
одно из следую щ их значений:
'FIXED' - если файл связан для записей ф иксированной длины .
'VARIABLE' - если файл связан для записей переменной длины .
'SEGM ENTED' - если файл связан для неф орматной последовательной передачи дан
ных, использующ ей сегментированны е записи.
'STREAM ' - если файловые записи ничем не заканчиваю тся.
'S T R E A M C R ' - если файловы е записи заканчиваю тся переводом каретки.
'S T R E A M L F ' - если файловые записи заканчиваю тся переводом строки.
'UNKNOW N' - если файл не связан.
Спецификатор SEQUENTIAL
Спецификатор SEQ U EN TIA L запраш ивает, связан ли файл для последовательного
доступа. Он имеет следую щ ий формат:
SEQUENTIAL = seq
где seq - по умолчанию скалярная переменная сим вольного типа, которой назначается
одно из следующ их значений:
'YES' - если файл связан для последовательного доступа.
'N 0 ' - если файл не связан для последовательного доступа.
338 С .Д Аъ*ашн, В В Кондратьев Прокламирование на Visual FORTRAN
Спецификатор SHARE
С пециф икатор SH A RE запраш ивает текущ ее состояние разделения файла или устрой
ства. Он им еет следую щ ий формат:
SHARE = shr
Спецификатор WRITE
С пециф икатор W R ITE запраш ивает, может ли быть записан файл. Он имеет следую
щ ий формат:
WRITE = wr
где w r - по ум олчанию скалярная переменная сим вольного типа, которой назначается
одно из следую щ их значений:
'Y ES' - если файл м ож ет бы ть записан.
'N 0 ' - если файл не м ож ет быть записан.
'U N K N O W N ' - если процессор не м ож ет определить, мож ет ли файл быть записан.
Fiaaa 11 Утверждения ввода/вывода фаГповых операции 339
Следую щ ий пример откры вает сущ ествую щ ий файл /usr/users/som eone/ tesl.dat:
OPEN (unit=10, DEFAULTFILE='/usr/users/someone/,) FILE='test.dat,) 1 FORM='FORMATTED,1STATUS='OLD')
Спецификатор ACCESS
С пецификатор A CC ESS указы вает метод доступа для соединения файла. Он имеет
следую щ ий формат:
ACCESS = асс
где асс - по ум олчанию скалярное вы раж ение сим вольного тина, которое является одним
из следую щ их значений:
'DIRECT' указы вает прямой доступ.
'SEQ U EN TIA L' указы вает последовательны й доступ.
'APPEN D ' указы вает последовательный доступ, но файл позиционирован па запись
конца файла (добавление в конец).
По ум олчанию - 'SEQ U EN TIA L'.
Есть ограничения на доступ к записи в соответствии с организацией файла и типом
записи.
Спецификатор ACTION
С пецификатор A CTIO N указы вает допустим ы е операции ввода/вы вода для соедине
ния с файлом. Он имеет следую щ ий формат:
ACTION = act
где act - но ум олчанию скалярное выраж ение сим вольного типа, которое является одним
из следую щ их значений:
'READ' указы вает на то, что только утверж дения REA D могут обратиться к этому со
единению.
'W RITE' указы вает на то, что только утверж дения W RITE, D ELETE и EN D FILE могут
обратиться к этому соединению.
'READW R1TE' указы вает на то, что утверж дения REA D , W RITE, D ELETE и EN DFILE
могут обратиться к этому соединению.
По ум олчанию - 'READW R1TE'. В системах W indows* на значение но умолчанию
можно воздействовать опцией компилятора.
Спецификатор BLOCKSIZE
Спецификатор B LO CK SIZE указы вает физический размер передачи ввода/вы вода для
файла. Он имеет следую щ ий формат:
BLOCKSIZE = bks
где bks - скалярное числовое выражение. В случае необходим ости значение преобразо
вывается в целочисленны й тип данны х перед использованием.
Если вы указываете число, отличное от нуля, для bks, оно округляется до числа, крат
ного 512-байтовым блокам.
Если вы не указы ваете B L O C K SIZE или вы указы ваете нуль для bks, применяется
значение по умолчанию файловой системы.
Спецификатор BUFFERCOUNT
Спецификатор B U FFERC O U N T указывает число буф еров, которые будут ассоцииро
ваться с устройством для многобуферного ввода/вывода. Он имеет следую щ ий формат:
BUFFERCOUNT = be
где be - скалярное числовое выраж ение в диапазоне от 1 до 127. В случае необходимости
значение преобразуется в целочисленны й тип данных перед использованием.
С пецификатор BL O C K SIZ E определяет размер каж дого буфера. Н апример, если
BUFFERCOUNT=3 и BLO CK S!ZE =2048, общ ее количество байтов, распределенны х для
буферов равно 3*2048 или 6144 байта.
Если вы не указы ваете B U FFE R C O U N T или вы указы ваете нуль для Ьс\ значение по
умолчанию равно I.
Спецификатор BUFFERED
Спецификатор BU FFERED указы вает поведение библиотеки времени вы полнения по
сле операций W RITE. Он имеет следую щ ий формат:
BUFFERED = bf
344 С Д Аъчпин, В В Кондратьев Програиирование на Visual FORTRAN
где b f - по ум олчанию скалярное вы раж ение сим вольного типа, которое оценивается к
одном у из следую щ их значений:
'Y ES' требует, чтобы библиотека поддерж ки накапливала выходные данны е в ее внут
реннем буфере, возможно для нескольких операций W RITE, прежде чем послать данные
файловой системе.
Буферизация м ож ет улучш ить работу во время выполнения для приложений с боль
шим объемом вывода.
'N 0 ' требует, чтобы библиотека поддерж ки посы лала выходные данны е файловой
систем е после каж дой операции W RITE. По ум олчанию - 'N 0 '.
Если указано BU FFE R E D - YES', запрос будет или не будет соблюдаться, в зависимо
сти от устройства вывода и файловы х различий или характеристик соединения.
Если BLOCKSLZE и BUFFERCOUNT были указаны для OPEN, их произведение определя
ет размер в байтах внутреннею буфера. Иначе значение по умолчанию внутреннего буфера
равно 8192 байт.
Примечание. На системах Windows* размер по умолчанию внутреннего буфера равен
1024 байт, если используется опция компилятора /fpscomp:general.
В нутренний буфер может увеличиваться, чтобы поддерж ивать наибольш ую отдель
ную запись, но никогда не будет сж иматься.
Спецификатор CARRIAGECONTROL
С пециф икатор C A R R IA G EC O N T R O L указы вает тип используем ого управления ка
ретки, когда файл отображ ается на терминале. Он имеет следую щ ий формат:
CARRIAGECONTROL = сс
где сс - rio ум олчанию скалярное выраж ение сим вольного типа, которое является одним
из следую щ их значений:
'FO R T R A N ' указы вает обы чную интерпретацию F ortran для первого символа.
'LIST' указы вает 1 перевод строки между записями.
'N O N E ' не указы вает никакой обработки управления каретки.
По ум олчанию для двоичны х (W *32, W *64) и неф орматны х файлов - 'NONE'. По
ум олчанию для форм атны х файлов - 'LIST'. О днако если вы используете опцию компи
лятора, указы ваю щ ую ум олчание O penV M S и устройство связано с терминалом, по
ум олчанию - 'FO RTR A N '.
Спецификатор CONVERT
С пециф икатор C O N V E R T указы вает неродной числовой ф орм ат для неформатных
данны х. Он им еет следую щ ий формат:
CONVERT = fm
где fin - по ум олчанию скалярное выражение сим вольного типа, которое является одним
из следую щ их значений:
*
'L 1 T T L E E N D 1A N ' - litll-endian целочисленны е данны е и 1ЕЕЕ данные с плаваю щ ей
точкой.
'ВЮм ENDIAN' - big-endicin целочисленные данные и 1ЕЕЕ данные с плавающей точкой.
'C R A Y ' - big-endian целочисленны е данны е и CR A Y * данны е с плаваю щ ей точкой
разм ера REA L(8) или CO M PLEX (8).
Глава 1 1 У т верж дения вво д а /вы во д а ф а й ю в ы х операций 345
'FDX' - Utll-endian целочисленны е данны е и VAX* данны е с плаваю щ ей точкой ф ор
мата F flo a tin g для REA L(4) или CO M PLEX (4), D floating для REA L (8) или C O M PLEX
(8) и IEEE X J lo a tin g для REA L(16) или CO M PLEX (16).
'FGX' - litll-endian целочисленны е данны е и данны е процессора V A X с плаваю щ ей
точкой формата F floating для REA L(4) или CO M PL E X (4), G _floating для размера
REAL(8) или CO M PLEX (8) и IEEE X _floating для REA L (16) или CO M PL E X (16).
'IBM ' - big-endian целочисленны е данны е и IBM * System \370 данны е с плаваю щ ей
точкой размера REA L(4) или C O M PLEX (4) (IBM короткие 4) и разм ера R EA L(8) или
CO M PLEX(8) (IBM длинны е 8).
'VAXD' - litll-endian целочисленны е данные и данны е процессора V A X с плаваю щ ей
точкой формата F floating для размера REA L(4) или C O M PL E X (4), D flo a tin g для р азм е
ра REAL(8) или C O M PLEX (8) и H floating для R EA L(16) или CO M PL E X (16).
'VAXG' - litll-endian целочисленны е данные и данны е процессора V AX с плаваю щ ей
точкой формата F floating для размера R EA L(4) или C O M PL E X (4), G floating для разм е
ра REAL(8) или C O M PLEX (8) и H _floating для REA L(16) или CO M PL E X (16).
'NATIVE' - никакого преобразования данных не выполняется. Это значение прим еня
ется по умолчанию.
Вы можете использовать CO N V ERT, чтобы указать несколько ф орм атов в одной про
грамме. О бычно один ф орм ат используется для каждого указанного ном ера устройства.
Когда читается неродной формат, неродной ф орм ат на диске преобразуется к родном у
формату в памяти. Если преобразованное неродное значение - вне диапазона родного
типа данных, появляется динамическое сообщение (сообщение во время выполнения про
граммы).
Есть другие способы указать числовой ф ормат для неф орматны х файлов: вы можете
указать переменную среды, опцию компилятора, указы ваю щ ую C O N V E R T или
O PTIO NS/CO N V ERT. Таблица показы вает порядок старш инства.
Используемый метод Старшинство
Переменная среды Самое высокое
OPEN (CONVERTS -
OPTIONS/CONVERT -
Опция компилятора CONVERT Самое низкое
Опция компилятора C O N V ER T и OPTION S/C O N V E R T воздействует на все номера
устройств, используемые программой, в то время как перем енны е среды и OPEN
(CO N VERT =) воздействую т на определенны е номера устройств.
Следующий пример показы вает, как закодировать утверж дение O PE N , чтобы прочи
тать неформатные числовые данны е CRAY с устройства 15, которые могли бы бы ть об
работаны и, возможно, записаны в родном формате litll-endian на устройство 20:
OPEN (CONVERT-CRAY', FILE=agraph3.data, FORM-UNFORMATTED',
UNIT=15)
Спецификатор DEFAULTFILE
Спецификатор D EFA U L TFILE указы вает строку имени пути ф айла по умолчанию . Он
имеет такой формат:
DEFAULTFILE = def
346 С Д А ъ'аш н, В В К ондрат ьев И рограм нроваи ие на Visual FORTRAN
где def - по ум олчанию сим вольное выраж ение, указы ваю щ ее строку имени пути файла.
Строка имени пути ф айла по ум олчанию используется главным образом при получении
имен пути файла в интерактивном режиме. Имена пути файла, известные пользователь
ской гтротрамме, обы чно появляю тся в спецификаторе FILE.
DEFAULT FILE поставляет значение системе ввода/вывода Fortran, которое префик-
сируется (добавляется в начало) к имени, которое появляется в FILE.
Если d efw z заканчивается слеш ем (/), слеш добавляется.
Если D E FA U LTFILE опущ ен, система ввода/вы вода Fortran использует текущ ий ра
бочий каталог в к ач ес 1 ве с троки имени пути файла по умолчанию .
Спецификатор DELIM
С пециф икатор D ELIM указы вает, какие символы (если они есть) использую тся, что
бы разграничивать сим вольны е константы в выводе списком имен и управляю щ им спи
ском. Он им еет следую щ ий формат:
DELIM = del
где d el - по ум олчанию скалярное выраж ение сим вольного типа, которое является одним
из следую щ их значений:
'A PO ST R O PH E' - указы вает, ч ю апострофы разграничиваю т символьные константы.
Все внутренние апостроф ы удваиваю тся.
'Q U O TE' - указы вает, что кавычки р ал р ан и ч и ваю т сим вольны е константы. Все внут
ренние кавычки удваиваю тся.
'N O N E' - указы вает, что сим вольны е константы не имеют никаких разделителей. Н и
какие внутренние апостроф ы или кавычки не удваиваю тся. По ум олчанию - 'NONE'.
С пециф икатор D ELIM допускается только для файлов, связанны х для форматной пе
редачи данны х; он И1 норируется во время ввода.
Спецификатор DISPOSE
С пециф икатор D ISPO SE (или DISP) указывает состояние файла после закрытия уст
ройства. Он имеет один из следую щ их форматов:
DISPOSE = dis
DISP = dis
где dis - no ум олчанию скалярное выраж ение си м вол ьн о ю типа, которое является одним
из следую щ их значений:
'K EEP' или 'SA V E' - сохраняет файл после закрытия устройства.
'D E L E TE ' - удаляет файл после закрытия устройства.
'PR IN T' - предоставляет файл спулеру устройства построчной печати и сохраняет ею .
(И спользовать только для последовательны х файлов.)
'PR IN T /D ELE T E ' - предоставляет файл спулеру устройства построчной печати и за
тем удаляет его. (И спользовать только для последовательны х файлов.)
'SU B M IT ' - разветвляет процесс, чтобы выполнить операции с файлом.
'SU B M IT /D E L E T E ' - разветвляет процесс, чтобы выполнить операции с файлом, и за
тем удаляет файл после т о ю , как разветвление закончено.
Д ля временных ф айлов, по ум олчанию - 'D ELETE'. Д ля всех других файлов, по ум ол
чанию - 'KEEP'.
Г ласа // У т верж дения вво д а /вы во д а ф ай ю ны \ операций 347
Спецификатор FILE
Спецификатор FILE указывает имя файла, который будет связан с устройством . Он
имеет следую щ ий формат :
FILE = name
где пате - сим вольное или числовое вы раж ение; мож ет бы ть лю бы м именем пути, д о
пускаемым операционной системой. Конечны е пробелы в имени игнорирую тся, если
возникаю т следую щ ие условия:
■ спецификатор FILE опущен;
■ устройство не связано с файлом;
- STATUS - SCRA TCH ' не указано;
■ соответствую щ ая переменная среды FO R T« не установлена для ном ера устройства.
Intel Fortran генерирует имя файла в ф орм ат q fort.п, где п является логическим н ом е
ром устройства. На системах W indows, если указана опция ком пилятора /fpscom p:general,
пропуск FILE, подразумевает STATUS - SCRA TCH '.
Если имя файла запомнено в числовом скаляре или массиве, имя долж но состоять из
сим волов ASCII, заканчиваю щ ихся символом нуля ASCII (нулевой байт). О днако если
оно запомнено в символьном скаляре или м ассиве, оно не долж но содерж ать н у л ев о ю
байта.
Спецификатор FORM
Спецификатор FORM указывает, связы вается ли файл для ф орм атной, неф орм атной
или двоичной (W *32, W *64) передачи данных. Он имеет следую щ ий формат:
FORM = fm
где fin - по ум олчанию скалярное выражение сим вольного типа, которому присваивается
одно из следую щ их значений:
'FO RM A TTED ' - указывает форм атную передачу данных.
'U N FO R M A TTED ' - указывает неф орматную передачу данны х.
'BIN A RY ' - указывает двоичную передачу данных.
Значение по умолчанию равно 'FO R M A TTED ' для ф айлов последовательного доступа
и 'U N FO R M A TTED ' - для файлов прямого доступа.
Спецификатор MAXREC
С пецификатор M A X R E C указы вает максим альное число записей, которые могут быть
переданы из файла или в файл прям ого доступа, в то время как файл связан. Он имеет
следую щ ий формат:
MAXREC = тг
где т г - скалярное числовое выражение. При необходимости значение преобразуется в
целочисленный тип данны х перед использованием. По умолчанию - неограниченное
число записей.
Спецификатор MODE
M O D E является нестандартны м синонимом для A CTION .
Спецификатор NAME
N A M E является нестандартны м синонимом для FILE.
Спецификатор NOSHARED
С пецификатор N O SH A R E D указы вает, что файл связан для исклю чительного доступа
программой. Он имеет следую щ ий формат:
NOSHARED
Спецификатор PAD
С пециф икатор PAD указы вает, дополняется ли форматная входная запись пробелами,
когда входной списка и специф икация форм ата требуют больш его количества данных,
чем содерж ит запись. С пециф икатор PAD имеет следую щ ий формат:
PAD = pd
где p d - по ум олчанию скалярное вы раж ение сим вольного тина, которое является одним
из следую щ их значений:
'YES' - указы вает, что запись будет дополняться пробелами, когда необходимо.
'N 0 ' - указы вает, что запись не будет дополняться пробелами. Входная запись долж на
содерж ать данны е, требуем ы е входным списком и спецификацией формата.
По ум олчанию - 'YES'.
Это поведение отличается от поведения Fortran 77, который никогда не дополняет ко
роткие записи пробелам и. Н априм ер, рассм отрите следую щ ее утверждение:
READ (5/(15)’) J
Глава II Утверждения ввода/вывода фай ювых операции 349
Если вы вводите значение 123, сопровож даем ое переводом каретки, Fortran 77 пре
вращ ает, 15 в 13 и J назначается 123.
О днако Intel Fortran дополняет значение 123 двумя пробелами, если вы явно не о т
крываете устройство с PAD - NO'.
М ож но отменить заполнение пробелам и, указывая описатель редактирования BN.
Спецификатор PAD игнорируется во время вывода.
Спецификатор POSITION
Спецификатор POSITION указы вает позицию файла, связанного для последователь
ного доступа. Он имеет следую щ ий ф орм а!’:
POSITION = pos
где pos - по умолчанию скалярное выраж ение сим вольного типа, которое является одним
из следую щ их значений:
'ASIS' - указывает, что позиция файла неизменяегся, если файл сущ ествует и уж е свя
зан. Позиция не определена, если файл сущ ествуем но не связан.
'REW IN D ' - указывает, что файл позиционируется при открытии в его начальную
точку.
'APPEN D ' - указывает, что файл позиционируется в его конечную точку (или перед
записью конца файла, если она есть).
По умолчанию - 'ASIS'. (На системах ввода/вы вода Fortran аналогичен 'R EW IN D ').
Новый файл (указанный как новый явно или по ум олчанию ) всегда позиционируется
в его начальную точку.
Спецификатор READONL Y
Спецификатор REA D O NLY указы вает, что только утверж дения RJEAD м огут обра
титься к этому с о е д и н е н и ю . Он имеет следую щ ий формат:
READONLY
REA D O N LY подобен указанию A CTION -R E A D ', но REA D O N LY предотвращ ает
удаление файла, если он закры вается со STA TU S - D ELETE'.
Значение по ум олчанию системы ввода/вы вода Fortran для доступа к файлу -
READW RITE. Если доступ отвергается, система ввода/вы вода автом атически повторяет
доступ к файлу для выполнения оператора READ.
О днако если вы используете опцию компилятора, указы ваю щ ую значение по ум олча
нию O penV M S, система ввода/вы вода не повторяет вызов для доступа REA D . Так, во
время выполнения могут возникнуть ош ибки ввода/вывода, если защ ита файла не р азр е
шает запись. Чтобы предотвращ ать такие ош ибки, если вы ж елаете прочитать файл, к ко
торому вы не имеете доступа для записи, укаж ите REA D O N LY .
Спецификатор RECL
Спецификатор RECL указы вает длину каждой записи в файле, связанном для прямого
доступа, или м аксимальную длину записи в файле, связанном для последовательного
доступа. Спецификатор RECL им еет следую щ ий формат :
RECL = rl
где /7 - положительное числовое выражение, указы ваю щ ие длину записей в файле. При
необходимости значение преобразуется в целочисленны й тип данных перед использова-
350 С ,1 Ачгазин, В В Кондратьев Програиироцание на Visual FORTRAN
Если файл связан для ф орм а!ной передачи данны х, значение долж но бьп ь выражено
в байтах (символах). И наче, значение выраж ается в 4-байтовы х блоках (длинных словах).
Если файл связан для неф орматной передачи данны х, значение мож ет быть выражено
в байтах, если указанна опция компилятора A SSU M E BY TERECL.
За исклю чением сегментированны х записей, г/ является длиной только для данных
записи, он не вклю чает пространство для информ ации управления.
У казанная длина интерпретируется в зависим ости от типа записей в связанном файле
следую щ им образом:
Для сегментированны х записей RECL указы вает м аксим альную длину для лю бой до
ли (вклю чая четыре байта информации управления).
Для записей фиксированной длины RECL указы вает разм ер каждой записи; он дол
ж ен быть указан. Если записи неф орматные, размер долж ен бьп ь выражен как множи
тель четырех. Вы можете использовать специф икатор RECL в утверждении INQUIRE,
чтобы получить длину записи перед откры тием файла. Для записей переменной длины
RECL указывает максим альную длину для лю бой записи.
Если вы читаете файл фиксированной длины с длиной записи, отличной от длины,
использованной для создания файла, могут возникнуть неопределенны е результаты.
М аксимальная длина для г/ зависит от типа записи и установки спецификатора
CA RR1A GECON TRO L, как показано в табл. 11.2.
Спецификатор RECORDSIZE
RECORDS1ZE является нестандартным синонимом для RECL.
Спецификатор RECORDTYPE
С пецификатор REC O R D TY PE указывае! тип записей в файле. Он имеет следую щ ий
формат:
RECORDTYPE = typ
I '.шва 11 Утверждения свода/вывода фай юаых операций 351
где typ - но умолчанию скалярное вы раж ение сим вольного типа, к о ю р о е является одним
из следую щ их значений:
'FIXED' - указы вает записи ф иксированной длины.
'V A RIA BLE' - указы вает записи переменной длины.
'SEG M EN TED ' - указы вает сегм ентированны е записи.
'STREA M ' - указы вает записи переменной длины потокового типа.
'S T R E A M L F ' - указы вает записи переменной длины потокового типа, заканчиваем ы е
переводом строки.
'STREAM CR' - указы вает записи переменной длины потокового типа, заканчивае
мые переводом каретки.
При открытии файла значения по ум олчанию типа записи определяю тся следую щ им
образом:
'FIXED' для файлов прямого доступа.
'FIXED' для последовательны х файлов п рям ою доступа.
'STREAM LF' для форматны х файлов последовательного доступа.
'VA RIA BLE' для неф орматных файлов последовательного доступа.
Сегментированная запись - это логическая запись, состоящая из долей, которые являются
физическими записями. Так как длина сег ментированной записи может' быть больше, чем
65 535 байт, используйте только сегментированные записи для неформатною последователь
ного доступа к дисковым или необработанным файлам магнитной ленты.
К файлам, содерж ащ им сегм ентированны е записи, м ожно получить доступ только
неформатными последовательны м и утверж дениями передачи данных.
Если утверждение вывода не указывает полную запись для файла, содерж ащ его запи
си фиксированной длины , происходит следую щ ее:
■ в форматных файлах запись заполняется пробелами;
■ в неформатных файлах запись заполняется нулями.
Спецификатор SHARE
Спецификатор SHA RE указы вает, допустим а ли блокировка файла, в то время как от
крыто устройство. Он имеет следую щ ий формат:
SHARE = shr
гдел7/г- по умолчанию скалярное выраж ение сим вольного тина.
На системах W indows* это вы раж ение является одним из значений:
'DEN Y RW ' - указывает режим запрета чтения/записи. Н икакой другой процесс не м о
жет открыть файл.
'DEN Y W R' - указы вает режим запрета записи. Никакой процесс не Может открыть
файл с доступом для записи.
'DEN Y RD ' - указы вает реж им запрета чтения. Н икакой процесс не м ож ет открыть
файл с доступом для чтения.
'DEN Y N ON E' - указывает реж им без запрета. Лю бой процесс может открыть файл в
любом режиме.
На системах Linux* и Mac OS* это выражение является одним из следующих значений:
'DEN Y RW ' - указывает исклю чительны й доступ для совместны х процессов.
'DEN Y N ON E' - указывает' разделяем ы й доступ для совместны х процессов.
352 С А /[¡гат и, В В Кондратьев Програмирпаание на Visual FORTRAN
Спецификатор SHARED
Специф икатор SH A R ED указы вает, что файл связан для разделяем ого доступа более
чем одной програм мой, вы полняю щ ихся одновременно. О н имеет следую щ ий формат:
SHARED
На системах Linux* и Mac OS* разделяемый доступ применяется по умолчанию для
системы ввода/вы вода Fortran. На системах W indows* эго является умолчанием, если
указанно SH A RED или опция компилятора /fpscom p:general.
Спецификатор STATUS
С пециф икатор STA TU S указы вает состояние файла, когда он открыт. Он имеет сле
дую щ ий формат:
STATUS = sta
где sta - по ум олчанию скалярное выражение сим вольного гипа, которое является одним
из следую щ их значений:
'O LD ' указывает сущ ествую щ ий файл.
'N EW ' указывает новый файл; если файл уже сущ ествует, возникает ошибка. Как
только файл создан, его состояние изменяется на 'OLD'.
'SC R A T C H ' указывает новый файл, который является неназванным (называется рабо
чим файлом). Когда файл закрывается или заканчивается программа, рабочий файл уда
ляется.
'R E PL A C E ' указы вает, что файл заменяет другой. Если файл, который будет заменен,
сущ ествует, он удаляется и новый файл создается с тем же самым именем. Если файл,
которы й будет заменен, не сущ ествует, новый файл создается и его состояние изменяется
на 'OLD'.
'U N K N O W N ' указы вает, что файл может сущ ествовать или не су щ ес!в 0 вать. Если
файл не сущ ествует, новый файл создается и его состояние изменяется на 'OLD'.
Рабочие файлы находятся во временном каталоге и могут бы ть видимы, в то время
когда они открыты .
По ум олчанию - 'U N K N O W N '. Это значение такж е применяется по умолчанию , если
вы неявно откры ваете файл, используя W RITE. О днако если вы неявно открываете файл,
используя READ, по ум олчанию применяется 'OLD'. Если вы указы ваете опцию компи
лятора F66 (или O PT IO N S/N O F77), по ум олчанию 'NEW '.
Примечание. Специф икатор S T A T U S может такж е появиться в утверждениях C L O S E , указывая
состояние файла после его закрытия. Однако в утверждениях C LO S E значения состояния являются
теми ж е, что и перечисленные для спецификатора D IS P O S E .
TITLE = name
где пате - сим вольное выражение.
Если TITLE указан в не-Q uickw in приложении, возникает динам ическая ош ибка (во
время выполнения программы).
Спецификатор TYPE
TY PE является нестандартным синонимом для STA TU S.
Спецификатор USEROPEN
Спецификатор U SEROPEN указывает написанную пользователем внеш ню ю ф ун к
цию, которая управляет открытием файла. Он им еет следую щ ий формат:
USEROPEN = function-name
гдеJunction-name - имя написанной пользователем функции, которая получает управление.
Ф ункция долж на бы ть объявлена в предшествующем утверж дении EX TE R N A L ; если
она типизирована, она долж на иметь тин IN T E G E R (4) (IN T E G E R *4).
Спецификатор USEROPEN позволяет опытны м пользователям использовать доп о л
нительные возмож ности операционной системы , которы е обы чно не доступны в Fortran.
из текущ его файла и читать утверж дения из вклю ченного файла или текстового модуля.
У тверж дение IN C LU D E им еет формат: ^
INCLUDE Ш п а т е [/[NOJLIST]'
гд е ß l e - n a m e - строка сим вола, указы ваю щ ая имя файла, который будет вклю чен. О на не
долж на бы ть им енованной константой. Формат имени файла долж ен бы ть приемлемым
для операционной системы , как описано в ваш ей системной документации.
/[N O ]L IS T указы вает, долж ен ли вклю чаемый код появиться в распечатке программы
компиляции. В листинге число предш ествует каж дому вклю чаемому утверждению . Ч ис
ло указы вает глубину влож ения "вклю чаем ою " кода. Ум олчанием является /NOLIST.
С п ециф икаторы /LJST и/N O L IS T долж ны бы ть записаны полностью .
Вы м ож ете использовать только /[NOJL1ST, если указы ваете опцию компилятора, ко
торая устанавливает ум олчание O penV M S.
П равила использования
Утверждение INCLUDE может' появиться где-нибудь внутри блока области действия. Оно
может охватить больш е чем одну исходную строку, но никакое другое утверждение не может
появиться на той же самой строке. Исходная строка не может быть помечена.
В клю ченны й файл или текстовы й м одуль не могу! начинаться со строки продолж е
ния, а каж дое утверж дение Fortran долж но полностью содерж аться внутри отдельного
файла. В клю ченны й файл или текстовы й модуль могут содерж ать лю бой исходный
текст, но он не м ож ет начинаться или заканчиваться неполным утверждением Fortran.
В клю ченны е утверж дения, когда они объединяю тся с другими утверж дениями при
ком пиляции, долж ны удовлетворить ограничениям о порядке утверж дений, которые по
казаны на рис. 2.1. В клю ченны е файлы или текстовы е м одули могут содерж ать дополни
тельны е утверж дения IN C LU D E, но они не долж ны бы ть рекурсивными. Утверждения
IN C L U D E м огут бы ть влож ены , пока не исчерпаю тся системны е ресурсы . Когда вклю
ченный файл или текстовы й модуль заканчиваю т выполнение, компиляции возобновля
ется с утверж дения, следую щ его за утверж дением INCLUD E.
Пример
Здесь файл по имени C O M M O N .FO R (в текущ ем рабочем каталоге) вклю чен и прочи
тан как ввод.
Включение текста из файла в основной программный файл Файл COMMON .FOR
PROGRAM
INCLUDE 'COMMON.FOR' INTEGER, PARAMETER:: M=100
REAL, DIMENSION(M) ;• Z REAL, D IM EN SIO N(M ):: X, Y
CALL CUBE COMMON X, Y
ßmomnm 354
Глава 12. Ут верж дения управлении компиляцией 355
DO I = 1, М
Z(I) = X(I) + SQRT(Y(I))
END DO
END
SUBROUTINE CUBE
INCLUDE 'COMMON.FOR'
DO l=1,M
X(l) = Y(l)**3
END DO
RETURN
END
Файл C O M M O N .FO R определяет им енованную константу M и определяет м ассивы X
и Y как часть непомеченного общ его блока.
йтоттп 356
Глава 13. Д ирект ивы расш иренной к о и т п я ц и и 357
Если исходная строка начинается с допустим ого преф икса директив, по директива не
распознана, компилятор игнорирует строку.
!DEC$ IVDEP
A=В+3
Это имеет тог ж е эффект, что и запись следую щ его явного цикла: *
!DEC$ IVDEP
DO 1= 1,10
А (I) = В (I) + 3
END DO
ATTRIBUTES ALIAS
О пция A LIA S директивы A T TR IB U TES указы вает дополнительное внеш нее имя, ко
торое используется для обращ ения к внеш ним подпрограмм ам . О на имеет следую щ ий
формат:
cDEC$ ATTRIBUTES ALIAS: external-name : : subprogram
где external-name - сим вольная константа, разграниченная апостроф ами или кавычками.
С им вольная константа используется, как есть: строка не изменяется к верхнему регистру
и пробелы не удаляю тся.
subprogram - внеш няя подпрограмма.
Гчава 13 Д ирект ивы расш иренной компиляции 361
О пция A LIA S отм еняет опцию С (и STD CALL). Если и С и A L IA S указаны для п од
программы, подпрограмм е придаю т соглаш ения о вызовах С, но не соглаш ение об им е
нах С. О на вместо э то ю получает имя, заданное в A LIA S, без модиф икаций.
Опция A LIA S не может использоваться с внутренними процедурам и и она не м ож ет
применяться к формальным аргум ентам .
Следую щ ий пример дает подпрограмм е имя "_O therN am e@ 4" вне этого блока облас
ти действия:
INTERFACE
SUBROUTINE happy(i)
!DEC$ ATTRIBUTES STDCALL, DECORATE, AUAS:’0therName’ :: happy INTEGER i
END SUBROUTINE
END INTERFACE
cD EC$ A TTR IB U TE S ALIA S имеет то же действие, что и ди ректива A LIA S.
A TTRIBUTES ALIGN
О пция ALIG N директивы A TTR IB U TES указы вает границу вы равнивания в байтах
для переменной. О на имеет такой формат:
cDEC$ ATTRIBUTES ALIGN: л:: var
где п - число байтов для минимальной границы выравнивания.
Для размещ аем ы х переменных (allocatable array), граничная величина долж н а быть
степенью двойки между 1 и 16384, таким и как 1, 2, 4, 8, 16, 32, 64, 128 и т. д.
Для неразмещ аемы х переменны х граничная величина долж на бы ть степенью 2 между
1 и 64 на системах W indow s*, между 1 и 2**16 на системах L inux*, или меж ду 1 и 2**12
на системах Mac OS*.
var - выравниваю щ аяся переменная.
A TTRIBUTES ALLOWNULL
Опция A LLO W N U LL директивы A TTR IB U TES разреш ает передавать соответст
вую щ ему формальному аргументу указатель N U LL (определяем ы й нулем или встроен
ной подпрограммой N U LL), как значение параметра. О на им еет следую щ ий формат:
cDEC$ ATTRIBUTES ALLOW_NULL : : arg
где arg - именя параметра.
Опция A LLO W N U LL допустим а только, если такж е указана опция RE FE R E N C E ;
иначе она не имеет никакого эффекта.
362 С Д А лгазин . В В К ондрат ьев П рограм ирование на Visual FORTRAN
A TTRIBUTES С и STDCALL
О пции С и S TD C A L L директивы A TTR IB U TES указываю т, как нужно передавать
данны е, ког да вы используете подпрограмм ы , написанны е на С или ассемблере с подпро
грам мами Fortran или Fortran 95/90. О ни им ею т следую щ ие форматы:
cDEC$ ATTRIBUTES С : : object I object] . . .
cDEC$ ATTRIBUTES STDCALL : : object [, object] . . .
г де o b je c t - имя объекта данны х или процедуры.
На процессорах IA-32 опции С и STD C A LL имею т немного разные смыслы; на всех
других п латф орм ах они интерпретирую тся как синонимы.
К огда опции С и S TD C A LL прим еняется к подпрограмм е, они определяют подпро
грам му, как им ею щ ую специф ический набор соглаш ений о вызовах.
Если С или 5Т О С А Е Е указаны для подпрограмм ы , параметры (за исклю чением м ас
сивов и сим волов) передаю тся по значению . П одпрограм м ы , использую щ ие стандартные
соглаш ения РогЧгап 95/90, передаю т параметры ссылкой.
Глава 13. Д ирект ивы расш иренной компиляции 363
На процессорах 1А-32 символ подчеркивания (_) пом ещ ается в начале внеш него и м е
ни подпрограммы. Если указано STD C A LL, знак (@), сопровож даем ы й числом байтов
параметра, которые передаю тся, пом ещ ается в конце имени. Н априм ер, подпрограм м а по
имени SUB1, которая имеет 3 параметра INTEG ER(4) и определен а с STD C A LL, назн а
чается внеш нее имя _ subl@ 12.
Символьные параметры передаю тся следую щ им образом:
■ По умолчанию скрытые д л и н ы 1 помещ аю тся в конце списка параметров.
■ Н а системах 1А-32 W indows* вы м ожете получить поведение по ум олчанию Compaq*
Visual Fortran, указывая опцию компилятора /iface:m ixed_ str ien arg.
■ Если С или STD C A LL (только) указаны: на всех системах первы й сим вол строки п е
редается (и дополняется нулями до длины 1NTEGER(4)).
■ Если указаны С или STD C A LL и указан R EFER E N C E для парам етра; на всех си сте
мах строка передается без длины.
■ Если С или STD C A LL указаны и R EFE R EN C E указан для подпрограм м ы (но
R EFEREN CE (ссылка) не указана для параметра, если он есть); на всех системах,
строка передается вместе с длиной.
Для больш его количества деталей см. описание R E FE R E N C E в разд. "A TTR IB U TES
REFEREN CE и VALUE".
A TTRIBUTES DECORA ТЕ
О пция D ECO RA TE директивы A TTR IB U TES указы вает, что внеш нее имя, исполь
зуемое в cD EC$ A LIA S или cD ECS A TTR IB U TE S A L IA S, им еет преф иксны е и п ост
фиксные знаки отличия, которы е ассоциирую тся с действую щ им м еханизм ом вызова. Это
те же самые знаки отличия, которы е вы полняю тся с именем процедуры , когда A LIA S не
указан. Опция D ECO RA TE им еет следую щ ий формат:
cDEC$ ATTRIBUTES DECORATE : : exname
где ex пате - внеш нее имя.
Регистр внеш него имени A LIA S не изменяется. Если A L IA S не указан, эта опция не
имеет никакого эффекта. См. такж е прим ер в описании "A T T R IB U T E S A L IA S" и краткое
изложение преф иксны х и постфиксны х знаков отличия в описании "A T T R IB U T E S С и
STDCALL".
ATTRIBUTES DEFAULT
Опция A TTR IB U TES директивы D ECO RA TE отм еняет некоторы е опции ком п и лято
ра, которые м огут воздействовать на внеш ню ю подпрограм м у и объявления блока
COM M ON. О на имеет следую щ ий формат:
cDEC$ ATTRIBUTES DEFAULT : : entity
где entity - внеш няя процедура или блок CO M M O N .
Эта опция указывает, чтобы ком пилятор игнорировал опции ком пилятора, которые
изменяю т соглаш ения по ум олчанию для обозначения внеш него сим вола и для передачи
параметров подпрограммам и блокам CO M M O N .
1ПоумолчаниюIntel Fortran передает скрытую длину аргумента для строк. Скрытая длина аргу
мента состоитиз 4-байтового цаого числа без знака (системыIA-32).
364 С Д . Алгазин, В. В К ондрат ьев П рограм ирование на Visual FO RTRAN
Эта опция м ож ет бы ть объединена с другим и опциями A TTR IB U TES типа STD CALL,
С, REFER EN C E, A LIA S и т. д., чтобы указы вать свойства, отличные от умолчаний ком
пилятора.
Эта опция полезна, когда объявляют блоки INTERFACE для внешних подпрограмм, так
как она препятствует опциям компилятора изменять вызов или соглашения об именах.
A TTRIBUTES EXTERN
О пция EX TERN директивы A TTR IB U TE S указывает, что переменная распределена в
другом исходном файле. О пция EXTERN мож ет использоваться в объявлениях глобаль
ных переменных, но она не долж на применяться к ф ормальным аргументам. О на имеет
следую щ ий формат:
cDEC$ ATTRIBUTES EXTERN : : var
где var - переменная, которая будет распределена.
Эта опция долж на использоваться для получения доступа к переменным, объявлен
ным на других языках.
A TTRIBUTES IGNOREJLOC
О пция IG N O R E L O C директивы A T TR IB U TES разреш ает удалить % LO C из пара
метра. О на имеет следую щ ий формат:
cDEC$ ATTRIBUTES IGNORE_LOC : : arg
где arg - имя параметра.
О пция IG N O R E LO C допустим а только, если опция R EFEREN CE такж е указана;
иначе она не им еет никакого эффекта.
Гпава 13 Д ирект ивы расш иренной ком т пяи ии 365
ATTRIBUTES INLINE, NOINLINE и FORCEDINLINE
О пции INLIN E, N O IN LIN E и FORCE1NLINE директивы A T TR IB U TE S могут исполь
зоваться, чтобы управлять решениями встраивания (inline function), принимаем ым и ком
пилятором. Вы долж ны пом естить директивную опцию в процедуру, которая вы зы вает
подпрограмму, на встраивание которой вы хотите влиять.
Опция INLINE указывает, что ф ункция или подпрограм м а м огут бы ть встроены.
Встраивание м ож ет игнорироваться компилятором , если действую щ ая эвристика реш ает,
что оно может иметь отрицательное воздействие на работу или явится причиной слиш
ком больш ого увеличения разм ера кода. О на им еет следую щ ий формат:
cDEC$ ATTRIBUTES INLINE : : procedure
где procedure - функция или подпрограмм а, которая м ож ет бы ть встроена.
Опция N O IN LIN E отклю чает встраивание функции. О на им еет следую щ ий формат:
cDEC$ ATTRIBUTES NOINLINE : : procedure
где procedure - функция или подпро]рам м а, которая не долж на бы ть встроена.
Опция FORCEINL1NE указывает, чтобы ф ункция или подпрограм м а были встроены ,
если это не явится причиной ош ибки. О на имеет следую щ ий формат:
cDEC$ ATTRIBUTES FORCEINLINE : : procedure
где procedure - функция или подпрограмм а, которая долж на бы ть встроена.
A TTRIBUTES N O A R G C HE C K
О пция NO ARG CH ECK директивы A T TR IB U TE S указы вает, чтобы тип и форма,
соответствую щ ие правилам, связы вания с явны м интерфейсом игнорировались. Это раз
реш ает конструкцию блока IN T E R FA C E для внеш ней процедуры или процедурного м о
дуля, который принимает параметр лю бого типа или формы; наприм ер, подпрограмму ко
пирования памяти. О пция NO ARG CH ECK имеет следую щ ий формат:
cDEC$ ATTRIBUTES NO_ARG_CHECK : : object
где object - имя параметра или процедуры.
Опция NO ARG C H EC K мож ет появиться только в блоке IN TER FA C E для неродо
вой процедуры или в процедурном модуле. О на м ож ет прим еняться к индивидуальном у
имени формального аргум ента или к имени подпрограммы, тогда опция прим еняется ко
всем формальным аргументам в этом интерфейсе.
Опция NO ARG C H EC K не мож ет использоваться для процедур с преф иксом PURE
или ELEM ENTA L.
SUBROUTINE Subr(x)
I NTEGERx
!DEC$ ATTRIBUTES VALUE ::x
ATTRIBUTES VARYING
О пция N O M IX ED STR LEN A RG директивы A T TR IB U TE S разреш ает переменное
число параметров вызова. О на имеет следую щ ий формат:
d(i) = c(i) + 1
enddo
do i = 1 ,m
b(i) = a(i)+1
d(i) = c(i) + 1
enddo
где с - одно из выражений: С (или с), ! или * (см. разд. 13.1); string - сим вольная кон
станта, содерж ащ ая пригодны е для печатания символы. Число сим волов ограничено
длиной исходной строки.
Э фф ективна только первая директива 1DENT; ком пилятор игнорирует лю бы е доп о л
нительные директивы 1DENT в програм мной единице или м одуле.
block], ..
[cD E C $ E L SE
block]
c D E C $ E N D IF
где с - одно из вы раж ений: С (или с), ! или * (см. разд. 13.1); ехрг - логическое вы раж е
ние - .TRU E, или .FA LSE.; пате - имя сим вола, который будет проверен на определение.
block - вы полним ое утверж дение, которое компилируется (или нет) в зависимости от зна
чения логических вы раж ений в конструкции директивы 1F.
Правила использования
К онструкции директив 1F и IF D EFIN ED заканчиваю тся директивой END1F и могут
содерж ать одну или более директив ELSE1F и самое больш ее одну директиву ELSE. Если
логическое условие внутри директивы вычисляется при компиляции как .TRUE., а все
п реды дущ ие условия в конструкции 1F вы числяю тся как .FA LSE., то компилирую тся ут
верж дения, содерж ащ иеся в директивном блоке.
И мя пате мож ет бы ть определено директивой D EFIN E и дополнительно ему может
бы ть назначено целочисленное значение. Если символ был определен, с или без назна
ченного значения, IF D E FIN ED (имя) вычисляется как .TRUE.; иначе оно вычисляется
как .FA LSE.
Если логическое условие в директиве 1F или IF D EFIN ED равно .TRUE., утверждения
внутри 1F или IF D E FIN ED блока компилирую тся. Если условие равно .FALSE., управле
ние п ереходит к следую щ ей директиве ELSE1F или ELSE, если они есть.
Если логическое вы раж ение в директиве ELSEIF равно .TRUE., утверж дения внутри
блока ELSE1F - ком пилирую тся. Если вы раж ение равно .FA LSE., управление переходит
к следую щ ей директиве ELSE1F или ELSE, если они есть.
Если управление дости гает директивы ELSE, потому что все предш ествую щ ие логи
ческие условия в конструкции 1F, вы числяется как .FALSE., утверж дения в блоке ELSE
ком пилирую тся безоговорочно.
Вы м ож ете использовать лю бой логический оператор или оператор отнош ения или
сим вол в логическом вы раж ении директивы , включая: .LT., <, .GT., >, .EQ., ==, .LE., <=,
.GE., >=, .NE., /=, .EQ V ., .N EQ V ., .NO T., .AND., .OR. и .XOR.. Л огическое выражение
м ож ет бы ть сколь угодно составны м , но вся директива долж на располагаться на одной
строке.
Пример
! К огда сл ед у ю щ и й к од к ом п и л и р ов ан и в ы п о л н ен ,
! вы в од за в и си т от того я в л я ет ся ли о д н о из п р о в ер я ем ы х
! в ы р а ж е н и й . Т Р и Е ., и л и в с е п р о в е р к и р а в н ы .F A L S E .
! D E C $ D E F I N E f la g = 3
! D E C $ IF ( fla g .L T . 2 )
W R IT E (*,*) " Э т о к о м п и л и р у е т с я е с л и f la g м е н ь ш е ч е м 2."
! D E C $ E L S E I F ( fla g > = 8 )
W R IT E (* ,* )" Э т о к о м п и л и р у е т с я е с л и f la g б о л ь ш е ч е м &
и л и р а в е н 8."
!D E C $ E L S E
W R IT E (*,*) "И ли э т о к о м п и л и р у е т с я е с л и в с е п р е д ш е с т в у ю щ и е &
у с л о в и я .F A L S E ."
!D E C $ E N D IF
Глава 13. Директивы расширенной компиляции 371
где с - одно из выражений: С (или с), ! или * (см. разд. 13.1). option является LO O P или
BACK. Этот параметр доступен только на процессорах 1А-32.
Правила использования
Д иректива 1VDEP является утверж дением для оптим изатора ком пилятора о порядке
ссылок к памяти в цикле DO.
1 V D E P :L 0 0 P подразум евает отсутствие вносимых циклом зависим остей.
1VDEP:BACK подразум евает отсутствие обратны х зависим остей.
Если option не указан, возникает одна из ситуаций:
■ На процессорах Intel Itanium поведение такое же, как при 1V D EP;BACK. Вы м ож ете
изменить поведение на 1V D E P :L 0 0 P , используя опцию ком пилятора.
372 С. Д. Алгазин, В. В. Кондратьев Програмирование на Visual FORTRAN
или
Глава 13. Директивы расширенной компиляции 373
cD E C $ LO O P C O U N T = п
где с - одно из выражений: С (или с ) , ! или * (см. разд. 13.1); п - целочисленная константа.
Правила использования
Значение счетчика цикла воздействует на эвристику, используем ую в програм мной
конвейерной обработке, векторизации и преобразованиях цикла.
Пример
cD E C $ L O O P C O U N T (1 0 0 0 0 )
d o i = 1 ,m
b (i) = a (i) + 1 ! Э т о , в е р о я т н о , р а з р е ш и т ц и к л у ,
! п о л у ч и т ь к он вей ер н ую п р о г р а м м н у ю о б р а б о т к у
enddo
где с - одно из выражений: С (или с), ! или * (см. разд. 13.1); string - символьная кон
станта, указы ваю щ ая сообщ ение.
Пример
!D E C $ M E S S A G E ^ С о с т а в л е н и е зв у к о в ы х у р а в н е н и й ск ор ости '
где с - одно из выражений: С (или с), ! или * (см. разд. 13.1); library - символьная кон
станта, указы ваю щ ая имя и, при необходим ости, путь для библиотеки, которую должен
искать компоновщ ик.
Правила использования
К ом поновщ ик ищ ет библиотеку, назы ваем ую в соответствии с директивой
O B JC O M M EN T, как будто вы назвали ее на командной строке, т. е. перед поисками биб
лиотеки по умолчанию . Вы можете пом естить многократны е директивы поиска библио
теки в тот же самы й исходный файл. Каждая директива поиска появляется в объектном
файле в порядке, в котором появлялись в исходном файле.
Если ди ректи ва O B JC O M M E N T появляется внутри м одуля, лю бая программная еди
ница, которая использует этот модуль, такж е содерж ит директиву, как если бы директива
O B JC O M M E N T появилась в исходном файле, использую щ ем этот модуль.
Если вы хотите иметь в м одуле директиву O B JC O M M E N T , но не хотите ее в про
граммны х единицах, которые использует этот м одуль, пом естите директиву вне модуля.
Пример
! M O D 1 .F 9 0
M ODULE а
! D E C $ O B J C O M M E N T LIB: " o p e n g l3 2 .lib "
END M ODULE а
! M O D 2 .F 9 0
! D E C $ O B J C O M M E N T LIB: " g r a fto o ls.lib "
M ODULE b
!
END M ODULE b
! U S E R .F 9 0
PROGRAM go
USE a ! пои ск би б л и о т ек и , со д е р ж а в ш и й с я в M O D ULE а
! вк лю ч ается з д е с ь
USE b ! п о и с к б и б л и о т е к и , н е в к л ю ч а е т с я ( в н е Ь)
END
Глава 13 Директивы расширенной компиляции 375
c D E C $ E N D O P T IO N S
где с - одно из вы раж ений: С (или с), ! или * (см. разд. 13.1); vor - необязательная ссылка
памяти.
hint является необязательны м инициализированны м скалярным целочисленным вы
раж ением со значением 0, 1, 2 или 3. Они имею т гот же самый смысл, что и значения для
hint во встроенной подпрограм м е M M PREFETCH . Чтобы использовать этот параметр,
вы долж ны такж е указать var.
distance является необязательны м инициализированны м скалярным целочисленным
вы раж ением со значением , больш е чем 0. Он указывает число итераций цикла, которые
надо выполнить перед иредвы боркой. Чтобы использовать этот параметр, вы долж ны
такж е указать var и hint.
Правила использования
Чтобы использовать эти директивы , долж на быть задана опция компилятора /0 3 .
Эта директива воздействует на цикл DO, которому она предш ествует.
Если вы укаж ете PR E FE T C H без параметров, то все массивы, к которым получаю т
доступ в цикле DO, будут вы бираться с упреж дением.
Если цикл вклю чает вы раж ение A(j), помещ ая cD EC$ PREFETCH перед циклом, вы
инструктируете ком пилятор вставлять предвыборкн для A(j + d) внутри цикла. Значение
d определяется самим ком пилятором .
Примеры
cD E C $ N O PR E FE T C H с
cD E C $ PR EFE TC H а
d o i = 1, m
b(¡) = a(c(¡)) + 1
enddo
q(j) = sum
enddo
6lS6b(i) = a(i)/c(i)
endif
enddo
Примеры
Ком пилятор обы чно не делает векторизации циклов DO, которые им ею т больш ое ко
личество неединичных ссы лок большого шага (по сравнению с числом единичны х ссылок
большог о шага).
В следую щ ем прим ере векторизация бы ла бы по ум олчанию заблокирована, но ди
ректива отм еняет это поведение:
!DEC$ VECTOR ALWAYS
do ¡ = 1 ,1 0 0 ,2
! две ссылки с большим шагом 2 следуют
a(i) = b(i)
enddo
М огут бы ть случаи, где вы хотите явно аннулировать векторизации цикла; например,
если векторизация привела бы к регрессу работы, а не к улучш ению . В этих случаях вы
м ож ете использовать директиву N O V EC TO R , чтобы отклю чить векторизацию цикла.
В следую щ ем примере векторизация бы ла бы вы полнена по умолчанию , но директива
отм еняет это поведение:
!DEC$ NOVECTOR
do ¡ = 1,100
a(i) = b(i) + c(i)
enddo
Оператор COPYIN
О ператор CO PY IN указы вает, чтобы данны е главного потока группы копирую тся
в личные копии общ его блока потока в начале параллельной области. Он им еет следую
щий формат:
COPYIN (list)
где list - имя одной или более переменны х или общ их блоков, которы е являю тся доступ
ными для блока области действия. П одобъекты не м огут бы ть указаны. Каждое имя
долж но бы ть отделено запятой, а имя поим енованного общ его блока долж но появляться
между слеш ами ( / / ) .
О ператор COPY1N прим еняется только к общ им блокам, объявленны м как
THREADPR1VATE.
Вы не обязаны указы вать весь общ ий блок T H R E A D PR IV A T E целиком, вы можете
указать именованные перем енны е внутри о б щ е ю блока.
Оператор COPYPRIVATE
Оператор C O PY PR IV A TE использует личную переменную , чтобы передать значение,
или указатель на разделяем ы й объект, o i одного члена группы другим членам. О ператор
CO PY PRIV A TE м ож ет только появиться в директиве EN D SIN G LE. Он им еет следую
щий формат:
COPYPRIVATE (list)
где list - имя одной или более переменны х или общ их блоков, которые являю тся доступ
ными для блока области действия. П одобъекты не м огут бы ть указаны . Каждое имя
долж но быть отделено запятой, а имя именованного общ его блока долж но появляться
между слешами ( / / ) .
386 С Д. A 'h'aniH. В В К ондрат ьев Программирование на Visitai FORTRAN
Оператор DEFA UL Т
О ператор D E FA U LT позволяет указы вать область действия для всех переменных в
лексическом пространстве параллельной области. Он имеет следую щ ий формат:
Í PR IV A TE ]
D EFA U LT( SH A RED О
NONE
С пециф икации способны на следую щ ие действия:
PR IV A T E делает все им енованны е объекты в лексическом пространстве параллель
ной области, вклю чая перем енны е общ его блока, но исклю чая переменные TH REA D-
PRIV A TE, личны м и для потока, как будто вы явно перечислили каждую переменную в
операторе PRIV A TE.
SH A R E D делает все им енованны е объекты в лексическом пространстве параллельной
области разделяем ы м и среди потоков в группе, как будто вы явно перечислили каждую
перем енную в операторе SH A RED . Если вы не указы ваете оператор DEFAULT, применя
ется значение по ум олчанию .
N O N E указы вает, что нет никакого неявного умолчания относительно того, являются
ли перем енны е типа PR IV A T E или SH A RED . В этом случае вы долж ны указать свойство
PR IV A T E , SH A R E D , F1RSTPR1VATE, LA STPRIV A TE или RED U CTIO N для каждой пе
рем енной, которую вы используете в лексическом пространстве параллельной области.
Вы м ож ете указать только один оператор D EFA U LT в директиве PA RALLEL. Вы мо
жете исклю чить перем енны е из определенного по умолчанию , используя операторы
PR IV A T E , SH A R ED , FIR ST PR IV A T E, LA STPRIV A TE или RED U CTIO N .
Н а перем енны е в общ их блоках T H R E Â D PR IV A T E этот оператор не воздействует.
Оператор FIRSTPRIVATE
О ператор FIR ST PR IV A T E обеспечивает надм нож ество функциональны х возможно
стей, обеспечиваем ы х оператором PR IV A T E (см. "О ператор PRIVA TE"); объекты явля
ются объявленны м и PR IV A T E и они инициализирую тся некоторы ми значениями. Он
им еет следую щ ий формат:
FIRSTPRIVATE (list)
где list —имя одной или более переменны х или общ их блоков, которые являю тся доступ
ными для блока области действия. П одобъекты не м огут быть указаны. Каждое имя
долж но бы ть отделено запятой, а имя им енованного о б щ ею блока долж но появляться
между слеш ам и ( / / ) .
Глава 13 Директивы расширенной компиляции 387
Переменные, которые появляю тся в списке FIR ST PR IV A T E , подчиняю тся сем антике
оператора PRIVATE. Кроме того, личны е (локальны е) копии каж дой переменной в д р у
гих потоках инициализируется значением , которое переменная имела перед началом п а
раллельной области.
Оператор LASTPRIVATE
О ператор LA ST PR IV A T E обеспечивает надм нож ество ф ункциональны х возм ож н о
стей, обеспечиваемых оператором PRIV A TE (см. "О ператор PR IV A T E "); объекты явл я
ются объявленными PR IV A T E и им приписы ваю т некоторы е значения, когда вы ходят из
параллельной области. Он имеет такой формат:
LASTPRIVATE (list)
где list - имя одной или более переменных или общ их блоков, которы е являю тся д о сту п
ными для блока области действия. П одобъекты не м огут бы ть указаны . Каж дое имя
долж но бы ть отделено запятой, а имя им енованного общ его блока долж но появляться
между слеш ами ( / / ) .
П еременные, которые появляю тся в списке L A ST PR IV A T E , подчинены сем антике
оператора PRIVATE. Кроме того, как только они вы ходят из параллельной области, каж
дой переменной обеспечивается значение последовательно последним разделом или и те
рацией цикла.
Когда оператор LA STPRIV A TE появляется в директиве DO, поток, которы й вы полня
ет последовательно последню ю итерацию , обновляет версию объекта, которую он имел
перед конструкцией. Когда оператор LA STPR IV A T E появляется в ди рективе SEC T IO N S,
поток, который вы полняет лексически последний SEC TIO N , обн овляет версию объекта,
которую он имел перед конструкцией.
Подобъекты, которым не назначены значение последней итерацией DO или лекси ч е
ски последним SECTION директивы SEC TIO N S, становятся неопределенны м и после
конструкции.
Оператор PRIVA ТЕ
О ператор PRIV A TE объявляет, что указанны е переменны е личны е для каж дого пото
ка в группе. Он имеет такой формат:
PRIVATE (list)
где list - имя одной одной или более переменных или общ их блоков, которы е являю тся
доступными для блока области действия. П одобъекты не м огут бы ть указаны . Каждое
имя долж но быть отделено запятой, а имя именованног о общ его блока долж но п оявлять
ся между слеш ами ( / / ) .
Правила использования
Следую щ ие ситуации возникает, когда переменные объявлены в операторе PRIV A TE:
Новый объект того же самого типа объявляется однажды для каждого потока в группе.
Новый объект больше не является памятью, ассоциированной с оригинальным объектом.
Все ссылки на оригинальны й объект в лексическом пространстве конструкции дирек
тивы заменяю тся ссылками на личны й объект.
П еременные, определенны е как PR IV A TE, становятся неопределенны м и для каж дого
потока при входе в конструкцию , а соответствующая разделяем ая переменная становится
неопределенной на выходе из параллельной конструкции.
388 С Д А и'атн, В В Кондратьев. Програмирооание на Visual FORTRAN
Оператор REDUCTION
О ператор R ED U C TIO N вы полняет операцию сокращ ения на указанных переменных.
Он имеет формат:
operator - одно из вы раж ений: +, *, - , .AND., .OR., .EQV. или .NEQV.; intrim ic - одно
из следую щ его: М АХ, M IN, 1AND, IOR или 1EOR.
list является именем одной или более переменных встроенного типа, которые являю т
ся доступны м и для блока области действия. П одобъекты не м огут бы ть указаны. Каждое
имя долж но бы ть отделено запятой. М ассивы отлож енной формы и перенимаю щ его раз
мера (см. стр. 55) не разреш аю тся.
П еременные, которы е появляю тся в операторе RED U CTIO N , долж ны быть SHARED
в контексте вклю чения. Л ичная копия каждой переменной в list создается для каждого
потока, как будто использовался оператор PRIVATE.
В конце RE D U C T IO N (сокращ ения) разделяем ая переменная обновляется, чтобы от
разить результат объединения оригинального значения разделяемой переменной сокра
щ ения с конечны м значением каж дой из личны х копий, используя указанный оператор.
О ператоры сокращ ения все ассоциативны (за исклю чением вычитания), и компилятор
мож ет свободно повторно ассоциировать вычисление конечного значения; частичные ре
зультаты сокращ ения вычитанием добавляю тся, чтобы сф ормировать конечное значение.
Значение разделяем ой переменной становится неопределенным, когда первый поток
достигает оператора, содерж ащ его сокращ ение, и оно остается неопределенным, пока
вы числение сокращ ения не заверш ено. О бычно вычисление заверш ается в конце конст
рукции R E D U C T IO N .
О днако если оператор RED U CTIO N используется в конструкции, к которой также
прим еняется N O W A IT, разделяем ая переменная остается неопределенной, пока не будет
вы полнена синхронизация барьера. Это гарантирует, что все потоки заканчивают опера
тор RED U CTIO N .
О ператор R E D U C TIO N долж ен использоваться в области или конструкции распреде
ления рабочих заданий, где перем енная сокращ ения используется только в утверждении
сокращ ения, им ею щ ем один из следую щ их форматов:
х = х operator ехрг
х = ехрг operator х (except for subtraction)
х = intrinsic (x, expr)
x = intrinsic (expr, x)
Н екоторы е сокращ ения м огут бы ть выражены в других форматах. Н апример, сокра
щ ение М А Х м ож ет бы ть вы раж ено следую щ им образом:
IF (x 1Т. expr) х = ехрг
А льтернативно сокращ ение могло бы быть скрыто в вызове подпрограммы. Будьте
вним ательны , чтобы оператор, который вы указы ваете в операторе RED U CTION , cooi-
ветствовал операции сокращ ения.
Г шва 13. Директивы расширенной компиляции 389
Табл. 13.5 перечисляет операторы и встроенны е подпрограмм ы и их значения ини
циализации. Ф актическое значение инициализации будет совм естим о с типом данны х
переменной сокращ ения.
Оператор SHARED
О ператор SH A RED указы вает переменные, которы е будут разделяться всеми потока
ми в группе. Он имеет формат:
SHARED {list)
i/ie list —имя одной или более переменных или общ их блоков, которые являю тся доступ
ными для блока области действия. П одобъекты не могут бы ть указаны. Каж дое имя
долж но быть отделено запятой, а имя им енованного общ его блока долж но появляться
между слеш ами ( / / ) .
Все потоки внутри группы для данных SHA RED получаю т’ доступ к той же самой об
ласти памяти.
Правила условной компиляции
API Fortran О репМ Р позволяет условно ком пилировать утверж дения Intel Fortran, если
вы используете соот ветствую щ ий преф икс директив.
П рефикс зависит, какой исходный формат вы используете, хотя !$ допустим во всех
форматах.
П рефикс долж ен сопровож даться допустим ы м утверж дением Intel Fortran на той же
самой с троке.
странства. П равила исходного текста свободного форм ата применяю тся к строке дирек
тивы.
Н ачальны е строки долж ны иметь пространство после префикса. Строки продолжения
долж ны им еть ам персанд как последний непробельны й знак на строке. Строки продол
жения м огут иметь ам персанд после префикса с необязательны м незаполненным про
странством перед и после амперсанда.
SUBROUTINE SOME_WORK(l,N)
c$OMP PARALLEL DEFAULT(SHARED)
c$OMP DO
DO J =1, N
CALL WORK(I.J)
END DO
c$OMP END PARALLEL
RETURN
END
Директива A TOMIC
Д иректива A TO M IC гарантирует, что определенное м естополож ение памяти обновля
ется динамически: это предотвращ ает возм ож ность множественных, одноврем енно запи
сываю щ их потоков. О на им еет формат:
с$ОМР ATOMIC
где с - одно из выражений: С (или с), ! или * (см. разд. 13.1).
392 С Д. Афазии, В В Кондратьев. П роект ирование на Visual FORTRAN
Правила использования
Д иректива A TO M IC разреш ает оптим изацию вне этой критической секции около на
значения. Реализация м ож ет заменить директивы A TO M IC , заклю чая каж дое утверж де
ние в критическую секцию. Критическая секция (или секции) долж на использовать то же
самое уникальное имя.
Д иректива A T O M IC применяется только к непосредственно следую щ ему утверж де
нию , которое долж но иметь один из следую щ их форматов:
х = х operator ехрг
х = ехрг operator х
х = intrinsic (х, ехрг)
х = intrinsic (ехрг, х)
В преды дущ их утверж дениях:
л* - скалярная переменная встроенного типа; operator является +, *, -, /, .AND., .OR.,
.EQV. или . N E Q V ; ехрг - скалярное выраж ение, которое не ссылается на х; intrinsic явля
ется M AX, M IN, IAND, IOR или IEOR.
Все ссылки на местополож ение памяти .v долж ны иметь одинаковы е тип и параметры
типа.
Только загрузка и запоминание л' являю тся динам ическим и; оценка ехрг не является
динамической. Чтобы избегать условий состязания (или состязания параллелизма), все па
раллельны е обновления местополож ения долж ны быть защ ищ ены, используя директиву
A TO M IC , кроме тех, которые, как известно, являю тся свободны ми от условий состязания.
Ф ункция intrinsic, оператор operator и назначение долж ны бы ть встроенны ми функция
ми, операторам и и назначениями.
Пример
С ледую щ ий пример показы вает способ избеж ать условий состязания при использова
нии A TO M IC , чтобы защ итить все одноврем енны е обновления м естополож ения множ е
ственны м и потоками:
с$ОМР PARALLEL DO DEFAULT(PRIVATE) SHARED(X,Y,INDEX,N)
DO 1=1,N
CALL WORK(XLOCAL, YLOCAL)
c$OMP ATOMIC
X(INDEX(I)) = X(INDEX(I)) + XLOCAL
Y(I) = Y(I) + YLOCAL
END DO
Так как директива A TO M IC применяется только к утверж дению , непосредственно
следую щ ем у за ним, замет им, что Y не обновляется атомарно.
Директива BARRIER
Д иректива B A R R IER синхронизирует все потоки в группе. О на заставляет каждый
поток ждать, пока все другие потоки в группе не достигнут барьера.
Д иректива B A R R IER имеет следую щ ий формат:
с$ОМР BARRIER
где с - одно из выраж ений: С (или с), ! или * (см. разд. 13.1).
С директивой B A R R IER долж ны столкнуться все потоки в группе или ни один вооб
ще. О на такж е долж на встретиться со всеми потоками в группе в том же самом порядке.
Глава 13 Директивы расширенной компиляции 393
Пример
П равила закрепления директив запраш иваю т директиву B A R R IER , чтобы связать ее с
самой близкой директивой включения PA R A LLEL. В следую щ ем прим ере директива
BA RRIER гарантирует, что все потоки выполнили первый цикл и что безопасно вы пол
нять второй цикл:
с$ОМР PARALLEL
с$ОМР DO PRIVATE®
DO ¡ = 1,100
b(i) = i
END DO
c$OMP BARRIER
c$OMP DO PRIVATE(i)
DO ¡ = 1,100
a(i) = b(101-i)
END DO
c$OMP END PARALLEL
Директива CRITICAL
Д иректива C R IT IC A L ограничивает доступ к блоку кода только одним потоком одн о
временно. О на имеет формат:
с$ОМР CRITICAL [(name)] block
с$ОМР END CRITICAL [(name)]
где с - одно из выражений: С (или с), ! или * (см. разд. 13.1); пате - имя критической
секции (critical section); block - структурированны й блок (секция) утверж дений или кон
струкций. Вы не можете выполнить переход в или из блока.
Правила использования
П оток ждет в начале критической секции, пока не будет никакого, другого потока в
группе, который вы полняет критическую секцию , им ею щ ую то же самое имя. Все неиме
нованные директивы C R ITIC A L получаю т одинаковое имя.
Если имя указанно в директиве CR ITICA L, оно же долж но появиться в соответст
вую щ ей директиве CR ITICA L END. Если никакое имя не появляется в директиве
C R ITICA L, никакое имя не может появиться в соответствую щ ей директиве CR ITICA L
END.
И мена критических секций являю тся глобальны м и объектам и программы . Если имя
вступает конфликт с лю бым другим объектом, поведение програм мы является неопреде
ленным.
Пример
С ледую щ ий пример показывает м одель организации очереди, в которой задача удаля
ется из очереди и обрабатывается. Чтобы предпринять меры против м нож ественны х по
токов, убираю щ их из очереди ту же самую задачу, операция удаления из очереди пом е
щ ается в критическую секцию.
П оскольку в этом примере имеется 2 независимы е очереди, каж дая очередь защ ищ а
ется соответствую щ ими директивами CR ITICA L, им ею щ ими соответственно разные
имена: XA XIS и YAXIS:
с$ОМР PARALLEL DEFAULT(PRIVATE) SHARED(X.Y)
с$ОМР CRITICAL(XAXIS)
CALL DEQUEUE(IX NEXT, X)
c$OMP END CRITICAL(XAXIS)
394 С Д A'U'diiiH, В В К о н д р а т ьев П р о грам и ровачи е па Visual FORTRAN
CALL WORK(IX_NEXT, X)
c$OMP CRITICAL(YAXIS)
CALL DEQUEUE(IY_NEXT,Y)
c$OMP END CRITICAL(YAXIS)
CALL WORK(IY_NEXT, Y)
c$OMP END PARALLEL
13.32. Директива DO
Д иректива DO указы вает, чтобы итерации непосредственно следую щ его цикла DO
вы полнились параллельно. О на имеет такой формат:
с$ОМР DO [clause[[t] clause] . . . ]
dojoop
[с$ОМР END DO [NOWAIT]]
где с - одно из вы раж ений: С (или с), ! или * (см. разд. 13.1).
clause - одно из следую щ их выражений:
F IR ST PR IV A T E (list).
L A ST PR JV A TE (list).
O R D E R E D (долж ен использоваться, если упорядочиваемые секции содержатся в дина
мическом пространстве директивы DO; см. разд. 13.35).
P R IV A T E (list).
RED U CTIO N (operator \ intrinsic : list).
S C H E D U L E (type [, chunk]). У казы вает, как итерации цикла DO разделяю тся среди
потоков группы, chunk долж ен быть полож ительны м скалярным целочисленны м выраж е
нием. С ледую щ ие 4 значения type разреш аю тся, 3 из них допускаю т необязательный
chunk- параметр:
Тип Влияние
STATIC Делит итерации на непрерывные части, деля число итераций на число потоков в группе. Каждая
часть затем посылается потоку прежде, чем начинается выполнение цикла. Если с/?ип/с указано,
итерации разделяются на части размера, указываемого chunk Части статически посылаются
потокам в группе циклическим способом в порядке номера потока
DYNAMIC Может использоваться, чтобы получить ряд итераций динамически. По умолчанию 1, если chunk \
не указано. Если chunk указано, итерации разделяются на части размера, указываемого chunk. \
Когда каждый поток заканчивает часть итеративного пространства, он динамически получает
следующий набор итераций
GUIDED Может использоваться, чтобы указать минимальное число итераций. По умолчанию 1, если
chunk не указан. Если chunk указано, размер куска сокращается по экспоненте с каждым после
дующей диспетчеризацией, chunk указывает минимальное число итераций, которое можно по
слать каждый раз. Если итераций осталось меньше чем указано chunk, все оставшиеся итерации
посылаются
RUNTIME1 Задерживает решение планирования до времени выполнения Вы можете выбрать тип списка и
размер куска во время выполнения, используя переменную среды OMP_SCHEDULE
1 Никакой chunk не разрешается для этого типа.
с$ОМР PARALLEL
С$ОМР DO LASTPRIVATE(I)
DO l=1,N
A(I) = B(I) + C(I)
END DO
c$OMP END PARALLEL
CALL REVERSE(I)
В этом случае значение I в конце параллельной области равно N+1, как в последова
тельном случае.
У порядочиваемы е секции полезны для последовательного упорядочивания вывода из
работы, которая вы полняется параллельно. П редполагая, что повторно используемая
библиотека ввода/вы вода сущ ествует, следую щ ая программа распечаты вает индексы в
последовательном порядке:
с$ОМР DO ORDERED SCHEDULE(DYNAMIC)
DO l=LB,UB,ST
CALL WORK(I)
END DO
SUBROUTINE WORK(K)
c$OMP ORDERED
W R ITE (V ) К
c$OMP END ORDERED
BARRIER
CRITICAL и END CRITICAL
END DO
END SECTIONS
END SINGLE
ORDERED и END ORDERED
PARALLEL и END PARALLEL
PARALLEL DO и END PARALLEL DO
PARALLEL SECTIONS и END PARALLEL SECTIONS
Пример
Следую щ ий пример использует директиву FLUSH для двухточечной синхронизации
между парами потоков:
с$ОМР PARALLEL DEFAULT(PRIVATE) SHARED(ISYNC)
1AM = GET_THREAD_NUM()
ISYNC(IAM) = 0
c$OMP BARRIER
CALLW ORK()
С Я СДЕЛАЛ СВОЮ РАБОТУ, СИНХРОНИЗИРУЮСЬ С МОИМ СОСЕДОМ
ISYNC(IAM) = 1
с$ОМР FLUSH(ISYNC)
С ЖДИТЕ, ПОКА СОСЕД НЕ СДЕЛАЕТ
DO WHILE (ISYNC(NEIGH) .EQ 0)
c$OMP FLUSH(ISYNC)
END DO
c$OMP END PARALLEL
SUBROUTINE WORK(K)
c$OMP ORDERED
W R ITE (V ) К
c$OMP END ORDERED
Примеры
Вы м ож ете использовать директиву PA R A LLEL в крупноблочны х параллельны х про
граммах. В следую щ ем прим ере каж дый поток в параллельной области реш ает, какую
часть глобального м ассива X обрабаты вать, основы ваясь на номере потока:
О бъекты програм мы идентиф ицирую тся именам и, меткам и, номерами устройств вво
да/вы вода, сим волам и оператора или сим волами назначения. Н апример, переменная,
производный тип или подпрограмм а идентифицирую тся ее именем.
О б л аст ь дейст вия относится к области, в которой имя распознается. Блок области
действия является програм мой или частью программы , в которой определено или извест
но имя. Он м ож ет бы ть лю бы м из следую щ их выражений:
■ Вся вы полняем ая программа.
■ О тдельны й блок области действия.
■ О тдельное утверж дение (или часть утверж дения).
О бласть програм мы , в которой имя является известны м и доступны м , упоминается
как область действия этого имени. Различные области действия допускаю т использование
одного и того же имени для разны х вещ ей в разных областях программы.
Связы вание - это язы ковое понятие, которое допускает обращ ение под другим име
нем к том у же самом у объекту в специфической области программы .
ттоттп 406
Глава 14 Об часть действия и связывание 407
Объект Область действия
Встроенные операторы Глобальная
Определяемые операторы Локальная
Метки утверждений Локальная
Номера внешних устройств ввода/вывода Глобальная
Встроенное назначение Глобальная4
Определяемое назначение Локальная
1 Имена общих блоков могут также использоваться, чтобы идентифицировать локальные объекты.
2 Если встроенная процедура не используется в блоке области действия, ее имя может использоваться как локальный объ
ект внутри этого блока области действия. Например, если встроенная функция COS не используется в программной еди
нице, COS может использоваться там как имя локальной переменной
3 Переменная DO в неявном - DO списке списка ввода/вывода имеет локальную область действия.
4 Область действия символа назначения (=) глобальна, но она может идентифицировать дополнительные операции.
Утверждение. Объекты, которые являются доступными только внутри утверждения или части
утверждения; на такие объекты нельзя сослаться в последующих утверждениях.
Блок области действия (Локальная область действия). О бъекты, которы е о бъ яв
лены внутри блока области действия. Эти объекты являю ю я локальны м и по отнош ению
к этому блоку области действия. И мена локальны х объектов разделены на классы (см.
табл. 14.1). Блок области действия является одним из следую щ их выражений:
■ О пределением производного типа.
■ Телом интерфейса процедуры (исклю чая лю бы е определения производного типа и т е
ла интерфейсов, содерж ащ ихся внутри нег о).
■ Программной единицей или подпрограмм ой (исклю чая лю бы е определения п рои з
водного типа, тела интерфейса и подпрограмм ы , содерж авш иеся внутри него).
■ Блок области действия, который непосредственно окружает другой блок области дей
ствия, называется блоком области действия хоста. Именованные объекты внутри блока
области действия хоста доступны для влож енного блока области действия связы вани
ем хостом (см. "С вязы вание хостом и использованием ").
Как только объект объявлен в блоке области действия, его имя м ож ет использоваться
повсюду в этом блоке области действия. О бъект, объявленны й в другом блоке области
действия, является другим объектом, даж е если он имеет то же самое имя и свойства.
Внутри блока области действия, локальное имя объекта, которое не является ро до
вым, долж но быть уникальны м внутри его класса. О днако имя локального объекта в о д
ном классе мож ет использоваться, чтобы идентифицировать локальны й объект другого
класса.
Внутри блока области действия, родовое имя м ож ет быть тем же, что и лю бое из имен
процедур в блоке интерфейса.
Имя компонента имеет ту же область действия, что и производный тип, компонентом
которого он является. О но м ож ет появиться только внутри указателя компонента струк
туры этог о типа.
Имя объекта утверж дения м ож ет такж е быть именем глобального или локального
объекта в том же самом блоке области действия; в этом случае имя интерпретируется
внутри утверждения как имя из объекта утверж дения.
Блоки области действия м огут содерж ать другие блоки области действия. Н априм ер,
следую щ ий пример показы вает ш есть блоков области действия:
MODULE M0D_1 ! Блок области действия 1
! Блок области действия 1
408 С j l А 1гашн, В В Кондратьев Нрограинрование на Visual FORTRAN
program unclear
!
! показывает, как использовать родовые процедурные ссылки
USE U N J/IO D
INTERFACE DUP
MODULE PROCEDURE dupl, dup2, dup3
END INTERFACE
real a.b
integer c,d
character (len=2) state
a = 1.5
b = 2.32
с=5
d = 47
state = 'WA'
call dup(a.b)
call dup(c.d)
print *, dup(state) фактический вывод - только 'S'
END
О братите внимание, что функция DUP3 печатает ю л ь к о 1 символ, гак как модуль,
U N M O D не устанавливает никакого параметра длины для ф ункционального результата.
Если бы ф орм альны е аргум енты х и у для DUP были объявлены как целые числа вм е
сто вещ ественны х чисел, то лю бы е вызовы в DUP были бы неоднозначными. Если дело
о бстоит так, компиляция заканчивается с ош ибкой.
О пределения подпрограмм DUP1, DUP2 и DUP3 долж ны иметь разны е имена. Родо
вое имя указы вается в первой линии блока интерфейса и в примере - эго DUP.
14.6. Связывание
С вязывание разреш ает получить доступ разным програм мны м единицам к том у же
самому значению через различные имена. О бъекты является связанны м и, когда каж дый
является связанным с тем же самы м м естополож ением памяти.
Есть 3 вида связывания:
■ связывание имени,
■ связывание указателя,
■ связывание памяти.
П ример показывает связывание имени, указателя и памяти м еж ду внеш ней п рограм м
ной единицей и внеш ней процедурой.
! Блок области действия 1: Внешняя программная единица
REAL А, В(4)
REAL, POINTER :: М(:)
REAL, TARGET :: N(12)
COM M O N/СОМ/...
EQUIVALENCE (A, B(1)) ! Связывание памяти между А и B(1)
М => N ! Связывание указателя
CALL Р (actual-arg,..)
412 С. Д Алгазин, В В Кондратьев Программирование на Visual FORTRAN
Связывание параметром
П араметры - это значения, которы е передаю тся к и из функций и подпрограмм е через
списки парам етров вызывающей программы.
В ы полнение процедурной ссы лки устанавливает связы вание параметром между фак
тическим парам етром и соответствую щ им ему формальным параметром. Имя формаль
ного параметра м ож ет отличаться от имени связанного с ним ф актического параметра
(если он есть).
Когда процедура заканчивает вы полнение, связы вание параметром заканчивается.
Связывание указателя
Указатель может бы ть связан с адресатом. В разное время в течение вы полнения про
граммы, указатель м ож ет бы ть неопределенны м , связанны м с другим и адресатам и или
разъединенным. Н ачальное состояние связы вания указателя является неопределенны м .
Указатель может стать связанны м следую щ им образом:
■ Н азначением указателя (указатель => адресат). А дресат долж ен бы ть связан или ука
зан с атрибутом TA RG ET. Если адресат распределяемы й, он долж ен бы ть в н астоя
щее время распределенным.
■ Распределением (успеш ное выполнение утверж дения A L LO C A T E ) У тверж дение
A LLO CATE долж но ссы латься на указатель.
Указатель становится разъединенны м , если возникает лю бое из следую щ их условий:
■ Указатель аннулирован утверж дением N U LLIFY .
■ У казатель освобож ден утверж дением D EA LLO CA TE.
■ Указателю назначен разъединенны й указатель (или встроенная функция N U LL).
Когда указатель связан с адресатом , состояние определения указателя - определен
ный или неопределенный, в зависим ости от состояния определения адресата. А дресат яв
ляется неопределенным в следую щ их случаях:
■ Если он никогда не распределялся.
■ Если он не освобож ден через указатель.
■ Если утверждение RETU RN или END заставляет его стать неопределенны м .
■ Если указатель связан с определяемы м адресатом, состояние определения указателя
может быть определенным или неопределенны м , согласно правилам для переменной.
■ Если состояние связы вания указателя - разъединенное или неопределенное, на указа
тель нельзя сослаться или освободить.
Н езависимо от св о ею состояния связы вания указатель всегда м ож ет аннулироваться,
распределяться или связываться с адресатом. Когда указатель аннулирован, он становится
414 С. Д Алгазин, В В К ондрат ьев П р о гр а и и р о ва п и е на Visual FORTRAN
Связывание памяти
Связывание памяти - это связы вание двух или более объектов данных. Оно возника
ет, когда две или больш е последовательностей иамяти разделяю тся (или выравниваю тся
с) одним или более блоками памяти. П оследовательности памяти использую тся, чтобы
описать отнош ения среди переменны х, общ их блоков и переменных результата.
Приложение В. Дополнительные
возможности языка
Чтобы облегчать совм естим ость со старыми версиями, Intel Fortran обеспечивает до
полнительны е язы ковы е возм ож ности. Эти язы ковы е возможности особенно полезны
при перенесении стары х програм м Fortran в Fortran 95/90. О днако вы долж ны избежать
использования их в новых програм м ах на этих системах и в новых программах, для кото
ры х взаим озам еняем ость с другой реализацией Fortran 95/90 является важной.
М аксим альное число сим волов, которое мож ет содерж ать сим вольная переменная или
сим вольны й элем ент м ассива, является длиной символьной переменной или символьного
элем ента м ассива.
М аксим альное число сим волов, которое может содерж ать символьный массив, - это
длина каж дого элем ента, ум нож енная на число элементов.
Примеры
В следую щ ем прим ере утверж дение D ECO D E преобразовы вает 12 сим волов из А к
целочисленном у форм ату (как указано утверж дением FORM A T):
DIMENSION К(3)
C H A R A C T E R S А,В
DATA А/'123456789012'/
DECODE(12,100,A) К
100 F0RMAT(3I4)
ENCODE(12,100,B) К(3), К(2), К(1)
12 символов сохранены в массиве К:
К(1) = 1234
К (2 )= 5678
К(3) = 9012
У тверж дение E N C O D E преобразовы вает значения К (3), К (2) и К (1) к символьному
ф орм ату и хранит сим волы в сим вольной переменной В:
В = '901256781234'
О днако когда используется как параметр полная функциональная ссылка, она пред
ставляет значение, а не имя подпрограмм ы ; наприм ер, SQRT (В) в CA LL SUBR (A, SQRT
(В), С). П оэтому эта функция не определена в утверж дении EX TER N A L (как было бы
для неполной ссылки - SQRT).
Пример
П оказы вает утверж дение EX TER N A L Fortran 66:
Основная программа П одпрограммы
EXTERNAL SIN, COS, *TAN, SINDEG SUBROUTINE TRIG(X,F,Y)
Y = F(X)
RETURN
END
CALL TRIG(ANGLE, SIN, SINE)
FUNCTION TAN(X)
TAN = SIN(X)/COS(X) CALL TRIG(ANGLE, COS, COSINE)
RETURN
END
Правила использования
Каждое имя с становится константой и определено как значение вы раж ения ехрг. Как
только имя определено как константа, оно м ож ет появиться в лю бой позиции, в которой
допустима константа. Эф ф ект - тот же самы й, как будто константа бы ла написана там
вместо имени.
Имя константы не м ож ет появиться как часть другой константы, кроме как действи
тельная или мнимая часть комплексной константы. Н апример:
PARAMETER 1=3
PARAMETER М=1.25 ! Не допустимо
PARAMETER N=(1.7 0 3 ,1) ! Допустимо
Имя, используемое в утверждении PA R A M ETER , идентифицирует только константу,
соответствую щ ую имени в этой программной единице. Такое имя м ож ет быть определе
но только однажды в утверж дениях PA R A M ET E R внутри той же самой программной
единицы.
Имя константы принимает тип данны х соответствую щ его ей постоянного выражения.
Тип данных константы параметра не м ож ет бы ть указан в утверж дении объявления типа.
Начальный символ имени константы не затрагивает неявно его тип данных.
Примеры
Следую щ ие утверж дения являю тся правильны м и прим ерам и этого форм ата утвер
ждения PARAM ETER:
PARAMETER Pl=3.1415927, DPI=3.141592653589793238D0
PARAMETER PIOV2=PI/2, DPIOV2=DPI/2
PARAMETER FLAG=.TRUE., LO NG NAM E-A STRING OF 25 CHARACTERS’
Объявления структуры
Объявление ст рукт уры определяет имена полей, типы данны х в пределах полей и по
рядка и вы равнивания полей внутри записи. Поля и структуры могут быть инициализи
рованы , но записи не м огут бы ть инициализированы .
О бъявление структуры им еет следую щ ий формат:
STRUCTURE [lstructure-namei\[field-namelist]
field-declaration
[field-declaration ] ...
[field-declaration]
END STRUCTURE
где structure-nam e - имя, используем ое для идентификации структуры, заклю ченное в
слеш и.
П оследую щ ие утверж дения REC O R D использую т имя структуры, для того чтобы об
ратиться к структуре. И мя структуры долж но бы ть уникальны м среди имен структуры,
П р т о ж ен и я 427
но структуры м огут им еть одинаковы е им ена с перем енны м и (скалярам и или м ассивами),
полями записи, константами PA R A M ETER и общ ими блокам и.
О бъявления структуры могут бы ть влож ены (содерж ать одно или более других о бъ
явлений структуры). И мя структуры требуется для структурированного объявления на
наиболее удаленном уровне вложения и является дополнительны м для других объявле
ний, вложенных, в него. О днако если вы ж елаете сослаться на влож енную структуру в у т
верждении REC O R D в вашей программе, структура долж на им еть имя.
Структура, поле и имена записей все являю тся локальны м и для програм м ой единицы,
где они определены . Когда записи передаю тся как парам етры , поля в определениях
структур внутри вызова и вызываемых подпрограмм долж ны соответствовать в типе, п о
рядке и измерении.
field-n am elist - список полей, имеющих конструкцию связанного объявления структу
ры. Список полей имен разреш ается только для влож енны х объявлений структуры .
field-declaration , такж е называемое телом объявления, состоит из лю бой комбинации
следую щ их утверж дений:
Типичные объявления - это обы чны е объявления типа данны х Fortran.
Объявления подструктур. П оле внутри структуры м ож ет бы ть подструктурой, со
ставленной из элем ентарны х полей, других подструктур или их комбинации.
Объявление объединения составлено из одного или более отображ енны е полевы х
объявлений.
Утверждения PARAMETER могут появиться в объявлении структуры , но нельзя за
давать тип данны х внутри блока объявления. О бъявления типа для имен PA R A M ET E R
долж ны предш ествовать утверж дению PA R A M ET E R и бы ть вне объявления ST R U C
TU RE следую щ им образом:
INTEGERS Р
STRUCTURE /АВС/
PARAMETER (Р=4)
REAL*4 F
END STRUCTURE
REAL*4 A(P)
Правила использования
В отличие от утверж дений объявления типа, объявления структуры не создаю т пере
менных. Структурированны е переменны е (записи) создаю тся, когда вы используете у т
верждение R EC O R D , содерж ащ ее имя предварительно объявленной структуры . У твер
ж дение REC O R D можно рассм атривать как своего рода утверж дение объявления типа.
Различие состоит в том, что определяю тся составные элем енты , а не единственны е эл е
менты.
Внутри объявления структуры, упорядочивание утверждений и имен полей внутри ут
верждений важно, потому что это упорядочивание определяет порядок полей в записях.
В объявлении структуры каж дое полевое смещ ение - это сум м а длин преды дущ их
полей, таким образом, длина структуры - сумма длин ее полей. С труктура упакована; вы
долж ны явно обеспечить лю бое вы равнивание, которое необходим о, вклю чая, наприм ер,
неим енованные поля соответствую щ ей длины .
По ум олчанию поля выравниваю тся на естественны х границах; невы ровненны е поля
дополняю тся по мере необходимости. Чтобы избегать доп олн ен и я записей, вы долж ны
располагать структуры так, чтобы все поля были вы ровнены естественно.
428 С Д. Алгсиин, В. В Кондратьев. Программирование на Visual FORTRAN
Чтобы упаковы вать поля на границе произвольного байта, вы долж ны указать опцию
компилятора. Вы м ож ете такж е указать вы равнивание для полей, используя общ ие ди
рективы cD EC $ O PT IO N S или cD EC $ PACK.
Имя ноля не долж но бы ть тем же самым что и лю бой встроенный или определяемы й
пользователем оператор (наприм ер, EQ не м ож ет использоваться как имя поля).
Пример
В этом прим ере объявление определяет структуру по имени A PPO IN TM EN T.
A PP O IN T M E N T содерж ит структуру D A TE (поле A PP DATE), как подструктуру. Она, в
свою очередь, содерж ит подструктуру по имени TIM E (поле A PP TIM E, массив), массив
C H A R A C T E R *20 по имени А РР М ЕМ О и поле L O G IC A L *l по имени A PP FLAG.
STRUCTURE /DATE/
INTEGER*1 DAY, MONTH
INTEGER*2 YEAR
END STRUCTURE
STRUCTURE /APPOINTMENT/
RECORD /DATE/ APP.DATE
STRUCTURE /TIME/ APP.TIME (2)
INTEGER*1 HOUR, MINUTE
END STRUCTURE
CHARACTER*20 APP.MEMO (4)
L0GICAL*1 APP_FLAG
END STRUCTURE
Д лина лю бого образца структуры A PPO IN T M EN T - 89 байт.
Рис. В-1 показы вает карту пам яти лю бой записи или элем ента массива записи со
структурой A PPO IN T M E N T.
Объявления объединения
О бъявление объединения - это объявление м нож ества утверж дений, определяю щ ее
область данных, которая м ож ет периодически разделяться во время вы полнения про
граммы одним или более полями или группами полей. О бъявление объединения долж но
находиться внутри объявления структуры .
Каждое уникальное поле или группа полей определяю тся в соответствии с отдельным
объявлением карты. О бъявление объединения приним ает следую щ ий формат:
UNION
map-declaration
map-declaration
[map-declaration]
[map-declaration]
END UNION
map-declaration
Принимает такую форму:
MAP
field-declaration
430 С Д. Алгазин, В В. Кондратьев Программирование на Visual FORTRAN
[field-declaration]
[field-declaration]
END MAP
где field-declaration - объявление структуры или утверж дение RECORD , содержащ ееся
внутри объявления объединения; объявление объединения, содерж ащ ееся внутри объяв
ления объединения или объявление поля данны х (имеет тип данны х) внутри объединения
(см. разд. "О бъявления структуры ").
Правила использования
Как и обы чны е объявления типа Fortran, данны е м огут бы ть инициализированы в ут
верж дениях объявления поля в объявлениях объединения. О днако, если поля внутри по
вторяю щ ихся объявлений карты в единственном объединении инициализированы, объяв
ления данны х инициализирую тся в порядке, в котором появляю тся утверждения. В ре
зультате только конечная инициализация вступает в силу, а все предыдущ ие инициали
зации перезаписаны поверх.
Размер разделяем ой области, установленной для объявления объединения, является
размером наибольш ей карты, определенной для этого объединения. Размер карты - это
сум м а разм еров полей, объявленны х внутри нее.
М анипулирование данны м и с использованием объявлений объединения подобно ис
пользованию утверж дений E Q U IV A LEN C E. Разница состоит в том, что информационные
объекты, указанны е внутри утверж дений E Q U IV A LE N C E , одноврем енно связаны с об
щим м естополож ением памяти и данны м и, постоянно находящ им ися там; с объявления
ми объединения вы м ож ете использовать одно дискретное местополож ение памяти, что
бы поочередно содерж ать различны е поля (массивы или переменные).
При объявлениях объединения, только одно объявление карты внутри объявления
объединения м ож ет бы ть связано в лю бой м омент времени с местополож ением памяти,
которое разделяю т карты. Всякий раз, когда на поле внутри другого объявления карты в
том же самом объявлении объединения ссылаю тся в ваш ей программе, поля в предш ест
вую щ ем объявлении карты становятся неопределенны м и и наследую т поля в объявлении
карты, содерж ащ ем поле, на которое недавно ссылались.
В следую щ ем примере определена структура W O R D S L O N G . Эта структура содер
ж ит объявление объединения, определяю щ ее 2 поля карты. П ервое поле карты состоит из
трех IN TEG ER *2 переменных (W O R D O , W O R D 1 и W O RD 2), а второе переменная
IN TEG ER*4, LONG:
STRUCTURE /W0RDS_L0NG/
UNION
MAP
INTEGER*2 WORDJ), W O R D J, W0RD_2
END MAP
MAP
INTEGERS LONG
END MAP
END UNION
END STRUCTURE
Д лина лю бой записи со структурой W O R D S LO N G - 6 байт. Рис. В-2 показывает
управление памятью лю бой записи со структурой W O R D S LONG:
Приложения 431
(смещ ение байта)
0 1 2 3 4 5 6
ч
. А А j
[, Istructure-name/record-namelist]
где structure-name - имя предварительно объявленной структуры.
record-nam elist является списком о д н о ю или более имен переменны х, имен массива
или спецификаций массива, разделенны х запятыми. Все записи, именованны е в этом
списке, имеют одну и ту же структуру и распределены отдельно в памяти.
Правила использования
Вы м ожете использовать имена записей в утверж дениях CO M M O N и D IM EN SIO N , но
не в утверждениях DATA, EQ U IV A LE N C E или N A M ELIST.
Записи первоначально им ею т неопределенны е значения, если вы не определили им
значения в объявлениях структуры.
STRUCTURE /APPOINTMENT/
RECORD/DATE/ APP_DATE
STRUCTURE /TIME/ APP_TIME(2)
INTEGER*1 HOUR, MINUTE
END STRUCTURE
CHARACTER*20 APP_MEM0(4)
LOGICAL*1 APP_FLAG
END STRUCTURE
С ледую щ ее утверж дение RECO RD создает перем енную по имени N E X T A P P и м ас
сив с 10 элементами по имени A P P L 1 S T . И переменная и каж ды й элем ент м ассива п р и
нимаю т формат структуры A PPO IN TM EN T.
REC O R D /A PPO IN T M E N T / N E X T_A PP,A PP_LIST(10)
Каждый из следую щ их примеров ссы лок к записи и полю получен из предш ествую
щ их объявлений структуры и утверж дений REC O R D :
Ссылки на составное поле
- Запись N EX T APP:
N EX TA PP.
■ П оле A P P D A T E , 4-байтовое поле м ассива в записи м ассива A PP_L1ST(3):
A PP_L1ST(3).A PP_DA TE.
Ссылки на скалярные поля
■ П оле A P P F L A G , является полем L O G IC A L записи N E X T A PP:
N Е Х Т А Р Р .A P P F L A G .
■ П ервы й символ А РР_М ЕМ О (1), поля C H A R A C T E R *20 записи N E X T A PP:
N Е Х Т А Р Р .А РР_М ЕМ О ( 1)( 1:1 ).
STRUCTURE /DATE/
INTEGER*1 DAY, MONTH
INTEGER*2 YEAR
END STRUCTURE
RECORD /DATE/ TODAY, THIS_WEEK(7)
STRUCTURE /APPOINTMENT/
Это прилож ение описы вает набор символов A SCII, который является доступным на
системах Linux* и M ac OS*. Д ругие наборы сим волов доступны на системах W indows*;
для деталей, см. диалоговую докум ентацию для этих систем.
Д ля деталей о наборе сим волов Fortran 95/90 см. разд. 1.3.
В ст роенны е ф ункции
Встроенные
Модель Возвращаемое значение
функции
BIT SIZE Bit Число битов в битовой модели
DIGITS Integer или Число значащих цифр в модели для параметра
Real
EPSILON Real Число, которое является почти незначащим по сравнению с единицей
EXPONENT Real Значение экспонентной части экспоненты действительного параметра
FRACTION Real Дробная часть действительного параметра
436 С Д Ачгазин, В В. Кондратьев Программирование на Visual FORTRAN
Встроенные
Модель Возвращаемое значение
функции
HUGE Integer или Наибольшее число в модели для параметра
Real
MAXEXPONENT Real Максимальная экспонента в модели для параметра
MINEXPONENT Real Минимальная экспонента в модели для параметра
NEAREST Real Наименьшее различимое машинно-представимое число в данном руко
водстве
PRECISION Real Десятичная точность (действительного или комплексного) параметра
RADIX Integer или Основание модели для параметра
Real
RANGE Integer или Десятичный диапазон экспоненты модели для параметра
Real
RRSPACING Real Обратная величина относительного зазора значения, около параметра
SCALE Real Значение части экспоненты (модели для параметра), измененное ука
занным значением
SET_EXPONENT Real Значение части экспоненты (модели для параметра), установленное к
указанному значению
SPACING Real Значение абсолютного интервала образцовых чисел около параметра
TINY Real Наименьшее положительное число в модели для параметра
/ = (-1 ) х (0 х 2 ° + 0 х 2 |+ 1 х 22 + 0 х 23 + 1 х -2 4 )
/ = ( -1 ) х (4 + 16)
i = -1x20
/ = -20
D-2. Модель для действительных данных
М одельны й набор для вещ ественны х чисел, вообщ е, определяется как одно из сле
дую щ его:
х=0
х = s x b e х £ / а хЬ~к
Приложения 437
где х - действительное значение; .у - знак (или +1 и л и -1 ); h - основание (действительное
основание системы счисления; целое число, больш е чем 1; в Intel Fort .n b = 2); p - число
цифр мантиссы (целое число больш е, чем 1).
Число цифр различает ся в зависимости от формата действительного ш и а таким образом:
REAL(4)IEEES floating 24
REAL(8)IEEE TJIoating 53
REAL(16) IEEE XJoating 113
где e - целое число в диапазоне от етш до етах вклю чительно. Этот диапазон варьируемся
в зависимости от действительного формата:
Qmin Bmax
REAL(4) IEEE SJoating IEEE -1 2 5 128
REAL(8) T_floating IEEE -1021 1024
REAL(16) XJoating -16381 16384
Ук - неотрицательное число меньш е, чем h \f\ отличается от нуля. Д ля х - 0, его экспо
нента е и цифры /к определяю тся, как нули.
М одельный набор для действительного с одинарной точностью (R E A L (4)) определя
ется как одно из следую щ их выраж ений:
х = 0
X = s X 2е X 1/2 +£ / ; 2-
х -125 < е < 128
Следую щ ий прим ер показы вает общ ей м одель действительного для х = 20.0, и сп оль
зую щ ую основание (Ь) 2:
х = 1 х 25 х (1 х 2 '1 +0 х 2'2 +1 х 2 '?)
х = 1 х 32 х ( .5 + .125)
х - 32 х (.625)
.г = 20.0
где / - целочисленное значение; .V - число битов; и>к - битовое значение 0 или 1. Биты
пронумерованы справа налево, начиная с 0.
Следую щ ий пример показы вает битовую модель для у = 1001 (целое число 9) исполь
зую щ ую число бит (¿), равное 4:
1 0 0 1
438 С Д Ачгазин, В. В Кондратьев Програмирование на Visual FORTRAN
Имя • Описание
Ввод и вывод:
ACCESS Отмечает доступность для файла в соответствии с режимом
CHMOD Изменяет атрибуты файла
FGETC Читает символ из внешнего устройства
FLUSH Записывает на диск буфер внешнего устройства для связанного с ним файла
FPUTC Записывает символ на внешнее устройство
FSEEK Устанавливает позицию файла на внешнем устройстве
FTELL, FTELLI8 Возвращают смещение, в байтах, от начала файла
GETC Читает символ из устройства 5
GETPOS, GETPOSI8 Возвращают смещение, в байтах, от начала файла
PUTC Записывает символ из устройство 6
Дата и время:
CLOCK Возвращает текущее время в формате "hh:mm:ss", используя 24-часовые часы
CLOCKX Возвращает часы процессора в микросекундах
CTIME Преобразует системное время в 24-символьную строку ASCII
DATE Возвращает текущую системную дату
DATE4 Возвращает текущую системную дату
DCLOCK Возвращает прошедшее время, в секундах начиная с начала текущего процесса
DTIME Возвращает процессорное время, прошедшее с (1) начала программы, или (2)
наиболее свежего вызова DTIME
ETIME Возвращает процессорное время, прошедшее с начала выполнения программы
FDATE Возвращает текущую дату и время как строку ASCII
GETDAT Возвращает дату
GETTIM Возвращает время
GMTIME Возвращает среднее время по Гринвичу как целочисленный массив
с 9 элементами
IDATE Возвращает дату как один массив с 3 элементами или как 3 скалярных парамет
ра (месяц, день, год)
IDATE4 Возвращает дату как один массив с 3 элементами или как 3 скалярных парамет
ра (месяц, день, год)
ITIME Возвращает текущее время как массив с 3 элементами (час, минута, секунда)
JDATE Возвращает текущую дату как 8-символьную строку с Юлианской датой
JDATE4 Возвращает текущую дату как 10-символьная строка с Юлианской датой
LTIME Возвращает местное время как целочисленный массив с 9 элементами
RTC Возвращает число секунд с 00:00:00 GMT, 1 января 1970
SECNDS Возвращает число секунд с полуночи, меньше значения ее параметра
SETDAT Устанавливает дату
SETTIM Устанавливает время -
TIME Как подпрограмма возвращает время, сформатированное как HH:MM:SS; как
функция возвращает время в секундах с 00:00:00 GMT, 1 января 1970
TIMEF Возвращает число секунд, прошедших с первого вызова этой функции (или 0)
Обработка ошибок:
GETLASTERROR Возвращает последнюю установленную ошибку
GETLASTERRORQQ Возвращает последнюю ошибку, установленную функцией или динамической
подпрограммой
IERRNO Возвращает последний код ошибки
SETERRORMODEQQ Устанавливает режим для обработки критических ошибок
Вызов и Управление Программ:
RAISEQQ Посылает прерывание выполняемой программе, моделируя прерывание от
операционной системы
RUNQQ Вызывает другую программу и ждет, чтобы она выполнилась
Прилож ения 441
Имя Описание
ЭЮ МАЮО Управляет обработкой сигнала
Задерживает выполнение программы в течение указанного времени
Система, Диск и Каталог:
CHDIR Изменяет текущий рабочий каталог
CHANGEDIRQQ Делает указанный каталог текущим (принимаемым по умолчанию) каталогом
CHANGEDRIVEQQ Делает указанный диск текущим диском
DELDIRQQ Удаляет указанный каталог
GETDRIVEDIRQQ Возвращает текущий диск и путь каталога
GETDRIVESIZEQQ Возвращает размер указанного диска
GETDRIVESQQ Возвращает диски, доступные для системы
GETENVQQ Возвращает значение из текущей среды
MAKEDIRQQ Создает каталог с указанным именем каталога
SETENVQQ Добавляет новую переменную среды или устанавливает значение суще
ствующей
SYSTEMQQ Выполняет команду, передавая командную строку интерпретатору команд опе
рационной системы
Динамики:
ВЕЕРСЮ | Издает звук динамиком указанной продолжительности в миллисекундах на ука
занной частоте в Герц
Управление файлами' \
DELFILESQQ Удаляет указанные файлы в указанном каталоге
FINDFILEQQ Ищет файл в каталогах, указанных в переменной среды РАТН
FULLPATHQQ Возвращает полный путь для указанного файла или каталога
GETFILEINFOQQ Возвращает информацию о файлах с именами, соответствующими требуемой
строке
PACKTIMEQQ Упаковывает значения времени для использования БЕТЕН-ЕИМЕОО
RENAMEFILEQQ Переименовывает файл
SETFILEACCESSQQ Устанавливает режим доступа к файлу для указанного файла
SETFILETIMEQQ Устанавливает время модификации для указанного файла
SPLITPATHQQ Разделяет полный путь на четыре компонента
4JNPÄCKTIMEQQ Распаковывает значение файлового времени и даты на его составные части
Массивы
BSEARCHQQ Выполняет двоичный поиск для указанного элемента на сортированном одно
мерном массиве встроенного типа
SORTQQ Сортирует одномерный массив встроенного типа
Исследование и управление плавающей точки'
CLEARSTATUSFPQQ Очищает флажки исключения в слове состояния процессора с плавающей
точкой
GETCONTROLFPQQ Возвращает значение слова управления процессором с плавающей точкой
GETSTATUSFPQQ Возвращает значение слова состояния процессора с плавающей точкой
LCWRQQ То же что и SETCONTROLFPQQ
SCWRQQ То же что и GETCONTROLFPQQ
SETCONTROLFPQQ Устанавливает значение слова управления процессора с плавающей точкой
SSWRQQ То же самое что и ОЕТЭТАТУБЕРОО
IEEE * Функциональность:
IEEE FLAGS Устанавливает, выбирает или очищает флажки 1ЕЕЕ
IEEEJHANDLER Устанавливает обработчик для исключений 1ЕЕЕ
Ввод/вывод последовательного порта 3
SPORT CANCEL Ю Отменяет любой ввода/вывода в указанный порт
SPORT.CONNECT Устанавливает соединение с последовательным портом и определяет некото
рые параметры использования
442 С Д. А ичпии. В В Кондратьев Прокламирование на Visual FORTRAN
Имя \ Описание
$РОРТ_СОММЕСТ_ЕХ Устанавливает соединение с последовательным портом, определяет некото-
|рые параметры использования и определяет размер внутреннего буфера для
¡приема данных
SPORT_GET_HANDLE Возвращает описатель Windows^ связанный с портом связи
S PO R T.G ET STATE Возвращает скорость в бодах, четность, состояние информационных разрядов
и состояние стоповых битов порта связи
SPORT_GET__STATE_EX Возвращает скорость в бодах, четность, установку информационных разрядов,
стоповые биты и другие параметры настройки порта связи
SPORT. G ETJIM EO UTS Возвращает выбранные пользователем времена ожидания для последова
тельного порта
SPORT PEEK DATA Возвращает информацию о пригодности входных данных
SPORT PEEK LINE Возвращает информацию о пригодности входных записей
SPORT PURGE Выполняет функцию очистки на указанном порту
SPORT READ DATA Читает доступные данные из указанного порта
SPORT_READ_LINE Читает запись из указанного порта
SPORT RELEASE Освобождает последовательный порт, который был предварительно связан
SPORT. SET_STATE Устанавливает скорость в бодах, четность, состояние информационных разря
дов и состояние стоповых битов порта связи
SPORT_SET_STATE_EX Устанавливает скорость в бодах, четность, состояние информационных разря
дов, стоповые биты и другие параметры настройки порта связи
SPORT _SET_TIMEOUTS Устанавливает выбранные пользователем времена ожидания для последова
тельного порта
SPORT SHOW STATE Отображает состояние порта
SPORT_SPECIAL_FUNC Выполняет функцию связи с указанным портом
SPORTJVRITE DATA Выводит данные в указанный порт
SPORT_WRITE_LINE Выводит данные в указанный порт и следующий за ними признак конца записи
Смешанные■
LNBLNK Возвращает индекс последнего непробельного символа в строке I
QSORT Возвращает сортированную версию одномерного массива указанного числа
элементов названного размера
RINDEX Возвращает индекс последнего возникновения подстроки в строке
SCANENV Просматривает среду для значения переменной среды
TTYNAM Проверяет, является ли логическое устройство терминалом
1 Эта подпрограмма может также быть указанна как HOSTNM
2 Есть функция RANDOM и подпрограмма RANDOM в библиотеке взаимозаменяемости
3 W*32, W*64.
MBLGE, MBLGT, MBLLE, MBLLT, То же что и LGE, LGT, LLE, LLT, и операторы EQ и NE за исключением того,
MBLEQ, MBLNE что многобайтовые символы могут быть включены в их параметры
MBSCAN То же что и SCAN, за исключением того, что многобайтовые символы могут
быть включены в его параметры
MBVERIFY То же что и VERIFY, за исключением того, что многобайтовые символы могут
быть включены в его параметры
; Имя Описание
PXFRMDIR Удаляет каталог
1PXFSETENV Добавляет новую переменную среды или устанавливает ее значение
‘ PXFSETGID1 Устанавливает эффективный групповой Ю текущего процесса
PXFSETPGID1 Устанавливает процессный групповой ID
PXFSETSID1 Создает сеанс и устанавливает групповой ID процесса
PXFSETUID1 Устанавливает эффективный пользовательский ID текущего процесса
PXFSIGACTION Изменяет действие, связанное с собственным сигналом
PXFSIGADDSET1 Добавляет сигнал к набору сигналов
PXFSIGDELSET1 Удаляет сигнал из набора сигналов
PXFSIGEMPTYSET1 Делает пустым набор сигналов
| PXFSIGFILLSET1 Заполняет набор сигнала
¡PXFSIGISMEMBER1 Проверяет, является ли сигнал элементом набора сигналов
iPXFSIGPENDING1 Исследует ждущие обработки сигналы
PXFSIGPROCMASK1 Изменяет список в настоящее время блокируемых сигналов
[PXFSIGSUSPEND1 Приостанавливает процесс, пока сигнал не получен
¡PXFSLEEP Вынуждает процесс бездействовать
PXFSTAT Получает состояние файла
IPXFSTRUCTCOPY Копирует содержание одной структуры в другую
i'PXFSTRUCTCREATE Создает образец указанной структуры
PXFSTRUCTFREE Удаляет образец структуры
PXFSYSCONF Получает значения для системных пределов или опций
PXFTCDRAIN1 Ждет, пока весь записанный вывод не будет передан
Ip x f t c f l o w 1 Приостанавливает передачу или прием данных
¡PXFTCFLUSH1 Сбрасывает входные данные терминала, выходные данные или оба
[PXFTCGETAfTR1 Читает текущие параметры настройки терминала
PXFTCGETPGRP1 Получает групповой Ю приоритетного процесса связанного с терминалом
PXFTCSENDBREAK1 Посылает отключение на терминал
PXFTCSETATTR1 Записывает новые параметры настройки терминала
PXFTCSETPGRP1 Устанавливает группу приоритетного процесса, связанную с терминалом
PXFTIME Получает системное время
PXFTIMES Получает времена процесса
'PXFTTYNAM1 Получает имя пути терминала
PXFUCOMPARE Сравнивает 2 целочисленных без знака
PXFUMASK Устанавливает новую маску создания файла и получает предшествующую
^XFUNAME Получает имя операционной системы
PXFUNLINK Удаляет вход каталога
PXFUTIME Устанавливает доступность файла и время модификации
PXFWAIT1 Ждет завершения дочернего процесса
PXFWAITPID1 Ждет завершения собственного PID
PXFWIFEXITED1 Определяет, имел ли место выход из дочернего процесса
PXFWIFSIGNALED1 Определяет, имел ли место выход из дочернего процесса из-за сигнала
PXFWIFSTOPPED1 Определяет, остановлен ли дочерний процесс
PXFWRITE Записывает в файл
1 Только L *X .
USE IFQWIN
Графические подпрограммы такж е использую тся в прилож ениях Q uickW in.
Имя Описание
Р01_УВЕг1ЕКТ0 \Л/ Рисует кривую Безье, используя координаты окна
РСИУССМ Рисует многоугольник, используя координаты области просмотра
Р01_УС0М \л/ Рисует многоугольник, используя координаты окна
Р01_УШ ЕСЮ Чертит линию между последовательными точками в массиве
РЕСТА№1_Е Рисует Прямоугольник, используя координаты области просмотра
RECTANGLE_W Рисует прямоугольник, используя координаты окна
Символьно-ориентированное отображение текста:
.О ^РЬА УС иРЭО К Включает или выключает курсор
СЕТТЕХТРОЭНЮ М Возвращает текущую позицию текстового вывода
GETTEXTW INDOW Возвращает границы текущего текстового окна
ОиТТЕХТ Посылает текст на экран в текущую позицию
ЗС РО аТЕХТО Ш СМ Листает содержимое текстового окна
ЭЕПЕХТСиРЗОР Устанавливает высоту и ширину текстового курсора для окна в фокусе
ЗЕТТЕХТРОЭНЮ М Устанавливает текущую позицию текстового вывода
SETTEXTWINDOW Устанавливает границы текущего текстового окна
WRAPON Включает или выключает направление обтекания текстом
Отображение символа на основе шрифта.
СЕТРОМПМРО Возвращает текущие характеристики шрифта
СЕТСТЕХТЕХТЕМТ Возвращает ширину указанного текста в текущем шрифте
СЕТСТЕХТКОТАТЮ М Возвращает текущую ориентацию текста выводимого шрифтом 0 1 те Т Е Х Т
м т^Е Р О м тэ Инициализирует библиотеку шрифта
ОиТСТЕХТ Посылает текст в текущем шрифте на экран в текущей позиции2
ВЕТРОМ" Находит один шрифт, который соответствует указанному набору характеристик
и делает его текущим шрифтом используемым 01ТС ТЕ Х Т
БЕТСТЕХТКОТАТЮ М Устанавливает угол ориентации вывода текста шрифта в градусах
Передача образа в памяти
ОЕТМ АОЕ Запоминает образ экрана, используя координаты области просмотра
СЕП М А С Е \Л/ Запоминает образ экрана, используя координаты окна
1МА6ЕБ£Е Возвращает размер образа, основанного на координатах области просмотра
в байтах
(МАСЕБЯЕ \Л/ Возвращает размер образа, основанного на координатах окна в байтах
РиП М А С Е Восстанавливает образ, основанный на координатах области просмотра,
из памяти и отображает его
PUTIMAGE_W Восстанавливает образ, основанный на координатах окна, из памяти и ото
бражает его
Загрузка и сохранение образа:
Ю АРИШ ЗЕ Читает файл точечной графики \Мпс1о\л/8 (ВМР) с диска и отображает его как
определено координатами области просмотра
LOADIMAGE_W Читает файл точечной графики \Л/|'пс1о)л/8 (ВМР) с диска и отображает его как
определено координатами окна
БАУЕИШ ЗЕ Сохраняет образ из указанной части экрана и сохраняет его как файл точеч
ной графики \Мпс1о\л/8; местоположение экрана указывается, используя коор
динаты области просмотра
SAVEIMAGE_W Сохраняет образ из указанной части экрана и сохраняет его как файл точеч
ной графики \№пс!о)л/8; местоположение экрана указывается, используя коор
динаты окна
1 КС В - "красный, зеленый, синий цвет"
2 О иТС ТЕ ХТ допускает использование специальных шрифтов; О УТТЕХТ этого не делает.
П рилож ения 451
Имя Описание
Обработка ошибок:
GERROR Возвращает код ошибки IERRNO как строковую переменную
PERROR Возвращает сообщение об ошибке, которой предшествует строка, для послед
ней обнаруженной ошибки
Исследование и управление плавающей точкой:
FOR GET FPE Возвращает текущие установки флажков исключения плавающей точки
FOR_SET_FPE Устанавливает флажки исключения для плавающей точки
GETEXCEPTIONPTRSQQ1 Возвращает указатель на указатели информации исключения времени вы
полнения С, используемые в обработчиках сигнала, устанавливаемых
БЮ МАЮ О или прямыми вызовами подпрограмм С 111 $1дпа1()
Среда выполнения (W*32, W*64):
for rtl finish • I(Очищает среду выполнения Fortran
for_rtl_init_ Инициализирует среду выполнения Fortran
Управление режимом повторной входимости:
FOR_SET_REENTRANCY Управляет типом защиты повторной входимости, которую показывает библио
тека поддержки
Обратная трассировка-
TRACEBACKQQ |Генерирует трассу стека
Назначение памяти■
FOR_DESCRIPTOR_ASSIGN1 ¡Создает описатель массива в памяти
Это приложение обобщ ает расш ирения язы ка Intel Fortran но сравнению со стандар
том AN SI/ISO Fortran 95. Больш инство расш ирений доступно на всех поддерж иваем ы х
ОС. О днако некоторы е расш ирения ограничены одной или более платформами. Если
расш ирение ограничено, это отмечено.
F-2. Имена
Следую щ ие правила являю тся расш ирениям и к правилам для имен (см. стр. 7):
■ Имена могут содерж ать до 63 сим волов.
■ Знак доллара ($) является допустим ы м символом для имен и м ож ет быть первым си м
волом.
F-5. Константы
С -строки допускаю тся в сим вольны х константах как расш ирение.
Х олериговы е константы допускаю тся как расш ирение (см. стр. 34).
Варианты записи
Порядок от младшего к старшему
П орядок от младш его к старш ему (англ. little-endian, о происхож дении термина
ниже): Ао, •• •? А п,запись начинается с младш его и заканчивается старш им. Этот порядок
записи принят в памяти персональны х компью теров с х86-процессорам и, в связи с чем,
иногда, его назы ваю т интсловский порядок байт (по названию фирмы-создателя
архитектуры х86).
Переключаемый порядок
М ногие процессоры м огут работать и в порядке от м ладш ею к старш ему, и в обрат-
юм, такие как ARM , Pow erPC (но не Pow erPC 970), DEC A lpha. M IPS, РА-RISC и IA-64.
)бьгчно порядок байтов выбирается програм мно во время инициализации операционной
¡истемы, но м ож ет бы ть выбран и аппаратно перемычкам и на мат еринской плате. В этом
лучае правильнее говорить о порядке байтов операционной системы. П ереклю чаемый
ю рядок байтов иногда назы ваю !’ bi-endian или bytesexual (слово-пародия на bisexual -
•исексуальный).
Смешанный порядок
См еш анный порядок байтов (от анг л. middle-endian) иногда используется при работе с
ислами, длина которых превыш ает м аш инное слово. П роизводится факторизация числа
а м аш инны е слова, которые записы ваю тся в формате, естественном для данной архи-
ектуры , но сами слова записы ваю тся в обратном порядке.
И рт ож ет м 463
Классический пример m iddle-endian - представление 4-байговы х целых чисел на 16-
битовых процессорах семейства PDP-11 (известен как PD P-endian). Для представления
двухбайтных значений использовался порядок big-endian, но 4-байтовое двойное слово
записывалось от м ладш его слова к старш ему.
В процессорах VAX и A RM используется см еш анное представление для длинны х ве
щ ественных чисел.
Пример
Д алее приведен пример, в котором описы вается разм ещ ение 4-байтового числа в ОЗУ
ЭВМ , доступ к которому может производиться как к 32-разрядному слову, так и ио-
байтово. Все числа записаны в 16-теричной системе счисления.
Число: 0xA lB 2C 3D 4
Ф акторизация: D4 + С3*100 + В2* 10000 + А1* 1000000
П орядок от м ладш ею к старш ему (litte-endian): 0xD 4, ОхСЗ, 0хВ2, 0хА1
Порядок от старш его к младш ему (big-endian): 0хА 1, 0хВ2, ОхСЗ, 0xD 4
Порядок, принятый в P D P -11 (PD P-endian): 0хВ2, O xA l, 0xD4, ОхСЗ
Сравнение
Big-endian Little-endian
Проблемы совместимости
Запись м ногобайтового числа из памяти ком пью тера в файл или передача по сети
требует соблю дения соглаш ений о том , какой из байтов является старш им, а какой
младшим. П рямая запись ячеек памяти приводит к возможны м проблемам при переносе
приложения с платформы на платформу.
int main(void)
{
printfp/osta”, ‘ ((unsigned char *) &x) == 0 ? "big-endian little-endian”);
return 0;
}
Результаты запуска на big-endian машине (SPARC)
$ cat /proc/cpuinfo | grep Acpu
cpu : Tl UltraSparc Ili
$ gcc -o testendian testendian.c
$ ./testendian
big-endian
Конвертация
Д ля преобразования между сетевым порядком байтов (англ. network byte order), кото
рый всегда big-endian, и порядком байтов, использую щ имся на маш ине (англ. host byte
order), стандарт POSIX предусм атривает функции htonl(), htons(), ntohl(), ntohs():
uinl32 I htonl(uint32_t hostlong); - конвертирует из текущ его порядка байт в сетевой
32-бигную беззнаковую величину;
u in tl6 _ t h to n s(u in tl6 _ t hostshorl); - конвертирует из текущ его порядка байт в сетевой
16-битную беззнаковую величину;
uint32_t ntohl(uint32_t netlong); - конвертирует из сетевого порядка байт в текущ ий
32-битную беззнаковую величину;
u in tl6 _ t n to h s(u in tl6 I netshorl); - конвертирует из сетевого порядка байт в текущ ий
16-битную беззнаковую величину.
В случае совпадения текущ его и сетевого порядка байтов, функции м огут быть "пус
ты м и" (т. е. не м енять порядка байтов). С тандарт такж е допускает, чтобы эти функции
были реализованы макросами.
Интересные факты
Т ерм ины big-endian и little-endian первоначально не имели отнош ения к информ ати
ке. В сатирическом произведении Д ж онатана Свифта "П утеш ествия Гулливера" описы
ваю тся вы м ы ш ленны е государства Л илипу гия и Блефуску, в течение многих лет ведущ ие
между собой войны из-за разногласия по поводу того, с каког о конца следует разбивать
варены е яйца. Тех, кто считает, что их нужно разбивать с тупого конца, в произведении
назы ваю т "B ig-endians" (тупоконечники). Споры м еж ду сторонниками big-endian и little-
endian в инф орм атике такж е часто носят характер "религ иозных войн".
Словарь
йтоттп 465
466 С. Д Алгазин, В. В. Кондратьев Програмироваиис на Visual FORTRAN
Литература
Предисловие............................................................................................................................. 3
В в е д е н и е .............................................................................................................................................................3
Я зы ковое соответствие стан д артов......................................................................................................... 3
Язы ковая совм естим ость............................................................................................................................. 4
Н овые язы ковы е во зм о ж н о с ти ................................................................................................................. 4
В озмож ности Fortran 2003 ..........................................................................................................................4
Г л а в а 1. С т р у к т у р а п р о г р а м м ы , зн а к и и и с х о д н ы е ф о р м ы ................................................6
1.1. Структура п р о гр ам м ы ..........................................................................................................................6
1.2. У твер ж д ен и я............................................................................................................................................6
1.3. Наборы сим вол ов....................................................................................................................................8
1.4. Форматы исходного т е к с т а ................................................................................................................ 8
1.5. Ф иксированные и табулированны е ф о р м ы ............................................................................... 12
1.6. И ндикатор утверж дения о т л а д к и .................................................................................................. 13
1.7. Исходный текст, используем ы й для всех исходных ф о р м ................................................. 15
Г л а в а 2. Т и п ы д а н н ы х , к о н с т а н т ы и п е р е м е н н ы е .................................................................... 16
2.1. Встроенные гины д а н н ы х .................................................................................................................16
2.2. Логические типы д а н н ы х ................................................................................................................. 24
2.3. Символьный тип д ан н ы х ...................................................................................................................24
2.4. Д воичные, восьм еричны е, ш естнадцатеричны е и холеритовы е кон стан ты ................ 33
Г л а в а 3. В ы р а ж е н и я и о п е р а т о р ы п р и с в а и в а н и я .....................................................................4 6
3.1. В ы раж ения.............................................................................................................................................. 46
3.2. О ператоры п рисваи ван и я..................................................................................................................56
Г л а в а 4. О п и с а н и я .......................................................................................................................................66
4.1. Типы утверж дений о б ъ я вл ен и я......................................................................................................66
4.2. Утверждения объявления на м а с с и в ы ........................................................................................ 71
4.3. А трибут и утверж дение A L L O C A T A B L E ................................................................................. 76
4.4. А трибуты и утверж дения A U TO M A T IC и S T A T 1C .............................................................. 76
4.5. Утверж дение C O M M O N ...................................................................................................................78
4.6. Утверж дение D A T A ........................................................................................................................... 80
4.7. А трибут и утверж дение D IM E N S IO N ........................................................................................ 83
4.8. Утверждение E Q U IV A L E N C E .......................................................................................................83
4.9. А трибут и утверж дение E X T E R N A L ...........................................................................................88
4.10. У тверж дение 1MPL1C1T..................................................................................................................89
4.11. А трибут и утверж дение IN T E N T ............................................................................................... 90
4.12. А трибут и утверж дение 1NTR1NSIC (вст р о ен н ы й ).............................................................92
4.13. Утверж дение N A M E L 1S T ..............................................................................................................93
4.14. А трибут и утверж дение O PTIO N A L ......................................................................................... 95
4.15. А трибут и утверж дение P A R A M E T E R .....................................................................................96
4.16. А трибут и утверж дение P O IN T E R ....................................................................................:....... 97
4.17. А трибуты и утверж дения PR1VATE и P U B L IC ..................................................................... 98
4.18. А трибут и утверж дение P R O T E C T E D .................................................... -................................ 99
4.19. А трибут и утверж дение S A V E .................................................................................................. 100
4.20. А трибут и утверж дение T A R G E T ............................................................................................ 102
йШО(ШОП 469
470 С .Д A'i.YiJini, В В К он драт ьев П р о гр а м и р о в а н и е н а Visual FORTRAN