2010-02-16 4 views
0

Allocation of Memory in Variable-Length Tables NealB는 비 CICS COBOL 프로그램에서 메모리를 할당/할당 해제하는 LE 루틴을 언급했습니다.LE 루틴으로 메모리 할당

이것이 어떻게 수행되는지 알고 싶습니다. LE 루틴이 어떻게 호출되는지. (저는 링크 섹션과 SET ADDRESS에 익숙합니다.)

현재 IBM 메인 프레임에 액세스 할 수 없어 온라인 문서에 액세스 할 수 없으므로 일부 코드 스니 j이 나를 깨달을 수 있습니다.

답변

1

거의 모든 IBM 제품 및 기술 문서는 인터넷에서 사용할 수 있습니다. IT는 Language Environment Programming Reference는 당신이 적 LE에 대해 알아야 할 모든 것을 알려줍니다, 분류하지만, 특정 질문에 대한 답을 Book Manger

좀보고 기계에 의존 조금 될 수 있습니다. 익스포트하려는 메모리 관리 루틴은 CEEGTST (메모리 할당)과 CEEFRST (여유 메모리)입니다.

다음은 약간 길지만 LE를 사용하여 간단한 메모리 관리 작업을 수행하는 완전한 IBM Enterprise COBOL 프로그램입니다. 몹시 흥분하지

 
    0001 
    0002 
    0003 
    0004 
    0005 
    LIST HAS BEEN FREED. 

을하지만 어떻게 함께 문자열을 몇 가지에 보여 않습니다

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

이 프로그램은 기록합니다.

2

LE 환경에서는 CEEGTST 및 CEEFRST를 호출하여 저장 공간을 확보하십시오.

둘 다 첫 번째 매개 변수로 12 바이트 결과 토큰을 사용합니다. 널 값을 전달하면 실패시 LE가 비정상 종료됩니다.

두 번째 매개 변수는 주소입니다.

CEEGTST의 경우 세 번째 길이 매개 변수도 전달합니다.

예 할당합니다 :

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

예는 무료로 : 나는 당신의 예제와 설명이 올바른 생각하지 않는다

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

. [CEEGTST - 힙 스토리지 확보] (http://publibfp.boulder.ibm.com/cgi-bin/bookmgr/BOOKS/CEEA3160/2.2.5.38?DT=20050629120436) - 첫 번째 매개 변수는 힙 ID이고, 세 번째 매개 변수는 힙 ID입니다. 12 바이트의 결과 토큰 첫 번째 매개 변수로 0을 전달하면 사용자 힙에서 메모리 할당이 요청됩니다. [CEEFRST - 무료 힙 저장] (http://publibfp.boulder.ibm.com/cgi-bin/bookmgr/BOOKS/CEEA3160/2.2.5.32?DT=20050629120436)의 경우와 마찬가지로 마지막 (두 번째) 매개 변수는 결과 토큰입니다 . – NealB

+0

사실, 나는 heapid와 fc parms를 섞었다. CEEGTST에 대한 올바른 서명은 CEEGTST (힙, 크기, 주소, fc)이며, 비정상 종료가 발생할 경우 FC를 생략 할 수 있습니다. –

+0

또한 CEEFRST에 대한 올바른 서명은 (주소, fc)입니다. 죄송합니다. –