1

I have my main calling two functions. The second function called (Decrypt) calls the first function (Encrypt) inside of it. So here Encrypt is being called twice. Once in the main, and then once inside of Decrypt.

The issue is that it refuses to work this way. Once Encrypt gets used in the main, I can't use Encrypt again anywhere~ in the program. Its like the variables are still in use and I can't pass it new ones.

For example, if I remove Encrypt from the main function and ONLY call Decrypt - it works fine. I can't figure out why.

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

3 回答 3

2

如果您的编译器支持它,请查看 LOCAL-STORAGE SECTION。

每次调用子程序时,这将“自动”将所有值设置为初始状态。

它们是子程序,而不是函数。

NealB 的 IS INITIAL 建议会起作用。LOCAL-STORAGE 的优势在于当您拥有“混合”事物时:您希望在 CALL 之间保留其价值,您使用 WORKING-STORAGE,以及您特别希望重置为初始状态的其他人,这您在 LOCAL-STORAGE 中使用 VALUE 子句定义。

IS INITIAL 所做的处理等同于对 LOCAL-STORAGE 的处理。每次调用程序名时,WORKING-STORAGE 中具有 VALUE 子句的所有内容都设置为该值。没有 VALUE 子句的字段具有“未定义”的内容。

于 2013-04-25T20:41:25.443 回答
1

我不确定我是否完全遵循您的问题,我会期待更多的问题DECRYPT。这就是为什么...

ProgramSER-1-CIPHER包含两个嵌套的程序:ENCRYPTDECRYPT. 在您声明ENCRYPTDECRYPT作为COMMON程序之前,它们不能“看到”彼此,因为只有更高嵌套级别的程序(例如SER-1-CIPHER)才能“看到”嵌套在其中的程序。这在嵌套程序的 Open Cobol Programmers Guide 中有解释。

尝试将嵌套程序声明为:

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

这样程序 DECRYPT 将能够 CALL ENCRYPT。

接下来,我鼓励您GOBACK在将控制STOP RUNEXIT PROGRAM返回给操作系统或调用程序时使用。OpenCobol Programmers Guide 也提出了这个建议。

最后,每个子程序都应包含作为其最后一条语句的 a GOBACKENCRYPT如果没有某种明确的 return 语句,我不确定行为是什么。您的实际程序可能有这个,但您问题中的代码示例没有。

Open Cobol 似乎对嵌套程序之间的递归没有任何限制,但某些版本的 COBOL 不允许这样做(例如 IBM Enterprise COBOL)。

于 2013-04-25T20:41:10.897 回答
0

在 encrypt 函数中实例化的数据仍然存在。它们需要重新设置。因此,Encrypt 中的任何数量的 PIC 都需要在函数开始时设置为 0,否则它们仍然会存储数据。

例子:

COMPUTE MYNUM1 = 0
COMPUTE MYNUM2 = 0
COMPUTE MYNUM3 = 0
MOVE '' TO MYVARSTRING
于 2013-04-25T20:11:53.483 回答