Поиск…


Программы 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 - исходный файл свободной формы, который должен быть предварительно обработан. Как и прежде, следует проконсультироваться с документацией компилятора для таких флагов и суффиксов файлов.



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow