A COBOL programozási nyelv

Típusok, típuskonstrukciók

Típus helyett maszk

A Cobolban a változóknak nincs típusa, van viszont egy maszkja (PIC), hogy milyen értékek tárolhatók benne. A fontosabb elemek:

A maszkban az ismétlődő karaktereket rövidíteni lehet:XXXX helyett X(4) írható stb.

Példa érvényes PICTURE értékekre:

a változóhoz megadott PICTURE a lehetséges érték intervalluma
9999 0-9999
S99 -99 - +99
S999V9 -999.9 - +999.9
PPP999 0 - .000999
S999PPP -1000 - -999000 és +1000 - +999000 vagy 0

A Cobolban az adatok definíciójánál kell megmondanunk az adat nyomtatási képét. Ezt szintén a PICTURE segítségével tehetjük meg. Szerkesztett adatmező csak output adatként szerepelhet. Szerkesztőjelek:

PéldáulZZZ,Z99.99 azt jelenti, hogy ha a szám nullákkal kezdődik, akkor az első négyet nem kell kinyomtatni (és ilyenkor a vesszőt sem). Két egész és két tizedesjegyet mindenképpen nyomtatni kell. Nagy számok esetén az ezresek helyét vessző fogja jelezni.
-ZZ9 esetén az output lehet:  123 vagy -123 vagy -  3.
---99 esetén pedig -123 vagy 00 vagy -12 vagy -1234 vagy 07 stb.

Belső számábrázolás

A 77-es szintszám használatával előírhatjuk egy mező ábrázolását. Ez erősen implementációfüggő, de a DISPLAY és a COMPUTATIONAL mindenhol megvan:

77 AAA PIC 9(8) USAGE IS DISPLAY.

77 BBB PIC 9(8) USAGE IS COMPUTATIONAL.

Csoportszinten alkalmazva az alatta levő adatok öröklik az ábrázolásmódot. Az ábrázolásmód nem jelent megszorítást az adat használhatóságára, de ha egy DISPLAY adattal számolunk vagy egy COMPUTATIONAL adaton adatbázis-műveletet végzünk, akkor a konverziók miatt a programunk kevésbé lesz hatékony.

Típuskonstrukciók

1. Feltételértékek

A 88-as szintszám feltételértékek definiálását teszi lehetővé:

01 EXCEPTION-STATUS.
05 STATUS-CODE-ONE PIC XX.
88 SUBFILE-IS-FULL VALUE '9M'.

Ekkor a SUBFILE-IS-FULL egy logikai értékű kifejezés, ami pontosan akkor igaz, ha STATUS-CODE-ONE tartalma "9M":

IF SUBFILE-IS-FULL
THEN PERFORM ERROR-MESSAGE.

2. Rekord típus

A Cobol egyetlen igazi típuskonstrukciós eszköze a rekord, amire már az előbb láttunk példákat. A rekordok leírásában az adatok hierarchiáját is jelölnünk kell. A rekord legtöbbször többszörösen összetett adatokat tartalmaz, amik között alá- illetve mellérendeltségi viszony van. Ezek leírására a Cobolban a szintszámokat használhatjuk. A szintszámokat az adatnév elé kell írni. A rekordok definiálásának szabályai:

Példa a rekordra:

01 StudentDetails.
02 StudentId PIC 9(7).
02 StudentName.
03 FirstName PIC X(10).
03 MiddleInitial PIC X.
03 Surname PIC X(15).
02 DateOfBirth.
03 DayOfBirth PIC 99.
03 MonthOfBirth PIC 99.
03 YearOfBirth PIC 9(4).
02 CourseCode PIC X(4).

3. Átnevezés

Átnevezésre szolgál a 66-os szintszám. Ezzel nem csak egy mezőt nevezhetünk át, hanem több mezőt is összefoghatunk - így lehet összetett kulcsot csinálni:

06 CUSTOMER PIC X(5).
06 INVOICE PIC S9(5).
66 COMP-KEY RENAMES CUSTOMER THRU INVOICE.

4. Átdefiniálás

01 DATE PIC 9(8).

01 DATE1 REDEFINES DATE.
03 YYYY PIC 9(4).
03 MM PIC 9(2).
03 DD PIC 9(2).

A DATE nevű szám és a DATE1 rekordszerkezet ugyanarra a memóriaterületre mutat, de más a struktúrájuk. így könnyen lekérdezhetjük egy dátum hónapját:

MOVE 19980101 TO DATE.
MOVE MM OF DATE1 TO HONAP.

5. Tömb típus

Minden tömb azonos felépítésű adatok halmaza, amelynek egy közös neve van. A tömböt alkotó elemek természetesen összetett adatok is lehetnek, de definíciójuk (hossz, típus stb.) közös.

A tömbökkel kapcsolatban két alapvető kérdéssel kell foglalkoznunk:

  1. tömbök leírása, definiálása
  2. tömbök elemeire való hivatkozás
A tömbök leírása az adatleíró főrészben történik, a FILE SECTION-ban megismert rekordleírás bővítésével. Az OCCURS bejegyzés lehetővé teszi, hogy egymás után írandó, azonos struktúrájú adatmezőket összevontan, egyetlen tömbként írjunk le azáltal, hogy meghatározzuk a tömb elemeinek a számát.

Az OCCURS bejegyzés formája:

1. forma:

OCCURS egész-2 TIMES
[{ASCENDING }
[{          } KEY IS adatnév-2[adatnév-3]...]...
[{DESCENDING}
[INDEXED BY indexnév-1 [indexnév-2]...]

2. forma:

OCCURS egész-1 TO egész-2 TIMES
[DEPENDING ON adatnév-1]
[{ASCENDING }
[{          } KEY IS adatnév-2[adatnév-3]...]...
[{DESCENDING}
[INDEXED BY indexnév-1 [indexnév-2]...]

Az OCCURS bejegyzés segítségével nemcsak vektorokat, hanem két- vagy háromdimenziós tömböket is definiálhatunk oly módon, hogy egy OCCURS-t tartalmazó adatmező részeinek leírásában is OCCURS bejegyzést szerepeltetünk.

A SEARCH utasítás segítségével egy adott feltételt kielégítő tömbelem a tömbben megkereshető és a megfelelő indexnév olyan értékre állítható be, hogy az indexnév a keresett elemre mutasson.
Ha egy teljes többdimenziós tömböt akarunk a SEARCH utasítással végigkutatni, akkor az utasítást minden dimenzióra külön végre kell hajtani az indexértékek megfelelő beállítása után.

A SET utasítás a tömbökhöz tartozó indexnevek értékének beállítására szolgál.

Mutatók

Az eredeti Cobol nyelvtől a mutató fogalma teljesen idegen. Azonban léteznek olyan implementációk, amelyben bevezették a mutatókat, főként a más nyelven írt kódrészletekkel való együttműködés támogatására, valamint a dinamikus memória foglalás miatt. Az MVS világában a COBOL II hozta be a mutatókat a COBOL egyes verzióiba.

Hogyan lehet mutatót létrehozni?

"USAGE IS POINTER" szavakkal, PICTURE nélkül.

Pl:
05 EXAMPLE-P USAGE IS POINTER.

ahol EXAMPLE-P egy 4 byte-os mező, ahol az adat memóriabeli címe van.

Ezek a címek jöhetnek más programból, mint paraméter, vagy paraméter egy része.

Egy adatnak(közvetlenül) mi is meg tudjuk adni a memóriabeli címét:

SET EXAMPLE-P TO ADDRESS OF LINKAGE-THING.

Ahol a LINKAGE-THING valamilyen adat, ami a LINKAGE SECTION részben deklarálva van. A WORKING-STORAGE részbeli adatoknak a memória címét is meg lehet tudni, de ehhez egy külön alprogramra van szükség.

Műveletek mutatókkal

A NULL egy speciális érték. Ha egy pointer egyenlő a NULL értékkel, akkor nem mutat sehova. Ha egy NULL pointert próbálunk "dereference"-elni, a program abortálni fog.

A mutatókra tett megjegyzések a VS COBOL II-n alapszanak. Egyes COBOL verziók ezektől eltérhetnek. Például a VAX COBOL nem támogatja a SET ADDRESS-t. Az AS/400 COBOL a SET utasítás helyett a MOVE-ot használja ahhoz, hogy pointerhez egy értéket adjon hozzá.

Táblagenerálás

A COBOL nyelvbe beépített táblagenerátor az adatfeldolgozási eredménytáblázatok elkészítését automatizálja olyan módon, hogy a felhasználónak elsősorban a tábla formáját, az adatoknak a táblán belüli elrendezését kell meghatároznia, és viszonylag keveset törődnie a tábla elemeinek előállítását végző eljárásokkal.

Minden tábla tételcsoportokból áll, amelyek tételekből épülnek fel. Ily módon lehet hivatkozni tételcsoportokra, ami egyben a tételcsoporton belüli tételekre való hivatkozást is jelenti. Egy-egy tétel a táblázatban egy vagy több sort foglalhat el.

A táblagenerátor két különleges regisztert használ:

A táblagenerátor csak az adatleíró főrészben és az eljárási főrészben igényel új bejegyzéseket ill. utasításokat.

Adatleíró főrész táblagenerálásra vonatkozó bejegyzései:

A FILE-SECTION-ban a megfelelő FD szintkódú file-leírást a REPORT bejegyzéssel kell kiegészíteni, amelyik megadja az elkészítendő táblák neveit. A FILE-SECTION-ban felsorolt táblák részletes leírását egy új rész, a REPORT SECTION tartalmazza. Itt minden táblához kétféle bejegyzés tartozik:

Táblaleírás:

A táblaleírás a táblázat szerkezetét tartalmazza. A táblázathoz tartozó lapot az egy lapra kerülő sorok számával, valamint a fejlécek, a lapvégi és a közbenső tételek szerkezetének leírásával kell specifikálni.

Tételcsoportleírás:

A táblák alkotórészeit, a tételcsoportokat, az adatleíró főrészben megismert rekordleíráshoz hasonló módon tételcsoport-definiálással kell megadni. Minden tételcsoport egymás alá illetve egymás mellé rendelt mezők halmaza.

Eljárási főrész táblagenerálásra vonatkozó bejegyzései:

Az eljárási főrészben a tábla elkészítéséhez három utasítás használható: