Oppgåve 6

Oppgåve 6

Subrutiner og funksjoner. COMMON.

Programenheter

Vi har sett at en programsekvens som skal benyttes om igjen flere ganger, kan programmeres som en løkke. Ofte kan det i stedet være å foretrekke at programsekvensen defineres som et subprogram. Vi kan skille mellom to typer subprogram, nemlig SUBROUTINE og FUNCTION. På det stedet der en SUBROUTINE skal utføres angis dette med statementet CALL. En FUNCTION utføres når den forekommer i et aritmetisk eller logisk statement og gir da en skalar verdi. Brukeren kan lage sine egne subprogram eller bruke program som allerede eksisterer i filer som kalles programbibliotek. Vi har allerede nevnt noen FUNCTION subprogram som finnes i standard FORTRAN programbibliotek, for eksempel SQRT(X), SIN(X) etc.

Et subprogram kan kalles flere steder i løpet av utførelsen av et program, og kan da benytte forskjellige lagerplasser hver gang. Disse kan angis på to måter, i en parameterliste og i COMMON. En FUNCTION må ha en parameterliste. Parameterlisten kan være tom, men parentesen må likevel være med. En SUBROUTINE kan være uten parameterliste, og bruke bare COMMON til å kommunisere med resten av programmet. Variable nevnt i parameterliste eller i COMMON kan ha en verdi før subprogrammet kalles, og verdien kan redefineres mens rutinen utføres. Det er rekkefølgen i parameterlisten som identifiserer lagerplassene i det kallende program, ikke navnet som benyttes for variabel, navnene er således lokale innenfor subprogrammet. Men det må være samsvar i deklarasjon av datatyper.

Et program kan med fordel struktureres med oppdeling i subprogrammer. Hvert subprogram kan lagres i hver sin kildefil, eller flere subprogram kan ligge etter hverandre i en og samme kildefil. Hver kildefil kan kompileres for seg, og gir hver sin objektfil. Disse spesifiseres ved linking, og gir en utførbar fil. For eksempel slik:

% fort77 -o hoved hoved.o sub1.o sub2.o sub3.o
Det er enkelt å selv lage biblioteker:
% ar cr libmitt.a sub1.o sub2.o sub3.o
Dette skaper biblioteksfilen libmitt.a (lib = bibliotek, .a = archive-format), man kan så linke til denne med:
% fort77 -o hoved hoved.o -L. -lmitt
Opsjonen -lx angir at filen libx.a er et bibliotek. Opsjonen -L indikerer hvilke katalog(er) evt. etterfølgende biblioteksfiler kan finnes i, i dette tilfelle i arbeidskatalogen ("."). Flere biblioteker kan søkes etter hverandre i fort77 kommandoen.

Oppgaver:

  1. Studer følgende programeksempel:
          PROGRAM HOVED
          COMMON /PER/ A,B,C
          CALL SUB1
          CALL SUB2
          CALL SUB3
          STOP
          END
    
          SUBROUTINE SUB1
          COMMON /PER/ PI,E,F
          PI=4.0*ATAN(1.0)
          RETURN
          END
    
          SUBROUTINE SUB2
          COMMON /PER/ P,Q,R
          XMIN= 999999.
          XMAX=-999999.
          DO 10 J=1,10000
            READ(*,'(I6)') I
            IF( I .LT. 0 ) GO TO 90
            X    = FLOAT(I+J)
            XMIN = MIN(XMIN,X)
            XMAX = MAX(XMAX,X)
            WRITE(*,*)J,X
      10  CONTINUE 
      90  Q = (XMIN+XMAX)*P/360.0
          R = SIN(Q)**2
          END    
    
          SUBROUTINE SUB3
          COMMON /PER/ X(3)
          WRITE(*,*) X
          RETURN
          END
    
    Prøv å forstå hva programeksemplet er ment å utføre, og lag programfiler for hovedprogram og hvert subprogram, med innlagte kommentarer som forklarer dette.
  2. Erstatt bruken av funksjonene FLOAT og SIN med funksjoner du selv programmerer. Kjør programmet.
  3. Lag en biblioteksfil av subroutinene og link hoved mot denne. Undersøk innholdet i biblioteksfilen med ar t.

Attende til startsida vår.

Oppdatert 9. mars 1995 av Erling Andersen