在COBOL中多次调用函数

在COBOL中多次调用函数,cobol,gnucobol,cobol85,Cobol,Gnucobol,Cobol85,我主要调用两个函数。 第二个函数(Decrypt)调用其中的第一个函数(Encrypt)。这里加密被调用了两次。一次在主体中,然后一次在内部解密 问题是它拒绝这样做。一旦在主程序中使用了Encrypt,我就不能在程序中的任何地方再次使用Encrypt~。好像变量还在使用,我无法传递新的变量 例如,如果我从主函数中删除Encrypt,只调用Decrypt,它就可以正常工作。我不明白为什么 IDENTIFICATION DIVISION. PROGRAM-ID. CAESER-1-CIPHER. D

我主要调用两个函数。 第二个函数(Decrypt)调用其中的第一个函数(Encrypt)。这里加密被调用了两次。一次在主体中,然后一次在内部解密

问题是它拒绝这样做。一旦在主程序中使用了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.

加密函数中实例化的数据仍然保留。 它们需要重新设置。因此,在函数开始时,需要将Encrypt中的任何数字pic设置为0,否则它们仍然会存储数据

例如:

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

我不确定我是否完全理解了你的问题,如果使用
解密
,我会遇到更多的问题。这就是为什么

程序
SER-1-CIPHER
包含两个嵌套程序:
ENCRYPT
DECRYPT
。直到你 将
加密
解密
声明为
通用
程序,因为只有程序才能相互“看到” 在较高的嵌套级别(例如,
SER-1-CIPHER
)可以“看到”嵌套在其中的程序。关于嵌套程序的开放Cobol程序员指南对此进行了解释

尝试将嵌套程序声明为:

 PROGRAM-ID. ENCRYPT IS COMMON.
 PROGRAM-ID. DECRYPT IS COMMON.
这样,程序解密将能够调用加密

接下来,我鼓励您在将控制返回到操作系统时使用
GOBACK
代替
STOP RUN
EXIT PROGRAM
调用程序。OpenCobol程序员指南也提出了这一建议

最后,每个子程序都应该包含一个
GOBACK
,作为其最后一个语句。我不确定
ENCRYPT
的行为是什么 有某种明确的返回语句。您的实际程序可能有此功能,但问题中的代码示例没有

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

如果您的编译器支持它,请查看本地存储部分

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

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

NealB的初步建议将起作用。LOCAL-STORAGE的优点是当您有一个“混合”的东西时:一些东西的值您希望在调用之间保留,您使用WORKING-STORAGE,而另一些东西您特别希望重置为初始状态,您在LOCAL-STORAGE中使用value子句定义


初始的处理等同于本地存储的处理。每次调用程序名时,工作存储器中具有VALUE子句的所有内容都将设置为该值。没有VALUE子句的字段有一个“未定义”的内容。

尝试使用
PROGRAM-ID。PROGRAM-name-1是初始值。
这将导致每次调用时程序都以初始状态输入。@NealB,IBM手册中不清楚初始值是否在“包含”的程序中操作。我没有试过。你知道它是否有效吗?@BillWoodger Yes是INITIAL,它在嵌套的子程序上有效(至少对IBM Enterprise COBOL有效),是的,我已经尝试过了。它也记录在:和开放式Cobol用户指南中。@NealB,谢谢,很高兴知道。我会在手册上做一些注释。该死的,刚记起来,是一个.PDF。。。