我主要调用两个函数。 第二个函数叫做(Decrypt),调用它内部的第一个函数(Encrypt)。所以这里加密被调用两次。一旦进入主体,然后进入Decrypt。
问题在于它拒绝以这种方式工作。一旦在main中使用了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.
答案 0 :(得分:1)
我不确定我是否完全关注了您的问题,我会在DECRYPT
中遇到更多问题。这就是为什么......
计划SER-1-CIPHER
包含两个嵌套程序:ENCRYPT
和DECRYPT
。直到你
声明ENCRYPT
和DECRYPT
作为COMMON
程序,他们无法“看到”彼此,因为只有程序
在更高的嵌套级别(例如SER-1-CIPHER
)可以“看到”嵌套在它们中的程序。有关嵌套程序的Open Cobol程序员指南中对此进行了解释。
尝试将嵌套程序声明为:
PROGRAM-ID. ENCRYPT IS COMMON.
PROGRAM-ID. DECRYPT IS COMMON.
这样程序DECRYPT将能够CALL ENCRYPT。
接下来,我建议您在将控制权返回给操作系统时使用GOBACK
代替STOP RUN
和EXIT PROGRAM
或
调用程序。 OpenCobol程序员指南也提出了这个建议。
最后,每个子程序应包含GOBACK
作为其最后一个语句。我不确定ENCRYPT
的行为是什么
有某种明确的退货声明。你的实际程序可能有这个,但你问题中的代码示例没有。
Open Cobol似乎对嵌套程序之间的递归没有任何限制,但某些版本的COBOL做 不允许这样做(例如IBM Enterprise COBOL)。
答案 1 :(得分:1)
如果您的编译器支持它,请查看LOCAL-STORAGE SECTION。
每次调用子程序时,这将“自动”将所有值设置为初始状态。
它们是子程序,而不是函数。
NealB对IS INITIAL的建议将起作用。 LOCAL-STORAGE的优势在于你有一个“混合”的东西:你想要在CALL之间保留的值,你使用WORKING-STORAGE,以及你特别希望重置为初始状态的其他值,你在LOCAL-STORAGE中用VALUE子句定义。
IS INITIAL所做的处理相当于LOCAL-STORAGE的处理。每次程序名称被调用时,WORKING-STORAGE中具有VALUE子句的所有内容都将设置为该值。没有VALUE子句的字段具有“未定义”内容。
答案 2 :(得分:0)
加密功能中实例化的数据仍然存在。 他们需要重置。因此,加密中的任何数量的PIC都需要在函数开头设置为0,否则它们仍然会存储数据。
示例:
COMPUTE MYNUM1 = 0
COMPUTE MYNUM2 = 0
COMPUTE MYNUM3 = 0
MOVE '' TO MYVARSTRING