2010-01-04 8 views
4

Dire que j'ai la table de longueur variable suivante définie dans WORKING-STORAGE ...Répartition de la mémoire dans les tableaux de longueur variable

01 SOAP-RECORD.           
    05 SOAP-INPUT  PIC X(8)   VALUE SPACES. 
    05 SOAP-STATUS  PIC 9    VALUE ZERO.       
    05 SOAP-MESSAGE  PIC X(50)   VALUE SPACES. 
    05 SOAP-ITEMS  OCCURS 0 TO 500 TIMES 
          DEPENDING ON ITEM-COUNT 
          INDEXED BY ITEM-X.  
     10 SI-SUB-ITEMS OCCURS 0 TO 100 TIMES 
          DEPENDING ON SUB-COUNT 
          INDEXED BY SUB-X.  
      15 SS-KEY  PIC X(8)   VALUE SPACES. 
      15 SS-AMOUNT PIC -9(7).99  VALUE ZEROS. 
      15 SS-DESCR PIC x(100)  VALUE SPACES. 

Lorsque ce programme est exécuté, il va allouer un premier temps autant d'espace que ce tableau pourrait peut-être besoin, ou est-ce plus dynamique sur l'allocation de la mémoire? Je suppose que la clause DEPENDING ON le rendrait plus dynamique dans le sens où il allouerait plus de mémoire car la variable ITEM-COUNT est incrémentée. Un collègue me dit le contraire, mais il n'est pas sûr à 100%. Donc, j'aimerais vraiment savoir comment cela fonctionne afin de structurer mon programme aussi efficacement que possible. PS: Oui, je am écrit un nouveau programme COBOL! C'est en fait un service web CICS. Je ne pense pas que ce langage mourra jamais :(

Répondre

6

Vous ne mentionnez pas quel compilateur vous utilisez, mais, au moins jusqu'à la norme COBOL 2002 actuelle, l'espace alloué pour un OCCURS. Il n'est pas obligatoire que l'élément de données .DEPENDING ON (ODO) soit dynamique (il s'agit uniquement du nombre d'occurrences et non de la longueur de l'élément de données qui varie). Bien que votre fournisseur de compilateur ait peut-être implémenté une extension Je ne suis pas au courant de tout fournisseur qui a fait dans ce domaine.

la prochaine, mais pas encore approuvé, révision de la norme inclut le support des tables capacité dynamique avec un nouveau OCCURS le format dynamique.

+0

Bonne réponse ... Une quantité de mémoire suffisante est allouée pour s'adapter à la taille maximale du tableau.La variable DEPENDING ON ne définit que le nombre d'éléments utilisés. Les ODO sont utiles lorsque vous utilisez SEARCH/SEARCH ALL sur des tables de taille variable et d'autres fonctions COBOL. Une discussion complète sur le moment et la raison d'utiliser les ODO serait longue. Mais - il n'y a rien de "dynamique" à propos de l'allocation de mémoire ici. – NealB

+0

Merci pour le commentaire, NealB. Eh bien, je suppose que «EN FONCTION DE» n'est pas une phrase très utile dans COBOL. J'accepte cette réponse, merci Bruce! –

1

Dans le monde de CICS, OCCUR S DEPENDING ON (ODO) peut être utilisé pour créer une table de taille dynamique au moment de l'exécution. Cependant, la façon dont vous déclarez SOAP-RECORD allouera suffisamment de mémoire pour contenir un enregistrement de taille maximale.

les opérations suivantes:

D'abord, déplacer le SOAP-RECORD en LINKAGE SECTION. Les éléments déclarés dans la section de liaison n'ont aucune mémoire allouée pour eux. A ce point vous avez seulement une disposition d'enregistrement. Laisser la déclaration de ITEM-COUNT et SUB-COUNT dans WORKING-STORAGE.

Ensuite, déclarer un pointeur et une longueur WORKING-STORAGE quelque chose comme:

77 SOAP-PTR  USAGE POINTER. 
77 SOAP-LENGTH PIC S9(8) BINARY. 

Enfin, dans le PROCEDURE DIVISION: Définissez la taille du tableau dimensions à des valeurs réelles; allouer le quantité appropriée de mémoire, puis connectez les deux. Par exemple:

MOVE 200 TO ITEM-COUNT 
MOVE 15 TO SUB-COUNT 
MOVE LENGTH OF SOAP-RECORD TO SOAP-LENGTH 
EXEC CICS GETMAIN 
    BELOW 
    USERDATAKEY 
    SET(SOAP-PTR) 
    FLENGTH(SOAP-LENGTH) 
END-EXEC 
SET ADDRESS OF SOAP-RECORD TO SOAP-PTR 

Cela n'allouer suffisamment de mémoire pour stocker un SOAP-RECORD avec 200 SOAP-ÉLÉMENTS dont chacun contient 15 SI-SOUS-POINTS.

Notez que, par opposition à l' registre LENGTH OF vous donne la taille de SOAP-RECORD sur la base des valeurs d'objet ODO (ITEM-COUNT, SOUS-COUNT) le nombre maximal de OCCURS.

Très important ... N'oubliez pas de libérer la mémoire lorsque vous avez terminé!

+1

S'il vous plaît montrer comment libérer –

+0

@NealB Wow, idée géniale! Je n'ai même jamais pensé à la section de liaison. Je pourrais juste essayer, bien que j'ai déjà fini par utiliser une solution complètement différente en utilisant des files d'attente TS. Corrigez-moi si je me trompe, mais pour libérer la mémoire, j'appellerais simplement le 'FREEMAIN', en passant l'adresse de mon pointeur. –

+0

@Josh Stodola. Utilisation correcte FREEMAIN. BTW. Vous pouvez faire quelque chose de similaire dans un programme non-CICS en utilisant les routines LE pour allouer/désallouer la mémoire. – NealB

Questions connexes