[successivo] [precedente] [inizio] [fine] [indice generale] [indice ridotto] [indice analitico] [volume] [parte]


Capitolo 573.   Descrizione delle variabili

Lo schema sintattico seguente descrive la dichiarazione delle variabili per i livelli da 01 a 49 e per il livello 77:

              .--           --.
              |  data-name-1  |
level-number  |               |  [REDEFINES data-name-2]
              |  FILLER       |   ¯¯¯¯¯¯¯¯¯
              `--¯¯¯¯¯¯     --'

              .--  /         \                     --.
              |    | PICTURE |                       |
              |    < ¯¯¯¯¯¯¯ >  IS character-string  |
              |    | PIC     |                       |
              `--  \ ¯¯¯     /                     --'

              .--            /                   \  --.
              |              |  COMPUTATIONAL    |    |
              |              |  ¯¯¯¯¯¯¯¯¯¯¯¯¯    |    |
              |              |  COMP             |    |
              |  [USAGE IS]  <  ¯¯¯¯             >    |
              |   ¯¯¯¯¯      |  DISPLAY          |    |
              |              |  ¯¯¯¯¯¯¯          |    |
              |              |  INDEX            |    |
              `--            \  ¯¯¯¯¯            /  --'

              .--           /            \                      --.
              |             |  LEADING   |                        |
              |  [SIGN IS]  <  ¯¯¯¯¯¯¯   >  [SEPARATE CHARACTER]  |
              |   ¯¯¯¯      |  TRAILING  |   ¯¯¯¯¯¯¯¯             |
              `--           \  ¯¯¯¯¯¯¯¯  /                      --'

              .--        /                                                           \  --.
              |          |               integer-2 TIMES                             |    |
              |  OCCURS  <                                                           >    |
              |  ¯¯¯¯¯¯  |  integer-1 TO integer-2 TIMES [DEPENDING ON data-name-3]  |    |
              |          \            ¯¯                  ¯¯¯¯¯¯¯¯¯                  /    |
              |                                                                           |
              |          .--  /              \                          --.               |
              |          |    |  ASCENDING   |                            |               |
              |          |    <  ¯¯¯¯¯¯¯¯¯   >  KEY IS  {data-name-4}...  |...            |
              |          |    |  DESCENDING  |                            |               |
              |          `--  \  ¯¯¯¯¯¯¯¯¯¯  /                          --'               |
              |                                                                           |
              |          [ INDEXED BY  {index-name-1}... ]                                |
              `--          ¯¯¯¯¯¯¯                                                      --'

              .--  /                \  .--     --.  --.
              |    |  SYNCHRONIZED  |  |  LEFT   |    |
              |    <  ¯¯¯¯¯¯¯¯¯¯¯¯  >  |  ¯¯¯¯   |    |
              |    |  SYNC          |  |  RIGHT  |    |
              `--  \  ¯¯¯¯          /  `--¯¯¯¯¯--'  --'

              .--  /             \         --.
              |    |  JUSTIFIED  |           |
              |    <  ¯¯¯¯¯¯¯¯¯  >  RIGHT    |
              |    |  JUST       |  ¯¯¯¯¯    |
              `--  \  ¯¯¯¯       /         --'

              [ BLANK WHEN ZERO ]
                ¯¯¯¯¯      ¯¯¯¯
              [ VALUE IS literal-1 ].
                ¯¯¯¯¯

Formato per il livello 66:

                                      .--  /           \             --.
                                      |    |  THROUGH  |               |
66  data-name-1  RENAMES data-name-2  |    <  ¯¯¯¯¯¯¯  >  data-name-3  | .
                 ¯¯¯¯¯¯¯              |    |  THRU     |               |
                                      `--  \  ¯¯¯¯     /             --'

Formato per il livello 88:

                   /            \ /           .-- /         \          --. \
                   | VALUE IS   | |           |   | THROUGH |            | |
88  condition-name < ¯¯¯¯¯      > < literal-1 |   < ¯¯¯¯¯¯¯ > literal-2  | >... .
                   | VALUES ARE | |           |   | THRU    |            | |
                   \ ¯¯¯¯¯¯     / \           `-- \ ¯¯¯¯    /          --' /

Nel primo schema, l'indicazione del nome della variabile, che si vede in alternativa alla parola chiave FILLER, deve apparire immediatamente dopo il numero di livello; inoltre, se si usa la parola chiave REDEFINES, questa segue immediatamente il nome della variabile. Il resto delle opzioni può essere inserito con l'ordine che si preferisce, rispettando comunque lo schema e l'eventuale interdipendenza che c'è tra le opzioni stesse.

L'opzione che definisce il modello di definizione della variabile, introdotta dalla parola chiave PICTURE, deve essere usata per ogni variabile che non si scompone ulteriormente e non può essere usata negli altri casi. Nello stesso modo, le opzioni SYNCHRONIZED, JUSTIFIED e BLANK WHEN ZERO si possono usare solo per le variabili terminali (che non si scompongono).

Il valore iniziale delle variabili, a eccezione del tipo INDEX, si specifica con l'opzione introdotta dalla parola chiave VALUE. Quando non si usa o non si può usare questa opzione, il valore iniziale delle variabile non è conosciuto e non può essere previsto.

La descrizione dei nomi di condizione (livello 88) è disponibile nella sezione 575.1, mentre per quella riguardante i raggruppamenti alternativi di variabili si può consultare la sezione 575.2.

573.1   Oggetto della dichiarazione

La dichiarazione di una variabile (livelli da 01 a 49 e 77) avviene indicandone il nome subito dopo il numero di livello. Il nome della variable può non essere univoco nell'ambito del programma, purché sia possibile individuare correttamente la variabile attraverso la qualificazione (sezione 575.3).

Al posto di indicare il nome di una variabile, è possibile mettere la parola chiave FILLER, quando il campo a cui fa riferimento non viene mai utilizzato direttamente. Naturalmente, l'uso di questa parola chiave non è ammissibile in un livello 77, perché non avrebbe senso dichiarare una variabile scalare, indipendente da qualunque altra, senza avere poi la possibilità di utilizzarla nel programma.

573.2   Ridefinizione di una variabile

L'opzione REDEFINES può essere usata soltanto quando si dichiara una variabile, nell'ambito dei livelli da 01 a 49 (si esclude quindi l'uso della parola chiave FILLER), allo scopo di ridefinire la struttura di un'altra variabile che si trova allo stesso livello.

000000 01  MIO-RECORD.
000000     02  A
000000         03  B                            PIC X(10).
000000         03  C                            PIC X(10).
000000     02  D REDEFINES A.
000000         03  E                            PIC X(5).
000000         03  F                            PIC X(10).
000000         03  G                            PIC X(5).
000000     02  H ...
...

L'esempio mostra che il campo A è composto complessivamente da 20 caratteri, a cui si accede con i campi B e C per i primi 10 e gli ultimi 10 rispettivamente. La ridefinizione successiva, consente di accedere a una porzione centrale, a cavallo dei campi B e C, con il campo F.

000100 IDENTIFICATION DIVISION.
000200 PROGRAM-ID.   PICTURE-REDEFINES.
000300 AUTHOR.       DANIELE GIACOMINI.
000400 DATE-WRITTEN. 2005-02-25.
000500*
000600 ENVIRONMENT DIVISION.
000700*
000800 DATA DIVISION.
000900*
001000 WORKING-STORAGE SECTION.
001100 01  RECORD-A.
001200     02  P        PICTURE X(10)        USAGE IS DISPLAY.
001300     02  Q        PICTURE X(10)        USAGE IS DISPLAY.
001400 01  RECORD-B REDEFINES RECORD-A.
001500     02  R        PICTURE X(5)         USAGE IS DISPLAY.
001600     02  S        PICTURE X(10)        USAGE IS DISPLAY.
001700     02  T        PICTURE X(5)         USAGE IS DISPLAY.
001800*
001900 PROCEDURE DIVISION.
002000*
002100 MAIN.
002200     MOVE "ABCDEFGHIJKLMNOPQRST" TO RECORD-A.
002300     DISPLAY "P: ", P.
002400     DISPLAY "Q: ", Q.
002500     DISPLAY "R: ", R.
002600     DISPLAY "S: ", S.
002700     DISPLAY "T: ", T.
002800*
002900     STOP RUN.
003000*

Questo esempio ulteriore mostra un piccolo programma completo, che dimostra il funzionamento della ridefinizione, visualizzando le variabili associate a RECORD-A e a RECORD-B, che ridefinisce il primo. Se si compila questo programma con TinyCOBOL o con OpenCOBOL, l'avvio dell'eseguibile che si ottiene genera il risultato seguente:

P: ABCDEFGHIJ
Q: KLMNOPQRST
R: ABCDE
S: FGHIJKLMNO
T: PQRST

573.3   Opzione «PICTURE»

Attraverso l'opzione PICTURE, che è obbligatoria per le variabili che non si scompongono in livelli inferiori, si definisce precisamente come è fatta la variabile. L'argomento dell'opzione è una stringa che descrive la variabile.

Il modo in cui si rappresenta il modello delle variabili è molto articolato e viene descritto nel capitolo 576.

573.4   Opzione «USAGE»

Per il linguaggio COBOL, il contenuto di una variabile può essere solo di due tipi: alfanumerico o numerico. Una variabile dichiarata per contenere valori alfanumerici, utilizza un formato a «caratteri» (normalmente si tratta della codifica ASCII o EBCDIC), mentre per i valori numerici ci sono delle alternative. Attraverso l'opzione USAGE si può specificare il modo in cui la variabile deve contenere i dati.

            /                   \
            |  COMPUTATIONAL    |
            |  ¯¯¯¯¯¯¯¯¯¯¯¯¯    |
            |  COMP             |
[USAGE IS]  <  ¯¯¯¯             >
 ¯¯¯¯¯      |  DISPLAY          |
            |  ¯¯¯¯¯¯¯          |
            |  INDEX            |
            \  ¯¯¯¯¯            /

Il formato definito dalla parola chiave DISPLAY corrisponde a un'organizzazione a caratteri. Si tratta evidentemente del formato necessario per le variabili alfanumeriche, ma può essere usato anche per le variabili numeriche.

Il formato COMPUTATIONAL, abbreviabile anche con COMP, può essere usato soltanto per i valori numerici e richiede l'utilizzo di 4 bit per ogni cifra numerica e anche per il segno (se specificato).

Il formato INDEX serve a dichiarare una variabile speciale, che può rappresentare soltanto numeri interi senza segno. Non si può associare un modello di definizione della variabile quando il formato è INDEX, perché la dimensione è fissa e dipende dal compilatore. L'uso di queste variabili è anche limitato a certi contesti (di solito ne è ammesso l'uso negli indici delle tabelle ed eventualmente nei contatori delle iterazioni) e queste variabili si dichiarano soltanto con un livello 77 in modo da essere svincolati da una struttura a record.

L'opzione USAGE va usata principalmente nella descrizione di variabili terminali; teoricamente si può indicare l'opzione USAGE anche per variabili che si suddividono in campi e in tal caso i livelli gerarchicamente inferiori ereditano l'opzione da quelli superiori. Tuttavia, è meglio evitare questa pratica e limitarsi a usare l'opzione USAGE soltanto sui campi terminali, tenendo conto che così i campi composti sono implicitamente di tipo DISPLAY.

Volendo assegnare a una variabile strutturata un tipo diverso da DISPLAY, si otterrebbe solamente di assegnare questa caratteristica ai livelli inferiori, perché una variabile strutturata, ammesso che la si voglia utilizzare direttamente, nel suo complesso, può funzionare soltanto come DISPLAY. Come conseguenza, una variabile strutturata può essere formata soltanto da un numero intero di byte.

Quando si dichiarano su uno stesso livello variabili numeriche organizzate secondo il formato COMPUTATIONAL, queste utilizzano regolarmente lo spazio loro assegnato, condividendo eventualmente i byte che dovessero trovarsi a cavallo tra una e l'altra; tuttavia, nell'ambito della variabile composta che contiene questi livelli, i dati devono occupare una quantità di byte intera, pertanto si può perdere eventualmente un po' di spazio alla fine.

Figura 573.8. Confronto fra due variabili strutturate.

01  A.                          01  B.
                                    02  I.
    03  P PIC 9    COMP.                03  P PIC 9    COMP.
                                    02  J.
    03  Q PIC S99  COMP.                03  Q PIC S99  COMP.
                                    02  K.
    03  R PIC 999  COMP.                03  R PIC 999  COMP.
                                    02  L.
    03  S PIC 9    COMP.                03  S PIC 9    COMP.
    03  T PIC X.                        03  T PIC X.

-------------------------------------------------------------

 9 S 9 9 9 9 9 9 0 -X-          9 0 S 9 9 0 9 9 9 0 9 0 -X-
|_|_____|_____|_| |___|        |_| |_____| |_____| |_| |___|
 |   |     |   |    |           |     |       |     |    |
 P   Q     R   S    T           P     Q       R     S    T
|_____________________|        |___|_______|_______|_______|
        |                        |     |       |       |
        A                        I     J       K       L
                               |___________________________|
                                             |
                                             B

La figura dovrebbe essere sufficiente per capire come viene utilizzata la memoria per la rappresentazione delle variabili COMPUTATIONAL. Si può osservare che la variabile strutturata A ha soltanto uno spreco di una cifra COMPUTATIONAL, ovvero 4 bit, mentre la variabile B, avendo un'organizzazione differente nella sua struttura sottostante, spreca più spazio.

Molti compilatori COBOL considerano anche il tipo numerico COMPUTATIONAL-3, o COMP-3. Si tratta di una variante del tipo COMPUTATIONAL, con l'indicazione del segno o dell'assenza del segno, nel gruppo di 4 bit meno significativo (quello più a destra).

La maggior parte dei manuali COBOL sottolinea il fatto che per eseguire delle elaborazioni numeriche (dei calcoli matematici di qualunque tipo) è bene che le variabili utilizzate siano di tipo COMPUTATIONAL, perché se le variabili sono ti tipo DISPLAY, prima di poter essere utilizzate devono essere convertite.

573.5   Opzione «SIGN»

Quando si dichiarano variabili numeriche che prevedono l'indicazione del segno, è possibile stabilire in che modo e in quale posizione deve trovarsi, con l'opzione SIGN:

           /            \                      
           |  LEADING   |                      
[SIGN IS]  <  ¯¯¯¯¯¯¯   >  [SEPARATE CHARACTER]
 ¯¯¯¯      |  TRAILING  |   ¯¯¯¯¯¯¯¯           
           \  ¯¯¯¯¯¯¯¯  /                      

Le variabili numeriche di tipo DISPLAY, in condizioni normali, incorporano il segno nel byte più significativo. Quando si vuole richiedere che il segno occupi un byte tutto per sé, è necessario usare la parola chiave SEPARATE. Per le variabili di tipo COMPUTATIONAL il segno occupa sempre uno spazio separato rispetto a quello delle cifre numeriche.

Se si utilizza la parola chiave LEADING, il segno viene collocato a sinistra (e di norma questo è il comportamento predefinito); se invece si usa la parola chiave TRAILING, il segno viene collocato nella posizione più a destra.

573.6   Opzione «OCCURS»

La parola chiave OCCURS introduce un gruppo di informazioni che consentono di indicare che la variabile a cui fanno riferimento viene ripetuta secondo certe modalità. Attraverso questo meccanismo si creano quelle che per il COBOL sono delle tabelle.

        /                                                           \
        |               integer-2 TIMES                             |
OCCURS  <                                                           >
¯¯¯¯¯¯  |  integer-1 TO integer-2 TIMES [DEPENDING ON data-name-3]  |
        \            ¯¯                  ¯¯¯¯¯¯¯¯¯                  /
                                                                     
        .--  /              \                          --.           
        |    |  ASCENDING   |                            |           
        |    <  ¯¯¯¯¯¯¯¯¯   >  KEY IS  {data-name-4}...  |...        
        |    |  DESCENDING  |                            |           
        `--  \  ¯¯¯¯¯¯¯¯¯¯  /                          --'           
                                                                     
        [ INDEXED BY  {index-name-1}... ]                            
          ¯¯¯¯¯¯¯

La variabile ricorrente di una tabella può ripetersi per un numero fisso di elementi (integer-2), oppure per un numero variabile, nell'ambito di un intervallo stabilito (da integer-1 a integer-2), sotto il controllo di un'altra variabile (data-name-3).

Se l'insieme degli elementi della tabella dichiarata con l'opzione OCCURS è ordinato in base a una chiave, questa può essere specificata (index-name-1); inoltre, l'indice per accedere agli elementi può essere dichiarato contestualmente già in questa fase (index-name-1).

Per maggiori dettagli, si veda il capitolo 574, che è dedicato solo alle tabelle del COBOL.

573.7   Opzione «SYNCHRONIZED»

L'opzione SYNCHRONIZED avrebbe lo scopo di allineare una variabile numerica nei limiti di una o più «parole», secondo l'architettura usata nell'elaboratore per il quale è realizzato il compilatore.

/                \  .--     --.
|  SYNCHRONIZED  |  |  LEFT   |
<  ¯¯¯¯¯¯¯¯¯¯¯¯  >  |  ¯¯¯¯   |
|  SYNC          |  |  RIGHT  |
\  ¯¯¯¯          /  `--¯¯¯¯¯--'

Teoricamente, l'uso dell'opzione SYNCHRONIZED avrebbe lo scopo di facilitare le elaborazioni numeriche, ma si creano delle complicazioni nel modo di determinare la dimensione effettiva delle variabili, soprattutto quando si vogliono ridefinire.

Per scrivere programmi COBOL compatibili tra i vari sistemi operativi e le architetture fisiche degli elaboratori, è meglio evitare l'uso di variabili SYNCHRONIZED; tuttavia, se si preferisce comunque usare questa funzione, diventa necessario consultare il manuale specifico del proprio compilatore.

573.8   Opzione «JUSTIFIED RIGHT»

Le variabili alfabetiche o alfanumeriche possono essere dichiarate con l'opzione JUSTIFIED, per fare in modo che ricevano i dati allineandoli a destra:

/             \
|  JUSTIFIED  |
<  ¯¯¯¯¯¯¯¯¯  >  RIGHT
|  JUST       |  ¯¯¯¯¯
\  ¯¯¯¯       /

Normalmente, quando si «invia» una stringa in una variabile alfanumerica, la copia inizia da sinistra a destra: se la variabile ricevente è più piccola della stringa, questa viene troncata alla destra; se la variabile ricevente è più grande, si aggiungono alla destra degli spazi.

Quando si usa l'opzione JUSTIFIED per una variabile (ricevente), la copia di una stringa avviene con un allineamento opposto, pertanto il troncamento avviene a sinistra e così anche l'aggiunta degli spazi ulteriori.

573.9   Opzione «BLANK WHEN ZERO»

L'opzione BLANK WHEN ZERO si può utilizzare solo per le variabili numeriche scalari, dove ogni cifra utilizza un byte intero. L'opzione fa sì che gli zeri anteriori vengano sostituiti da spazi, a meno che il modello di definizione della variabile preveda diversamente.

[ BLANK WHEN ZERO ]
  ¯¯¯¯¯      ¯¯¯¯

573.10   Opzione «VALUE»

Convenzionalmente, una variabile che viene dichiarata nei livelli da 01 a 49 e 77, non ha inizialmente un valore prestabilito, ma solo casuale. Per stabilire un valore da attribuire a una variabile nel momento della sua creazione, si usa l'opzione VALUE:

VALUE IS literal-1
¯¯¯¯¯

La costante che nello schema sintattico è indicata come literal-1, è il valore che viene attribuito inizialmente.

Si osservi che è possibile stabilire un valore iniziale per una variabile, soltanto quando si tratta di qualcosa che viene dichiarato nella sezione WORKING-STORAGE SECTION, perché nella sezione FILE SECTION ciò non è possibile e non avrebbe senso.

L'opzione VALUE si usa anche per la dichiarazione dei nomi di condizione, ma in tal caso la funzione di questa opzione ha un valore differente e non c'è più la discriminazione tra le sezioni in cui si può utilizzare.

573.11   Opzione «RENAMES»

L'opzione RENAMES, che si usa nel livello 66, permette di dichiarare delle variabili che rappresentano un raggruppamento di altre variabili, appartenenti alla stessa struttura, purché queste siano adiacenti. Nella sezione 575.2 viene mostrata la dichiarazione dei raggruppamenti.

Appunti di informatica libera 2007.02 --- Copyright © 2000-2007 Daniele Giacomini -- <daniele (ad) swlibero·org>


Dovrebbe essere possibile fare riferimento a questa pagina anche con il nome descrizione_delle_variabili.htm

[successivo] [precedente] [inizio] [fine] [indice generale] [indice ridotto] [indice analitico]

Valid ISO-HTML!

CSS validator!