2010-02-16 3 views
0

A Allocation of Memory in Variable-Length Tables NealB a mentionné les routines LE pour allouer/désallouer la mémoire dans un programme COBOL non-CICS.Allocation de mémoire avec les routines LE

J'aimerais beaucoup savoir comment cela est fait: comment la routine LE est appelée. (Je connais LINKAGE SECTION et SET ADDRESS.)

Étant donné que je n'ai pas accès à un ordinateur central IBM pour le moment, ce qui signifie qu'il n'y a pas d'accès à la documentation en ligne, certains extraits de code pourraient m'éclairer.

Répondre

1

Presque toute la documentation produit et technique d'IBM est disponible sur Internet. Il peut être un peu une corvée pour trier mais jeter un oeil à Book Manger

Pour répondre à votre question, le Language Environment Programming Reference vous dit à peu près tout ce que vous aurez jamais besoin de savoir sur LE. Les routines de gestion de la mémoire que vous pouvez souhaiter sont: CEEGTST (allouer de la mémoire) et CEEFRST (mémoire libre). Ce qui suit est un peu long, mais il s'agit d'un programme IBM Enterprise COBOL complet qui exécute des tâches simples de gestion de la mémoire à l'aide de LE ( ).

*************************************************** 
    **            ** 
    ** DEMONSTRATION FOR LINKED LIST HANDLING  ** 
    **            ** 
    *************************************************** 
    IDENTIFICATION DIVISION. 
    PROGRAM-ID. LINKLST. 
    DATA DIVISION. 
    WORKING-STORAGE SECTION. 
    01 RET-CDE     PIC 9(3). 
    01 HEAD-OF-LIST   POINTER. 
    LINKAGE SECTION. 
    01 LINK        GLOBAL. 
     02 DATA-PART   PIC 9(4). 
     02 NEXT-PTR    POINTER. 
    PROCEDURE DIVISION. 
     CALL "BULDLST" USING HEAD-OF-LIST, 
          RET-CDE 
     IF RET-CDE = ZERO THEN 
      CALL "SHOWLST" USING HEAD-OF-LIST 
      CALL "FREELST" USING HEAD-OF-LIST 
      IF HEAD-OF-LIST = NULL THEN 
      DISPLAY "LIST HAS BEEN FREED." 
      END-IF 
     END-IF 
     GOBACK 
     . 
    *************************************************** 
    IDENTIFICATION DIVISION. 
    PROGRAM-ID BULDLST. 
    DATA DIVISION. 
    WORKING-STORAGE SECTION. 
    01 I      PIC 9(4). 
    LINKAGE SECTION. 
    01 HEAD-OF-LIST    POINTER. 
    01 RET-CDE     PIC 9(3). 
    PROCEDURE DIVISION USING HEAD-OF-LIST, RET-CDE. 
    MAINLINE SECTION. 
     CALL "MEMALOC" USING BY REFERENCE HEAD-OF-LIST, 
          BY CONTENT LENGTH OF LINK, 
          BY REFERENCE RET-CDE 
     IF RET-CDE = ZERO THEN 
      SET ADDRESS OF LINK TO HEAD-OF-LIST 
      PERFORM VARYING I FROM 1 BY 1 
        UNTIL I > 4 
         OR RET-CDE > ZERO 
      MOVE I TO DATA-PART OF LINK 
      CALL "MEMALOC" USING BY REFERENCE NEXT-PTR OF LINK, 
            BY CONTENT LENGTH OF LINK, 
            BY REFERENCE RET-CDE 
      IF RET-CDE = ZERO THEN 
       SET ADDRESS OF LINK TO NEXT-PTR OF LINK 
      END-IF 
      END-PERFORM 
      IF RET-CDE = ZERO THEN 
      MOVE I TO DATA-PART OF LINK 
      SET NEXT-PTR  OF LINK TO NULL 
      END-IF 
     END-IF 
     GOBACK 
     . 
    END PROGRAM BULDLST. 
    *************************************************** 
    IDENTIFICATION DIVISION. 
    PROGRAM-ID SHOWLST. 
    DATA DIVISION. 
    LINKAGE SECTION. 
    01 HEAD-OF-LIST    POINTER. 
    PROCEDURE DIVISION USING HEAD-OF-LIST. 
    MAINLINE SECTION. 
     SET ADDRESS OF LINK TO HEAD-OF-LIST 
     PERFORM UNTIL ADDRESS OF LINK = NULL 
      DISPLAY DATA-PART 
      SET ADDRESS OF LINK TO NEXT-PTR OF LINK 
     END-PERFORM 
     GOBACK 
     . 
    END PROGRAM SHOWLST. 
    *************************************************** 
    IDENTIFICATION DIVISION. 
    PROGRAM-ID FREELST. 
    DATA DIVISION. 
    WORKING-STORAGE SECTION. 
    01 NXT-PTR     POINTER. 
    01 RET-CDE     PIC 9(3). 
    LINKAGE SECTION. 
    01 HEAD-OF-LIST    POINTER. 
    PROCEDURE DIVISION USING HEAD-OF-LIST. 
    MAINLINE SECTION. 
     MOVE ZERO TO RET-CDE 
     PERFORM UNTIL HEAD-OF-LIST = NULL OR 
        RET-CDE NOT = ZERO 
      SET ADDRESS OF LINK TO HEAD-OF-LIST 
      SET NXT-PTR TO NEXT-PTR OF LINK 
      CALL "MEMFREE" USING HEAD-OF-LIST, RET-CDE 
      SET HEAD-OF-LIST TO NXT-PTR 
     END-PERFORM 
     GOBACK 
     . 
    END PROGRAM FREELST. 
    *************************************************** 
    IDENTIFICATION DIVISION. 
    PROGRAM-ID MEMALOC COMMON PROGRAM. 
    DATA DIVISION. 
    WORKING-STORAGE SECTION. 
    01 HEAPID     PIC S9(9) BINARY. 
    01 FC. 
     02 CONDITION-TOKEN-VALUE. 
     COPY CEEIGZCT. 
      03 CASE-1-CONDITION-ID. 
       04 SEVERITY PIC S9(4) BINARY. 
       04 MSG-NO  PIC S9(4) BINARY. 
      03 CASE-2-CONDITION-ID 
        REDEFINES CASE-1-CONDITION-ID. 
       04 CLASS-CODE PIC S9(4) BINARY. 
       04 CAUSE-CODE PIC S9(4) BINARY. 
      03 CASE-SEV-CTL PIC X. 
      03 FACILITY-ID  PIC XXX. 
     02 I-S-INFO   PIC S9(9) BINARY. 
    LINKAGE SECTION. 
    01 PTR-TO-MEM    POINTER. 
    01 NBR-OF-BYTES    PIC S9(9) BINARY. 
    01 RET-CDE     PIC 9(3). 
    PROCEDURE DIVISION USING PTR-TO-MEM, NBR-OF-BYTES, RET-CDE. 
     MOVE 0 TO HEAPID 
     CALL "CEEGTST" USING HEAPID, 
          NBR-OF-BYTES, 
          PTR-TO-MEM, 
          FC 
     IF CEE000 OF FC THEN 
      MOVE ZERO TO RET-CDE 
     ELSE 
      DISPLAY "CEEGTST FAILED WITH: " MSG-NO OF FC 
      MOVE 1 TO RET-CDE 
      SET PTR-TO-MEM TO NULL 
     END-IF 
     GOBACK. 
    END PROGRAM MEMALOC. 
    *************************************************** 
    IDENTIFICATION DIVISION. 
    PROGRAM-ID MEMFREE COMMON PROGRAM. 
    DATA DIVISION. 
    WORKING-STORAGE SECTION. 
    01 HEAPID     PIC S9(9) BINARY. 
    01 FC. 
     02 CONDITION-TOKEN-VALUE. 
     COPY CEEIGZCT. 
      03 CASE-1-CONDITION-ID. 
       04 SEVERITY PIC S9(4) BINARY. 
       04 MSG-NO  PIC S9(4) BINARY. 
      03 CASE-2-CONDITION-ID 
        REDEFINES CASE-1-CONDITION-ID. 
       04 CLASS-CODE PIC S9(4) BINARY. 
       04 CAUSE-CODE PIC S9(4) BINARY. 
      03 CASE-SEV-CTL PIC X. 
      03 FACILITY-ID  PIC XXX. 
     02 I-S-INFO   PIC S9(9) BINARY. 
    LINKAGE SECTION. 
    01 PTR-TO-MEM    POINTER. 
    01 RET-CDE     PIC 9(3). 
    PROCEDURE DIVISION USING PTR-TO-MEM, RET-CDE. 
     MOVE 0 TO HEAPID 
     CALL "CEEFRST" USING PTR-TO-MEM, 
          FC 
     IF CEE000 OF FC THEN 
      MOVE ZERO TO RET-CDE 
     ELSE 
      DISPLAY "CEEFRST FAILED WITH: " MSG-NO OF FC 
      MOVE 1 TO RET-CDE 
     END-IF 
     GOBACK. 
    END PROGRAM MEMFREE. 
    END PROGRAM LINKLST. 
    *************************************************** 

Le programme écrit:

 
    0001 
    0002 
    0003 
    0004 
    0005 
    LIST HAS BEEN FREED. 

Pas très excitant, mais ne démontre comment la chaîne quelques choses ensemble.

2

Dans un environnement LE, vous appelez CEEGTST et CEEFRST pour obtenir et libérer du stockage. En tant que premier paramètre, ils prennent tous les deux un jeton de résultat de 12 octets - si vous passez la valeur null, LE sera annulé pour vous en cas d'échec.

Le deuxième paramètre est l'adresse.

Dans le cas de CEEGTST, vous passez également un troisième paramètre, longueur.

Exemple d'allouer:

Call 'CEEGTST' using 
    omitted 
    address of some-linkage-item 
    length of some-linkage-item 
End-Call 

Exemple pour libérer:

Call 'CEEFRST' using 
    omitted 
    address of some-linkage-item 
End-Call 
+1

Je ne pense pas que vos exemples et explications sont correctes. Voir [CEEGTST - Obtenir le stockage en tas] (http://publibfp.boulder.ibm.com/cgi-bin/bookmgr/BOOKS/CEEA3160/2.2.5.38?DT=20050629120436) - Le premier paramètre est l'identifiant du tas, le troisième est le jeton de résultat de 12 octets. Passer un zéro comme le premier paramètre demande l'allocation de mémoire à partir du tas utilisateur. Similaire pour [CEEFRST - Free heap storage] (http://publibfp.boulder.ibm.com/cgi-bin/bookmgr/BOOKS/CEEA3160/2.2.5.32?DT=20050629120436) le dernier (second) paramètre est le jeton de résultat . – NealB

+0

Vrai, j'ai mélangé les paramètres heapid et fc. La signature correcte pour CEEGTST est CEEGTST (tas, taille, adresse, fc) et vous pouvez omettre FC si vous voulez un échec pour provoquer une fin anormale. –

+0

En outre, la signature correcte pour CEEFRST est (adresse, fc). Désolé pour l'erreur. –