Читайте также:
|
|
Для каждого аргумента в спецификации переменных подпрограммы мы можем теперь дать его вид INTENT как IN, OUT или INOUT. Если задан IN, то фактический параметр может быть выражением подобным X+Y или SIN(X) или константой как 37, после чего значение может быть передано подпрограмме, но новое значение не может быть возвращено вызывающей единице. Переменной в этом случае может быть присвоено новое значение в подпрограмме. Если задан OUT, в другом случае, то фактический параметр может быть переменной. На входе в подпрограмму в этом случае переменная не определена. Третий случай, когда возможно одно значение на входе и другое на выходе или то же самое значение. В этом случае фактический параметр должен быть переменной. Если переменная имеет атрибут указателя, то INTENT не должен задаваться. Реализован INTENT еще не всеми компиляторами.
Я
Модуль
Одно из возможных использований программной единицы MODULE состоит заботе о глобальных данных. Как замена для BLOCK DATA. Другое использование в создании пакета новых типов данных. Примеролм может служить пакет интервальной арифметики. Связывая с каждым значением X вы имеете интервал (X_lower; X_upper). Используя пакет вы будете иметь только имя переменной X в смысле интервала. Переменная X теперь поддержана новым типом данных "интервал". Вот из файла интервальной арифметики file interval_arithmetics.f90 или intv_ari.f90.
MODULE INTERVAL_ARITHMETICS
TYPE INTERVAL
REAL LOWER, UPPER
END TYPE INTERVAL
INTERFACE OPERATOR (+)
MODULE PROCEDURE INTERVAL_ADDITION
END INTERFACE
INTERFACE OPERATOR (-)
MODULE PROCEDURE INTERVAL_SUBTRACTION
END INTERFACE
INTERFACE OPERATOR (*)
MODULE PROCEDURE INTERVAL_MULTIPLICATION
END INTERFACE
INTERFACE OPERATOR (/)
MODULE PROCEDURE INTERVAL_DIVISION
END INTERFACE
CONTAINS
FUNCTION INTERVAL_ADDITION(A, B)
TYPE(INTERVAL), INTENT(IN):: A, B
TYPE(INTERVAL):: INTERVAL_ADDITION
INTERVAL_ADDITION%LOWER = A%LOWER + B%LOWER
INTERVAL_ADDITION%UPPER = A%UPPER + B%UPPER
END FUNCTION INTERVAL_ADDITION
FUNCTION INTERVAL_SUBTRACTION(A, B)
TYPE(INTERVAL), INTENT(IN):: A, B
TYPE (INTERVAL):: INTERVAL_SUBTRACTION
INTERVAL_SUBTRACTION%LOWER = A%LOWER - B%UPPER
INTERVAL_SUBTRACTION%UPPER = A%UPPER - B%LOWER
END FUNCTION INTERVAL_SUBTRACTION
FUNCTION INTERVAL_MULTIPLICATION(A, B)
! POSITIVE NUMBERS ASSUMED
TYPE(INTERVAL), INTENT(IN):: A, B
TYPE (INTERVAL):: INTERVAL_MULTIPLICATION
INTERVAL_MULTIPLICATION%LOWER = A%LOWER * B%LOWER
INTERVAL_MULTIPLICATION%UPPER = A%UPPER * B%UPPER
END FUNCTION INTERVAL_MULTIPLICATION
FUNCTION INTERVAL_DIVISION(A, B)
! POSITIVE NUMBERS ASSUMED
TYPE(INTERVAL), INTENT(IN):: A, B
TYPE(INTERVAL):: INTERVAL_DIVISION
INTERVAL_DIVISION%LOWER = A%LOWER / B%UPPER
INTERVAL_DIVISION%UPPER = A%UPPER / B%LOWER
END FUNCTION INTERVAL_DIVISION
END MODULE INTERVAL_ARITHMETICS
Компиляция выше приведенного приведет к созданию файла interval_arithmetics.mod. Этот файл включает интересную модифицированную версию вышеприведенного кода. Любая программа, которая будет использовать этот пакет, должна содержать оператор USE INTERVAL_ARITHMETICS в начале операторов спецификации. Тогда будут доступны тип данных INTERVAL и четыре арифметических действия с этим типом. В некоторых случаях -желательно только включить некоторые средства в модуль. В таком случае вы можете использовать атрибут ONLY внутри оператора USE.
USE module_name, ONLY: список_выбранных_подпрограмм
Я
Дата добавления: 2015-11-14; просмотров: 69 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Уровни доступа | | | Использование модуля |