Справочное руководство по языку Fortran 95

перевод Балуева А. Н.

Оглавление

Глава 2.Алфавитный справочник

Оператор ENTRY

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

       Syntax
ENTRY entry-name [( [ dummy-arg-list ] ) [ RESULT (result-name)] ]
       Здесь:
entry-name есть имя входа.

dummy-arg-list есть список через запятую фиктивных аргументов или индикаторов альтернативного выхода *.
Замечания
Оператор ENTRY может использоваться только во внешней подпрограмме или модульной подпрограмме. ENTRY не может стоять внутри выполнимого конструкта.

Оператор ENTRY в функции

Если оператор ENTRY содержится в функции-подпрограмме, то эта подпрограмма определяет дополнительную функцию. Ее имя есть entry-name, а ее результат есть или result-name или entry-name, если result-name отсутствует. Характеристики результата функции указаны спецификациями результирующей переменной. Если RESULT указан, entry-name не должно фигурировать ни в одном операторе спецификации в единице видимости программы функции. RESULT может присутствовать только если оператор ENTRY содержится в подпрограмме функции. Если RESULT указан, result-name может не совпадать с entry-name.

Оператор ENTRY в подрутине

Фиктивный аргумент может быть индикатором альтернативного выхода только если оператор ENTRY содержится в подпрограмме подрутины.

Если оператор ENTRY содержится в подпрограмме подрутины и дополнительная подрутина определяется в этой подпрограмме, имя подрутины есть entry-name. Фиктивные аргументы подрутины есть те, которые указаны в операторе ENTRY.
                 Пример
                          program main
                                i=2
                                call square(i)
                                j=2
                                call quad(j)
                                print*, i,j       
                                ! prints 4  16
                          end program main
                          subroutine quad(k)
                                k=k*k
                          entry square(k)
                                k=k*k
                                return
                          end subroutine quad
                                  

Функция EOSHIFT

В начало страницы
Описание
Сдвиг (end-off shift) всех секций массива, имеющих ранг один. Элементы выдвигаются с одного конца и копии значений boundary вдвигаются с другого. Различные секции могут быть сдвинуты на разные количества и в разных направлениях при помощи сдвига на величину, имеющую значением массив.
Syntax
EOSHIFT (array, shift, boundary, dim)
Обязательные аргументы
array может иметь любой тип. Он не может быть скаляром. shift имеет тип INTEGER и должен быть скаляром, если array имеет ранг один; в противном случае он должен быть скаляром или иметь ранг n-1 и форму (d1, d2, ..., ddim-1, ddim+1, ..., dn) , где (d1, d2, ..., dn) есть форма array.
Необязательные аргументы

boundary должен быть того же типа и разновидности, что и array. Если array имеет тип CHARACTER, boundary должен иметь ту же самую длину, что и array. Он должен быть скаляром, если array имеет ранг один; в противном случае он должен быть скаляром или массивом ранга n-1 и формы (d1, d2, ..., ddim-1, ddim+1, ..., dn).

boundary может быть опущен, и в таком случае подразумеваемые значения есть нули в случае численных типов, пробелы для CHARACTER и false для LOGICAL. dim должен быть скаляром INTEGER со значением между 1 и n , где n есть ранг array. Если dim опущен, подразумевается, что он есть 1.

Результат
      
Результат имеет тот же тип, разновидность и форму, что и array.
Элемент (s1, s2, ..., sn) результата имеет значение
       array (s1, s2, ..., sdim-1, sdim+sh, sdim+1, ..., sn), где
sh есть shift или
  shift (s1, s2, ..., sdim-1, sdim+1, ..., sn) при условии если справедливо
неравенство  lbound(array, dim)<=sdim + sh <= ubound(array, dim)
и в противном случае он есть boundary  или
       boundary (s1, s2, ..., sdim-1, sdim+1, ..., sn) .




                 Пример
                           integer, dimension (2,3) :: a, b
                           integer, dimension (3) :: c, d
                           integer :: e
                           a = reshape((/1,2,3,4,5,6/), (/2,3/))
                                                   ! представляет  |1 3 5|
                                   !                                   |2 4 6|
                           c = (/1,2,3/)
                           b = eoshift(a,1)  ! b получает значение |0 0 0|
                                   !                                   |1 3 5|
                           b = eoshift(a,-1,0,2) ! b получает значение |3 5 0|
                                   !                                   |4 6 0|
                           b = eoshift(a,-c,1)! b получает значение |2 1 1|
                                   !                                   |1 1 1|
                           d = eoshift(c,2)  ! c получает значение |3 0 0|

Функция EPSILON

В начало страницы
Описание
Положительное значение, которое почти пренебрежимо по сравнению с единицей; наименьшее x, такое что 1+x не равно to 1.
                 Syntax
                          EPSILON (x)
                 Аргумент
x должен иметь тип REAL.  Он может быть скаляр или массив.

                 Результат
Результат есть скаляр той же разновидности, что и  x.  Его значение
есть  21-p, где p есть число битов в дробной части физического представления
x.


        Пример
                !  разумно безопасное сравнение двух  default REAL
                function equals (a, b)
                  implicit none
                  logical :: equals
                  real, intent(in) :: a, b
                  real :: eps
                  eps = abs(a) * epsilon(a) ! шкала epsilon
                  if (eps == 0) then
                    eps = tiny (a)   ! Если eps исчезающе мало по сравн. с 0,
                                     ! используем очень маленькое
                                     ! полож. значение для epsilon
                  end if
                  if (abs(a-b) > eps) then
                    equals = .false.       ! не равны, если разность > eps
                    return
                  else
                    equals = .true.                ! иначе равны
                    return

                  endif
                end function equals

Оператор EQUIVALENCE

В начало страницы
Описание
Оператор EQUIVALENCE используется для указания, что два или более объектов в единице видимости совместно используют одну и ту же часть памяти.
Syntax
EQUIVALENCE equivalence-sets
Здесь:
equivalence-sets есть список через запятую (equivalence-objects) equivalence-objects есть список через запятую переменных, элементов массивов или подцепочек.
Замечания
Если объявленные эквивалентными объекты имеют различные типы или разновидности, оператор EQUIVALENCE не влечет математической эквивалентности. Если скаляр и массив объявлены эквивалентными, скаляр не приобретает свойств массива, а массив --- свойств скаляра.

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

Если объект эквивалентности имеет производный тип, который не является числовой последовательностью или последовательностью значений типа CHARACTER, то все объекты множества эквивалентности должны иметь этот самый тип.

Если объект эквивалентности имеет встроенный тип, отличный от default INTEGER, default REAL, double precision REAL, default COMPLEX, default LOGICAL или default CHARACTER, то все объекты во множестве эквивалентности должны быть одного типа с одинаковым параметром разновидности.

Объект данных типа default CHARACTER может быть эквивалентным только с другими объектами типа default CHARACTER. Длины этих объектов не обязательно должны быть одинаковыми.

Оператор EQUIVALENCE не должен требовать, чтобы одна и та же единица памяти более одного раза встречалась в последовательности в памяти.

                 Пример
                         equivalence (a,b,c(2)) ! a, b и  c(2) занимают
                                                         ! ту же память

Сабрутина ERROR

В начало страницы
Описание
    Печатает сообщение на консоли, затем обработка продолжается

        Syntax
                   ERROR (message)

           Аргумент
                 message должен иметь тип  CHARACTER.  Это аргумент вида
INTENT(IN), представляющий сообщение для печати.  Заметим, что для порождения
кода обратного пути подпрограммы нужно указать при компиляции переключатель
-trace.


                 Пример
                             call error('error')  ! печатает цепочку 'error'
                                                  ! и за ней код обратного пути
                                                  ! по подпрограмме traceback

Оператор EXIT

В начало страницы
           Описание
Оператор  EXIT завершает исполнение цикла DO  (DO loop).

       Syntax
                 EXIT [ do-construct-name ]
       Здесь:
do-construct-name есть имя конструкта  DO, содержащего оператор  EXIT.
Если do-construct-name опущено, дело происходит так, как будто
do-construct-name было именем самого внутреннего конструкта DO, содержащего
оператор  EXIT.

       Пример
                 outer: do i=1, 10
                 inner:     do j=1, 10
                               if (i>a) exit outer
                               if (j>b) exit ! выход из  inner
                               ...
                            enddo inner
                           enddo outer

Сабрутина EXIT

В начало страницы
       Описание
      Прекращает исполнение программы и устанавливает системный уровень ошибки.


       Syntax
                  EXIT (ilevel)
       Аргумент
       ilevel должен иметь тип INTEGER.  Он определяет системный уровень
ошибки, устанавливаемый при выходе из программы.

       Пример
                 call exit(3) ! exit -- системный уровень ошибки  3

Функция EXP

В начало страницы
       Описание
       Экспоненциальная функция.


                 Syntax
                           EXP (x)
                Аргумент
                 x должен быть типа REAL или COMPLEX.

                 Результат
                 Результат имеет тот же тип, что и x.  Его значение есть
вещественное или комплексное представление e**x. Если x имеет тип COMPLEX,
его мнимая часть трактуется как значение в радианах.

                 Пример

                      a = exp(2.0) ! a получает значение 7.38906

Функция EXPONENT

В начало страницы
                 Описание
Порядок (exponent part) модельного представления числа .

                 Syntax
                           EXPONENT (x)

                 Аргумент
                 x должен быть типа  REAL.

                 Результат
Результат имеет тип default INTEGER.  Его значение есть значение порядка
в модельном представлении  x.

                 Пример
                           i = exponent(3.8) ! i получает значение  2
                           i = exponent(-4.3)! i получает значение 3

Оператор EXTERNAL

В начало страницы
                 Описание
Оператор EXTERNAL указывает внешние процедуры.  Спецификация имени процедуры
как EXTERNAL позволяет использовать это имя как фактический аргумент.


      Syntax
                 EXTERNAL [::] external-name-list
      Здесь:
external-name-list есть список через запятую внешних процедур, фиктивных
процедур или программных единиц  block data.
Замечания

Если имя встроенной процедуры появляется в операторе EXTERNAL, то встроенная процедура становится недоступной в единице видимости и ее имя становится именем внешней процедуры. Имя может появиться только один раз в операторе EXTERNAL в некоторой единице видимости.

      Пример
                subroutine fred (a, b, sin)
                external sin         ! sin есть имя внешней процедуры
                                     ! а не встроенного  sin()
                call bill (a, sin)  !sin может быть передан как факт. аргумент

Функция FLOOR

В начало страницы
 
      Описание
      Выдает  INTEGER, которое  меньше или равно указанному числу.

      Syntax
              FLOOR (a, kind)
      Обязательный аргумент
      a должно иметь тип REAL.

      Необязательный аргумент
      kind должен быть скалярным INTEGER выражением, которое можно вычислить
      при компиляции.

      Результат
Результат имеет тип default INTEGER. Его значение равно наибольшему INTEGER, которое меньше или равно a. Если kind присутствует, он определяет разновидность результата. Если kind отсутствует, он считается соответствующим типу default REAL.
      Пример
                i = floor(-2.1) ! i получает значение  -3
                j = floor(2.1)          ! j получает значение  2


Сабрутина FLUSH

В начало страницы
                 Описание
Очищает буфер устройства ввода/вывода  записью в соответствующий ему файл.
Заметим, буфер файла при этом не очищается.

                 Syntax
                           FLUSH (iunit)

                 Аргумент
                 iunit должен иметь тип INTEGER.  Это аргумент INTENT(IN),
представляющий номер файлового устройства, буфер которого подлежит очистке.

                 Пример
                       call flush(11) ! очистить буфер устройства  11

Конструкт FORALL

В начало страницы
                 Описание
Конструкт FORALL управляет исполнением операторов присваивания и присваивания
указателю с отбором по индексным значениям и необязательной маске.

                 Syntax
[ construct-name: ] FORALL ( forall-triplets [ , mask ] )
                                      [ forall-body ]
                    END FORALL [ construct-name ]

Здесь:

construct-name есть необязательное имя для конструкта FORALL. forall-triplets есть список через запятую выражений index-name = subscript : subscript [ : stride ].

index-name есть именованная скалярная переменная типа INTEGER. subscript есть индекс массива. stride есть шаг по индексу.

mask есть скалярное выражение типа LOGICAL. forall-body есть 0 или более операторов присваивания или присваивания указателю, операторов или конструктов WHERE или FORALL.

Замечания

Если конструкт FORALL имеет construct-name, то же самое construct-name должно стоять в начале и конце конструкта.

Любая ссылка на процедуру в mask или в forall-body должна быть ссылкой на чистую процедуру.

Если mask отсутствует, дело происходит так, как будто она присутствует со значением .TRUE..

      Пример
                real :: a(10,10), b(10,10) = 1.0
                ...
                forall (i=1:10, j=1:10, b(i,j) /= 0.0)
                  a(i,j) = real(i+j-2)
                  b(i,J) = a(i,j) + b(i,j) * real(i*j)
                end forall

Оператор FORALL

В начало страницы
Описание

Оператор FORALL управляет исполнением операторов присваивания или присваивания указателю с отбором по множеству значений индексов и по необязательному выражению mask.

      Syntax
                FORALL ( forall-triplets [ , mask ] ) forall-assignment-stmt

Здесь:

forall-triplets есть разделенный запятыми список выражений index-name = subscript : subscript [ : stride ].

index-name есть именованная скалярная переменная типа INTEGER. subscript есть индекс массива.

stride есть шаг по индексу. mask есть скалярное выражение типа LOGICAL. forall-assignment-stmt есть оператор присваивания или присваивания указателю.

Замечания
                 
Каждая ссылка на процедуру в маске или в forall-assignment-stmt должна быть
чистой.

Если mask отсутствует, считается, что она присутствкет и имеет значением
.TRUE..



                 Пример
                            integer, dimension(3,3) :: a
                            forall (i=1:n-1, j=1:n, j>i) a(i,j) = a(j,i)
                 ! присваивает транспонированный нижний треугольник массива  a
                    ! (секция под главной диагональю) верхнему
                            ! треугольнику a

Оператор FORMAT

В начало страницы
                 Описание
Оператор FORMAT обеспечивает явную информацию для управления редактированием

между внутренним представлением данных и символами ввода и вывода.

                 Syntax
                            FORMAT ( [ format-items ] )

                 Здесь:
format-items есть разделенный запятыми список  [r]data-edit-descriptor, или

 control-edit-descriptor, или  char-string-edit-descriptor, или
 [r](format-items).

data-edit-descriptor есть Iw[.m]
                 или Bw[.m]
                 или Ow[.m]
                 или Zw[.m]
                 или Fw.d
                 или Ew.d[Ee]
                 или ENw.d[Ee]
                 или ESw.d[Ee]
                 или Gw.d[Ee]
                 или Lw
                 или A[w]
                 или Dw.d

 w, m, d и e есть INTEGER литеральные константы, представляющие соответственно
ширину поля,  цифры,  цифры после десятичной точки и цифры порядка.  


control-edit-descriptor есть
     Tn
или TLn
или TRn
или nX
или S
или SP
или SS
или BN
или BZ
или [r]/
или :
или kP.

char-string-edit-descriptor есть  CHARACTER литеральная константа или
 cHrep-chars,

rep-chars есть цепочка символов.

c означает количество символов в rep-chars.

r, k и n есть положительные литеральные константы типа INTEGER , используемые для указания количества повторений для data-edit-descriptor, char-string-edit-descriptor, control-edit-descriptor или (format-items)

Замечания
          
Оператор  FORMAT должен иметь метку.

Запятая между дескрипторами редактирования может быть опущена в следующих
случаях:

* между масштабным множителем  (P) и численными дескрипторами редактирования
 F, E, EN, ES, D или G.
* перед новой записью, указанной посредством слеш, когда отсутствуют
коэффициенты повторения.
* после слеш для новой записи.
* перед или после дескриптора редактирования двоеточием.

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




                 Дескрипторы редактирования

                 I (decimal INTEGER),
                 B (binary INTEGER),
                 O (octal INTEGER),
                 Z (hexadecimal INTEGER),
                 F (REAL или COMPLEX, без порядка на выходе),
                 E и D (REAL или COMPLEX, с порядком на выходе),
                 EN (инженерная форма),
                 ES (научная форма),
                 G (обобщенная форма),
                 L (LOGICAL),
                 A (CHARACTER),
                 T (позиция от начала записи),
                 TL (позиция влево от текущей позиции),
                 TR (позиция вправо от текущей позиции),
                 X (позиция вперед от текущей позиции),
                 S (плюс по умолчанию на выходе),
                 SP (обязательный плюс на выходе),
                 SS (отсроченный плюс на выходе),
                 BN (игнорировать не ведущие пробелы на вводе),
                 BZ (не ведущие пробелы есть нули на вводе),
                 / (конец текущей записи),
                 : (закончить управление форматом), и
                 P (масштабный множитель)

указывают способ редактирования данных.

Описание каждого дескрипторы приведено в разделе "Редактирование Ввода /Вывода" , начинающегося на стр. 24.

Запятая, используемая для разделения единиц в описании формата, может быть опущена между дескриптором P и немедленно следующими дескрипторами F, E, EN, ES, D или G ; перед дескриптором редактирования слеш, когда необязательный спецификатор повторения отсутствует; после дескриптора слеш; перед или после дескиптора-двоеточия.

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

                 Пример
                                      a = 123.45
                                      write (7,10) a
                                      write (7,20) a
                             10       format (e11.5)             ! 0.12345E+03
                             20       format (2p, e12.5) ! 12.3450E+01


Функция FRACTION

В начало страницы

       Описание
Дробная часть физического представления числа.

       Syntax
                 FRACTION (x)

       Аргумент
       x должен иметь тип  REAL.

       Результат
Результат имеет ту же разновидность, что и x.  Его значение есть значение
дробной части физического представления  x.

       Пример
                 a = fraction(3.8) ! a получает значение  0.95

Оператор FUNCTION

В начало страницы
Описание

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

       Syntax
[ PURE ][ ELEMENTAL ][ RECURSIVE ] [ type-spec ] FUNCTION function-
name ( [ dummy-arg-names ] ) [ RESULT (result-name)]

       Здесь:
type-spec is 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 is (LEN =  length [, KIND =  kind ] )
                 или (length [,[ KIND = ] kind ] )
                 или ( KIND = kind [, LEN = length ] )
                 или * char-length [,].

kind есть скалярное выражение типа INTEGER, которое может быть вычислено при компиляции. length есть скалярное выражение типа INTEGER или *. char-length есть scalar литеральная константа тпа IMTEGER или (*). function-name есть имя функции. dummy-arg-names есть список через запрятую имен фиктивных аргументов. result-name есть имя переменной-результата.

Замечания

PURE, ELEMENTAL, RECURSIVE и type-spec могут располагаться в любом порядке. Чистая функция имеет префикс PURE или ELEMENTAL. Функция с признаком ELEMENTAL имеет префикс ELEMENTAL.

Чистая функция не должна содержать операции, которые могут каким-либо мыслимым способом через присваивание или присваивание указателя воздействовать на переменную common, переменную, доступную по ассоциации use или host, или на INTENT (IN) фиктивный аргумент; операции, которые могут привести к I/O операции со внешним файлом или к операции STOP.

Спецификации чистой функции должны указывать для всех фиктивных аргументов свойство INTENT(IN) за исключением аргументов-процедур и аргументов с атрибутом POINTER.

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

Результат и фиктивные аргументы элементных функций должны быть скалярами и не должны иметь атрибут POINTER.

Фиктивные аргументы элементных функций не должны появляться ни в каких спецификационных выражениях кроме как аргументы одной из встроенных функций BIT_SIZE, KIND, LEN или числовых функций запроса.

Фиктивные аргументы элементных функций не могут быть фиктивными процедурами. Ключевое слово RECURSIVE должно присутствовать, если функция прямо или косвенно может вызывать себя или функцию, определенную в операторе ENTRY в той же подпрограмме. RECURSIVE должно также присутствовать, если функция, определенная оператором ENTRY, непосредственно или косвенным путем вызывает себя, другую функцию, определенную оператором ENTRY или функцию, определенную оператором FUNCTION.

Если результат функции содержит массивы или указатели, это должно быть отражено в спецификации переменной-результата в теле функции.

       Пример
                 integer function sum(i,j) result(k)

Сабрутина GETCL

В начало страницы
       Description
       Дает командную строку.

       Syntax
                 GETCL (result)
Аргументы

result должен быть типа CHARACTER. Это INTENT(OUT) аргумент, которому присваиваются символы из системной командной строки, начиная с первого не white-space символа после имени программы.

       Пример
                 call getcl(cl) ! cl получает значение командной строки

Сабрутина GETENV

В начало страницы
       Описание
       Выдает значение указанной переменной окружения

       Syntax
                 GETENV(variable, value)

       Аргументы

variable должна иметь тип default CHARACTER. Это аргумент INTENT(IN), который указывает, какую переменную окружения проверить.

value тоже должна иметь тип default CHARACTER. Этот аргумент со свойством INTENT(OUT), он получает значение переменной окружения.

Example
                           character (len=80) :: mypath
                           call getenv('path', mypath)





<<< Оглавление Страницы:  11   12 >>>