16.2.2 引数の受け取り方法(C言語インタフェースに従った形式の場合)
C言語インタフェースに従った形式でコマンド行に指定した引数を受け取る方法には,次の3種類があります。
-
アドレスデータ項目を使った引数の受け取り
-
サービスルーチンを使った引数の受け取り
-
ACCEPT/DISPLAY文を使った引数の受け取り
それぞれの受け取り方法について,次に示します。
(1) アドレスデータ項目を使った引数の受け取り
コマンド行から渡された引数の形式を連絡節(LINKAGE SECTION)で定義して,直接COBOLプログラムから参照する方法です。なお,引数の値は,アドレスとして渡されるため,アドレスデータ項目で参照する必要があります。
- アドレスデータ項目を使った引数の受け取りの例
: IDENTIFICATION DIVISION. PROGRAM-ID. SAMPLE1. : DATA DIVISION. WORKING-STORAGE SECTION. …1. 01 CMDN-G ADDRESSED BY A-CMDN. 02 CMDN PIC X(8). 01 OPT1-G ADDRESSED BY A-OPT1. 02 OPT1 PIC X(8). 01 OPT2-G ADDRESSED BY A-OPT2. 02 OPT2 PIC X(8). : LINKAGE SECTION. …2. 01 ARGC PIC 9(9) USAGE COMP. 01 ARGV. 02 ARGV1 USAGE ADDRESS. 02 ARGV2 USAGE ADDRESS. 02 ARGV3 USAGE ADDRESS. : PROCEDURE DIVISION USING …3. BY VALUE ARGC BY REFERENCE ARGV. COMPUTE A-CMDN = ARGV1. COMPUTE A-OPT1 = ARGV2. COMPUTE A-OPT2 = ARGV3. :
-
作業場所節(WORKING-STORAGE SECTION)で,アドレスデータ項目で参照するデータを定義します。
-
連絡節(LINKAGE SECTION)で,受け取る引数の形式を定義します。
-
アドレスデータ項目のアドレス参照を解決し,引数の値をCOBOLのデータ項目に格納します。
-
- 規則
-
-
COBOLプログラムのコンパイル時に,-Main,Systemオプションを指定する必要があります。
-
連絡節で定義した受け取る引数の個数と,実際にコマンド行に入力した実行可能ファイル名,および引数の個数が一致していなければなりません。
-
受け取った引数の終端には,NULL文字(X'00')が付加されています。COBOLプログラム中で引数の長さなどを求める場合は,このNULL文字の分を考慮する必要があります。
-
最初の引数を受け取るデータ項目は,「PIC 9(9) USAGE COMP」で定義する必要があります。
-
(2) サービスルーチンを使った引数の受け取り
CBLARGCサービスルーチンおよびCBLARGVサービスルーチンを呼び出して,引数を受け取る方法です。
CBLARGCサービスルーチンでコマンド行の引数の個数を取得し,引数の個数だけCBLARGVサービスルーチンを繰り返し呼び出すことで,すべてのコマンド行の引数を取得できます。
- サービスルーチンを使った引数の受け取りの例
: IDENTIFICATION DIVISION. PROGRAM-ID. SAMPLE1. DATA DIVISION. WORKING-STORAGE SECTION. 01 ARGC PIC 9(9) USAGE COMP. …1. 01 ARGV. 02 ARGV-LENGTH PIC 9(4) USAGE COMP. …2. 02 ARGV-AREA. …3. 03 ARGV-AREA-C PIC X(1) OCCURS 1 TO 100 DEPENDING ON ARGV-LENGTH. 77 CMD-NO PIC 9(9) USAGE COMP. …4. : PROCEDURE DIVISION. CALL 'CBLARGC' USING BY REFERENCE ARGC. IF RETURN-CODE NOT = 0 THEN (CBLARGC異常時の処理) END-IF. : MOVE 1 TO CMD-NO. PERFORM UNTIL ARGC = 0 CALL 'CBLARGV' USING BY REFERENCE CMD-NO ARGV IF RETURN-CODE NOT = 0 THEN (CBLARGV異常時の処理) END-IF (CBLARGVで受け取った引数の処理) ADD 1 TO CMD-NO SUBTRACT 1 FROM ARGC END-PERFORM. :
-
CBLARGCサービスルーチンで受け取る引数の個数の領域
-
CBLARGVサービスルーチンで受け取る引数の長さ
-
CBLARGVサービスルーチンで受け取る引数の文字列
-
CBLARGVサービスルーチンに引き渡す引数の順序
-
- 規則
-
-
COBOLプログラムのコンパイル時に,-Main,Systemオプションを指定する必要があります。
-
CBLARGCサービスルーチンで取得した値は,実行可能ファイル名と引数の個数の合計値となります。詳細については,「29.4.3 CBLARGC」を参照してください。
-
CBLARGVサービスルーチンで引数の文字列を受け取る領域は,100バイトで定義する必要があります。受け取ったコマンド行の引数が100バイト未満の場合,残りの領域は,空白文字で埋められます。また,受け取ったコマンド行の引数が100バイトを超える場合は,先頭から100バイトまでが有効となり,以降の文字列は切り捨てられます。詳細は,「29.4.4 CBLARGV」を参照してください。
-
(3) ACCEPT/DISPLAY文を使った引数の受け取り
ACCEPT文やDISPLAY文を使って,コマンド行に指定された引数の個数や値を取得できます。詳細は,「10.3 コマンド行へのアクセス」を参照してください。