Читайте также:
|
|
Модули это коллекции данных, определений типов определений процедур, которые дают большую защищенность и общее замену понятия COMMON.
Модули занимают важное место в том, чтобы положить вещи для совместного использования. Этот новый вариант программной единицы может содержать данные, процедуры, определения производных типов и блоки интерфейса (и даже блоки common), все, что может быть включено в единицу scoping с посощью оператора USE. Модуль может также быть использован в скрытом коде процедуры от клиентов. Один и тот же модуль может быть использован во многих программах.
з
Интерфейсы
В соответствии с предложениями Metcalf и Reid (1990, 1992) в Фортран 90 введено требование явного интерфейса. Он выглядит так
INTERFACE SUBROUTINE SUB(A) REAL, DIMENSION (:,:,:):: A END SUBROUTINE SUB END INTERFACEЕсли Вы забыли INTERFACE или если Вы имеете ошибочный интерфейс, то Вы обычно получаете "ошибку сегментации", это означает, что программная единица может быть отсутствует.
Компилятор может быть использован для проверки результатов если характеристики процедур доступны в явном интерфейсе. Тело интерфейса, определенного пользователем, выглядит очень похоже на оператор определения функции и ассоциируется с определениями. Компилятор знает интерфейс с каждой определенной процедурой внутри программной единицы. С интерфейсом компилятор будет проверять характеристики результата функций, с которым ожидаются при вызове и проверке характеристик каждого аргумента с которыми ожидается процедура.
Программисты общих (родовых) процедур могут использовать общие процедуры (процедуры с одним и тем же имененм) с помощью использования интерфейсного блока, чтобы проверить информацию для определения, какую процедуру вызвать. Специальная процедура чтобы быть вызываемой, использующая вид, тип и ранг (категорию) аргументов.
! Пример использования общих процедур
module procedure_def
! Опрелить общий интерфейс 'force' для специальных функций
! 'real_force' and 'double_force'.
interface force
! Объявляет функции и подставляемые типы аргумента.
function real_force(mass, accel) result(force)
real force, mass, accel
end function real_force
function double_force(mass, accel) result(force)
double precision force, mass, accel
end function double_force
end interface
end module
program main
use procedure_def! Ассоциирует procedure_def с main.
real rmass, raccel, rforce
double precision dmass, daccel, dforce
data rmass/2401.0/, raccel/9.81245/
data dmass/2401.0d0/, daccel/9.81245d0/
! Вызывает функцию 'force'. Компилятор реализует первый
! в 'real_force', и второй в 'double_force'.
rforce = force(rmass, raccel)
dforce = force(dmass, daccel)
write(*,'(1x,1p,e16.9,t25,d16.9)') rforce, dforce
end program
! Фактические функции выполняемы, когда сделан вызов 'force'.
function real_force(mass, accel) result(force)
real force, mass, accel
force = mass*accel
end function real_force
function double_force(mass, accel) result(force)
double precision force, mass, accel
force = mass*accel
end function double_force
з
Дата добавления: 2015-11-14; просмотров: 54 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Секция (вырезка) массива | | | Более подробная информация |