Справочное руководство по языку Fortran 95
перевод Балуева А. Н.
Оглавление
В начало страницы
Описание
Оператор GOTO передает управление оператору, идентифицированному указанной
меткой.
Syntax
GOTO label
Здесь:
label есть метка оператора, представляющего цель перехода.
Замечания
label олжна быть меткой оператора, расположенного в той же
единице видимости, что и оператор GOTO.
Пример
a = b
goto 10 ! переход к 10
b = c ! никогда не выполняется
10 c = d
10 c = d
В начало страницы
Описание
Наибольшее представимое число данного типа.
Syntax
HUGE (x)
Аргумент
x должен иметь тип REAL или INTEGER.
Результат
Результат имеет тот же тип и разновидность, что и x. Его значение есть
значение наибольшего числа того же типа, что x.
Пример
a = huge(4.1) ! a получает значение 0.340282E+39
В начало страницы
Описание
Позиция символа в упорядоченной (collating) последовательности ASCII.
Syntax
IACHAR (c)
Аргумент
c должно иметь тип default CHARACTER и длину один.
Результат
Результат имеет тип default INTEGER. Его значение есть позиция c в
упорядоченной последовательности ASCII и лежит в области
0 <= iachar(c) <= 127 .
Пример
i = iachar('c') ! i получает значение 99
В начало страницы
Описание
Побитовое логическое AND.
Syntax
IAND (i, j)
Аргументы
i должно иметь тип INTEGER.
j должно иметь тип INTEGER той же разновидности, что и i.
Результат
Резулльтат имеет тип INTEGER. Его значение получается осуществлением
побитового логического AND над i и j.
Пример
i=53 ! i = 00110101 binary (последний байт)
j=45 ! j = 00101101 binary (последний байт)
k=iand(i,j) ! k = 00100101 binary (последний байт)
! k = 37 decimal
В начало страницы
Описание
Заменяет нулем указанный бит.
Syntax
IBCLR (i, pos)
Аргументы
i должно быть типа INTEGER.
pos должен иметь тип INTEGER.
Он должен быть неотрицательным и меньше, чем количество битов в i.
Результат
Результат имеет тип INTEGER той же разновидности, что и i. Его значение
есть значение i кроме того, что бит pos установлен на ноль. Напомним, что
самая младшая позиция имеет номер ноль.
Example
i = ibclr (37,2) ! i получает значение 33
В начало страницы
Описание
Извлекает последовательность битов.
Syntax
IBITS (i, pos, len)
Аргументы
i должно иметь тип INTEGER.
pos должен иметь тип INTEGER. Он должен быть неотрицательным и pos+len
должно быть меньше чем или равно количеству бит в i.
len должен иметь тип INTEGER и быть неотрицательным.
Результат
Результат имеет тип INTEGER и ту же разновидность, что и i. Его значение есть
значение последовательности из len бит, начинающейся с позиции pos, которая
(последовательность) затем смещена до конца вправо и дополнена нулями слева.
Напомним, что самая правая (младшая) позиция имеет номер 0.
Пример
i = ibits (37,2,2) ! i получает значение 1
В начало страницы
Описание
Устанавливает указанный бит в единицу.
Syntax
IBSET (i, pos)
Аргументы
i должно иметь тип INTEGER.
pos должен иметь тип INTEGER. Он должен быть неотрицательным и меньше чем
количество бит в i.
Результат
Результат имеет тип INTEGER и ту же разновидность, что и i. Его значение
есть значение i за исключением того, что бит в позиции pos заменен на 1.
Заметим, позиция наименьшего порядка имеет номер 0.
Пример
i = ibset (37,1) ! i получает значение 39
В начало страницы
Описание
Позиция символа в упорядоченной последовательности процессора, связанная с
разновидностью символа.
Syntax
ICHAR (c)
Аргумент
c должен иметь тип CHARACTER и длину один.
Результат
Результат имеет тип default INTEGER. Его значение есть позиция c в
упорядоченной последовательности процессора, связанная с разновидностью c
и лежит в области 0 <= ichar c < количество символов в последовательности.
( ) n н 1 , where n is
Пример
i = ichar('c') ! i получает значение 99 для
! символа c в ASCII
! упорядоченной последовательности
В начало страницы
Описание
Побитовое логическое исключающее OR.
Syntax
IEOR (i, j)
Аргументы
i должно иметь тип INTEGER.
j должно иметь тип INTEGER и ту же разновидность, что и i.
Результат
Результат имеет тип INTEGER. Его значение получается
побитовым логическим исключающим OR над двоичными кодами i и j.
Пример
i=53 ! i = 00110101 binary (байт низшего порядка)
j=45 ! j = 00101101 binary (lowest-order byte)
k=ieor(i,j) ! k = 00011000 binary (lowest-order byte)
! k = 24 в десятичной форме
В начало страницы
Описание
Конструкт IF определяет, какой (или никакой) из одного или более блоков или
конструктов будет выполнен.
Syntax
[construct-name:] IF (expr) THEN
block
[ELSE IF (expr) THEN [construct-name]
block]
...
[ELSE [construct-name]
block]
END IF [construct-name]
Здесь:
construct-name есть необязательное имя конструкта.
expr есть скалярное LOGICAL выражение.
block есть последовательность из нуля или более операторов или исполнимых
конструктов.
Замечания
Исполняется не более чем один блок, содержащийся в конструкте IF. Если в
конструкте содержится оператор ELSE, то выполняется точно один из блоков,
содержащихся в конструкте. Выражения expr вычисляются в порядке их
расположения в конструкте, пока не будет получено значение true или достигнут
оператор ELSE или END IF. Если обнаружено значение true или
встретился оператор ELSE, то выполняется непосредственно следующий блок и
на этом исполнение конструкта завершается. Выражения expr в оставшихся
операторах ELSE IF или конструктах IF не вычисляются. Если никакое из
вычисленных expr не дало значения true и не было операторов ELSE, выполнение
конструкта завершается без выполнения каких-либо блоков в пределах конструкта.
Если в операторе IF указано construct name, то соответствующий оператор
END IF должен содержать то же самое construct name. Если оператор IF
не имеет construct name, соответствующий оператор END IF тоже не должен
его содержать.
Пример
if (a>b) then
c = d
else if (a
В начало страницы
Описание
Оператор IF-THEN начинает конструкт IF.
Syntax
[ construct-name: ] IF (expr) THEN
Здесь:
construct-name есть необязательное имя конструкта IF.
expr есть скалярное выражение типа LOGICAL.
Замечания
Выполняется не более чем один из блоков, содержащихся в конструкте IF.
Если в конструкте имеется оператор ELSE, то исполняется точно один из блоков,
содержащихся в конструкте. Выражения expr вычисляются в порядке их
расположения в конструкте, пока не будет получено значение true или достигнут
один из операторов ELSE или END IF. Если обнаружено значение true или
достигнут оператор ELSE, выполняется непосредственно следующий блок
и на этом выполнение конструкта заканчивается. Выражения expr в оставшихся
операторах ELSE IF конструкта IF не вычисляются. Если ни одно из
вычисленных выражений expr не дало значения true и нет операторов ELSE,
выполнение конструкта заканчивается без выполнения каких-то блоков в его
пределах.
Пример
if (a>b) then
c = d
else
d = c
end if
В начало страницы
Описание
Оператор IF определяет, должен выполняться или нет единственный исполнимый
оператор.
Syntax
IF (expr) action-statement
Здесь:
expr есть скалярное выражение типа LOGICAL.
action-statement ecть исполнимый оператор, отличный от других операторов IF
или END программы, функции или подрутины.
Замечания
Выполнение оператора IF требует вычисления expr. Если значение expr есть
true, то выполняется action-statement. Если это значение есть false, то
action-statement не выполняется.
Example
if (a >= b) a = -a
В начало страницы
Описание
Оператор IMPLICIT определяет, в пределах своей единицы видимости, тип и,
возможно, разновидность длины CHARACTER для каждого имени, начинающегося
с буквы, указанной в операторе IMPLICIT. Как альтернатива, он может указывать,
что в пределах единицы видимости соглашения о начальных буквах не действуют.
Syntax
IMPLICIT implicit-specs
or
IMPLICIT NONE
Здесь:
implicit-specs есть список через запятую type-spec (letter-specs)
type-spec есть INTEGER [kind-selector]
или REAL [kind-selector]
или DOUBLE PRECISION
или COMPLEX [kind-selector]
или CHARACTER [char-selector]
или LOGICAL [kind-selector]
или TYPE (type-name).
kind-selector есть ( [KIND = ] kind ).
char-selector есть (LEN = length [, KIND = kind ] )
или (length [,[ KIND = ] kind ] )
или ( KIND = kind [, LEN = length ] )
или * char-length [,].
type-name есть имя типа, определенного пользователем.
kind есть скалярное выражение типа INTEGER, которое можно вычислить
при компиляции.
length есть скалярное выражение типа INTEGER или *
char-length есть скалярная литеральная константа типа INTEGER или (*)
letter-specs есть список через запятую выражений формы буква[-буква].
буква есть одна из букв от A до Z.
Замечания
letter-spec состоящий из двух букв, разделенных знаком минус, эквивалентен
написанию списка, содержащего в алфавитном порядке все буквы от первой
указанной буквы до второй. Одна и та же буква не может появиться как
отдельная буква или в диапазоне букв более одного раза во всех операторах
IMPLICIT в единице видимости.
При отсутствии оператора implicit программная единица рассматривается так, как
будто она имеет хост с объявлением
implicit integer (i-n), real (a-h, o-z)
IMPLICIT NONE указывает отсутствие определенного предназначения (defolt
mapping) для всех букв. Если предназначение буквы не определено в данной
единице видимости, по умолчанию оно определяется хостом данной единицы.
Если IMPLICIT NONE имеется в единице видимости, он должен предшествовать
всем операторам PARAMETER в этой единице и быть единственным оператором
IMPLICIT в этой единице.
Всякий объект данных, который не объявлен явно в операторе объявления типа,
не есть встроенная функция и не сделан доступным посредством use или
хост-ассоциации, считается неявно объявленным с типом (и параметрами типа
разновидностью и длиной ) по первой букве своего имени при условии, что ее
предназначение ( mapping ) не пусто (not null).
Явная спецификация типа в операторе FUNCTION подавляет оператор IMPLICIT
для имени этой функциональной подпрограммы.
Пример
implicit character (c), integer (a-b, d-z)
! указывает, что все объекты данных
! с начальной буквой c неявно имеют
! тип character, а другие объекты данных
! имеют тип integer
В начало страницы
Описание
Строка INCLUDE побуждает обрабатывать текст из другого файла так, как если бы
этим текстом заменить строку INCLUDE. Строка INCLUDE не является
оператором Fortran.
Syntax
INCLUDE filename
Здесь:
filename есть литеральная константа типа CHARACTER, которая соответствует
файлу, содержащему входной текст для вставки на место строки INCLUDE.
Замечания
Строка INCLUDE является единственным непустым (non-blank) текстом в этой
входной строке (source line) кроме возможного конечного комментария.
Метки оператора или дополнительные операторы недопустимы в этой строке.
Пример
include "types.for" ! вставить файл с именем types.for
! вместо этой строки INCLUDE
В начало страницы
Описание
Начальная позиция подцепочки (substring) внутри цепочки (string).
Syntax
INDEX (string, substring, back)
Обязательные аргументы
string должен иметь тип CHARACTER.
substring должен иметь тип CHARACTER той же разновидности, что и
string.
Необязательный аргумент
back должен иметь тип LOGICAL.
Результат
Результат имеет тип default INTEGER. Если back отсутствует или имеет
значение false, то значение результата есть номер позиции в string,
где начинается первое вхождение или ноль, если нет такого значения или
если string короче чем substring. Если substring имеет длину ноль, то
значение результата есть один.
Если back присутствует и имеет значение true, то значение результата
есть номер позиции в string, где начинается последнее вхождение substring.
Если string короче чем substring или если substring не входит в string,
возвращается значение ноль. Если substring имеет длину ноль, то выдается
значение LEN(string)+1.
Пример
i = index('mississippi', 'si')
! i получает значение 4
i = index('mississippi', 'si', back=.true.)
! i получает значение 7
В начало страницы
Описание
Оператор INQUIRE побуждает программу справиться о существовании файла, о
связях, о методе доступа и других свойствах.
Syntax
INQUIRE (inquire-specs)
или
INQUIRE (IOLENGTH = iolength) output-items
Здесь:
inquire-specs есть список через запятую следующих возможных текстов:
[UNIT =] external-file-unit
или FILE = file-name-expr
или IOSTAT = iostat
или ERR = label
или EXIST = exist
или OPENED = opened
или NUMBER = number
или NAMED = named
или NAME = name
или ACCESS = access
или SEQUENTIAL = sequential
или DIRECT = direct
или FORM = form
или FORMATTED = formatted
или UNFORMATTED = unformatted
или RECL = recl
или NEXTREC = nextrec
или BLANK = blank
или POSITION = position
или ACTION = action
или READ = read
или WRITE = write
или READWRITE = readwrite
или DELIM = delim
или PAD = pad
или FLEN = flen
или BLOCKSIZE = blocksize
или CONVERT =file-format
или CARRIAGECONTROL = carriagecontrol.
external-file-unit есть скалярное выражение типа INTEGER, которое вычисляет для
устройства ввода/вывода номер внешнего файла.
file-name-expr есть скалярное выражение типа CHARACTER, которое определяет имя
файла.
iostat есть скалярная переменная типа INTEGER, которой присваивается
положительное значение при обнаружении ошибки, отрицательное значение при
обнаружении конца файла или конца записи, и значение ноль в остальных случаях.
label есть метка оператора для перехода при ошибке.
exist есть скалярная типа default LOGICAL переменная, которая получает
значение true, если названный файл в FILE= specifier существует
или устройство ввода/вывода, указанное в UNIT= specifier существует,
и false в противных случаях.
opened есть скалярная переменная типа default LOGICAL, которая получает
значение true, если файл или названное устройство ввода/вывода подсоединены,
и false в противном случае.
number есть скалярная переменная типа INTEGER, которая получает значение
номера устройства ввода/вывода внешнего файла или -1, если файл не присоединен
или не существует.
named есть скалярная переменная типа default LOGICAL, которая получает значение
true, если файл имеет имя, и false в противном случае.
name есть скалярная переменная типа default CHARACTER, которая получает
значением имя файла, если он имеет имя, и в противном случае остается
неопределенной.
access есть скалярная переменная типа default CHARACTER, которая получает
значение SEQUENTIAL, если файл предназначен для последовательного доступа,
DIRECT, если файл предназначен для прямого доступа, TRANSPARENT, если файл
подсоединен для доступа transparent , или UNDEFINED если файла нет.
sequential есть скалярная переменная типа default CHARACTER, которая
получает значение YES, если последовательный доступ есть допустимый метод
доступа к файлу, NO, если последовательный доступ недопустим, и UNKNOWN,
если файл не подсоединен или не существует.
direct есть скалярная переменная типа default CHARACTER, которая получает
значение YES, если прямой доступ возможен для файла, NO, если прямой доступ
не разрешен, и UNKNOWN, если файл не подсоединен или не существует.
form есть скалярная переменная типа default CHARACTER, которой присваивается
значение FORMATTED, если файл подсоединен для форматированного
ввода/вывода, UNFORMATTED, если файл подсоединен для неформатированного
ввода/вывода, и UNDEFINED, если связи нет.
formatted есть скалярная переменная типа default CHARACTER, которая
получает значение YES, если formatted есть допустимая форма для файла,
NO, если formatted недопустима, и UNKNOWN, если файл не присоединен или
не существует.
unformatted есть скалярная переменная типа default CHARACTER, которая
получает значение YES, если unformatted есть допустимая форма для файла,
NO, если unformatted недопустима и UNKNOWN, если файл не присоединен
или не существует.
recl есть скалярная переменная типа default INTEGER, которая вычисляется для
определения длины записи в байтах для файла, присоединенного для прямого
доступа, или для максимальной длины записи в байтах для файла, присоединенного
для последовательного доступа, или ноль для файла не присоединенного или не
существующего.
nextrec есть скалярная переменная типа default INTEGER, которая получает
значение n+1, где n есть номер последней записи, прочтенной или записанной
в файл, присоединенный для прямого доступа. Если в файл не писали или
не читали из него с момента присоединения, переменная получает значение 1.
Если файл не присоединен для прямого доступа, значение равно 0.
blank есть скалярная переменная типа default CHARACTER, в которую записывается
NULL, если действует null blank control, ZERO, если действует zero blank
control, и UNDEFINED, если файл не присоединен для форматированного
ввода/вывода или не существует.
position есть скалярная переменная типа default CHARACTER, которая получает
значение REWIND, если заново открытый файл последовательного доступа
установлен в начальную позицию; APPEND, если он установлен перед записью
endfile, если такая существует, или на конечную позицию в противном случае;
ASIS, если позиция есть после записи endfile; и UNDEFINED, если файл
не присоединен или не существует.
action есть скалярная переменная типа default CHARACTER, которая
устанавливается на READ, если файл предназначен только для чтения, на WRITE,
если установленный файл предназначен для записи, или на READWRITE, если
в файл можно и писать и читать, или на UNDEFINED, если файл не присоединен
или не существует.
read есть скалярная переменная типа default CHARACTER, которой присваивается
значение YES, если READ есть допустимое действие с файлом, NO, если READ
есть недопустимое действие, и UNKNOWN, если файл не присоединен или не
существует.
write есть скалярная переменная типа default CHARACTER, которой присваивается
значение YES, если WRITE есть допустимое действие с файлом, NO, если
WRITE есть недопустимое действие, и UNKNOWN, если файл не присоединен или
не существует.
readwrite есть скалярная переменная типа default CHARACTER, которая получает
значение YES, если READWRITE есть допустимое действие с файлом, NO, если
READWRITE есть недопустимое действие с файлом, и UNKNOWN, если файл не
присоединен или не существует.
delim есть скалярная переменная типа default CHARACTER, она получает значение
APOSTROPHE, если апостроф будет использоваться для ограничения символьных
констант, написанных с управляемым списком или с namelist-форматированием,
QUOTE, если будут использоваться кавычки, NONE, если не будут использоваться
ни кавычки ни апострофы, UNDEFINED, если файл не присоединен или не существует.
pad есть скалярная переменная типа default CHARACTER, которая
получает значение YES, если форматированная входная запись дополняется
пробелами, и NO, если файл не присоединен или не существует.
flen есть скалярная переменная типа default INTEGER, которая получает значение
длины файла в байтах.
blocksize есть скалярная переменная типа default INTEGER, которая получает
значение размера в байтах буфера ввода/вывода. Это значение может быть
внутренним образом переделано в границу для длин записей, если устройство
присоединено для прямого доступа и поэтому может оказаться не соответствующим
спецификатору BLOCKSIZE, указанном в операторе OPEN. Значение есть ноль,
если файл не присоединен или не существует.
file-format есть скалярная переменная типа default CHARACTER, которая получает
значение BIG_ENDIAN, если действует конверсия big endian, LITTLE_ENDIAN, если
действует конверсия little endian, IBM, если действунет конверсия в стиле IBM,
и NATIVE, если никакая конверсия не действует.
carriagecontrol есть скалярная переменная типа default CHARACTER, которая
получает значение FORTRAN, если первый символ форматированной последовательной
записи должен использоваться для управления кареткой, и LIST в противном
случае.
iolength есть скалярная переменная типа default INTEGER, которая получает
значение от использования выходных объектов в операторе бесформатного вывода.
Значение может быть использовано как RECL= specifier в операторе OPEN,
который присоединяет файл для безформатного прямого доступа, когда имеются
операторы ввода/вывода с тем же списком выходных объектов, которые
представляют собой разделенный запятыми список элементов с iolength, как
это объяснено чуть выше.
Замечания
inquire-specs магут содержать один FILE= specifier или одно UNIT= specifier,
только не оба, и не более одного спецификатора других видов.
В запросе по форме unit в операторе INQUIRE statement, если необязательные
символы UNIT= отсутствуют в спецификации устройства, эта спецификация
должна стоять на первом месте в inquire-specs.
Когда возвращаемое значение спецификатора, отличного от NAME = specifier,
имеет тип CHARACTER и процесор может выдавать буквы обоих регистров, это
значение выдается буквами верхнего регистра.
Если во время выполнения оператора INQUIRE происходит ошибка, все
спецификационные переменные оператора становятся неопределенными, за
исключением перeменной в IOSTAT= specifier (если такие есть).
Пример
inquire (unit=8, access=acc, err=200)
! каков метод доступа к unit 8? goto 200 при ошибке
inquire (this_unit, opened=opnd, direct=dir)
! открыто ли устройство this_unit? допустим ли прямой доступ?
inquire (file="myfile.dat", recl=record_length)
! какова длина записи в файле "myfile.dat"?
В начало страницы
Описание
конверсия к типу INTEGER.
Syntax
INT (a, kind)
Обязательный аргумент
a должен иметь тип INTEGER, REAL или COMPLEX.
Необязательный аргумент
kind должен быть скалярным выражением типа INTEGER, которое можно вычислить
при компиляции.
Result
Результат имеет тип INTEGER. Если kind присутствует, то он и определяет
разновидность результата. Значение результата есть значение a без дробной
части. Если a имеет тип COMPLEX, результат есть вещественная часть без
дробной части.
Пример
b = int(-3.6) ! b получает значение -3
В начало страницы
Описание
Оператор INTEGER объявляет примитивы типа INTEGER.
Syntax
INTEGER [ kind-selector ] [[, attribute-list ] :: ] entity [, entity ] ...
Здесь:
kind-selector есть ( [ KIND = ] scalar-int-initialization-expr )
scalar-int-initialization-expr есть скалярное выражение типа INTEGER, которое
можно вычислить при компиляции.
attribute-list есть разделенный запятыми список следующих возможных атрибутов:
PARAMETER, ALLOCATABLE, DIMENSION(array-spec), EXTERNAL, INTENT (IN) или
INTENT (OUT) или INTENT (IN OUT), PUBLIC или PRIVATE, INTRINSIC, OPTIONAL,
POINTER, SAVE, TARGET.
entity есть entity-name [(array-spec)] [ = initialization-expr ]
или function-name [(array-spec)].
array-spec есть спецификация массива.
initialization-expr есть выражение, которое можно вычислить при компиляции.
entity-name есть имя объявляемого объекта данных.
function-name есть имя объявляемой функции.
Замечания
Один и тот же атрибут не должен появляться в операторе INTEGER более одного
раза.
function-name может быть именем external, встроенной или операторной функции,
или функции фиктивной процедуры.
Запись вида = initialization-expr может появиться, если оператор содержит
атрибут PARAMETER.
Если = initialization-expr появилась, то удвоенное двоеточие должно стоять
перед списком примитивов. Каждый примитив имеет атрибут SAVE, если не стоит в
в именованном блоке common.
Форма = initialization-expr не должна употребляться, если entity-name есть
фиктивный аргумент, результат функции, объект в именованном блоке common (в
случае когда объявление типа не находится в программной единице block data),
объект в безымянном блоке common, размещаемый массив, указатель, внешнее имя,
встроенное имя или автоматический объект.
Массив, объявленный с атрибутом POINTER или ALLOCATABLE, должен
специфицироваться с отложенной формой.
array-spec для function-name, которая не имеет атрибута POINTER или
ALLOCATABLE, должен специфицироваться с явной формой.
array-spec для function-name которая имеет атрибут POINTER или атрибут
ALLOCATABLE, должен специфицироваться с отложенной формой.
Если указан атрибут POINTER, то атрибуты TARGET, INTENT, EXTERNAL или
INTRINSIC не должны специфицироваться.
Если указан атрибут TARGET, атрибуты POINTER, EXTERNAL, INTRINSIC или
PARAMETER специфицироваться не должны.
Атрибут PARAMETER не должен быть специфицирован для фиктивных аргументов,
указателей, размещаемых массивов, функций или объектов в блоке common.
Атрибуты INTENT и OPTIONAL могут указываться только для фиктивных аргументов.
Примитив не должен иметь атрибут PUBLIC, если его тип имеет атрибут PRIVATE.
Атрибут SAVE не должен указываться для объекта, который находится в блоке
common block, для фиктивного аргумента, процедуры, результата функции или
автоматического объекта данных.
Примитив не может иметь атрибут EXTERNAL, если имеет атрибут INTRINSIC.
Примитив в операторе INTEGER не должен иметь атрибуты EXTERNAL или INTRINSIC,
если только он не является функцией.
Массив не может иметь вместе атрибуты ALLOCATABLE и POINTER.
Примитиву нельзя давать явно какой-нибудь атрибут более одного раза в единице
видимости.
Пример
integer :: a, b, c ! a, b, и c имеют тип integer
integer, dimension (2, 4) :: d
! d есть массив 2 на 4 из целых
integer :: e = 2 ! целое e инициализируется
|