Содержание:
1. ОСНОВНАЯ ПРОГРАММА
2. ПОДПРОГРАММЫ
3. ФУНКЦИИ
3.1. Внешние функции
3.2. Встроенные функции
3.3. Функции-операторы
4. ПАРАМЕТРЫ
5. ПЕРЕДАЧА ЦЕЛЫХ ПАРАМЕТРОВ
Основная программа - это любая программная единица, у которой первый оператор - это не FUNCTION,SUBROUTINE или BLOCK DATA. Первым оператором основной программы может быть оператор PROGRAM. Если у основной программы нет оператора PROGRAM, ей будет присвоено имя MAIN. Имя MAIN тогда не может быть использовано как имя любого другого глобального объекта.
Выполнение программы всегда начинается с первого выполняемого оператора основной программы. Соответственно, в каждой выполняемой программе должна быть только одна основная программа.
Для дополнительной информации о программах и операторе PROGRAM смотрите часть 3 "Операторы".
Подпрограмма - это программная единица, которая может быть вызвана из другой программной единицы c помощью оператора CALL. Будучи вызванной, подпрограмма производит набор действий, определенных ее выполняемыми операторами, и затем возвращает управление на оператор, следующий непосредственно за вызвавшим ее оператором, или на оператор, определенный как переменный возврат (смотрите оператор CALL в части 3).
Подпрограмма не возвращает величину прямо, хотя величины могут быть возвращены в вызывающую программную единицу через параметры и COMMON-блоки.
Для более подробной информации о подпрограммах смотрите часть 3 "Операторы".
На функцию ссылаются в выражении, и она возвращает величину, которая используется при вычислении этого выражения. Существует три вида функций:
Каждый из них описан более подробно в дальнейших параграфах.
Ссылка на функцию может появиться в арифметическом или логическом выражении. Когда выполняется ссылка на функцию, функция вызывается, а величина результата используется как операнд в выражении, которое содержит ссылку на функцию. Форма ссылки на функцию следующая:
------------------------------------------------ имя-функции ([пар[,пар]...]) ------------------------------------------------ имя-функции - это определенное пользователем имя внешней или встроеной функции или функции-оператора. пар - это фактический параметр.Правила для параметров функций аналогичны правилам для подпрограмм (за исключением переменного возврата, который недопустим) и приведены в описании оператора CALL в части 3. Некоторые дополнительные ограничения, применимые для функций-операторов и встроеных функций, описаны ниже в этой части.
Внешняя функция определена программной единицей функции. Она начинается оператором FUNCTION и заканчивается оператором END. Она может содержать любые виды операторов, кроме PROGRAM, FUNCTION, SUBROUTINE или BLOCK DATA.
Встроенные функции определены в языке МS-Фортран и доступны для использования в программе на МS-Фортране. В таблице 5-1 приведены имена, назначения, типы параметров и типы функций для всех встроенных функций, допустимых в МS-Фортране, с дополнительными примечаниями после таблицы.
Оператор IMPLICIT не может изменять тип встроенной функции. Для этих встроенных функций, которые допускают различные типы параметров, при одном обращении все параметры должны быть одного и того же типа.
Имя встроенной функции может появиться в операторе INTRINSIC. Имя встроенной функции может также появиться в операторе описания типа, но только если тип тот же самый, что и стандартный тип этой встроенной функции.
Параметры некоторых встроенных функций ограничены назначением этих функций. Например, логарифм отрицательного числа математически не определен и поэтому недопустим.
Многие встроенные функции имеют общие имена, что позволяет ссылаться на функцию без уточнения типа параметров при ссылке. Когда ссылаются на общее имя компилятор выбирает соответствующую относительно специфическую функцию в зависимости от типа параметра(ов) в ссылке на функцию.
Например, функция INT - это общее имя шести чуть отличающихся функций: одна с собственным именем, совпадающим с основным, три с особыми именами (IFIX,IDINT,ICHAR) и две - безымянных (для типов данных COMPLEX*8 и COMPLEX*16).
Все углы в таблице 5-1 выражены в радианах. Все параметры в ссылке на встроенную функцию должны быть того же типа. Х и У - действительные, Z - комплексное, I и J - целые, а С,С1 и С2 - символьные величины. Числа в квадратных скобках в колонке 1 ссылаются на примечания после таблицы.
В дальнейшем REAL эквивалентно REAL*4, DOUBLE PRECISION - REAL*8, a COMPLEX - COMPLEX*8. Если в указанном типе параметра - INTEGER, то тип может быть INTEGER*2 или INTEGER*4. Если указанный тип функции - INTEGER, тип будет целый по умолчанию определенный метакомандой $STORAGE. (Для более полной информации смотрите часть 6).
г============T=======================T==========T=========¬ | ИМЯ | НАЗНАЧЕНИЕ |ТИП ПАРАМ.|ТИП Ф | |============|=======================|==========|=========| | Преобразование типов | | INT(общее) | преобразует в INTEGER | любой |INTEGER | | INT2(X) | преобразует в INTEGER*| любой |INTEGER* | | INT4(X) | преобразует в INTEGER*| любой |INTEGER* | | INT(X) [1] | преобразует в INTEGER | REAL*4 |INTEGER | | IFIX(X) | преобразует в INTEGER | REAL*4 |INTEGER | | IDINT(X) | преобразует в INTEGER | REAL*8 |INTEGER | | ICHAR(C)[S]| преобразует в INTEGER | CHARACTER|INTEGER | | REAL(общее)| преобразует в REAL*4 | любой |REAL*4 | | REAL(X) [2]| преобразует в REAL*4 | INTEGER |REAL*4 | | | | REAL*4 |REAL*4 | | DREAL(Z) | преобразует COMPLEX*16|COMPLEX*16| REAL*8 | | | в REAL*8 | | | | FLOAT(I) | преобразует в REAL*4 | INTEGER | REAL*4 | | CHAR(X) | преобразует в символ. | INTEGER |CHARACTER| | SNGL(X) | преобразует в REAL*4 | REAL*8 | REAL*4 | | DBLE(общее)| преобразует в REAL*8 | любой | REAL*8 | | CMPLX(Z[,Y]| преобразует в COMPLEX*| любой |COMPLEX*8| | [4]| | | | | DCMPLX(Z[,Y| преобразует в COMPLEX*| любой |COMPLEX*1| | | | Взятие целой части | | AINT(общее)| целая часть от REAL | REAL*4 | REAL*4 | | AINT(X) | целая часть от REAL*4 | REAL*8 | REAL*8 | | | | REAL*4 | REAL*4 | | DINT(X) | целая часть от REAL*8 | REAL*8 | REAL*8 | | | | Округление | | ANINT(общее| округление REAL | REAL*4 | REAL*8 | | | | REAL*8 | REAL*8 | | ANINT(X) | округление REAL*4 | REAL*4 | REAL*4 | | DNINT(X) | округление REAL*8 | REAL*8 | REAL*8 | | | | Округление в целое | | NINT(общее)| округление с переводом| REAL*4 | INTEGER | | | в целое | REAL*8 | INTEGER | | NINT(X) | округление с переводом| REAL*4 | INTEGER | | | в целое | | | | IDNINT(X) | округление с переводом| REAL*8 | INTEGER | | | в целое | | | | | | Абсолютная величина | | ABS(общее) | абсолютная величина | любой | любой | | IABS(I) | абсолютное целое | INTEGER | INTEGER | | ABS (X) | абсолютное REAL*4 | REAL*4 | REAL*4 | | DABS(X) | абсолютное REAL*8 | REAL*8 | REAL*8 | | CABS(Z) | абсолютное COMPLEX | COMPLEX*8| REAL*4 | | | | COMPLEX*1| REAL*8 | | CDABC(Z) | абсолютное COMPLEX*16 | COMPLEX*1| REAL*8 | | | | Взятие остатка | | MOD(общее) | остаток | INTEGER |INTEGER | | | | REAL*4 | REAL*4 | | MOD(I,Y) | целый остаток | INTEGER | INTEGER | | AMOD(X,Y) | остаток REAL*4 | REAL*4 | REAL*4 | | DMOD(X,Y) | остаток REAL*8 | REAL*8 | REAL*8 | ----------------------------------------------------------- | | | Передача знака | | SIGN(общее)| передача знака | INTEGER | INTEGER | | | | REAL*4 | REAL*4 | | | | REAL*8 | REAL*8 | | ISIGN(I,Y) | передача знака целого | INTEGER | INTEGER | | SIGN(X,Y) | передача знака REAL*4 | REAL*4 | REAL*4 | | DSIGN(X,Y) | передача знака REAL*8 | REAL*8 | REAL*8 | | | | Положительная разность [6] | | DIM(общее) | положительная разность| INTEGER | INTEGER | | | | REAL*4 | REAL*4 | | | | REAL*8 | REAL*8 | | IDIM(I,Y) | разность целых | INTEGER | INTEGER | | DIM(X,Y) | разность REAL*4 | REAL*4 | REAL*4 | | DDIM(X,Y) | разность REAL*8 | REAL*8 | REAL*8 | | | | Поиск наибольшей величины | | MAX(общее) | максимум | INTEGER | INTEGER | | | | REAL*4 | REAL*4 | | | | REAL*8 | REAL*8 | | MAX0(I,Y..)| целый максимум | INTEGER | INTEGER | | AMAX1(X,Y.)| максимум REAL*4 | REAL*4 | REAL*4 | | AMAX0(I,Y.)| максимум REAL*4 | INTEGER | REAL*4 | | MAX1(X,Y..)| целый максимум | REAL*4 | INTEGER | | DMAX1(X,Y.)| максимум REAL*8 | REAL*8 | REAL*8 | | | | Поиск наименьшей величины | | MIN(общее) | минимум | INTEGER | INTEGER | | | | REAL*4 | REAL*4 | | | | REAL*8 | REAL*8 | | MIN0(I,Y..)| целый минимум | INTEGER | INTEGER | | AMIN1(X,Y.)| минимум REAL*4 | REAL*4 | REAL*4 | | AMIN0(I,Y.)| минимум REAL*4 | INTEGER | REAL*4 | | MIN1(X,Y..)| целый минимум | REAL*4 | INTEGER | | DMIN1(X,Y.)| минимум REAL*8 | REAL*8 | REAL*8 | | | | Перевод в REAL*8 | | DPROD(X,Y) | перевод в REAL*8 | REAL*4 | REAL*4 | | | | Мнимая часть комплексного числа | | AIMAG(Z) | выделяет мнимую часть | COMPLEX*8| REAL*4 | | | заданной пары в REAL*4| | | | DIMAG(Z) | выделяет мнимую часть |COMPLEX*16| REAL*8 | | | заданной пары в REAL*8| | | | | | Сопряжение комплексного числа | | CONYG(Z) | сопряжение COMPLEX*8 |COMPLEX*8 |COMPLEX*8| | DCONYG(Z) | сопряжение COMPLEX*16 |COMPLEX*16|COMPLEX*1| ----------------------------------------------------------- | Квадратный корень | | SQRT(общее)| квадратный корень | REAL*4 | REAL*4 | | | | REAL*8 | REAL*8 | | | |COMPLEX*8 |COMPLEX*8| | | |COMPLEX*16|COMPLEX*1| | SQRT(X) | квадратный корень REAL| REAL*4 | REAL*4 | | DSQRT(X) | квадратный корень REAL| REAL*8 | REAL*8 | | CSQRT(Z) | квадратный корень | COMPLEX*8|COMPLEX*8| | | COMPLEX*8 | | | | CDSQRT(Z) | квадратный корень |COMPLEX*16|COMPLEX*1| | | COMPLEX*16 | | | | Экспонента | | EXP(общее) | экспонента | REAL*4 | REAL*4 | | | | REAL*8 | REAL*8 | | | | COMPLEX*8|COMPLEX*8| | | |COMPLEX*16|COMPLEX*1| | EXP(X) | REAL*4 e в степени | REAL*4 | REAL*4 | | DEXP(X) | REAL*8 e в степени | REAL*8 | REAL*8 | | CEXP(Z) | COMPLEX*8 e в степени | COMPLEX*8|COMPLEX*8| | CDEXP(Z) | COMPLEX*16 e в степени|COMPLEX*16|COMPLEX*1| | | | Натуральный логарифм | | LOG(общее) | натуральный логарифм | REAL*4 | REAL*4 | | | | REAL*8 | REAL*8 | | | | COMPLEX*8|COMPLEX*8| | | | COMPLEX*1|COMPLEX*1| | ALOG(X) | нат. логарифм REAL*4 | REAL*4 | REAL*4 | | DLOG(X) | нат. логарифм REAL*8 | REAL*8 | REAL*8 | | CLOG(Z) | нат. логарифм COMPLEX*| COMPLEX*8|COMPLEX*8| | DLOG(Z) | нат. логарифм COMPLEX*|COMPLEX*16|COMPLEX*1| | | | Десятичный логарифм | |LOG10(общее)| десятичный логарифм | REAL*4 | REAL*4 | | | | REAL*8 | REAL*8 | | ALOG10(X) | дес. логарифм REAL*4 | REAL*4 | REAL*4 | | DLOG10(X) | дес. логарифм REAL*8 | REAL*8 | REAL*8 | | | | Синус | | SIN(общее) | функция синус | REAL*4 | REAL*4 | | | | REAL*8 | REAL*8 | | | | COMPLEX*8|COMPLEX*8| | | |COMPLEX*16|COMPLEX*1| | SIN(X) | REAL*4 синус | REAL*4 | REAL*4 | | DSIN(X) | REAL*8 синус | REAL*8 | REAL*8 | | CSIN(Z) | COMPLEX*8 синус | COMPLEX*8|COMPLEX*8| | CDSIN(Z) | COMPLEX*16 синус |COMPLEX*16|COMPLEX*1| ----------------------------------------------------------- | Косинус | | COS(общее) | функция косинус | REAL*4 | REAL*4 | | | | REAL*8 | REAL*8 | | | | COMPLEX*8|COMPLEX*8| | | |COMPLEX*16|COMPLEX*1| | COS(X) | REAL*4 косинус | REAL*4 | REAL*4 | | DCOS(X) | REAL*8 косинус | REAL*8 | REAL*8 | | CCOS(Z) | COMPLEX*8 косинус | COMPLEX*8|COMPLEX*8| | CDCOS(Z) | COMPLEX*16 косинус |COMPLEX*16|COMPLEX*1| | | | Тангенс | | TAN(общее) | функция тангенс | REAL*4 | REAL*4 | | | | REAL*8 | REAL*8 | | TAW(X) | REAL*4 тангенс | REAL*4 | REAL*4 | | DTAN(X) | REAL*8 тангенс | REAL*8 | REAL*8 | | Арксинус | | ASIN(общее)| функция арксинус | REAL*4 | REAL*4 | | | | REAL*8 | REAL*8 | | ASIN(X) | REAL*4 арксинус | REAL*4 | REAL*4 | | DASIN(X) | REAL*8 арксинус | REAL*8 | REAL*8 | | | | Арккосинус | | ACOS(общее)| функция арккосинус | REAL*4 | REAL*4 | | | | REAL*8 | REAL*8 | | ACOS(X) | REAL*4 арккосинус | REAL*4 | REAL*4 | | DACOS(X) | REAL*8 арккосинус | REAL*8 | REAL*8 | | | | Арктангенс | | ATAN(общее)| функция арктангенс | REAL*4 | REAL*4 | | | | REAL*8 | REAL*8 | | ATAN(X) | REAL*4 арктангенс | REAL*4 | REAL*4 | | DATAW(X) | REAL*8 арктангенс | REAL*8 | REAL*8 | | ATAN2(X,Y) | REAL*4 арктангенс х/y | REAL*4 | REAL*4 | | DATAN2(X,Y)| REAL*8 арктангенс x/y | REAL*8 | REAL*8 | | | | Гиперболический синус | | SINH(общее)| гиперболический синус | REAL*4 | REAL*4 | | | | REAL*8 | REAL*8 | | SINH(X) | REAL*4 гиперб. синус | REAL*4 | REAL*4 | | DSINH(X) | REAL*8 гиперб. синус | REAL*8 | REAL*8 | | | | Гиперболический косинус | | COSH(общее)| гиперболич. косинус | REAL*4 | REAL*4 | | | | REAL*8 | REAL*8 | | COSH(X) | REAL*4 гиперб. косинус| REAL*4 | REAL*4 | | DCOSH(X) | REAL*8 гиперб. косинус| REAL*8 | REAL*8 | ----------------------------------------------------------- | Гиперболический тангенс | | TANH(общее)| гиперболич. тангенс | REAL*4 | REAL*4 | | | | REAL*8 | REAL*8 | | TANH(X) | REAL*4 гиперб. тангенс| REAL*4 | REAL*4 | | DTANH(X) | REAL*8 гиперб. тангенс| REAL*8 | REAL*8 | | | | Лексически больше или равно [7] | | LGE(C1,C2) | первый параметр больше| CHARACTER| LOGICAL | | | или равен второму | | | | | | Лексически больше [7] | | LGT(C1,C2) | первый параметр больше| CHARACTER| LOGICAL | | | второго | | | | | | Лексически меньше или равно [7] | | LLT(C1,C2) | первый параметр меньше| CHARACTER| LOGICAL | | | или равен второму | | | | | | Лексически меньше [7] | | LLT(C1,C2) | первый параметр меньше| CHARACTER| LOGICAL | | | второго | | | | Конец файла [8] | | EOF(I) | целый конец файла | INTEGER | LOGICAL | L============|=======================|==========|=========- Таблица 5-1. Встроенные функции.Примечания к таблице 5-1:
Функция-оператор определена единственным оператором и по виду подобна оператору присваивания. Функция-оператор может появиться только после операторов описания и перед любыми выполняемыми операторами в программной единице.
Функция-оператор не является выполняемым оператором, так как она не выполняется, как стоящая первой в конкретной программной единице. Однако, тело функции-оператора используется для определения значения функции-оператора. Она выполняется, как и любая другая функция при вычислении ссылки на функцию в выражении.
Для информации о синтаксисе и использовании функции-оператора смотрите часть 3 "Операторы".
Формальный параметр - это имя, с помощью которого параметр передается функции или подпрограмме; фактический параметр - это указанная переменная, выражение, массив и т.д., передаваемый процедуре при конкретном ее вызове. Взаимодействие между формальными и фактическими параметрами в функции или подпрограмме детально раскрывается ниже.
Параметры передают величины и берут их из процедуры ссылочным образом. Число действительных параметров должно совпадать с числом формальных параметров и при этом их типы должны быть согласованы.
На входе в подпрограмму или функцию фактические параметры связываются с формальными, во многом подобно тому как оператор EQUIVALENCE связывает два или более массива или переменные, а оператор COMMON в двух или нескольких программных единицах связывает списки переменных. Эта связь действует, пока не закончилось выполнение подпрограммы или функции. Поэтому присвоение величины формальному параметру во время выполнения подпрограммы или функции может изменить величину соответствующего фактического параметра.
Если фактический параметр - константа, ссылка на функцию или выражение, а не простая переменная, то присвоение величины соответствующему формальному параметру недопустимо и может вызвать непредсказуемые последствия. В частности, присвоение величины формальному параметру типа CHARACTER, когда фактический параметр - литерал, может вызвать ненормальное поведение.
Если фактический параметр - выражение, то оно вычисляется немедленно, еще до установления связи формальных и фактических параметров. Если фактический параметр - элемент массива, его индексные выражения вычисляются тоже до установления связи и остаются постоянными во время выполнения процедуры, даже если они содержат переменные, которые переопределяются во время выполнения процедуры.
Формальный параметр, описанный как переменная, может быть связан с фактическим параметром - переменной, элементом массива, выражением. Формальный параметр, описанный как переменный возврат (*) может быть связан с определителем переменного возврата (*n) в операторе CALL и является повторяемым.
Формальный параметр, описанный как массив, может быть связан с фактическим параметром, являющимся массивом или элементом массива. Число и размер размерностей формального параметра могут быть отличны от этих характеристик фактического параметра, но любая ссылка на формальный массив должна быть в пределах памяти, отведенной под фактический массив. Когда ссылка на элемент выходит за границы, это не фиксируется как ошибка при исполнение программы на МS-Фортране и результат непредсказуем.
Формальный параметр может быть также связан с внешней подпрограммой, функцией или встроенной функцией, если он используется в теле процедуры как ссылка на подпрограмму или функцию или он появляется в операторе EXTERNAL.
Соответствующий фактический параметр должен быть внешней подпрограммой или функцией, объявленной в операторе EXTERNAL или встроенной функцией, которую допускается связывать с формальным параметром процедуры. Встроенные функции должны быть объявлены в операторе INTRISIC в программной единице, где они используются как фактические параметры.
Все встроенные функции, за исключением нижеуказанных, могут быть связаны с формальными параметрами процедуры:
INT SNGL CHAR MAX0 MIN0 INT2 REAL LGE AMAX1 AMIN1 INT4 DBLE LGT DMAX1 DMIN1 IFIX COMPLX LLE AMAX0 AMIN0 IDINT DCMPLX LLT MAX1 MIN1 FLOAT ICHAR MAX MIN
SUBROUTINE S(I) INTEGER*2 I . . . END INTEGER*2 J,K CALL S(J+K)дает ошибку, поэтому J+K - INTEGER*4. Вы должны написать вызов подпрограммы так
CALL S(INT2(J+K))Компилятор при оптимизации понижает степень точности арифметики, если это не влияет на результат и не установлено $DEBUG. Например, если не установлено $DEBUG, арифметика в
INTEGER2 I,J,K I=J+K- 16-ти разрядная арифметика, даже если определено $STORAGE:4. Использование $STORAGE:4 не действует на выражения INTEGER*2 при использовании в нем только операторов +, - или *, поэтому что результат их одинаковый как в 16-разрядной, так и в 32-разрядной арифметике.
Целые параметры, которые передаются величинами (смотрите "Атрибуты" в части 7 для определения атрибутов, которые позволяют передавать параметры величинами), не являются объектами таких же ограничений. Параметр обрабатывается, как если бы ему была присвоена временно переменная соответствующего типа, и временная переменная затем передается как параметр. Правила присвоения для величин параметров те же самые, что и при присваивании. Вы можете, например, передать действительную величину целому параметру.