6.1 Eenvoudige tabellen

Wat is een tabel?

onthoud

Een tabel is een verzameling van gelijksoortige elementen op achtereenvolgende locaties in een geheugen. De elementen hebben geen afzonderlijke naam, ze worden aangeduid met hun nummer. Zo'n nummer heet een subscript.

In COBOL gebruiken we voor het definiëren van een tabel de occurs-clausule in de data division. Als voorbeeld definiëren we een tabel die bestaat uit 12 elementen van elk drie posities.

01 maandtabel.
   03 maandnaam  occurs 12 times  pic xxx.
  

Het veld maandnaam komt 12 keer voor. Dat geven we aan met de occurs-clausule. Na occurs moet een geheel getal staan. Hier is dat getal 12: er zijn 12 velden met de naam maandnaam. De nummering loopt van 1 tot en met 12. De ondergrens van een tabel is in COBOL altijd 1.

Je ziet dat de occurs-clausule op 03-niveau staat.

onthoud

De occurs-clausule mag nooit en te nimmer op 01-niveau voorkomen. Een veld met occurs is altijd onderdeel van een ander veld (met een lager niveaunummer).

illustratie: Geert Nijmolen

cartoon

We kunnen niet meer de naam van het veld maandnaam alleen gebruiken, maar we moeten aangeven welk van de 12 velden met dezelfde naam we bedoelen. Dat doen we door tussen haakjes achter de naam een subscript te vermelden. Bijvoorbeeld:

    move "okt" to maandnaam(10)
  

De constante okt brengen we over naar het tiende element van de tabel. De subscript staat tussen haakjes. Voor en na de haakjes zijn spaties toegestaan.

In het voorbeeld van de maandtabel is elk veld maandnaam drie posities groot. Er zijn twaalf van die velden. Samen zijn ze dus 3 x 12 = 36 posities groot. Samen vormen ze ook het groepsveld maandtabel. Dat veld is dus ook 36 posities groot en het beschrijft het totaal aan geheugenplaatsen van de afzonderlijke velden maandnaam. Via het groepsveld kunnen we de afzonderlijke elementen een waarde geven.

    move "janfebmrtaprmeijunjulaugsepoktnovdec" to maandtabel
  

Na deze move-opdracht hebben alle elementen van de tabel een waarde gekregen. We kunnen dit aantonen met het volgende programmagedeelte.

    perform with test after 
    varying maandnr from 9 by 1 until maandnr = 11
       display maandnaam(maandnr)
    end-perform
  

In dit stukje programma gebruiken we de variabele maandnr om aan te wijzen welk element van de tabel we bedoelen. Maandnr heeft achtereenvolgens de waarden 9, 10 en 11; de uitvoer die dit stukje programma veroorzaakt, is dan ook:

sep
okt
nov
  

Een subscript wijst een tabelelement aan. Het is dus onzin als de subscript nul is, want er is geen nulde element in de tabel. Een negatief en een gebroken getal kan uiteraard ook niet.

onthoud

Een subscript kan er slechts op een beperkt aantal manieren uitzien. Het kan een geheel getal zijn of een variabelenaam. Eventueel mag na de variabelenaam een plus- of een minteken en een geheel getal volgen.

Van elk van die vormen volgt een voorbeeld. Neem daarbij aan dat de variabele maandnr de waarde 5 heeft.

maandnaam(2)            (wijst naar tabelelement 2)
maandnaam(maandnr)      (wijst naar tabelelement 5)
maandnaam(maandnr + 1)  (wijst naar tabelelement 6)
maandnaam(maandnr - 4)  (wijst naar tabelelement 1)
  

Andere vormen zijn niet mogelijk. Tussen de haakjes mag dus geen formule staan en de variabele tussen de haakjes mag niet zelf voorzien zijn van een subscript.

Bij het werken met subscripts moeten we binnen de grenzen van de tabel blijven. Veel COBOL-compilers controleren niet of een subscript binnen de grenzen van de tabel ligt. Als we een elementnummer gebruiken dat groter is dan het aantal elementen, wijzen we naar een gebied in het geheugen waar zich iets anders dan de tabel bevindt. Dat kan tot heel merkwaardige resultaten leiden.

omslag leerboek

Serie: leerboeken informatica

Titel: Tijd voor COBOL 1

Auteur: Andree Hollander

naamlogo