CALL CALLB CALLP呼叫(資料移植)

2021-05-27 21:16:07 字數 4107 閱讀 9408

原文:

關於as400呼叫 ***

rpgiv提供三種呼叫:

call (call a program)呼叫乙個程式,此呼叫又叫動態呼叫。

callp(call a protoyped procedure or program)呼叫原型過程或者原型子過程。可以使用動態呼叫或者是靜態呼叫。

callb(call a bound module)呼叫乙個繫結模組,此呼叫又叫靜態呼叫。

callp和callb,call的主要區別在於callp提供更好的引數型別檢查。它同時也提供更豐富的功能如使用值傳遞或者常量傳遞引數。

callp是用來代替callb和call的。當使用callp時,必須在d規範表中定義乙個過程原型。在原型宣告中,可以定義靜態或者動態繫結的呼叫連線。關鍵字extproc被用來指定靜態呼叫連線,而extpgm被用來指定動態呼叫連線,(預設是靜態繫結)。

建議在進行rpg iv程式設計時,全部使用callp方式以取代call或者callb呼叫方式。最大的好處:一是在於對程式的引數檢驗是在編譯時進行的,這樣許多引數型別、數量問題在編譯時就被檢查出來,實際呼叫的時候會減少呼叫程式引數出問題。二是可以使用靜態呼叫,提高執行效率。

在使用較複雜的過程呼叫可以巢狀在內建函式中使用,可以省略callp直接在程式中使用過程名返回值。

通過定義乙個相應的原型,可以容易地用callp去呼叫當前使用call或者callb呼叫方式的程式。只需檢查*entry plist中定義的變數的型別並定義乙個具有跟它對應型別的引數的原型。但是如果想傳遞變長的字元型或者陣列型引數就需要指定options(*varsize)選項;如果某些引數是可選的,需要指定*ptions(*omit)或者options(*nopass)選項。

一、程式內部callp子過程

1、過程原型定義: d  過程名    pr      like(xx)

過程引數定義

2、呼叫過程:     rc = 過程名(引數1 :引數2 ... )

3、過程內容:     p  過程名    b                (過程開始,並可被外部呼叫)

d  過程名    pi      like(xx)

過程引數定義               (與上面引數定義一樣)

過程體p  過程名    e                (過程結束)

4、pdm option 14 

二、過程外部呼叫

1、外部過程書寫(模組一):

過程原型定義: d  過程名    pr      like(xx)

過程引數定義

過程內容:     p  過程名    b       export   (過程開始,並可被外部呼叫)

d  過程名    pi      like(xx)

過程引數定義               (與上面引數定義一樣)

過程體p  過程名    e                (過程結束)

2、編譯過程:     pdm option 15  或者  crtrpgmod

3、呼叫過程:     d  過程名    pr      like(xx) (過程原型定義)

(模組二)        過程引數定義

rc = 過程名(引數1 :引數2 ... )

4、pdm option 15  或者  crtrpgmod

crtpgm pgm( 模組二) module( 模組二 模組一) actgrp( *caller )

(其中模組二是主模組,模組二呼叫模組一,生成的程式名與主模組相同)

三、呼叫繫結模組callb

1、被呼叫模組書寫(模組一):

過程原型定義: d  過程1     pr

d  過程2     pr

過程內容:     p  過程1     b       export

d  過程1     pi      like(xx)  (可省略)

過程引數定義                (可省略)

過程體             

p  過程1     e               

p  過程2     b       export

d  過程2     pi      like(xx)  (可省略)

過程引數定義                (可省略)

過程體             

p  過程2     e               

2、編譯模組:pdm option 15  或者  crtrpgmod

3、呼叫模組書寫: *entry       plist

parm         變數名

callb       『過程1』

parm         變數名

或者:callb       『模組一』

parm         變數名    

4、編譯模組:pdm option 15  或者  crtrpgmod

5、生成程式:crtpgm 程式名 module( 模組一 模組二) actgrp( *caller)6、執行:call 程式名 ( '過程1' ) ...

四、callp的使用:

1、被呼叫模組書寫(模組一):

*entry       plist

parm         變數名

模組體2、編譯模組:pdm option 15  或者  crtrpgmod,生成模組一。

3、呼叫模組書寫(模組二):

變數定義

原型定義:     d  模組名    pr      extproc('模組一')

引數定義                    (此引數定義與上面變數定義一致,可用like)

呼叫:         callp                模組名(引數1 : 引數2 ...)

4、編譯模組:pdm option 15  或者  crtrpgmod,生成模組二。或者pdm option 14

5、生成程式:crtpgm 程式名 lib(模組二 模組一)(模組二為主模組,程式名可與模組二同名)

說一下三者的區別:

在cl中呼叫程式可以使用call,callb和callp三種方式。

call 呼叫opm的老式rpg程式,採用動態記憶體呼叫方式

callb 呼叫module中的pep(primary entry procedure),此procedure不需事先宣告

callp 呼叫module中的procedure,此procedure必須在本程式的d specification事先宣告,又稱原形呼叫方式,和callb有相似的記憶體呼叫方式,但在呼叫之前會對呼叫引數進行預先檢查。

目前ile rpg中推薦使用callp呼叫內部,外部的procedure.

對程式和過程的呼叫

ile程式中既可以呼叫程式也可以呼叫過程。ile語言通過呼叫語句call和callp或callb來標識呼叫的目標是程式還是過程。

1.動態程式呼叫

a.opm程式可以呼叫乙個opm程式或ile程式

b.ile程式可以呼叫乙個opm程式或另乙個ile程式

c.服務程式可以呼叫opm程式或ile程式

2.靜態過程呼叫

a.在同一模組內的物件

b.在同乙個ile程式或服務程式內的乙個單獨模組中的過程

c.在乙個單獨的ile服務程式中的過程

call, callb, callp的區別:

call只能呼叫*pgm, 是動態呼叫,程式執行效率低。callb和callp都只能呼叫procedure(懷疑一下!),大部分時候是靜態呼叫,只有呼叫指標變數中所指的procedure時才是動態呼叫;但是callb不參加介面合法性檢查,即:不需要原型說明,因此在執行時可能會導致一些錯誤。call 和callb都只能使用固定格式的實參傳遞,即:使用plist。

rpg iv中的全域性變數與區域性變數:

每乙個opm程式都只有乙個唯一的程式入口,但是在ile程式中每乙個procedure都可以有乙個入口。在opm程式中每乙個內部子程式的變數都是全域性變數,但是在ile程式的procedure中宣告的所有變數都是區域性變數,其餘所有用到的變數都是全域性變數。如果在procedure中宣告的變數和某一全域性變數同名的話,那麼這兩個變數將在記憶體中使用不同的兩個空間,也就是說這兩個變數將互不影響,同名的那個全域性變數將不被此procedure 使用。區域性變數也將在此procedure執行完成後被全部釋放。

spark調優 shuffle調優

基於spark1.6 引數可以通過 new sparkcontext set 來設定,也可以通過命令的引數設定 conf spark.shuffle.file.buffer 預設值 32k 引數說明 該引數用於設定shuffle write task的bufferedoutputstream的buf...

Spark Spark調優 資源調優

spark在乙個executor的記憶體分為三塊,1.一塊是execution記憶體 2.一塊是storge 記憶體 3.一塊是其他記憶體 執行記憶體是執行記憶體,加入,聚合都是在這部分記憶體中執行.shuffle的資料也會先快取在這個記憶體中,滿了再寫入磁碟,能減少io,其實地圖過程也是在這個記憶...

尾調遞迴 ,尾調優化

尾調優化 title head body p pre 尾調優化,值得是函式最後一步呼叫了另乙個函式,函式呼叫會在內部形成乙個 呼叫記錄 儲存呼叫位置,內部變數等,a函式呼叫b函式,形成乙個 a到b的呼叫幀,直到結果返回,幀消失,b呼叫c函式,這樣,就形成了 呼叫棧,pre p h4 pre 尾調,不...