Справочное руководство по языку 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) Сабрутина GETCLDescription Дает командную строку. 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 | >>> |