RPG

452. 効果的な組込み関数の使い方 %SIZE

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