Om man vill använda Algol-principen att deklarera samtliga variabler underlättas detta av att kommandot IMPLICIT NONE slår av de implicita typ-reglerna. Notera att denna sats måste finnas först i varje programenhet, om den skall ha verkan i hela programmet.
Liksom i de flesta Algol-språk kan nu END kompletteras med namnet på rutinen eller funktionen, som END PROGRAM ALPHA och END FUNCTION GAMMA.
< .LT. > .GT.
<= .LE. >= .GE.
== .EQ. /= .NE.
Detta innebär att man inte behöver så många
punktsymboler som tidigare. Det är dock inga fler punktsymboler
som fått ny representation i och med Fortran 90. Notera att vid
felaktig användning av exempelvis <= kan kompilatorn komma att
klaga på .LE. i stället.
REAL, DIMENSION(2), PARAMETER :: a = (/ 1.0, 7.0 /)
COMPLEX, DIMENSION(10) :: kurre
där variablerna a blir en konstant vektor med två element
och flyttalsvärdena 1.0 respektive 7.0, medan kurre blir en
komplex vektor med 10 (komplexa) element, vilka ej initierats.
Dubbel precision har kompletterats med en mer generell metod att ange önskad precision, nämligen parametern KIND för vilken precision som önskas, användbar på alla variabeltyper.
INTEGER, PARAMETER :: LP = SELECTED_REAL_KIND(20)
REAL (KIND = LP) :: X, Y, Z
Ovanstående båda satser deklarerar således
variablerna X, Y och Z att vara reella flyttalsvariabler med (minst)
20 decimala siffrors noggrannhet, av en datatyp som här kallas LP
(står för lång precision).
SELECT CASE (uttryck)
CASE block-väljare
block
CASE block-väljare
block
CASE DEFAULT
defaultblock
END SELECT
Typisk konstruktion:
SELECT CASE(3*i-j) ! väljarvariabeln är 3*i-j
CASE(0) ! för väljarvariabeln noll
... ! exekverbar kod
CASE(2,4:7) ! för väljarvariabeln 2,4,5,6,7
... ! exekverbar kod
CASE DEFAULT ! för andra värden på
! väljarvariabeln
... ! exekverbar kod
END SELECT
Om CASE DEFAULT saknas och inget av alternativen gäller så
fortsätter exekveringen med nästa sats, utan felutskrift.
Annat exempel:
INTEGER FUNCTION SIGNUM(N)
SELECT CASE (N)
CASE (:-1)
SIGNUM = -1
CASE (0)
SIGNUM = 0
CASE (1:)
SIGNUM = 1
END SELECT
END
namn: DO
exekverbara satser
END DO namn
Den gamla vanliga DO-slingan har nu följande utseende,
namn: DO i = heltalsuttr_1, heltalsuttr_2, heltalsuttr_3
exekverbara satser
END DO namn
där i kallas kontrollvariabel eller styrvariabel,
och där heltalsuttr_3 markerar ej nödvändig del. Slutligen finns
även den nya DO WHILE-slingan
namn: DO WHILE (logiskt_uttryck)
exekverbara satser
END DO namn
Namnet behöver ej anges men kan utnyttjas för kapslade
slingor för att ange vilken som skall itereras på nytt med
CYCLE eller avslutas med EXIT.
S1: DO
IF ( X > Y ) THEN
Z = X
EXIT S1
END IF
CALL NEW(X)
END DO S1
N = 0
SLINGA1: DO I = 1, 10
J = I
SLINGA2: DO K = 1, 5
L = K
N = N + 1
END DO SLINGA2
END DO SLINGA1
I det senare fallet blir slutvärdena I = 11, J = 10, K = 6, L = 5
och N = 50 i enlighet med vad standarden föreskriver.
Namnsättning av slingorna är helt frivillig. Notera att denna typ av namn är begränsad till DO-slingor, CASE och IF...THEN...ELSE...ENDIF. Den gamla möjligheten med satsnummer (utan kolon) att hoppa till finns kvar även i fri form.
SUBROUTINE solve (a,b,n)
REAL, OPTIONAL, INTENT (IN) :: b
kan anropas med
CALL solve ( n = i, a = x)
där två av argumenten ges med nyckelord i stället
för med position, och där det tredje är ett
standardvärde. Om solve är en extern rutin fordras ett
INTERFACE block i det anropande programmet.
Se vidare avsnitt 5.2.1.6.
Rutiner kan specificeras att vara rekursiva
RECURSIVE FUNCTION fakultet(n) RESULT (fak)
men måste då ha ett särskilt RESULT namn för att
föra tillbaks resultatet.
Se vidare avsnitt 5.2.1.3.
a = ''
och tilldelning av överlappande strängar
a(:5) = a(3:7)
samt ett antal nya inbyggda funktioner som TRIM, vilken
tar bort avslutande blanka. Vidare så kan vi nu valfritt
använda apostrof ' eller citattecken " för att innesluta
texten. Detta kan bland annat utnyttjas om man vill skriva en apostrof
inuti en text, då omsluter man det hela med citattecken, och
tvärtom om man vill ha ett citattecken inuti en text. Variabel
längd på en textsträng finns bara under vissa
restriktioner. Längden ges då antingen via en variabel vars
värde bestäms vid anropet av programenheten, eller med en
asterisk som kopplar textsträngen till ett verkligt argument av
typ textsträng eller till en konstant textsträng. I ett
tillägg till
standarden behandlas textsträngar med variabel längd.
NAMELIST / list2 / a, i, x
...
READ(enhet, NML = list2)
önskar indata av formen (ej samtliga variabler behöver vara
med, godtycklig ordning)
&list2 x = 4.3, a = 1.E20, i = -4 /
Jag anser dock att NAMELIST kom in för sent i standarden, det
är inte längre något användbart begrepp vid
nutidens interaktiva program. Det är ett gammalt IBM påfund
från 1960-talet.
REAL, DIMENSION(5,20) :: x, y
REAL, DIMENSION(-2:2,20) :: z
:
z = 4.0*y*SQRT(x)
Vi kanske här vill skydda oss för negativa element i
x. Detta sker genom
WHERE ( x >= 0.0 )
z = 4.0*y*SQRT(x)
ELSEWHERE
z = 0.0
END WHERE
Notera att ELSEWHERE måste vara i ett ord! Jämför
även funktionen SUM som diskuteras sist i nästa avsnitt.
Med deklarationen
REAL, DIMENSION(-4:0,7) :: a
väljer a(-3,:) ut hela den andra raden, medan a(0:-4:-2, 1:7:2)
väljer i omvänd ordning ut vartannat element i varannan
kolumn.
Liksom variabler kan bilda fält, så kan även konstanter det.
REAL, DIMENSION(6) :: B
REAL, DIMENSION(2,3) :: C
B = (/ 1, 1, 2, 3, 5, 8 /)
C = RESHAPE( B, (/ 2,3 /) )
där det första argumentet till den inbyggda funktionen
RESHAPE
ger värdena och det andra argumentet ger det nya
mönstret. Ytterligare två argument finns som möjliga
till denna funktion.
Några kommandon för verklig parallell databehandling finns ej, kommittén bedömde att ytterligare erfarenhet krävs före standardisering. Se därför Appendix 9 om HPF.
Det andra är att använda ett allokerbart fält, "allocatable array", dvs att med de båda satserna ALLOCATE och DEALLOCATE erhålla respektive återlämna lagringsutrymme för ett fält vars typ, rang och namn (och andra attribut) tidigare har deklarerats
REAL, DIMENSION(:), ALLOCATABLE :: x
...
ALLOCATE(x(n:m)) ! n och m är heltalsuttryck
! Ge båda gränserna eller bara
! den övre och då utan kolon!
...
x(j) = q
CALL sub(x)
...
DEALLOCATE (x)
...
Deallokering förekommer automatiskt (om ej attributet SAVE getts)
när man i proceduren når RETURN eller END i samma procedur.
Den tredje varianten är ett automatiskt fält, "automatic array". Detta fanns nästan men inte riktigt i gamla Fortran, där X då måste vara med i argumentlistan.
SUBROUTINE sub (i, j, k)
REAL, DIMENSION (i, j, k) :: x
Dimensioneringen för X hämtas från heltalen i det
anropande programmet.
Slutligen finns antaget mönster, "assumed-shape array", vars lagring definieras i den anropande proceduren, och för vilken endast typ, rang och namn ges.
SUBROUTINE sub (a)
REAL, DIMENSION(:, :, :) :: a
Här krävs ett explicit gränssnitt i den anropande
programenheten för att överföra
dimensioneringsinformationen. Detta skall se ut som följer:
INTERFACE
SUBROUTINE SUB(A)
REAL, DIMENSION (:,:,:) :: A
END SUBROUTINE SUB
END INTERFACE
Om man glömmer INTERFACE eller har ett felaktigt sådant
erhålles ofta felet "Segmentation error". Se vidare
avsnitt 11.2.
Vissa inbyggda funktioner finns för att bestämma de verkliga dimensioneringsgränserna
DO (i = LBOUND(a,1), UBOUND(a,1))
DO (j = LBOUND(a,2), UBOUND(a,2))
DO (k = LBOUND(a,3), UBOUND(a,3))
där LBOUND ger den lägre dimensioneringsgränsen
för den specificerade dimensioneringen, och UBOUND den övre.
Summan av de positiva värdena av ett antal tal i ett fält kan skrivas
SUM ( X, MASK = X > 0.0 )
Samtliga inbyggda funktioner presenteras utförligt i
Appendix 5.
För att kunna använda användardefinierade datatyper i exempelvis COMMON eller för att se till att två likadana datatyper betraktas som samma datatyp använder man kommandot SEQUENCE, i det senare fallet får dessutom ingen variabel vara deklarerad PRIVATE.
B'01010101010101010101010101010101'
för binära,
O'01234567'
för oktala och
Z'ABCDEF'
för hexadecimala tal.