< .LT. > .GT.
<= .LE. >= .GE.
== .EQ. /= .NE.
TYPE, access-direktiv :: namn
privat-direktiv
komponent-definition
END TYPE namn
Härvid gäller att om privat-direktivet SEQUENCE gäller
så måste alla typer i komponent-definitionen också
ha den egenskapen. Ett access-direktiv, eller en vanlig PRIVATE sats
inne i definitionen, är tillåten endast om typdefinitionen
befinner sig i en modul.
DIMENSION måste kompletteras med rang och eventuellt även med omfång.
KIND-parametern har formen (KIND=heltalskonstant)
ALLOCATABLE får ej ges för formella argument eller funktionsresultat.
Ett fält specificerat med ALLOCATABLE eller POINTER skall ha getts rang men ej omfång. Ett fält får inte ha båda dessa attribut.
Om POINTER har använts får inte något av TARGET, INTENT, EXTERNAL eller INTRINSIC användas.
Om TARGET har använts får inte något av POINTER, EXTERNAL, INTRINSIC eller PARAMETER användas.
INTENT och OPTIONAL får endast ges vid formella argument.
En variabel kan inte vara PUBLIC om motsvarande typ är PRIVATE
Attributet SAVE får inte ges för element i COMMON-block, för ett formellt argument, för en funktion eller för en subrutin.
En storhet får inte ges både EXTERNAL och INTRINSIC
INTENT ges som INTENT(IN), INTENT(OUT) eller INTENT(INOUT) och innebär att variabeln betecknas som in-variabel, ut-variabel respektive både och.
Explicit dimensionering ges med (undre_gräns : övre_gräns), vid flera dimensioner så många gånger som erfordras, med komma mellan de olika paren, men högsta tillåtna antal dimensioner (rang) är 7. När endast rangen behöver ges utelämnas både undre gräns och övre gräns, dvs bara kolon ges för varje dimension. Om undre gräns är 1 kan undre gräns och : utelämnas. Den "sista" dimensionen kan i ett formellt fält ges med en * i stället för normal specifikation.
INTENT och OPTIONAL kan bara användas i en funktion, subrutin eller INTERFACE specifikation.
SAVE kan följas av variabelnamn och/eller COMMON-namn. Om så ej är fallet sparas allt som kan sparas, och några fler SAVE satser får då ej finnas i den aktuella programenheten.
Om attribut finns med måste deklarationen ges med dubbelkolon, annars kan dubbelkolon utelämnas. Jag rekommenderar att det får vara kvar.
IMPLICIT NONE
REAL :: A = 1 ! Fortran 90
REAL B ! Fortran 77 och 90
DATA B / 6 / ! Fortran 77 och 90
REAL C ! Fortran 77 och 90
PARAMETER ( C = 12 ) ! Fortran 77 och 90
REAL, PARAMETER :: D = 17 ! Fortran 90
REAL, DIMENSION(4) :: A = (/ 1, 1, 1, 1 /)
REAL, DIMENSION(4) :: B
DATA B = / 4*1 /
REAL, DIMENSION(4), PARAMETER :: D = (/ 1, 1, 1, 1 /)
IMPLICIT LOGICAL (B-C, L)
Satsen ovan innebär att alla variabler som börjar på
någon av bokstäverna B, C eller L betraktas automatiskt som
logiska variabler, om de inte explicit (dvs med hela namnet)
deklarerats att vara av någon annan typ.
Om IMPLICIT NONE utnyttjas måste den satsen vara först i programenheten (men efter PROGRAM, FUNCTION, SUBROUTINE, BLOCK DATA eller MODULE), och där får då inte finnas några andra IMPLICIT satser.
NAMELIST / list_1 / a, i, x
NAMELIST / list_2 / b, j, y, / list_3 / c, k, z
Som variabelnamn får här inte användas ett formellt
fältargument med icke-konstanta gränser, en
textsträngsvariabel med variabel längd, en pekare, eller ett
allokerbart fält.
Trots att NAMELIST kom med i standarden i och med Fortran 90 är det snarare att betrakta som ett tillägg till Fortran 66 än en verklig beståndsdel av Fortran 90. Det har ej utvidgats till att klara alla nyheter hos datatyperna i Fortran 90.
Om gruppnamnet getts attributet PUBLIC får inte något av variabelnamnen getts attributet PRIVATE.
REAL, DIMENSION(10) :: C
INTEGER, DIMENSION(20) :: D
EQUIVALENCE (A, B), (C(8), D(3))
Som variabelnamn får här inte användas ett formellt
argument, en pekare, ett allokerbart fält, en funktion, ett
ENTRY-namn, ett RESULT-namn, namnet för en konstant, eller en
struktur-komponent. Alla variabler som görs ekvivalenta
måste vara i samma grupp av datatyper, nämligen i
någon av
REAL, DIMENSION(10) :: C INTEGER, DIMENSION(20) :: D COMMON A, B ! Blankt COMMON COMMON / / E, F ! Fortsättning av blankt COMMON COMMON / VEKTORER / C, DI motsats till vid EQUIVALENCE får i detta fall ett variabelnamn bara förekomma en gång.
Som variabelnamn får här inte användas ett formellt argument, ett allokerbart fält, en funktion, ett ENTRY-namn eller ett RESULT-namn. Om variabelnamnet svarar mot en användardefinierad typ, måste denna vara sekventiell, dvs ha attributet SEQUENTIAL. Eventuella fältgränser måste vara konstanta.
REAL, DIMENSION (:,:,:), ALLOCATABLE :: A INTEGER :: I_ALLOKERING, I_AV_ALLOKERING ... ! Här antas värdena på heltalsvariablerna N och M kända ALLOCATE ( A(1:10, 7:19, N:M), STAT = I_ALLOKERING) ... DEALLOCATE (A, STAT = I_AV_ALLOKERING)
WHERE (mask_uttryck) tilldelning
där maskuttrycket är ett logiskt villkor för ett
fält och tilldelningssatsen innehåller fält med samma
mönster. Tilldelning kommer då att ske enbart för
element svarande mot sanna positioner i maskuttrycket. Konstruktionen
däremot användes dels då olika tilldelningar skall ske
vid sant och falskt, dels vid behov av flera tilldelningssatser.
WHERE (mask_uttryck)
tilldelningar
ELSEWHERE
tilldelningar
END WHERE
IF (logiskt_uttryck) exekverbar_sats
där om det skalära logiska villkoret är sant så
utföres den exekverbara satsen, annars fortsätter
exekveringen med nästa sats. Den exekverbara satsen får
inte vara en ny IF-sats, CASE eller DO-slinga.
Den får inte
heller vara en END-sats, men väl en STOP-sats eller
normal GO TO sats.
namn: IF (logiskt_uttryck) THEN
exekverbara_satser
ELSE IF (logiskt_uttryck) THEN namn
exekverbara_satser
ELSE namn
exekverbara_satser
END IF namn
där om det första skalära logiska villkoret är
sant så utföres de första exekverbara satserna, annars
fortsätter exekveringen med eventuell ELSE IF eller ELSE-del.
Om
namnet (som är frivilligt att ange) användes på alla
fyra ställena måste det vara lika, om det ej ges på
den första platsen, dvs före kolon skall även kolon
utelämnas, och då kan namnet ej heller ges vid något
av de andra ställena. Normalt ger man bara namnet på det första
och det sista stället (dvs. efter END IF).
Det är tillåtet att sätta in "nästan vad som helst" bland de exekverbara satserna, till exempel en ny IF-konstruktion.
IF (aritmetiskt_uttryck) sats_nr_1, sats_nr_2, sats_nr_3och medför hopp till det första satsnumret om det aritmetiska uttrycket är negativt, till det andra om det är noll, och till det tredje om det är positivt. Det aritmetiska uttrycket får naturligtvis inte vara komplext.
namn: SELECT CASE (skalärt_uttryck)
CASE (skalärt_värde_1) namn
exekverbara satser
CASE (skalärt_värde-2) namn
exekverbara satser
...
CASE (skalärt_värde-n) namn
exekverbara satser
CASE DEFAULT namn
exekverbara_satser
END SELECT namn
där det skalära uttrycket kan vara heltal, textsträng
eller logiskt. Värdena skall naturligtvis vara av samma typ, men
de kan vara intervall (två värden skilda av kolon, i
extremfall kan det ena av dessa värden utelämnas) och
upprepningar (skilda av komma). De får däremot inte vara
givna med överlappningar, dvs ett värde får ej
tillfredsställa mer än ett CASE. Om värdet inte
tillfredsställer något av dem användes CASE DEFAULT om
detta finnes, annars fortsätter exekveringen direkt med
nästa sats. Om namnet (som är frivilligt att ange)
användes på alla ställena måste det vara lika,
om det ej ges på den första platsen, dvs före kolon
skall även kolon utelämnas, och då kan namnet ej
heller ges vid något av de andra ställena.
Värdena skall vara av samma typ och slag, men för textsträngar är olika längd tillåten. Varianten med kolon är inte tillåten vid logiska värden.
namn: DO
exekverbara satser
END DO namn
Denna kan avbrytas med konventionella hoppsatser eller med den nya
satsen EXIT namn, vilken ger ett uthopp ur aktuell slinga, eller
slingan med angivet namn. En annan ny sats, CYCLE namn, ger på
motsvarande sätt en ny iteration av slingan. Dessa båda
satser kan naturligtvis även utnyttjas i de följande
varianterna.
DO snr styrvariabel = start_värde, slut_värde, steg
exekverbara satser
snr sista_exekverbara_sats
Det bästa valet för sista_exekverbara_sats är satsen
CONTINUE, en sats som inte utför något, men kan
användes som platsmarkering för hopp hitan och ditan.
Markeringen snr står för satsnummer om en till fem
siffror. Kapslade slingor är tillåtna, och kan
tillåtas sluta på samma sats. Numera rekommenderas dock
att låta varje slinga sluta med sin egen CONTINUE sats eller
ännu bättre med sin egen END DO enligt nedan. En modernare
variant är nämligen
namn: DO styrvariabel = start_värde, slut_värde, steg
exekverbara satser
END DO namn
Styrvariabeln kan i båda fallen vara heltal eller flyttal. Vi
antar först att steget är utelämnat eller positivt. Om
det är utelämnat användes steget ett. Det hela fungerar
då så att först sätts styrvariabeln till
startvärdet. Om detta värde är större än
slutvärdet är det hela klart, och exekveringen
fortsätter på nästa sats efter slingan. I annat fall
utförs de exekverbara satserna med aktuellt värde på
styrvariabeln, varefter denna uppräknas med steget och ny test
sker.
namn: DO WHILE (logiskt_uttryck)
exekverbara satser
END DO namn
GOTO (snr1, snr2, ... , snrn) , skalärt_heltals_uttryckHär kan ett godtyckligt antal satsnummer finnas inom parentesen. Kommat efter parentesen är faktiskt onödigt. Om det skalära uttrycket blir 1 sker hopp till det första satsnumret snr1, och så vidare.
GOTO satsnummervariabel, (snr1, snr2, ... , snrn)Här kan ett godtyckligt antal satsnummer finnas inom parentesen. Kommat före parentesen är faktiskt onödigt även här. Satsnummervariabel är däremot ett helt nytt begrepp. Det liknar heltal men är i själva verket programadresser. Om en satsnummervariabel skall tilldelas ett visst satsnummer kan detta tyvärr inte ske med en vanlig tilldelningssats utan måste ske med den speciella ASSIGN-satsen. Notera att parentesen med de olika möjliga satsnumren helt kan utelämnas, då måste naturligtvis även eventuellt komma före utelämnas. Man får då följande förenklade variant av den tilldelade hoppsatsen.
GOTO satsnummervariabel
ASSIGN satsnummer TO satsnummervariabel
Satsnummervariabler kan användas dels för dessa tilldelade
hoppsatser, dels vid FORMAT i samband med in- och utmatning. Vid
användning i aktuell programenhet av deklarationen IMPLICIT NONE
skall satsnummervariablerna deklareras som INTEGER, trots att dom
egentligen inte är det.
snr CONTINUE
STOP stopp_kod
där stopp-koden kan vara en textsträng eller högst fem
decimala siffror.
PAUSE paus_kod
där paus-koden likaså kan vara en textsträng eller
högst fem decimala siffror.
PROGRAM program_namn
Specifikationer
Satsfunktioner
Exekverbar del
Interna funktioner och subrutiner
END PROGRAM program_namn
Den första satsen, PROGRAM program_namn, är helt frivillig,
om den användes måste program-namnet anges. Den sista
satsen kan vara END, END PROGRAM eller den fullständiga
END PROGRAM program_namn. Program-namnet i END-satsen måste
naturligtvis vara samma som i PROGRAM-satsen.
De exekverbara satserna får inte innehålla någon av satserna RETURN eller ENTRY.
MODULE modul_namn
Specifikationer
Modul-subprogram
END MODULE modul_namn
Motsvarande regler gäller för modul-namnet som för
program-namnet. Modulen får inte innehålla satsfunktioner,
ENTRY eller FORMAT.
En modul användes med något av följande alternativ.
USE modul_namn
USE modul_namn, byt_namn_lista
USE modul_namn, ONLY: enbart_lista
I det första fallet blir alla offentliga (PUBLIC) storheter i
modulen tillgängliga. Här gäller att alternativet
byt_namn_lista består av komponenter av följande utseende.
lokalt_namn => verkligt_namn_i_modulen
Motsvarande regler gäller för ONLY, även där kan
namnbyte ske. Samtliga storheter som anropas måste naturligtvis
vara offentliga.
BLOCK DATA block_data_namn
Specifikationer
END BLOCK DATA block_data_namn
Motsvarande regler gäller för block-data-namnet som för
program-namnet, men något block data namn är ej
nödvändigt att ange.
Specifikationerna får innefatta användning av moduler via USE satser, deklarationer av olika typer inklusive användning av IMPLICIT, PARAMETER satser, användardefinierade datatyper, samt följande olika specifikationer: COMMON, DATA, DIMENSION, EQUIVALENCE, INTRINSIC, POINTER, SAVE och TARGET.
Specifikationerna får däremot inte innefatta ALLOCATABLE, EXTERNAL, INTENT, OPTIONAL, PRIVATE eller PUBLIC. Inte heller får något gränssnitt INTERFACE ingå.
INTERFACE
Specifikations_del
Modul_procedur
END INTERFACE
I den första satsen, INTERFACE, kan tillägg ske med
högst ett av
I fallet OPERATOR ovan skall inom parentesen finnas aktuell operator, till exempel +, -, * eller /.
Specifikations_del får inte innehålla någon av ENTRY, DATA, FORMAT och inte heller någon satsfunktion. Den får inte heller referera till en procedur som definieras i den programenhet i vilken gränssnittet ingår. I övrigt ser den ut som
FUNCTION funktions_namn(argument_lista)
specifikationer
END FUNCTION funktions_namn
SUBROUTINE subrutin_namn(argument_lista)
specifikationer
END FUNCTION subrutin_namn
Man kan förenklat säga att ovanstående erhålles
då man tar bort "allt väsentligt", dvs den egentliga
procedur-kroppen, ur funktionen eller subrutinen.
Modul-proceduren får endast finnas då INTERFACE satsen har något av tilläggen ovan, och den har då utseendet MODULE PROCEDURE namn_lista, där listan innehåller namn på procedurer som är tillgängliga.
EXTERNAL lista_över_externa_funktioner_och_subrutinerNotera att om denna lista upptar ett namn på en i Fortran 90 inbyggd funktion eller subrutin blir motsvarande inbyggda ej längre tillgänglig. Detta kan användas om man av någon anledning vill skriva till exempel sin egen funktion för beräkning av sinus.
INTRINSIC lista_över_inbyggda_funktioner_och_subrutinerNotera att denna senare lista endast får upptaga namn på i Fortran 90 inbyggda funktioner och subrutiner, dvs de i Appendix 5.
I de båda fallen (funktion och subrutiner) kan det verkliga argumentet normalt ges antingen enbart på sin korrekta plats jämfört med det formella, eller utnyttjande det formella argumentet som nyckelord, dvs
formellt_argument = verkligt_argument
Notera att det formella argument som skall ges som nyckelord
måste vara det i gränssnittet, och inte
nödvändigtvis det i den verkliga funktionen eller
subrutinen. Detta innebär även att ett explicit INTERFACE
är en förutsättning för att nyckelord skall kunna
användas. Så fort som ett argument getts med nyckelord
måste alla följande också ges med nyckelord. De som
ges med nyckelord kan ges i godtycklig ordning.
Som argument kan användas även namn på funktioner och subrutiner, men här gäller följande undantag: Man kan som argument inte använda satsfunktioner, interna funktioner, interna subrutiner eller det generiska namnet för en funktion eller subrutin. Observera här särskilt att de specifika och ej de generiska namnen på de inbyggda funktionerna måste användas i detta sammanhang.
FUNCTION prefix funktions_namn(argument_lista) RESULT (resultat)
specifikationer
satsfunktioner
exekverbara_satser
interna_funktioner_och_subrutiner
END FUNCTION funktions_namn
De båda delarna prefix och RESULT (resultat) är ej
nödvändiga. För prefix gäller att det kan inledas
med ordet RECURSIVE och följas av typdeklaration, eller
tvärtom.
För RESULT (resultat) gäller att om det ges så skall ej någon typdeklaration ges i prefix och funktionsnamnet får ej typdeklareras på annat sätt i funktionen. Namnet resultat får ej vara samma som funktions_namn.
Ordet FUNCTION måste vara med vid END vad avser en intern funktion eller en modul-funktion. En intern funktion får inte innehålla en ENTRY sats eller i sin tur en intern funktion eller subrutin.
SUBROUTINE subrutin_namn(argument_lista)
specifikationer
satsfunktioner
exekverbara_satser
interna_funktioner_och_subrutiner
END SUBROUTINE subrutin_namn
Första raden kan kompletteras med ordet RECURSIVE före
rutin-namnet. Argumentlistan kan innehålla en asterisk * i
stället för verkligt argument, nämligen när den
ålderdomliga varianten med alternativa återhopp
utnyttjas. Argumentlistan kan också helt utgå,
nämligen om inga argument finns.
Ordet SUBROUTINE måste vara med vid END vad avser en intern subrutin eller en modul-subrutin. En intern subrutin får inte innehålla en ENTRY sats eller i sin tur en intern funktion eller subrutin.
ENTRY alternativ_namn(argument_lista) RESULT (resultat)För RESULT (resultat) gäller att om det ges så skall funktionsnamnet ej typdeklareras på annat sätt i funktionen. Namnet resultat får ej vara samma som det på den alternativa ingången alternativ_namn. Inom programenheten får inte alternativ-namn förekomma som formellt argument eller i en annan ENTRY sats eller i en EXTERNAL eller INTRINSIC sats.
satsfunktion(argument_lista) = skalärt_uttryckDet skalära uttrycket får använda sig av tidigare (ovanför) definierade satsfunktioner. Rekursiv användning (att den anropar sig själv) är ej tillåten