Fortran
Программные единицы и макет файла
Поиск…
Программы Fortran
Полная программа Fortran состоит из нескольких отдельных программных модулей. Программные единицы:
- основная программа
- функция или подпрограмма подпрограммы
- модуль или подмодуль
- блок данных блока данных
Основная программа и некоторые подпрограммы (функции или подпрограммы) могут быть предоставлены языком, отличным от Fortran. Например, основная программа C может вызывать функцию, определенную подпрограммой функции Fortran, или основная программа Fortran может вызывать процедуру, определенную C.
Эти программные модули Fortran могут быть представлены отдельными файлами или в одном файле.
Например, мы можем видеть два файла:
prog.f90
program main
use mod
end program main
mod.f90
module mod
end module mod
И компилятор (вызванный правильно) сможет связать основную программу с модулем.
Один файл может содержать множество программных единиц
everything.f90
module mod
end module mod
program prog
use mod
end program prog
function f()
end function f()
В этом случае, однако, следует отметить, что функция f
по-прежнему является внешней функцией в отношении основной программы и модуля. Однако модуль будет доступен основной программе.
Правила области ввода применяются к каждому отдельному программному модулю, а не к файлу, в котором они содержатся. Например, если мы хотим, чтобы в каждой области видимости не было неявного ввода текста, указанный выше файл должен быть записан как
module mod
implicit none
end module mod
program prog
use mod
implicit none
end program prog
function f()
implicit none
<type> f
end function f
Модули и подмодули
Модули документированы в другом месте .
Компиляторы часто генерируют так называемые файлы модулей : обычно файл, содержащий
module my_module
end module
приведет к компилятору файл с именем my_module.mod
. В таких случаях, чтобы модуль был доступен программному модулю, этот файл модуля должен быть видимым до того, как этот последний программный блок будет обработан.
Внешние процедуры
Внешняя процедура - это та, которая определяется вне другого программного модуля или другими средствами, отличными от Fortran.
Функция, содержащаяся в файле, подобном
integer function f()
implicit none
end function f
является внешней функцией.
Для внешних процедур их существование может быть объявлено с помощью блока интерфейса (для указания явного интерфейса)
program prog
implicit none
interface
integer function f()
end interface
end program prog
или инструкцией объявления, чтобы дать неявный интерфейс
program prog
implicit none
integer, external :: f
end program prog
или даже
program prog
implicit none
integer f
external f
end program prog
external
атрибут не требуется:
program prog
implicit none
integer i
integer f
i = f() ! f is now an external function
end program prog
Блоки данных блоков данных
Блоки данных блоков данных - это программные единицы, которые предоставляют начальные значения для объектов в общих блоках. Они намеренно оставлены без документов здесь и будут представлены в документации по историческим функциям Fortran.
Внутренние подпрограммы
Программный блок, который не является внутренней подпрограммой, может содержать другие программные единицы, называемые внутренними подпрограммами .
program prog
implicit none
contains
function f()
end function f
subroutine g()
end subroutine g
end program
Такая внутренняя подпрограмма имеет ряд особенностей:
- существует ассоциация хозяев между объектами в подпрограмме и внешней программой
- неявные правила набора текста наследуются (
implicit none
действует поf
выше) - внутренние подпрограммы имеют явный интерфейс, доступный на хосте
Подпрограммы модуля и внешние подпрограммы могут иметь внутренние подпрограммы, такие как
module mod
implicit none
contains
function f()
contains
subroutine s()
end subroutine s
end function f
end module mod
Файлы исходного кода
Файл исходного кода представляет собой (обычно) обычный текстовый файл, который обрабатывается компилятором. Файл исходного кода может содержать до одной основной программы и любое количество модулей и внешних подпрограмм. Например, файл исходного кода может содержать следующее
module mod1
end module mod1
module mod2
end module mod2
function func1() ! An external function
end function func1
subroutine sub1() ! An external subroutine
end subroutine sub1
program prog ! The main program starts here...
end program prog ! ... and ends here
function func2() ! An external function
end function func2
Здесь мы должны напомнить, что, хотя внешние подпрограммы заданы в том же файле, что и модули и основная программа, внешние подпрограммы явно не известны никакому другому компоненту.
В качестве альтернативы отдельные компоненты могут быть распределены по нескольким файлам и даже скомпилированы в разное время. Документация компилятора должна быть прочитана о том, как объединить несколько файлов в одну программу.
Один файл исходного кода может содержать исходный код фиксированной формы или свободной формы: их нельзя смешивать, хотя несколько файлов, которые объединяются во время компиляции, могут иметь разные стили.
Чтобы указать компилятору исходную форму, обычно есть два варианта:
- выбор суффикса имени файла
- использование флагов компилятора
Флаг времени компиляции для указания источника фиксированной или свободной формы можно найти в документации компилятора.
Существенные суффиксы имен файлов также содержатся в документации компилятора, но, как правило, файл с именем file.f90
берется содержать источник свободной формы, а файл file.f
- содержать источник фиксированной формы.
Использование суффикса .f90
для указания источника свободной формы (которое было введено в стандарте Fortran 90) часто заставляет программиста использовать суффикс, чтобы указать языковой стандарт, которому соответствует исходный код. Например, мы можем видеть файлы с .f03
или .f08
. Этого обычно следует избегать: большинство источников Fortran 2003 также совместимы с Fortran 77, Fortran 90/5 и Fortran 2008. Кроме того, многие компиляторы автоматически не учитывают такие суффиксы.
Компиляторы также часто предлагают встроенный препроцессор кода (обычно на основе cpp). Опять же, флаг времени компиляции может использоваться для указания того, что препроцессор должен быть запущен до компиляции, но суффикс файла исходного кода также может указывать на такое требование предварительной обработки.
Для файловых систем, чувствительных к file.F
файл file.F
часто воспринимается как исходный файл с фиксированной формой, который должен быть предварительно обработан, а file.F90
- исходный файл свободной формы, который должен быть предварительно обработан. Как и прежде, следует проконсультироваться с документацией компилятора для таких флагов и суффиксов файлов.