2010-01-25 19 views
3

Comment définir une matrice MxN bidimensionnelle dans Cobol dont M et N sont de longueur variable?Tableau bidimensionnel de longueur variable dans Cobol

Voici le message que je reçois dans Net Express lorsque vous essayez d'avoir un tableau de variables dans un autre:

COBCH0144S OCCURS DEPENDING subsidiary to OCCURS only allowed with ODOSLIDE 
+1

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. –

Répondre

5

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.

+0

Merci pour l'explication NealB. Suite à la recherche, il s'avère que Net Express nécessite une directive de compilation (ODOSLIDE) dans un projet afin de compiler une structure qui a un Occurrences imbriquées selon. –

1

Vous pouvez définir un tableau de longueur variable multidimensionnel en définissant OCCURS.. DEPENDING ON sur chaque niveau de cote que vous souhaitez atteindre.

Questions connexes