最初のページに戻ります。

総合の目次があるページに戻ります。

よく使うマニュアルです

Wiki

updated on 2004.06.23

13.3.基本に戻ろうCLP内のCALLコマンド編

[ Previous ] [ HOME ] [ Upper ] [ Next ]


何気に使っているCALL。そのパラメータでおかしなことに、気が付いた方もいるでしょう?こんな身近なのに、知らないことってあるんですよね。尚、RPGのCALLと、CLPのCALLは違います。但し、RPGからQCMDEXCでCALLを指定した場合は、CLPのCALLと同じです。RPGによるメニューでは、RPG命令コードのCALL命令ではなく、QCMDEXCにCALLストリングを渡し、CLPのCALLと同じ環境にして、呼び出すといいでしょう。

CLP内のCALLコマンド

基礎事項

パラメータの数は、最大40個まで。(RPGでは255個のPARMを指定できます。)

文字の定数の桁数

32バイト以下の定数と、33バイト以上の定数で異なり、注意事項があります。

数字の桁数

15.5で定義された場合とそうでない場合で、異なり、注意事項があります。

CL プログラミング バージョン 4から

※「変数」と「定数」の言葉の使い分けに注意してください!

32 バイト以下の文字ストリング定数は、常に 32 バイトとして (右側にブランクが 埋め込まれて) 渡されます文字定数が 32 バイトより長い場合には、その長さの定 数全体が渡されます。パラメーターが 32 バイトより大きいものとして定義されている場合にはCALL コマンドは正確にそのバイト数分の定義を渡さなければなりません32 文字より長い定数については、受取側のプログラムで予定されている長さに 合わせるための埋め込みは行われません。

受取側のプログラムは、渡したバイト数より少ないバイト数しか受け取ることができません。(トリミングされます)

受取側のプログラムが、渡したバイト数より多いバイト数を受け取った場合、その結果は予期できません。

10 進定数は、長さ LEN(15 5) のパック 10 進形式で渡されます。15 は値全体の 桁数で、5 は小数部分の桁数です。したがって、12345 というパラメーターが渡さ れるとすれば、受取側のプログラムでは 10 進数フィールドが LEN(15 5) として宣 言されていなければならず、そのパラメーターは 12345.00000 として受け取られま す。呼び出されるプログラムに数値定数を渡す必要があり、かつそのプログラムが「15 5」以外の桁数と精度でその値の受取が想定されている場合には、その定数を 16 進数形式でコーディングすることができます。

論理定数は 32 バイトの長さを持つものとして渡されます。論理値 0 または 1 は第 1 バイトにあり、その他のバイトはブランクです。論理値で動作するプログラムに 0 または 1 以外の値が渡されると、その結果は予期できないものになることがあり ます。

浮動小数点リテラルまたは浮動小数点特殊値 (*NAN、*INF、または *NEGINF)は、8 バイトを占める倍精度の値として渡されます。CL プログラムは浮動小数点数を処理 することはできませんが、浮動小数点数値を文字変数に受け入れて、その変数を浮動 小数点数の処理が可能な HLL プログラムに渡すことはできます。

CALL命令で、数字の定数を渡すときは、15.5としておくと、10進数形式で渡せます。便利ですね。X'12345F'なんてしないでいいのですよ。

3.4.2.4 文字の桁数エラー

  • 受取側の変数として宣言されている文字数より長い文字値を渡す場合には、受取側のプロシージャーまたはプログラムはその超過した部分にアクセスすることができません。

次の例では、PGMB は渡された変数をブランクに変更します。PGMB では、その変数が LEN(5) として宣言されているので、5 桁分だけがブランクに変更されますが、PGMA でその値が参照されるさいには、残りの文字はそのまま値の一部として残っています

PGM        /* PGMA */
  DCL		&A *CHAR 10

  CHGVAR &A 'ABCDEFGHIJ'
  CALL PGMB PARM(&A)           /* PASS to PGMB */
  .
  .
  .
  IF (&A *EQ '  ') THEN(...)  /* THIS TEST FAILS */
ENDPGM
 
PGM PARM(&A)     /* PGMB */
  DCL		 &A *CHAR 5   /* THIS LEN ERROR*/

  CHGVAR &A '  '   /* 5 POSITIONS ONLY; OTHERS UNAFFECTED */
RETURN

このようなエラーに対してはエスケープ・メッセージは出されませんが、このような変数の処理によって意図した結果とは異なる結果を招くことがあります。

  • プロシージャーまたはプログラムに渡される値が、受取側のプロシージャーまたはプログラムで宣言されている桁数より短かった場合には、重大な結果を招く場合があります。この場合には、受取側のプロシージャーまたはプログラムにおける変数の値の最初の部分にはその渡された値が入りますが、残りの部分 (受取側のプログラムで宣言されている桁数に達するまでの部分) には、記憶域でその値に続く部分の記憶域の値が入ることになります。この部分の記憶域の内容は予測不能な値です。渡された値がプログラム変数である場合には、その後に別のプログラム変数が続く場合や、プロシージャーまたはプログラムの内部制御構造が続いている場合もあります。渡された値が定数である場合には、その後には、CALL または CALLPRCコマンドによって渡された他の変数、または内部制御構造が続く場合も考えられます。

受取側のプロシージャーまたはプログラムが値を変更すると、元の値およびそれに続く記憶域にも操作を加えます。このような操作によりただちに現れる影響として、他の変数または定数の変更、あるいはプロシージャーまたはプログラムの実行不能の原因となるような内部構造の変更などがあります。記憶域に対する変更はただちに有効になります。

次の例では、受取側のプログラムに 3 文字の定数が 2 つ渡されます。文字定数は CALL コマンドに対して最低 32 文字として渡されます。(通常この 3 文字は左寄せにされ、その後に後書きブランクが付加されます。)受取側のプログラムで、値を受け取る変数として 32 文字を超える長さの変数が宣言されている場合には、32文字を超える部分には、その値に対応する記憶域に続く記憶域にある未知の値が入ることになります。この例では、2 つの定数が隣接して記憶域に入っているものとします。

 CALL PGMA ('ABC' 'DEF')  /* PASSING PROG */

 

  PGM  PARM(&A &B) /* PGMA */
  DCL  &A *CHAR 50  /* VALUE:ABC+29' '+DEF+15' ' */
  DCL  &B *CHAR 10  /* VALUE:DEF+7' ' */
  CHGVAR VAR(&A) (' ')  /* THIS ALSO BLANKS &B */
  .
  .
  .
  ENDPGM

変数として渡される値もこれとまったく同じです。 

[追記] 2001-5-16

尚、SBMJOBのCMD(CALL XXXX)に注意してください。

コンパイルされていない CALL コマンドを使用して CL プログラムを呼び出す場合 (対話式 CALL コマンド、または SBMJOB コマンドを介して)、受取側のプログラムでは 10 進パラメーター (*DEC) を LEN(15 5)、文字パラメーター (*CHAR) を LEN(32) 以下で宣言してください。

SBMJOBの場合、CLPの中だとしても、パラメータの長さには制限があるようです。

2001-1-1


[ Previous ] [ HOME ] [ Upper ] [ Next ]

You are at K's tips-n-kicks of AS/400

 

SEO [PR] 爆速!無料ブログ 無料ホームページ開設 無料ライブ放送