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) :: kurredä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, ZOvanstå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 SELECTTypisk 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 SELECTOm 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 namnDen gamla vanliga DO-slingan har nu följande utseende,
namn: DO i = heltalsuttr_1, heltalsuttr_2, heltalsuttr_3 exekverbara satser END DO namndä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 namnNamnet 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 SLINGA1I 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) :: bkan 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 WHERENotera 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) :: avä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) :: xDimensioneringen 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(:, :, :) :: aHä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 INTERFACEOm 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.