%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 を使用することができる。
このようにフリー・フォーマットのほうが柔軟な記述ができるので
今後の開発はフリー・フォーマットを積極的に取り入れたほうがよい。
