Å andra sidan bör vid anropet en in-variabel redan ha tilldelats ett värde.
För en variabel som är både in och ut måste båda villkoren ovan vara uppfyllda.
Inuti den anropade programenheten bör värdet på en in-variabel användas, men inte ändras. För en utvariabel gäller att den vid inhoppet saknar värde, och således inte bör användas före den första tilldelningen.
För allt detta gäller att systemet har en möjlighet att kontrollera dessa olika villkor, i begränsad omfattning vid kompileringen (statisk kontroll) och i full omfattning vid exekvering (dynamisk kontroll). I praktiken så utför de nuvarande systemen ännu inte så mycket av dessa kontroller. Enligt standarden är det inget krav på att systemet utför dem! Det är dock större chans att kontrollerna sker om man inte bara använder INTENT utan även gränssnitt INTERFACE.
Vid dessa kontroller utnyttjas i stor omfattning tekniken med dataflödesanalys, se avsnittet 17.1.
Med hjälp av ett gränssnitt överföres information mellan olika programenheter.
Eftersom de olika programenheterna i ett Fortran-program behandlas helt självständigt måste all information om argumenten i princip föras över manuellt. I Fortran 77 skedde detta med otympliga argumentlistor. I Fortran 90 kan i stället ett gränssnitt kallat INTERFACE användas. Detta måste användas vid
b) anrop med nyckelordsargument eller underförstådda argument,
c) egna generiska rutiner,
d) fält med antaget mönster,
e) fält deklarerade med pekare,
f) vid definition av ny betydelse hos en OPERATOR,
g) om avsikt INTENT skall få verkan vid NAG-kompilatorn.
h) vid användning av subrutiner eller funktioner som argument (om man använder IMPLICIT NONE)
En generellare form är den interna funktionen efter CONTAINS, se nästa avsnitt.
En annan viktig användning av det nya begreppet resultat-variabel är vid fält-värda funktioner, då det är lätt att deklarera denna variabel att lagra funktionens värde(n). Det är faktiskt kombinationen rekursivitet och fält som tvingat fram det nya begreppet.
Användningen av nyckelord och underförstådda argument är inte riktigt så enkel som det borde vara. Det är ett av de fall då ett explicit gränssnitt INTERFACE erfordras. Jag har gett ett liknande exempel, utnyttjande en funktion, redan i kapitel 5. Nu tittar jag i stället på en subrutin.
Som nyckelord användes de formella parametrarna i gränssnittet, vilka ej behöver ha samma namn som de i den verkliga subrutinen. Dessa skall ej deklareras i anropande programenhet (utom i gränssnittet).
IMPLICIT NONE INTERFACE SUBROUTINE SOLVE (A, B, N) INTEGER, INTENT (IN) :: N REAL, INTENT(OUT) :: A REAL, INTENT(IN), OPTIONAL :: B END SUBROUTINE SOLVE END INTERFACE REAL X CALL SOLVE(B=10.0,N=50,A=X) WRITE(*,*) X CALL SOLVE(B=10.0,N=100,A=X) WRITE(*,*) X CALL SOLVE(N=100,A=X) WRITE(*,*) X END SUBROUTINE SOLVE(A,B,N) IMPLICIT NONE REAL, OPTIONAL, INTENT (IN) :: B REAL :: A, TEMP_B INTEGER :: N IF (PRESENT(B)) THEN TEMP_B = B ELSE TEMP_B = 20.0 END IF A = TEMP_B + N RETURN ENDNotera att IMPLICIT NONE för huvudprogrammet ej verkar i subrutinen SOLVE, varför denna har kompletterats med det kommandot och deklaration av de ingående variablerna. Körning på Sun-datorn sker med
f90 program.f90 a.out 60.0000000 1.1000000E+02 1.2000000E+02Gränssnittet INTERFACE placeras lämpligen i en modul. Gränssnitten blir ett naturligt komplement till rutinbiblioteken, Fortran 90 söker automatiskt efter moduler i aktuell filkatalog, eventuella filkataloger i I-listan, samt /usr/local/lib/f90. Begreppet I-lista förklaras i Appendix 6.
Om man glömmer INTERFACE eller har ett felaktigt sådant erhålles ofta felet "Segmentation error". Detta fel kan dock även erhållas vid ett i princip korrekt INTERFACE, men då man glömt att allokera något av de ingående fälten i den anropande programenheten.
Notera att om en utmatningsvariabel anges som OPTIONAL och INTENT (OUT) så måste den vara med i anropslistan om programmet vid exekveringen lägger ut ett värde på denna variabel. Man måste därför i sitt program använda test med PRESENT av aktuell variabel, och endast om den är med i anropet använda den för tilldelning, för att på så sätt få den önskade valfriheten om man bara ibland vill ha ut en viss variabel.