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

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

Оглавление

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

Конструкт DO

В начало страницы
                 Описание
Конструкт DO определяет повторяемое исполнение (loop) последовательности операторов или исполнимых конструктов. Syntax do-statement block do-termination Здесь: do-statement есть оператор DO block есть последовательность нуля или более операторов или исполнимых конструктов. do-termination есть END DO [construct-name] или label action-stmt action-stmt есть оператор действия, отличный от GOTO, RETURN, STOP, EXIT, CYCLE, присваиваемого GOTO, арифметического IF или END.
DO Statement Замечания
Если construct name указано в операторе DO, то же самое construct name должно быть указано в соответствующем операторе END DO.
Окончание конструкта DO помеченным оператором действия представляет устаревший способ.
Пример
                 do i=1,100                  ! повторить  100 раз
                   do while (a>b)            ! повторять пока a>b
                      do 10 j=1,100,3 ! повторять  33 раза
                         ...
                 10 continue
                   end do
                 end do
Оператор CYCLE может быть употреблен для сокращения текущей итерации в цикле (loop) DO.
Оператор EXIT можно использовать для выхода насовсем из цикла DO.

Оператор DO

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

Описание
Оператор DO начинает конструкт DO. Конструкт DO обеспечивает повторяющееся исполнение (loop) последовательности исполнимых операторов или конструктов. Syntax

                 [ construct-name : ] DO [ label ] [ loop-control ]

       Здесь:
construct-name есть необязательное имя конструкта  DO.

label сть необязательная метка оператора, завершающего конструкт DO.

loop-control есть  [,] do-variable = expr, expr [, expr]
               или [,] WHILE (while-expr)
do-variable есть скалярная переменная типа INTEGER, default REAL или default double-precision REAL.
expr есть скалярное выражение типа INTEGER, default REAL или default double-precision REAL. Первое expr есть начальное значение для do-variable; второе expr есть конечное значение do-variable; третье expr есть значение приращения для do-variable.
while-expr есть скалярное LOGICAL выражение.
Замечания
Когда выполняется оператор DO, становится активным конструкт DO. Выражения в loop-control вычисляются и, если присутствует do-variable, то ей присваивается начальное значение и на базе вычисленных значений выражений устанавливается счетчик итераций для конструкта. Он может получит и значение 0. Заметим, что вследствие того, что счетчик устанавливается до начала выполнения loop, изменение do-variable в пределах loop не влияет на число итераций.
Если loop-control есть WHILE (while-expr), то вычисляется while-expr и если оно есть false, повторений больше не будет и конструкт DO заканчивает работу. Если loop-control отсутствует, счетчик устанавливается на бесконечность.
Использование значений default или double-precision REAL для do-variable считается устаревшим приемом.
Пример
                           do i=1,100                  ! повторение 100 раз
                             do while (a>b)           ! повторять пока a>b
                                do 10 j=1,100,3 ! повторять 33 раза каждый раз
                                             ! после входа в этот конструкт
                                     ...
                           10 continue
                              end do
                           end do

Функция DOT_PRODUCT

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

Описание
Dot-product умножение векторов.
Syntax
DOT_PRODUCT (vector_a, vector_b)
Аргументы
vector_a должен быть типа INTEGER, REAL, COMPLEX или LOGICAL. Он должен иметь значением массив ранга 1.
vector_b должен иметь численный тип, если vector_a имеет численный тип, или тип LOGICAL, если vector_a имееи тип LOGICAL. Он должен иметь значением массив того же размера, что и vector_a.
Результат
Если аргументы имеют тип LOGICAL, то результат есть скаляр типа default LOGICAL. Его значение есть ANY (vector_a .AND. vector_b). Если векторы имеют размер ноль, результат есть false.
DOUBLE PRECISION Statement
Если аргументы имеют различные численные типы, то тип результата есть тип аргумента высшего типа: COMPLEX выше REAL, REAL выше INTEGER. Если оба аргумента имеют один тип, разновидность результата есть разновидность аргумента, у которого больше ранг. Значение результата есть SUM (vector_a * vector_b), если vector_a имеет тип REAL или INTEGER. Значение результата есть SUM (CONJG (vector_a) * vector_b), если vector_a имеет тип COMPLEX.
Пример

                i = dot_product((/3,4,5/),(/6,7,8/))
                           ! i получает значение 86

Оператор DOUBLE PRECISION

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

Описание
Оператор DOUBLE PRECISION объявляет примитивы типа double precision REAL.
Syntax

DOUBLE PRECISION [[, attribute-list] :: ] entity [, entity ] ...
Здесь: 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 есть имя объявляемой функции.
Замечания
    
Один и тот же атрибут не может появиться дважды в операторе  DOUBLE PRECISION.

function-name должно быть именем  external, intrinsic или  statement function,
или фиктивной процедуры-функции.

= initialization-expr может появиться в операторе, содержащем атрибут
 PARAMETER.
 
Если присутствует = initialization-expr, то перед списком примитивов
должно стоять двойное двоеточие. Каждый примитив имеет атрибут SAVE, если
только он не находится в именованном блоке common.



 = initialization-expr не должно фигурировать, если entity-name есть фиктивный
аргумент, результат функции, объект в именованном блоке  common (если только
объявление типа не находится в программной единице блок данных),
размещаемый массив, указатель, внешнее имя, встроенное имя или автоматический
объект данных.

Атрибут ALLOCATABLE может быть использован только при объявлении массива,
который не есть фиктивный аргумент или результат функции.

Массив, объявленный с атрибутом POINTER или  ALLOCATABLE, должен быть описан с
отложенной формой.

array-spec для  function-name, которая не имеет атрибута POINTER, должен
определять  явную форму.

array-spec для имени функции, которая имеет атрибут POINTER, должен быть
специфицирован с отложенной формой.

Если указан атрибут POINTER, то  TARGET, INTENT, EXTERNAL или  INTRINSIC
атрибуты не должны указываться.

Если указан атрибут ARGET, нельзя специфицировать атрибуты POINTER, EXTERNAL,
INTRINSIC или PARAMETER.

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

Атрибуты  INTENT и OPTIONAL могут специфицироваться только для фиктивных
аргументов.

entity не должен иметь атрибут PUBLIC, если его тип имеет атрибут PRIVATE.
Атрибут SAVE не должен указываться для объекта в блоке common,
фиктивного аргумента, процедуры, результата функции или автоматического
объекта данных.

entity не должен иметь атрибут EXTERNAL, если имеет атрибут INTRINSIC.
entity в операторе DOUBLE PRECISION не должен специфицироваться с  атрибутами
EXTERNAL или INTRINSIC, если не есть функция.

Массив не должен иметь одновременно атрибуты ALLOCATABLE и POINTER.
entity не может получить явно атрибут более одного раза в единице видимости.

 Пример
                          double precision a, b, c ! a, b,  c имеют тип

                                                          ! double precision
                          double precision, dimension (2, 4) :: d
                                                    ! d есть массив  2 х 4
                                                    ! of double precision
                          double precision :: e = 2.0d0
                                                    ! e инициализировано


Функция DPROD

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


       Описание
       Произведение двойной точности для чисел REAL.

       Syntax
                 DPROD (x, y)

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

       Результат
       Результат имеет тип  double-precision REAL. Его значение есть
 представление с двойной точностью произведения  x и y.

       Пример
                 dub = dprod (3.e2, 4.4e4) ! dub получает значение 13.2d6

Сабрутина DVCHK (только в Windows)

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

Описание

       
 Начальный вызов подрутины  DVCHK маскирует прерывание по делению на ноль в
 устройстве с плавающей точкой. При первом обращении флажок lflag
устанавливается на true. Последующие вызовы возвращают true или  false в
переменной lflag в зависимости от того, произошло или нет упомянутое
событие.
DVCHK не проверяет и не маскирует деление ноль на ноль. Для этого нужно
употреблять  INVALOP.

       Syntax
                 DVCHK (lflag)

       Аргумент
       lflag должен быть типа LOGICAL.  Он получает значение true, если
произошло событие деления на ноль и false в противном случае.

       Пример
                 call dvchk (lflag) ! маскирует прерывание по делению на ноль


Оператор ELSE IF

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

Описание

Оператор  ELSE IF управляет условным исполнением блока кода в конструкте
IF, когда все предудущие IF-выражения имеют значением false.


                 Syntax
ELSE IF (expr) THEN [construct-name]
                 Здесь:
еxpr есть скалярное выражение типа LOGICAL.
construct-name есть необязательное имя, данное конструкту IF.

                 Пример
                       if (i>-1) then
                             print*, b
                       else if (i<j) then ! выполняется только при true здесь и
                                          ! false в предыдущем  if expression
                             print*, c
                       end if

Оператор ELSE

В начало страницы
 
                 Описание
Оператор  ELSE  предшествует блоку кода, исполняемому в конструкте IF, если
все предыдущие IF-выражения есть false.

                 Syntax
ELSE [construct-name]
                Здесь:
 construct-name есть необязательное имя конструкта IF.

                 Пример
if (i>j) then print*, a else if (i<j) then print*, b else ! выполняется когда предыдущие ! if-выражения были false print*, c end if

Оператор ELSEWHERE

В начало страницы
 
       Описание
Оператор ELSEWHERE управляет условным исполнением блока операторов присваивания
для элементов массива, для которого маскировочное выражение конструкта  WHERE
имеет значение false (см.  "Контрукт WHERE" на стр. 234).

       Syntax
                  ELSEWHERE [ ( mask-expr ) ]
       Здесь:
 mask-expr есть выражение типа  LOGICAL.

       Пример
                 where (b>c)             ! начало конструкта  where
                     b = -1
                 elsewhere (b=c)
                     b = 1
                 elsewhere !b=0
                     b = 999
                 end where

Оператор END

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


       Описание
Оператор END заканчивает программную единицу, модульную подпрограмму или
внутреннюю подпрограмму.

       Syntax
                  END [ class [ name ] ]
       Здесь:
class есть или PROGRAM, FUNCTION, SUBROUTINE, MODULE, INTERFACE или

       BLOCK DATA.
name есть имя программной единицы, модульной подпрограммы  или внутренней
подпрограммы.

       Замечания
Каждая программная единица, модульная подпрограмма или внутренняя подпрограмма
должны иметь точно один оператор END.
Операторы END PROGRAM, END FUNCTION и END SUBROUTINE есть исполнимые
операторы и могут служить назначением операторов перхода.  Операторы
END MODULE, END INTERFACE и END BLOCK DATA не являются исполнимыми.


Выполнение операторов  END FUNCTION или  END SUBROUTINE эквивалентно
выполнению оператора return в подпрограмме.

Выполнение оператора END PROGRAM заканчивает выполнение программы.

name можно употреблять только если name было дано программной единице,
модульной подпрограмме или внутренней подпрограмме в операторах  PROGRAM,
FUNCTION, SUBROUTINE, MODULE или BLOCK DATA statement.  name нельзя
употреблять в операторе  END INTERFACE. Если name присутствует, оно должно
совпадать с именем, указанным в соответствующих операторах PROGRAM, FUNCTION,
SUBROUTINE, MODULE или BLOCK DATA.

                 Пример
                           program names
                             call joe
                             call bill
                             call fred
                           end program names ! program и names не обязательны
                           subroutine joe
                           end subroutine joe ! правильный оператор end
                           subroutine bill
                           end subroutine   ! также правильный оператор end
                           subroutine fred
                           end              ! также правильный оператор end

Оператор END DO

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

                 Описание
Оператор END DO заканчивает конструкт DO.

                 Syntax
END DO [construct-name]
                 Здесь:
construct-name есть имя конструкта DO.

                 Замечания
Если оператор DO в конструкте DO отмечен посредством construct-name, то
соответствующий оператор END DO должен иметь то же самое construct-name.
Если оператор DO не идентифицирован посредством construct-name, то оператор

END DO тоже не должен его содержать.
Если опрератор DO помечен меткой, то соответствующий END DO должен быть
идентифицирован той же меткой.



       Example
                 named: do i=1,10
                 labeled: do 10 j=1,10
                                     do k=1,10
                                       ...
                                     end do
                 10              end do labeled
                               end do named

Оператор ENDFILE

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

       Syntax
                 ENDFILE unit-number
       или
                 ENDFILE (position-spec-list)
       Здесь:
unit-number есть скалярное INTEGER выражение, определяющее номер
соответствующего устройства ввода/вывода для внешних файлов.
position-spec-list есть

[[ UNIT = ] unit-number][, ERR = label ][, IOSTAT = stat ], где

 UNIT=, ERR= и IOSTAT=  могут располагаться в любом порядке, но если UNIT=
опущено, то  unit-number должно стоять на первом месте.
label есть метка оператора, который получает управление при обнаружении
ошибки.

stat есть переменная типа INTEGER, которой присваивается положительное
значение при обнаружении ошибки , отрицательное значение при обнаружении
условия  end-of-file или end-of-record и 0 в остальных случаях.
Если присутствует  stat и обнаружена ошибка, end-of-file или end-of-record,
исполнение программы не прерывается.

       Замечания
После исполнения оператора ENDFILE  могут исполняться операторы  BACKSPACE или
REWIND, чтобы изменить позицию в файле перед операторами передачи данных или
последующим оператором ENDFILE.
Выполнение  ENDFILE для файла, который связан но еще не существует, приводит
к созданию файла перед записью в него признака endfile.



                 Пример
                           endfile 8 ! записывает  endfile record в файл
                                         ! связанный с unit 8

Оператор END IF

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

                 Описание
Оператор END IF оканчивает конструкт IF.

                 Syntax
                           END IF [ construct-name ]

                 Здесь:
construct-name есть имя конструкта IF.

                 Замечания

Если оператор IF в конструкте  IF идентифицирован посредством construct-name,
то соответствующий оператор END IF должен быть снабжен тем же construct-name.
Если оператор IF не идентифицирован посредством construct-name, то оператор
 END IF не должен содержать construct-name.

                 Example
                           if (a.gt.b) then
                             c = 1
                             d = 2
                           end if

Оператор END SELECT

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

                 Описание
Оператор END SELECT заканчивает конструкт CASE.

                 Syntax
                           END SELECT [ construct-name ]

                 Здесь:
construct-name есть имя конструкта CASE.



       Замечания
Если оператор SELECT CASE в конструкте  CASE идентифицирован посредством
 construct-name, соответствующий оператор END SELECT должен указывать то же
construct-name.  Если the  SELECT CASE не идентифицирован посредством
 construct-name, оператор the END SELECT не должен содержать construct-name.

       Пример
                 select case (i)
                 case (:-1)
                   print*, "negative"
                 case (0)
                   print*, "zero"
                 case (1:)
                   print*, "positive"
                 end select

Оператор END WHERE

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

           Описание
       Оператор  END WHERE заканчивает конструкт  WHERE.

       Syntax
                END WHERE
       Пример
                 where (c > d) ! c и d есть массивы
                   c = 1
                   d = 2
                 end where




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