Читайте также:
|
|
Рассмотрим,
PROGRAM CalculatePay
IMPLICIT NONE
REAL:: Pay, Tax, Delta
INTEGER:: NumberCalcsDone = 0
Pay =...; Tax =...; Delta =...
CALL PrintPay(Pay,Tax)
Tax = NewTax(Tax,Delta)
....
CONTAINS
SUBROUTINE PrintPay(Pay,Tax)
REAL, INTENT(IN):: Pay, Tax
REAL:: TaxPaid
TaxPaid = Pay * Tax
PRINT*, TaxPaid
NumberCalcsDone = NumberCalcsDone + 1
END SUBROUTINE PrintPay
REAL FUNCTION NewTax(Tax,Delta)
REAL, INTENT(IN):: Tax, Delta
NewTax = Tax + Delta*Tax
NumberCalcsDone = NumberCalcsDone + 1
END FUNCTION NewTax
END PROGRAM CalculatePay
Здесь NumberCalcsDone глобальная переменная. Она доступна во всех процедурах главной ассоциации.
Рассмотрим еще один пример
PROGRAM Proggie
IMPLICIT NONE
REAL:: A, B, C
CALL sub(A)
CONTAINS
SUBROUTINE Sub(D)
REAL:: D! D формальный (соответствующий для фактического параметра A)
REAL:: C! локальное C (отлично от С из Proggie)
C = A**3! A не может быть заменено
D = D**3 + C! D может быть заменено
B = C! B из Proggie получает новое значение
END SUBROUTINE Sub
END PROGRAM Proggie
В процедуре Sub при выполнении с одной стороны A как параметр будет подставлен вместо D, с другой стороны в операторе
C = A**3
используется значение А из процедуры Proggie, независимо от того, какой фактический параметр использован при вызове Sub.
Есть и другой аспект: А как глобальная величина из процедуры Proggie не может менять значения, но как фактический параметр, соответствующий D, будет перевычислено оператором
D = D**3 + C.
C в Sub отдельное от C в Proggie, замена его значения в Sub не приведет к замене значения C в Proggie.
Я
Блок взаимодействия (Interface Blocks)
Интерфейс происходит всегда, когда одна программная единица вызывает другую. Чтобы работать правильно, программа должна обеспечивать, чтобы фактические параметры в вызове процедуры согласовывались с формальными параметрами этой процедуры. Такой интерфейс проверяется компилятором во время компиляции программы и может быть:
•явным - как в вызове внутренних процедур и процедур модуля, где компилятор может видеть подробности вызова параметров процедуры
•неявным - как в вызове внешних процедур. Здесь компилятор допускает, что детали вызова процедуры и параметры увязаны.
Как бы ни было интерфейс возможно сделать явным. Это может быть сделано с помощью интерфейсного блока:
INTERFACE
Операторы интерфейса
END INTERFACE
Интерфейсный блок для процедуры включается в начало вызывающей программной единицы. Операторы интерфейса содержат копию оператора SUBROUTINE (или FUNCTION), все операторы объхявлений для формальных аргумнетов и оператор END SUBROUTINE (или FUNCTION). Например:
PROGRAM count
INTERFACE
SUBROUTINE ties(score, nties)
REAL:: score(50)
INTEGER:: nties
END SUBROUTINE ties
END INTERFACE
REAL, DIMENSION(50):: data
...
CALL ties(data, n)
...
END PROGRAM count
SUBROUTINE ties(score, nties)
REAL:: score(50)
INTEGER:: nties
...
END SUBROUTINE ties
Интерфейсный блок в программе count обеспечивает явный интерфейс с подпрограммой ties. Если бы программа count могла бы вызвать другую внешнюю процедуру, ее операторы интерфейса могли бы быть заменены в том же интерфейсном блоке.
Я
Дата добавления: 2015-11-14; просмотров: 53 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Внутренние процедуры | | | Объекты допустимого образа |