在COBOL中,调用子程序可以通过静态调用(Static Call)或动态调用(Dynamic Call)两种方式实现。
静态调用(Static Call)
静态调用时,被调用的子程序必须与调用程序一起链接(link-edited)起来形成一个完整的装载模块(Load module)。
子程序可以单独编译,但调用时需要使用CALL LITERAL(文字常数)来说明。
使用COBOL的编译选项NODYNAM编译调用程序。
被调用程序必须由调用者进行连接编译,并与调用程序一起生成一个装载模块。
动态调用(Dynamic Call)
动态调用时,被调用的子程序必须编译和链接成一个独立的装载模块(Load module)。
子程序可以与主程序一起放到同一个装载模块库中。
使用CALL VARIABLE(变量)来说明。
不管COBOL编译是用DYNAM或NODYNAM选项,都是动态调用。
示例
静态调用示例
```cobol
WORKING-STORAGE SECTION.
01 MAIN-DATA.
05 TEST-NUM PIC 9(5).
PROCEDURE DIVISION.
MOVE 10 TO TEST-NUM.
CALL STATIC-SUB USING TEST-NUM.
DISPLAY TEST-NUM.
GOBACK.
STATIC-SUB.
WORKING-STORAGE SECTION.
01 PLUS-NUM PIC 9(5).
PROCEDURE DIVISION.
ADD TEST-NUM TO PLUS-NUM.
MOVE PLUS-NUM TO SYSTEM-OUTPUT.
GOBACK.
```
动态调用示例
```cobol
WORKING-STORAGE SECTION.
01 MAIN-DATA.
05 TEST-NUM PIC 9(5).
PROCEDURE DIVISION.
MOVE 10 TO TEST-NUM.
CALL DYNAMIC-SUB USING TEST-NUM.
DISPLAY TEST-NUM.
GOBACK.
DYNAMIC-SUB.
WORKING-STORAGE SECTION.
01 PLUS-NUM PIC 9(5).
PROCEDURE DIVISION.
ADD TEST-NUM TO PLUS-NUM.
MOVE PLUS-NUM TO SYSTEM-OUTPUT.
GOBACK.
```
参数传递
参数可以通过以下两种方式在程序之间传递:
按内容传递:
如果被调用程序中变量的值被修改,那么它们的新值将反映在调用程序中。
按引用传递:
如果BY子句未指定,则变量始终通过引用传递。
示例(按引用传递)
```cobol
WORKING-STORAGE SECTION.
01 MAIN-DATA.
05 TEST-NUM PIC 9(5).
05 REF-TEST-NUM REFSYSVAL.
PROCEDURE DIVISION.
MOVE 10 TO TEST-NUM.
CALL SUB-PROC USING TEST-NUM, REF-TEST-NUM.
DISPLAY TEST-NUM, REF-TEST-NUM.
GOBACK.
SUB-PROC.
WORKING-STORAGE SECTION.
01 PLUS-NUM PIC 9(5).
PROCEDURE DIVISION.
ADD TEST-NUM TO PLUS-NUM.
MOVE PLUS-NUM TO SYSTEM-OUTPUT.
GOBACK.
```
总结
在COBOL中,调用子程序可以通过静态调用或动态调用两种方式实现。静态调用需要将被调用程序与调用程序一起链接,而动态调用则需要将被调用程序编译和链接成一个独立的装载模块。参数可以通过按内容传递或按引用传递两种方式在程序之间传递。根据具体需求选择合适的调用方式和参数传递方式,可以有效地实现子程序之间的功能调用和数据传递。