ЭЛЕКТРОННАЯ БИБЛИОТЕКА КОАПП |
Сборники Художественной, Технической, Справочной, Английской, Нормативной, Исторической, и др. литературы. |
Часть 5 ПРОГРАММЫ, ПОДПРОГРАММЫ И ФУНКЦИИ. ОБ ЭТОЙ ЧАСТИ. Эта часть расширяет описание операторов PROGRAM, SUBROUTINE, FUNCTION и функции-оператора, приведенное в части 3. В ней приво- дится информация о типах функций и взаимодействии формальных и фактических параметров при вызове функции или подпрограммы. Содержание. 1.ОСНОВНАЯ ПРОГРАММА. . . . . . . . . . . . . . . . . . . . 5-1 2.ПОДПРОГРАММЫ. . . . . . . . . . . . . . . . . . . . . . . 5-1 3.ФУНКЦИИ. . . . . . . . . . . . . . . . . . . . . . . . . . 5-1 3.1.Внешние функции. . . . . . . . . . . . . . . . . . . . . 5-2 3.2.Встроенные функции. . . . . . . . . . . . . . . . . . . 5-2 3.3.Функции-операторы. . . . . . . . . . . . . . . . . . . . 5-8 4.ПАРАМЕТРЫ. . . . . . . . . . . . . . . . . . . . . . . . . 5-8 5.ПЕРЕДАЧА ЦЕЛЫХ ПАРАМЕТРОВ. . . . . . . . . . . . . . . . . 5-9 1.ОСНОВНАЯ ПРОГРАММА. Основная программа - это любая программная единица, у которой первый оператор - это не FUNCTION,SUBROUTINE или BLOCK DATA. Первым оператором основной программы может быть оператор PROGRAM. Если у основной программы нет оператора PROGRAM, ей будет присвоено имя MAIN. Имя MAIN тогда не может быть использовано как имя любого другого глобального объекта. Выполнение программы всегда начинается с первого выполняемого оператора основной программы. Соответственно, в каждой выполняемой программе должна быть только одна основная программа. Для дополнительной информации о программах и операторе PROGRAM смотрите часть 3 "Операторы". 2.ПОДПРОГРАММЫ. Подпрограмма - это программная единица, которая может быть вызвана из другой программной единицы c помощью оператора CALL. Будучи вызванной, подпрограмма производит набор действий, определенных ее выполняемыми операторами, и затем возвращает управ- ление на оператор, следующий непосредственно за вызвавшим ее оператором, или на оператор, определенный как переменный возврат (смотрите оператор CALL в части 3). Подпрограмма не возвращает величину прямо, хотя величины могут быть возвращены в вызывающую программную единицу через параметры и COMMON-блоки. Для более подробной информации о подпрограммах смотрите часть 3 "Операторы". 3.ФУНКЦИИ. На функцию ссылаются в выражении, и она возвращает величину, которая используется при вычислении этого выражения. Существует три вида функций: 1. Внешние функции 2. Встроенные функции 3. Функции-операторы. Каждый из них описан более подробно в дальнейших параграфах. Ссылка на функцию может появиться в арифметическом или логи- ческом выражении. Когда выполняется ссылка на функцию, функция вызывается, а величина результата используется как операнд в вы- ражении, которое содержит ссылку на функцию. Форма ссылки на фун- кцию следующая: ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД имя-функции ([пар[,пар]...]) ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД имя-функции - это определенное пользователем имя внешней или встроеной функции или функции-оператора. пар - это фактический параметр. Правила для параметров функций аналогичны правилам для под- программ (за исключением переменного возврата, который недопустим) и приведены в описании оператора CALL в части 3. Некоторые допол- нительные ограничения, применимые для функций-операторов и встро- еных функций, описаны ниже в этой части. 3.1.Внешние функции. Внешняя функция определена программной единицей функции. Она начинается оператором FUNCTION и заканчивается оператором END. Она может содержать любые виды операторов, кроме PROGRAM, FUNCTION, SUBROUTINE или BLOCK DATA. 3.2.Встроенные функции. Встроенные функции определены в языке МС-Фортран и доступны для использования в программе на МС-Фортране. В таблице 5-1 при- ведены имена, назначения, типы параметров и типы функций для всех встроенных функций, допустимых в МС-Фортране, с дополнительными примечаниями после таблицы. Оператор 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). ЙННННННННННННЛНННННННННННННННННННННННЛННННННННННЛННННННННН» є ИМЯ є НАЗНАЧЕНИЕ єТИП ПАРАМ.єТИП Ф є МННННННННННННКНННННННННННННННННННННННКННННННННННКННННННННН№ є Преобразование типов є є 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 є ИННННННННННННКНННННННННННННННННННННННКННННННННННКНННННННННј Таблица 5-1. Встроенные функции. Примечания к таблице 5-1: 1. Для Х типа INTEGER INT(X)=X. Для Х типа REAL или REAL*8, если Х - неотрицательно, то INT(X) - наибольшее целое, не превы- шающее Х; а если Х - отрицательно, то INT(X) - наибольшее отрицательное целое не меньшее чем Х. Для Х типа REAL IFIX(X) то же самое, что INT(X). 2. Для Х типа REAL REAL*(X)=X. Для Х типа INTEGER или REAL*8 REAL(X) это значащая часть наибольшей точности Х, которую может содержать данный тип REAL. Для Х типа INTEGER FLOAT(X) - то же самое, что REAL(X). 3. Для Х типа REAL*8 DBLE(X)=X. Для Х типа INTEGER или REAL DBLE(X) - это значащая часть наибольшей точности Х, которую может содержать тип данных двойной точности. 4. COMPLEX и DCMPLX могут иметь один или два параметра. Если ис- пользован один параметр, он может быть типа INTEGER, REAL, DOUBLE PRECISION, COMPLEX или DOUBLE PRECISION COMPLEX. Если использованы два параметра, то они должны быть одного и того же типа и при этом допустимы типы INTEGER, REAL или DOUBLE PRECISION. При Z=COMPLEX*8, COMPLEX(Z)=Z. Для Z=INTEGER, REAL и REAL*8 COMPLEX(Z)=комплексной величине, действительная часть которой REAL(Z), а мнимая часть равна нулю. COMPLEX(X,Y)= комплексной величине, действительная часть ко- торой - REAL(X), а мнимая - REAL(Y). При Z=COMPLEX*16, DCMPLX(Z)=Z. Для Z=INTEGER, REAL и REAL*8 DCMPL(Z)=комплексной величине, у которой действительная часть - REAL*8, а мнимая равна нулю. Для Z=COMPLEX*8 DCMPLX(Z) имеет действительную часть равной DBLE(Z), а мнимую равной DBLE(AIMAG(Z)). DCMPLX(X,Y)=комплексной величине, у которой действительная часть - REAL*8(X), а мнимая - REAL*8(Y). 5. ICHAR преобразует символьную величину в целую. Целая величина символа - это внутреннее представление символа в коде ASCII, лежащее в диапазоне от 0 до 255. Для любых двух символов С1 и С2 (С1.LE.C2) будет .TRUE. тогда и только тогда если (ICHAR(C1).LE.ICHAR(C2)) есть .TRUE. Функция CHAR(I) возвращает 1-й символ таблиц ASCII. Это ве- личина типа CHARACTER длиной один символ, при этом I должно быть целым выражением, величина которого принадлежит диапазону 0уiу255. ICHAR(CHAR(I))=I для 0уIу255 CHAR(ICHAR(C))=C для любого С из набора ASCII 6. DIM(X,Y) - это Х-Y, если X>Y, или нуль в противном случае. 7. LGE(X,Y) возвращает .TRUE. если Х=Y или если Х следует за Y в таблице кодов ASCII; иначе возвращается .FALSE. LGT(X,Y) возвращает .TRUE. если Х следует за Y в таблице кодов ASCII; иначе возвращается .FALSE. LLE(X,Y) возвращает .TRUE. если X=Y или если Х предшевствует Y в таблице ASCII; иначе возвращается .FALSE. LLT(X,Y) возвращает .TRUE. если Х предшевствует Y в таблице ASCII; иначе возвращается .FALSE. Если у операндов неравная длина, то более короткий дополняется справа пробелами. 8. EOF(X) возвращает .TRUE. если устройство, определенное этим параметром находится на или после записи конец-файла; иначе возвращается .FALSE. Величина Х должна соответствовать откры- тому файлу или нулю, что соответствует экрану или клавиатуре. 3.3.Функции-операторы. Функция-оператор определена единственным оператором и по виду подобна оператору присваивания. Функция-оператор может появиться только после операторов описания и перед любыми выполняемыми опера- торами в программной единице. Функция-оператор не является выполняемым оператором, так как она не выполняется, как стоящая первой в конкретной программной единице. Однако, тело функции-оператора используется для определе- ния значения функции-оператора. Она выполняется, как и любая другая функция при вычислении ссылки на функцию в выражении. Для информации о синтаксисе и использовании функции-оператора смотрите часть 3 "Операторы". 4.ПАРАМЕТРЫ. Формальный параметр - это имя, с помощью которого параметр передается функции или подпрограмме; фактический параметр - это указанная переменная, выражение, массив и т.д., передаваемый процедуре при конкретном ее вызове. Взаимодействие между формаль- ными и фактическими параметрами в функции или подпрограмме детально раскрывается ниже. Параметры передают величины и берут их из процедуры ссылочным образом. Число действительных параметров должно совпадать с числом формальных параметров и при этом их типы должны быть согласованы. На входе в подпрограмму или функцию фактические параметры связываются с формальными, во многом подобно тому как оператор EQUIVALENCE связывает два или более массива или переменные, а оператор COMMON в двух или нескольких программных единицах связы- вает списки переменных. Эта связь действует, пока не закончилось выполнение подпрограммы или функции. Поэтому присвоение величины формальному параметру во время выполнения подпрограммы или функции может изменить величину соответствующего фактического параметра. Если фактический параметр - константа, ссылка на функцию или выражение, а не простая переменная, то присвоение величины соот- ветствующему формальному параметру недопустимо и может вызвать непредсказуемые последствия. В частности, присвоение величины фор- мальному параметру типа CHARACTER, когда фактический параметр - литерал, может вызвать ненормальное поведение. Если фактический параметр - выражение, то оно вычисляется немедленно, еще до установления связи формальных и фактических параметров. Если фактический параметр - элемент массива, его ин- дексные выражения вычисляются тоже до установления связи и остаются постоянными во время выполнения процедуры, даже если они содержат переменные, которые переопределяются во время выполнения процедуры. Формальный параметр, описанный как переменная, может быть связан с фактическим параметром - переменной, элементом массива, выражением. Формальный параметр, описанный как переменный возврат (*) может быть связан с определителем переменного возврата (*n) в операторе CALL и является повторяемым. Формальный параметр, описанный как массив, может быть связан с фактическим параметром, являющимся массивом или элементом мас- сива. Число и размер размерностей формального параметра могут быть отличны от этих характеристик фактического параметра, но любая ссылка на формальный массив должна быть в пределах памяти, отве- денной под фактический массив. Когда ссылка на элемент выходит за границы, это не фиксируется как ошибка при исполнение программы на МС-Фортране и результат непредсказуем. Формальный параметр может быть также связан с внешней подпрог- рвммой, функцией или встроенной функцией, если он используется в теле процедуры как ссылка на подпрограмму или функцию или он по- является в операторе 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 5.ПЕРЕДАЧА ЦЕЛЫХ ПАРАМЕТРОВ. Переменная INTEGER*2 не может быть передана формальному параметру INTEGER*4, а переменная INTEGER*4 не может быть передана формальному параметру INTEGER*2. Передача неверного типа переменной порождает ошибку компиляции. Вы должны использовать встроенные функции INT4 и INT2. Также при действии $STORAGE:4 по умолчанию выражения с параметрами INTEGER*2 будут иметь результат типа INTEGER*4. Следующая программа: 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 для определения атрибутов, которые позволяют передавать параметры величинами), не являются объектами таких же ограничений. Параметр обрабатывается, как если бы ему была присво- ена временно переменная соответствующего типа, и временная пере- менная затем передается как параметр. Правила присвоения для величин параметров те же самые, что и при присваивании. Вы можете, например, передать действительную величину целому параметру. |