Fortran
Programenheter och fillayout
Sök…
Fortran-program
Ett komplett Fortran-program består av ett antal olika programenheter. Programenheter är:
- huvudprogram
- funktion eller underprogram
- modul eller undermodul
- blockera dataprogramenheten
Huvudprogrammet och vissa procedurer (funktion eller subroutine) delprogram kan tillhandahållas av ett annat språk än Fortran. Till exempel kan ett C-huvudprogram ringa en funktion definierad av ett underprogram för Fortran-funktion, eller ett Fortran-huvudprogram kan anropa en procedur definierad av C.
Dessa Fortran-programenheter kan ges olika filer eller i en enda fil.
Vi kan till exempel se de två filerna:
prog.f90
program main
use mod
end program main
mod.f90
module mod
end module mod
Och kompilatorn (påkallas korrekt) kan koppla huvudprogrammet till modulen.
Den ena filen kan innehålla många programenheter
everything.f90
module mod
end module mod
program prog
use mod
end program prog
function f()
end function f()
Men i detta fall måste det noteras att funktionen f
fortfarande är en extern funktion när det gäller huvudprogrammet och modulen. Modulen är dock tillgänglig via huvudprogrammet.
Regler för att skriva omfattning gäller för varje enskild programenhet och inte för filen i vilken de finns. Om vi till exempel vill att varje scoping-enhet inte ska ha någon implicit typning måste filen ovan skrivas som
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
Moduler och undermoduler
Moduler dokumenteras någon annanstans .
Kompilatorer genererar ofta så kallade modulfiler : vanligtvis den fil som innehåller
module my_module
end module
kommer att resultera i en fil som heter något liknande my_module.mod
av kompilatorn. I sådana fall måste en modulfil vara synlig innan en senare programenhet behandlas för att en modul ska kunna nås av en programenhet.
Externa förfaranden
En extern procedur är en som definieras utanför en annan programenhet, eller på ett annat sätt än Fortran.
Funktionen som finns i en fil som
integer function f()
implicit none
end function f
är en extern funktion.
För externa procedurer kan deras existens förklaras med hjälp av ett gränssnittsblock (till ett uttryckligt gränssnitt)
program prog
implicit none
interface
integer function f()
end interface
end program prog
eller genom ett uttalande för att ge ett implicit gränssnitt
program prog
implicit none
integer, external :: f
end program prog
eller ens
program prog
implicit none
integer f
external f
end program prog
Det external
attributet är inte nödvändigt:
program prog
implicit none
integer i
integer f
i = f() ! f is now an external function
end program prog
Blockera dataprogramenheter
Blockdata-programenheter är programenheter som tillhandahåller initialvärden för objekt i vanliga block. Dessa lämnas medvetet okokumenterade här och kommer att visas i dokumentationen av historiska Fortran-funktioner.
Interna underprogram
En programenhet som inte är ett internt underprogram kan innehålla andra programenheter, kallade interna underprogram .
program prog
implicit none
contains
function f()
end function f
subroutine g()
end subroutine g
end program
Ett sådant internt underprogram har ett antal funktioner:
- det finns värdförening mellan enheter i delprogrammet och det yttre programmet
- implicit typregler ärvs (
implicit none
gäller if
ovan) - interna underprogram har ett tydligt gränssnitt tillgängligt i värden
Underprogram och externa underprogram för moduler kan ha interna underprogram, t.ex.
module mod
implicit none
contains
function f()
contains
subroutine s()
end subroutine s
end function f
end module mod
Källkodsfiler
En källkodfil är en (vanligtvis) vanlig textfil som ska bearbetas av kompilatorn. En källkodfil kan innehålla upp till ett huvudprogram och valfritt antal moduler och externa underprogram. Till exempel kan en källkodfil innehålla följande
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
Vi bör här komma ihåg att även om de externa underprogrammen ges i samma fil som modulerna och huvudprogrammet, är de externa underprogrammen inte uttryckligen kända av någon annan komponent.
Alternativt kan de enskilda komponenterna spridas över flera filer och till och med sammanställas vid olika tidpunkter. Compilerdokumentation bör läsas om hur man kombinerar flera filer till ett enda program.
En enda källkodfil kan innehålla antingen källkod med fast form eller fri form: de kan inte blandas, även om flera filer som kombineras vid kompileringstid kan ha olika stilar.
För att ange källformuläret till kompilatorn finns det i allmänhet två alternativ:
- val av filnamnsuffix
- användning av kompilatorflaggor
Kompileringstidsflaggan för att ange en fast eller fri formkälla kan hittas i kompilatorns dokumentation.
De betydande filnamnssuffixerna finns också i kompilatorns dokumentation, men som en allmän regel tas en fil med namnet file.f90
till att innehålla fri file.f
medan filen file.f
anses innehålla källa med fast form.
Användningen av .f90
suffix för att indikera källa i fri form (som infördes i Fortran 90-standarden) frestar ofta programmeraren att använda suffixet för att indikera den språkstandard som källkoden överensstämmer med. Vi kan till exempel se filer med .f03
eller .f08
suffix. Detta är vanligtvis att undvika: de flesta Fortran 2003-källor överensstämmer också med Fortran 77, Fortran 90/5 och Fortran 2008. Dessutom överväger många comilers inte automatiskt sådana suffix.
Kompilatorer erbjuder ofta en inbyggd kodförberedare (generellt baserat på cpp). Återigen kan en kompileringstidsflagg användas för att indikera att förbehandlaren bör köras före kompilering, men källkodsfilsuffixet kan också indikera ett sådant förbehandlingsbehov.
För file.F
filsystem file.F
ofta vara en källfil för fast form som ska förbehandlas och file.F90
vara en källa för friform som ska förbehandlas. Som tidigare bör kompilatorns dokumentation konsulteras för sådana flaggor och filsuffix.