Ce que vous essayez de définir est un « complexe Survient Selon » structure (ODO complexe).
Vous peut définir un ODO complexe où la table est rectaguar comme suit:
01 TABLE-REC.
05 M PIC S9(4) BINARY.
05 N PIC S9(4) BINARY.
05 ROWS OCCURS 10 TIMES DEPENDING ON M.
10 COLUMNS OCCURS 10 TIMES DEPENDING ON N.
20 CELL PIC X(1).
L'astuce est que la déclaration de N ne peut pas avoir lieu dans la partie variable de la table. Par exemple, la déclaration suivante:
01 TABLE-REC.
05 M PIC S9(4) BINARY.
05 ROWS OCCURS 1 TO 10 TIMES DEPENDING ON M.
10 N PIC S9(4) BINARY
10 COLUMNS OCCURS 1 TO 10 TIMES DEPENDING ON N.
20 CELL PIC X(1).
vous donnera une erreur parce que la déclaration implique que chaque ligne peut contenir un nombre différent de colonnes (non une table rectangulaire.).
En général, il y a beaucoup de confusion quant à ce qu'une structure ODO dans COBOL vous "achète" vraiment. Il y a une vue commune, mais erronée, qu'il peut être utilisé pour économiser de la mémoire parce que la taille de la structure de données peut être dimensionnée dynamiquement. C'est absolument faux lorsque l'ODO est déclarée sous LOCAL ou WORKING STORAGE. Le compilateur COBOL allouer suffisamment de mémoire pour accueillir la plus grande valeur de M et N.
Ce qu'il fait « acheter » vous est un mécanisme pour organiser physiquement les données en mémoire. Regardez le programme suivant et ce il affiche:
IDENTIFICATION DIVISION.
PROGRAM-ID. EXODO.
DATA DIVISION.
WORKING-STORAGE SECTION.
77 I PIC S9(4) BINARY.
77 J PIC S9(4) BINARY.
01 DIMENSIONS.
05 M PIC S9(4) BINARY VALUE 6.
05 N PIC S9(4) BINARY VALUE 7.
01 TABLE-REC-1.
05 ROWS OCCURS 1 TO 10 TIMES DEPENDING ON M.
10 COLUMNS OCCURS 1 TO 10 TIMES DEPENDING ON N.
20 CELL PIC X(1).
01 TABLE-REC-2.
05 ROWS OCCURS 10 TIMES.
10 COLUMNS OCCURS 10 TIMES.
20 CELL PIC X(1).
PROCEDURE DIVISION.
PERFORM VARYING I FROM 1 BY 1 UNTIL I > M
PERFORM VARYING J FROM 1 BY 1 UNTIL J > N
MOVE 'X' TO CELL OF TABLE-REC-1 (I J)
MOVE 'X' TO CELL OF TABLE-REC-2 (I J)
END-PERFORM
END-PERFORM
DISPLAY TABLE-REC-1
DISPLAY TABLE-REC-2
GOBACK
.
Affiche:
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXX XXXXXXX XXXXXXX XXXXXXX XXXXXXX XXXXXXX
Avis la version ODO a toutes les données bien compated dans une matrice 6 X 7 tandis que la table fixe La version conserve la matrice 10 X 10 avec un groupe de «trous» pour remplir chaque rangée jusqu'à son nombre maximal de OCCURS
. Il y a des moments où cette distinction est importante (le plus souvent ce n'est pas le cas).
Je vois que vous utilisez le Net Express, que je ne connais pas, donc il se peut que vous ayez à bidouiller pour que la partie suivante fonctionne. Avec IBM Enterprise COBOL pour Z/OS, vous pouvez effectuer les opérations suivantes:
Définition d'un ODO dans le programme LINKAGE SECTION
donc pas de mémoire est alloué, il est juste une mise en page d'enregistrement. Ensuite, vous pouvez allouer dynamiquement assez de mémoire pour la taille réelle de la table nécessaire (c'est-à-dire M fois N éléments). Reliez les deux en utilisant quelque chose comme: SET ADDRESS OF ODO-DATA-STRUCTURE TO mem-address
(sous CICS, utilisez GETMAIN et, dans le cas d'utilisation par lots, utilisez CEEGTST pour obtenir de la mémoire). Maintenant, vous avez une structure de données dynamique qui utilise le minimum d'espace et indexera toujours correctement en raison des propriétés de mise en page illustrées ci-dessus.
Il existe d'autres façons d'utiliser (ou de ne pas utiliser) les ODO dans COBOL, mais ce sont les plus courantes que je connaisse.
Il est vrai que Cobol est une vieille langue. Cependant, il est possible de définir des tableaux/tables de longueur variable (voir la réponse de NealB) sans les astuces d'allocation de mémoire utilisées dans les tableaux dynamiques. –