2013-04-25 2 views
1

저는 두 가지 주요 함수를 호출합니다. 두 번째 함수 (Decrypt)는 첫 번째 함수 (Encrypt)를 호출합니다. 여기에서는 Encrypt가 두 번 호출됩니다. 한번은 메인에, 그리고 한번은 디 크립트 내부에 있습니다.COBOL의 함수를 두 번 이상 호출하십시오.

문제는이 방법으로 작업을 거부한다는 것입니다. 일단 Encrypt가 주에서 사용되면, 프로그램에서 아무 곳에서나 Encrypt를 다시 사용할 수 없습니다. 변수가 여전히 사용 중이며 새로운 변수를 전달할 수 없습니다.

예를 들어, 주 기능에서 Encrypt를 제거하고 Decrypt를 호출하는 경우 - 정상적으로 작동합니다. 나는 이유를 알 수 없다.

IDENTIFICATION DIVISION. 
PROGRAM-ID. CAESER-1-CIPHER. 
DATA DIVISION. 
PROCEDURE DIVISION 
CALL 'ENCRYPT' USING BY CONTENT INPUTE CIPHERE. 
CALL 'DECRYPT' USING BY CONTENT INPUTD CIPHERD. 
STOP RUN. 

IDENTIFICATION DIVISION. 
PROGRAM-ID. ENCRYPT. 
DATA DIVISION. 
PROCEDURE DIVISION BLAH BLAH 
BLAH BLAH COMPUTE 
END PROGRAM ENCRYPT. 

IDENTIFICATION DIVISION. 
PROGRAM-ID. DECRYPT. 
DATA DIVISION. 
PROCEDURE DIVISION BLAH BLAH 
CALL 'ENCRYPT' USING BY CONTENT BLAH BLAH 
EXIT PROGRAM. 
END PROGRAM DECRYPT. 

답변

1

, 나는 DECRYPT 더 많은 문제를 expeced 것이다. 이것이 이유입니다 ...

프로그램 ENCRYPTDECRYPT은 프로그램에 2 개의 중첩 된 프로그램이 포함되어 있습니다. 까지 ENCRYPTDECRYPTCOMMON 개의 프로그램으로 선언 할 때까지 중첩 수준이 높은 프로그램 (예 : SER-1-CIPHER)만이 그 안에 중첩 된 프로그램을 "볼"수 있으므로 서로를 "볼"수 없습니다. 이는 중첩 된 프로그램에 대한 Open Cobol Programmers Guide에서 설명합니다.

으로 중첩 된 프로그램을 선언하십시오 :

PROGRAM-ID. ENCRYPT IS COMMON. 
PROGRAM-ID. DECRYPT IS COMMON. 

이 방법은 프로그램 암호 해독 ENCRYPT를 호출 할 수 있습니다.

다음, 내가 운영 체제 또는 호출 프로그램에 제어를 반환 할 때 STOP RUNEXIT PROGRAM의 장소에서 GOBACK를 사용하는 것이 좋습니다 것입니다. OpenCobol Programmers Guide는 또한이 권장 사항을 제시합니다.

마지막으로 각 서브 프로그램은 마지막 문장으로 GOBACK을 포함해야합니다. ENCRYPT의 동작에 어떤 종류의 명시적인 return 문이있는 이 없는지 확실하지 않습니다. 실제 프로그램에이 내용이있을 수 있지만 질문의 코드 예는 그렇지 않습니다.

Open Cobol은 중첩 된 프로그램 사이에서 재귀하는 데 제한이없는 것 같지만 COBOL의 일부 버전에서는 이이를 허용하지 않습니다 (예 : IBM Enterprise COBOL).

+0

그게 효과가있어! 고맙습니다! – user99999991

0

encrypt 함수에서 인스턴스화 된 데이터는 여전히 남아 있습니다. 재설정해야합니다. 따라서 Encrypt의 모든 PIC는 함수의 시작 부분에서 0으로 설정해야합니다. 그렇지 않으면 여전히 데이터가 저장됩니다.

예 : 나는 완전히 당신의 질문에 따라 확실하지 않다

COMPUTE MYNUM1 = 0 
COMPUTE MYNUM2 = 0 
COMPUTE MYNUM3 = 0 
MOVE '' TO MYVARSTRING 
+0

PROGRAM-ID를 사용해보십시오. program-name-1 IS INITIAL .' 이것은 매 호출마다 프로그램이 초기 상태로 들어가게합니다. – NealB

+0

@ NealB, IS INITIAL이 "포함 된"프로그램에서 작동하는지는 IBM 설명서에서 분명하지 않습니다. 나는 시도하지 않았다. 작동하는지 아십니까? –

+1

@BillWoodger 예 IS INITIAL은 중첩 된 하위 프로그램 (적어도 IBM Enterpirse COBOL의 경우)에서 작동하며 예 시도했습니다. 또한 문서화되어 있습니다 : [2.1 프로그램 구조] (http://publibfp.boulder.ibm.com/cgi-bin/bookmgr/BOOKS/igy3lr31/2.1?ACTION=MATCHES&REQUEST=is+initial&TYPE=FUZZY&SHELF=&DT=20060329140556&CASE= & searchTopic = TOPIC & searchText = TEXT & searchIndex = INDEX & rank = RANK & ScrollTOP = FIRSTHIT # FIRSTHIT) 그리고 Open Cobol User Guide에도 있습니다. – NealB

1

컴파일러에서 지원하는 경우 LOCAL-STORAGE SECTION을 확인하십시오.

이렇게하면 서브 프로그램이 호출 될 때마다 모든 값이 초기 상태로 "자동"설정됩니다.

이들은 서브 프로그램이지만 기능은 아닙니다.

NealB의 IS INITIAL 제안이 효과적입니다.LOCAL-STORAGE의 장점은 물건의 "혼합"이있는 것입니다 : 일부는 CALL 사이에 보유하고 싶은 값, WORKING-STORAGE를 사용하는 값 ​​및 특히 초기 상태로 재설정하려는 다른 값이 있습니다. LOCAL-STORAGE에 VALUE 절을 정의합니다.

IS INITIAL 처리는 LOCAL-STORAGE 처리와 같습니다. VALUE 절이있는 WORKING-STORAGE의 모든 항목은 program-name이 호출 될 때마다 해당 값으로 설정됩니다. VALUE 절이없는 필드에는 "정의되지 않은"내용이 있습니다.

관련 문제