CL 程式或程序中的 CALLSUBR 指令

在 CL 程式或程序中使用 Call Subroutine (CALLSUBR) 指令,以將控制傳遞至在相同程式或程序內定義的子常式。

CALLSUBR 指令有兩個參數: Subroutine (SUBR)(包含要將控制傳送至其中的子常式名稱) ,以及 Return value (RTNVAL)(指定將包含來自所呼叫子常式之回覆值的變數)。 請參閱下列範例:


CALLSUBR SUBR(mysubr) RTNVAL(&myrtnvar)

子常式 mysubr 必須由 SUBR 指令的「子常式 (SUBR)」參數定義在程式或程序中。 變數 &myrtnvar 必須定義為 TYPE (*INT) LEN (4) ,讓它包含在子常式 mysubr中找到之 Return from Subroutine (RTNSUBR)End Subroutine (ENDSUBR) 指令的「回覆值 (RTNVAL)」參數值。 如果未定義 RTNVAL 參數,則會忽略子常式中的回覆值。

CALLSUBR 指令可以放置在程式或程序內的任何位置,包括其他子常式,但程式層次 Monitor Message (MONMSG) 指令除外。 執行時,每一個 CALLSUBR 指令都會將回覆位址放置在子常式堆疊上,並且可以使用 Declare Process Options (DCLPRCOPT) 指令的「子常式堆疊 (SUBRSTACK)」參數來變更堆疊大小。 如果廣域監視的訊息導致 GOTO 指令執行,則下一個執行的 CALLSUBR 指令會重設子常式堆疊。

在下列範例中,第一個 CALLSUBR 指令會將控制權傳遞給子常式 SUBR1,當控制權傳回時, 12 的回覆值會置於變數 &myrtnvar 中。 如果 MONMSG 指令監視訊息,則會執行 Goto (GOTO) 指令,並控制分支至標籤 DUMP。 CL 程式或程序由 DMPCLPGM 指令傾出,下一個 CALLSUBR 指令至次常式 SUBR2 會重設次常式堆疊。


            PGM      
            DCL        VAR(&myrtnvar) TYPE(*INT) LEN(4)
            MONMSG     MSGID(CPF0000) EXEC(GOTO CMDLBL(DUMP)) 
            :
            CALLSUBR   SUBR(SUBR1) RTNVAL(&myrtnvar)
            :
DUMP:       DMPCLPGM                                          
            CALLSUBR   SUBR(SUBR2)
            :
            SUBR       SUBR(SUBR1)                            
            :
            ENDSUBR    RTNVAL(12)
            :
            SUBR       SUBR(SUBR2)                            
            :
            ENDSUBR
            ENDPGM