IBM Books

OS/400 版管理及程式設計指南

傳遞參數到程式

經由在函數定義上指定參數類型,以及指定將傳遞的參數是僅輸入 (IN)、 僅輸出 (OUT) 或輸入/輸出 (INOUT) 參數,將參數傳遞到程式。例如:

%function(DTW_DIRECTCALL) dc2(IN CHAR(3) p1,
                              INOUT INTEGER p2,
                              OUT DECIMAL(7,2) p3) {
   %EXEC { /QSYS.LIB/NETDATA.LIB/MYPGM.PGM %}
%}

在上面範例中,「直接呼叫」語言環境將傳遞這三個參數到程式 MYPGM: 字元變數、整數及聚集十進位變數。您最多可傳遞 50 個參數到呼叫的程式。 僅有以資料類型指定的參數才能傳遞到程式。「直接呼叫」語言環境會將對應到參數的字串, 轉換為資料類型的內部表示式。然後,語言環境會按照函數定義上指定的次序, 將變數的內部表示式的指標傳遞到呼叫的程式。

因為變數的指標將傳遞到程式,所以程式可以變更變數的值。不過, 僅有 OUT 或 INOUT 變數,在經過程式變更後,才會向呼叫語言環境的巨集反映。

支援的資料類型

表 4會列示「直接呼叫」語言環境支援的資料類型。並非所有資料類型均受到每一高階語言的支援。

表 4. 直接呼叫資料類型

資料類型 用法注意事項

CHAR(n)
CHARACTER(n)
CHARACTER

字串。如果指定 n, 它必須大於 0 的值。如果未指定字串,將假設為一個字元。 因為所有從「直接呼叫」語言環境傳遞的字串均是以空值終止, 所以語言環境將配置 n+1 個位元組 ( 1 個位元組供 NULL (空值) 終止符使用)。 超出 n 的字串將被截斷。
VARCHAR(n) 可變長度字串,其中 n 是大於 0,小於或等於 32740 的值。 字串是空值終止,所以語言環境會配置 n+2+1 個位元組 (2 個位元組用於儲存字串長度, 1 個位元組用於儲存空值終止符)。超出 n 的字串將被截斷。 字串的前兩個位元組含有字串長度 (二進位值)。如果參數定義為 OUT (僅輸出), 則在變數傳遞到呼叫的程式之前,字串長度將設定為 0。

INTEGER
INT

帶正負號的二進位整數,長度為 4 個位元組。
SMALLINT 帶正負號的二進位整數,長度為 2 個位元組。
FLOAT(p,s) 單精準度或倍精準度浮點數。對於單精準度,p 必須大於 0, 小於 25。對於倍精準度,p 必須大於 24, 小於 54。僅在轉換資料為可顯示的格式 (如轉換為字串) 時, 才會使用精確度 (p) 及小數位數 (s)。
REAL(p,s) 單精準度浮點數。p 必須大於 0,小於 25。僅在轉換資料為可顯示的格式 (如轉換為字串) 時, 才會使用精確度 (p) 及小數位數 (s)。

DOUBLE (p,s)
DOUBLEPRECISION(p,s)

倍精準度浮點數。p 必須大於 0,小於 53。僅在轉換資料為可顯示的格式 (如轉換為字串) 時, 才會使用精確度 (p) 及小數位數 (s)。
NUMERIC(p,s) 區化十進位數,具有精確度 p 及小數位數 sp 的值須大於 0,小於 32。

DEC(p,s)
DECIMAL(p,s)

聚集十進位數,具有精確度 p 及小數位數 sp 的值須大於 0,小於 32。
DTWTABLE 用來將 Net.Data 表格傳遞到呼叫的程式的特殊資料類型。 「直接呼叫」語言環境會將指標傳遞到表格,然後可以使用 Net.Data 語言環境介面表格函數, 來操作它。

定義為數值的參數可以包括貨幣符號及三位數的區隔符號。 在傳遞變數到程式之前,當數值變數從字串格式轉換為它的內部格式時, 「直接呼叫」語言環境會除去貨幣符號及三位數的區隔符號。 Net.Data 會從 Net.Data 執行所在的處理的處理屬性中,取回貨幣符號、小數格式及三位數的分隔字元。

以空值終止的字串參數

在架構檔或巨集內,若 DTW_PAD_PGM_PARMS 設定為 NO,則「直接呼叫」語言環境 將使用空值終止符字元 (值 x'00'),將字串值傳遞到您的程式。 這需要您撰寫程式碼,來處理字串 (除非您正在使用 C 或 C++, 因為它會預期以空值終止的字串)。

例如,如果您將參數欄位定義為 CHAR(10),但您傳遞一個長度為 5 個位元組的字串值, 則 Net.Data 會在第 5 個位元組之後放置空值終止符。 在 CHAR(10) 欄位中,以字串形式傳遞值 "12345" 將產生:

x'F1F2F3F4F500........'

空值終止符後的位元組沒有定義 (您無法假設位元組是空值或空白)。

因為字串是以空值終止,且在空值終止符後含有未起始設定的位元組,所以您無法在 RPG 或 COBOL 程式中使用字串。 例如,如果您在比較作業中使用字串,則作業將不會產生有效的結果。 程式不會預期字串含有空值終止符,而是預期將在尾端以空白填補的字串。

您可以在程式內使用字串處理函數,取回字串值或使用 VARCHAR 資料類型。 這種方法會在前兩個位元組中給與字串的長度。

在架構檔或巨集內,若 DTW_PAD_PGM_PARMS 設定為 YES, 則「直接呼叫」語言環境會將字串值傳遞到您的程式, 而這個值的右邊將填補空白,直到符合精確度長度。 使用上面的同一範例,但 DTW_PAD_PGM_PARMS 設定為 YES, 在 CHAR(10) 欄位中,以字串形式傳遞值 "12345" 將產生:

x'F1F2F3F4F5404040404000'

因為字串長度為 5,少於指定的精確度,所以將在值的後面插入空白, 直到符合精確度長度。以如 RPG 的語言撰寫的程式現在可以使用參數, 不需要處理以空值終止的字串。

傳遞參數時常見的錯誤

下列列示描述當使用「直接呼叫」語言環境呼叫程式,以及將參數傳遞到程式時, 可能發生的錯誤。 也會提供避免這些錯誤的秘訣。

參數不符錯誤
確定參數的數目及次序符合它們出現在呼叫的程式的參數列示中的數目及次序。

資料類型錯誤
確定針對參數指定的資料類型符合呼叫的程式所預期的資料類型。 可能是「直接呼叫」語言環境支援的資料類型不被用來建立呼叫程式的高階程式設計語言所支援。

長度錯誤
確定針對參數定義的長度是正確的,且符合在呼叫程式中指定的長度。若指定的長度短於呼叫程式的宣告長度,可能會損毀儲存體, 使得 Net.Data 無法正常運作。


[ 頁面頂端 | 前一頁 | 下一頁 | 目錄 | 索引 ]