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.
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:
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.
A 88-as szintszám feltételértékek definiálását teszi lehetővé:
Ekkor a SUBFILE-IS-FULL egy logikai értékű kifejezés, ami pontosan akkor igaz, ha STATUS-CODE-ONE tartalma "9M":
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:
Á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:
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:
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:
Az OCCURS bejegyzés formája:
1. forma:
2. forma:
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.
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.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:
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á.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ó: