next up previous
Naprej: Spolsna priporocila za Gor: Laboratorijske vaje pri predmetu Nazaj: Delo na racunalniku

Fortran

Tu bom prikazal standardne posebnosti v Fortranu, ki jih boste s pridom uporabili pri programiranju. Priporoca se tipkanje programa z malimi crkami, saj je tako kodiran program bolj citljiv.

Ce zelimo interpretirati (parsing) vhodne podatke, ki imajo (na)kljucne besede skupaj s stevilcnim parametrom je potrebno najprej prebrati celotno vrstico kot niz znakov in ga nato interpretirati glede na vrsto kljucne besede. Naslednji primer programa prebere vhodno datoteko in izpise ustrezne podatke, ki jih je interpretiral.

       program Prep Demo 
       character*80 line
       real node(100,3)
       integer nodes, i, j, k
       open(1, 'primer2.sim', status='old')
10     read(1,'(A)', err=200) line
       if(line(1:5) .eq. 'nodes') then
          read(line(6:80), '(I5)') nodes
          print *, 'Nodes = ', nodes
          do 20, i=1, nodes
            read(1,*) j, (node(j,k), k=1,3) 
20          print *, i, j, (node(j,k), k=1,3)
       endif
       if(line(1:5) .eq. 'solve') stop 'OK'
       goto 10
200    stop 'Pricakoval ukaz solve'
       end

Navedeni primer vsebuje formatne stavke vkljucene kar v ukaz read, kar je ugodno, ce imamo male formatne stavke. Podobno bi lahko napisali formatni stavek za ukaz read/write:

   character ime*65
   write(*, '('' Ime vhodne datoteke: '',$)')
   read(*,'(A)') ime
Datoteke delimo na tekstne in binarne datokeke. Direktna datoteka je poseben primer binarne datoteke, ki ima fiksno dolzino zapisa (record). Fortran omogoca branje/pisanje v prostem formatu (*), uporabniskem formatu (format()) in brez formata (samo v binarne datoteke). Neformatirano direktno datoteko z dolzino enega zapisa 58 bytov se odpre z ukazom
    open(1, 'results.bin', status='NEW',
  * access='DIRECT', form='UNFORMATTED',
  * recl=58)

Dolzina enega zapisa RECL se doloca z maksimalno velikostjo zapisa v datoteki. Zapisi imajo lahko razlicne vsebine podatkov, dolzina zapisa pa je fiksna zaradi hitrejsega dolocanja pozicije datotecnega kazalca. Doloci se jo s sestevkom dolzine vseh spremenljivk in upostevanjem, da zavzame realna spremenljivka 4 byte, celostevilcna 2, znakovna pa toliko, kolikor znakov ima rezerviranih.

Za branje in pisanje enote se uporablja standardni read/write stavek brez podatka o formatu.

     write(1, rec=2) (x(i), i = 1, n/2)
     read(1, rec=2)  (x(i), i = 1, n/2)

Pri vseh branjih in pisanjih se lahko testira napaka ob konverziji ali napaka na vhodno/izhodno enoti s parametrom err. Primer:

    ...
    read(line(6:80), '(I6)', err=102) nodes
    ...
    return
102 stop 'Napaka pri branju parametra nodes!'
    end

Fortran omogoca pisanje in branje v svoje interne enote v obliki character polja. To nam omogoca pretvarjanje numericnih spremenljivk v znakovne. Najveckrat se to uporablja za podprograme, ki zahtevajo kot parameter znakovno spremenljivko, na voljo pa imamo le numericno spremenljivko. Tipicen primer uporabe je izpis teksta v jeziku GKS. Primer:

      character cnode*3
      integer node
      ...
      write(cnode, '(I3)') node
      call gtx(x, y, cnode)
      ...
      end





Leon Kos
Mon Oct 9 07:47:31 GMT+0100 1995