%SIZE はフィールドまたは構造体の長さを取得する組込み関数である。
_
C言語でも効率のよい長さ(=サイズ)の取得方法として sizeof という関数が
頻繁に利用されるが %SIZE もこれと同じ機能である。
%SIZEの基底となる元のフィールドや構造体の定義が変わっても
%SIZEを変更する必要はない。
そのため拡張性、汎用性を与える関数として %SIZE の利点がある。
特にAPIを使う場合にAPIの受取り変数の長さをパラメータで与える必要があるが
このときに %SIZEを利用すると将来のAPIの変数の拡張に対応することができる。
社内で使用する変数でも%SIZEによって長さを宣言しておくと対象となる変数が
拡張されても長さを修正する必要がない。
またプログラムの読み手にこれは長さを示していると伝えることができるので
読み手は意味を理解しやすい。
単に長さを表示するよりこれは変数の長さであると表現するほうが
読み手に対して親切でわかりやすいものとなる。
プログラムにわかりやすく記述することが重要でその意味でも
%SIZEの使用は効果的である。
それでは %SIZE の実践的な使い方を紹介しよう。
■ 効果的な組込み関数 %SIZE の使い方の TESTSIZ
ソースはこちらから
0001.00 H DFTNAME(TESTSIZ) DATEDIT(*YMD/) BNDDIR('QC2LE') 0002.00 F********** 効果的な組込み関数 %SIZE の使い方 ************************* 0003.00 F* 0004.00 F********************************************************************** 0005.00 0006.00 * CRTBNDRPG PGM(OBJLIB/TESTSIZ) SRCFILE(SRCLIB/QRPGLESRC) DFTACTGRP(*NO) 0007.00 * ACTGRP(*NEW) DBGVIEW(*SOURCE) AUT(*ALL) 0008.00 0009.00 D APIERR DS QUALIFIED 0010.00 D GETBYT 1 4B 0 INZ(160) 0011.00 D AVLBYT 5 8B 0 INZ(0) 0012.00 D APIID 9 15 0013.00 D APIDTA 17 160 0014.00 0015.00 *( API : QMHRCVPM: プログラム・メッセージの受取りの定義 ) 0016.00 D QMHRCVPM PR EXTPGM('QMHRCVPM') 0017.00 D MSGINFO 32767 OPTIONS(*VARSIZE) 0018.00 D MSGLEN 10I 0 CONST 0019.00 D FORMAT 8A CONST 0020.00 D CALLSTK 4096A CONST 0021.00 D CALLSTKCNT 10I 0 CONST 0022.00 D MSGTYPE 10A CONST 0023.00 D MSGKEY 4A CONST 0024.00 D WAITTIME 10I 0 CONST 0025.00 D ACTION 10A CONST 0026.00 D APIERR LIKEDS(APIERR) 0027.00 D OPTIONS(*VARSIZE) 0028.00 D CALLSTKLEN 10I 0 CONST OPTIONS(*NOPASS) 0029.00 D CALLSTKQUAL 20 CONST OPTIONS(*NOPASS) 0030.00 0031.00 D MSGINFO S 32767A 0032.00 D MSGLEN S 10I 0 0033.00 D CALLSTKCNT S 10I 0 0034.00 D CALLSTKLEN S 10I 0 0035.00 D MSGTYPE S 10A 0036.00 D MSGKEY S 4A 0037.00 D COUNT S 10I 0 INZ(0) 0038.00 D WTTIME S 10I 0 INZ(0) 0039.00 0040.00 D DS 1024 0041.00 D VALUE# 1 2 0042.00 D VALUE 1 1024 0043.00 0044.00 C EVAL MSGLEN = %SIZE(MSGINFO) 0045.00 C*----------------------------------------------------+ 0046.00 C CALL 'QMHRCVPM' 0047.00 C PARM MSGINFO 0048.00 C PARM MSGLEN 0049.00 C PARM 'RCVM0200' FORMAT 8 0050.00 C PARM '*' STACK 10 0051.00 C PARM COUNT 0052.00 C PARM '*LAST ' MSGTYPE 10 0053.00 C PARM MSGKEY 4 0054.00 C PARM WTTIME 0055.00 C PARM '*SAME ' LEAVE 10 0056.00 C PARM APIERR 0057.00 C*----------------------------------------------------+ 0058.00 /FREE 0059.00 QMHRCVPM(MSGINFO:%SIZE(MSGINFO):'RCVM0200':VALUE:CALLSTKCNT: 0060.00 MSGTYPE:MSGKEY:0:'*SAME':APIERR: 0061.00 CALLSTKLEN:'*NONE *NONE '); 0062.00 /END-FREE 0063.00 C SETON LR 0064.00 C RETURN 0065.00
[解説]
固定式記述では組込み関数は EVAL と組み合わせて使用するしか方法がないが
フリー・フォーマットであればフリー・フォーマット内のパラメータでも
組込み関数 %SIZE を使用することができる。
このようにフリー・フォーマットのほうが柔軟な記述ができるので
今後の開発はフリー・フォーマットを積極的に取り入れたほうがよい。