12. Közös tömbök

A Fortran 77 nem rendelkezik globális változókkal, azaz olyan változókkal, amelyeken több programrész is felhasznál, osztozik. Eddig csak egyféle módszert láttunk az egyes subroutinok közötti információcserére, ez volt a paraméter lista. Azonban ennek a használata nem mindig célravezetõ, például akkor, mikor sok segédprogram van, amik nagy mennyiségû paraméteren osztoznak. Ilyenkor célszerû a közös tömbök használata. De azért e módszer alkalmazását nem szabad túlzásba vinnünk.

Példa

A közös tömbök használatára lássuk az alábbi példát: Tegyük fel van két paraméterünk: alfa és beta, amelyeket több segédprogram is felhasznál.
      program fo
      deklarációk
      real alpha, beta
      common /coeff/ alfa, beta

      utasítások
      stop
      end

      subroutine sub1 (néhány argumentum)
      az argumentumok deklarációi
      real alfa, beta
      common /coeff/ alfa, beta

      utasítások
      return
      end

      subroutine sub2 (néhány argumentum)
      az argumentumok deklarációi
      real alfa, beta
      common /coeff/ alfa, beta

      utasítások
      return
      end
Itt defináltunk egy coeff nevû közös tömböt, mely két elembõl áll: alfa és beta változókból. Természetesen tetszõleges számú elemet is tehetünk egy ilyen közös tömbbe. Sõt, még az elemek típusainak se kell egyformának lenniük, mivel minden subroutin, amely ezt a tömböt alkalmazza, az egész tömböt deklarálja.

Megjegyzés: Ebben a példákban is könnyen elkerülhettük volna a közös tömb használatát, ha alfa-t és beta-t eleve paraméterként(argumentumként) kezeljük. Amikor csak lehet, kerüljük a közös tömbök használatát. Természetesen azonban vannak olyan problémák is, mikor csak a közös tömbök használata jelenti a megoldást.

Közös tömbök szintaktikája

      common / név / a változók listája
Fontos tudnivalók: Ezen szabályok figyelembevételét is szemlélteti a következõ példánk:
      subroutine sub3 (néhány argumentum)
      az argumentumok deklarációi
      real a, b
      common /coeff/ a, b

      utasítások
      return
      end
Ez a deklaráció ekvivalens a korábban látott, alfa-ra és beta-ra vonatkozó deklarációval. Célszerû ugyanazon neveket használni ugyanazon elemekre, mert könnyen összezavarodhatunk. Nézzük erre egy elrettentõ példát:
      subroutine sub4 (néhány argumentum)
      az argumentumok deklarációi
      real alfa, beta
      common /coeff/ beta, alfa

      utasítások
      return
      end
Itt most az alfa egyben beta is. Ha ilyesmit látunk, akkor nagy valószinûséggel hibát fedeztünk fel. De az ilyen típusú hibákat igen nehéz megtalálni.

Vektorok a közös tömbökben

Közös tömbökben definiálhatunk vektorokat is. De mégegyszer hangsúlyozzuk, ezt nem ajánlatos alkalmazni. A legfõbb oka ennek a flexibilitás. A következõ példában is láthatjuk, hogy mennyire rossz ez az ötlet. Tegyük fel az alábbi deklarációkat írjuk meg a fõprogramban:
      program main
      integer nmax
      parameter (nmax=20)
      integer n
      real A(nmax, nmax)
      common /matrix/ A, n
Ebben a közös tömbben az A mátrix elemei vannak, illetve egy egész szám, az n. Szeretnénk ezt az A mátrixot néhány subroutinban alkalmazni. Ekkor az alábbi deklarációt kell megejteni minden egyes segédprogramban:
      subroutine sub1 (...)
      integer nmax
      parameter (nmax=20)
      integer n
      real A(nmax, nmax)
      common /matrix/ A, n
Különbözõ dimenziójú vektorok nem lehetnek egy közös tömbben, ezért az nmax értékének pontosan meg kell egyeznie a fõprogrambeli értékével. Emlékezzünk vissza: a mátrix méretét pontosan kell ismernie a fordítóprogramnak, ezért nmaxot definiálnunk kell egy paraméter utasítással.

Ez a kis példa is rámutatott arra, hogy a nem érdemes vektorokat közös tömbben kezelnünk. Sokkal célszerûbb a vektorokat argumentumként alkalmazni a subroutinokban (persze a fõdimenzió figyelembevételével).

 

Copyright © 1995-7 by Stanford University. All rights reserved.

Fordították: Seres András Tamás és Szalai Szilvia (ELTE-TTK)


[Tovább] [Tartalomjegyzék]