RPG の中での動的な文字列の生成 (spintf() 関数を使用して)

C のランタイム・ライブラリの中から今回は sprintf() を使ってみましょう。
最初から定数で長めの固定メッセージを作成しておき、その中で変更のある部分だけを差し替えて使用する、といった用途です。

sleep() の使用例を元に変更してみました。

もともと dsply 命令の引数として命令実行時にメッセージを組み立てていたわけなのですが、もし何回も同様のメッセージを出すような場合ではいかにも非効率なコーディングになってしまいますし、メッセージの文言に修正が入るような場合には影響が大きくなってしまいます。直し忘れなどのが発生してしまいかねませんね。

そこで、あらかじめ str というフィールドに定数として設定しておいて、変更箇所のみを dsply 命令の実行時にセットする、という形に変えてみました。

     H BNDDIR('QC2LE')  DFTACTGRP(*NO)                                                              
      *                                                                                             
     D sleep           PR            10u 0 extProc('sleep')                                         
     D  seconds                      10u 0 VALUE                                                    
      *                                                                                             
     D timeb           S              8a                                                            
     D timea           S              8a                                                            
      *                                                                                             
     D sprintf         PR            10u 0 extProc('sprintf')                                       
     D  string                         *   VALUE                                                    
     D  format                         *   VALUE OPTIONS(*STRING)                                   
     D  parm1                          *   VALUE OPTIONS(*STRING:*NOPASS)                           
     D  parm2                          *   VALUE OPTIONS(*STRING:*NOPASS)                           
      *                                                                                             
     D str             C                   CONST('PGM was slept from %s +                           
     D                                            to %s ')                                          
     D msg             S             50a                                                            
      /Free                                                                                         
                                                                                                    
              timeb = %CHAR(%time());                                                               
              sleep(5);                                                                             
              timea = %CHAR(%time());                                                               
              sprintf(%addr(msg):str:timeb:timea);                                                  
              dsply (%trimR(msg));                                                                  
                                                                                                    
              *inLR = *on ;                                                                         
              return;                                                                               
                                                                                                    
      /End-Free

ちゃんと固定メッセージに変数が埋められて表示されているのが確認できますね。

変数が数値の場合

数値変数を渡すケースの例です。

     H BNDDIR('QC2LE')  DFTACTGRP(*NO)                                                              
      *                                                                                             
     D sleep           PR            10u 0 extProc('sleep')                                         
     D  seconds                      10u 0 VALUE                                                    
      *                                                                                             
     D timeb           S              6  0                                                          
     D timea           S              6  0                                                          
      *                                                                                             
     D sprintf         PR            10u 0 extProc('sprintf')                                       
     D  string                         *   VALUE                                                    
     D  format                         *   VALUE OPTIONS(*STRING)                                   
     D  parm1                        10i 0 VALUE OPTIONS(*NOPASS)                                   
     D  parm2                        10i 0 VALUE OPTIONS(*NOPASS)                                   
      *                                                                                             
     D str             C                   CONST('PGM was slept from %d +                           
     D                                            to %d ')                                          
     D msg             S             50a                                                            
      /Free                                                                                         
                                                                                                    
              timeb = %dec(%time());                                                                
              sleep(5);                                                                             
              timea = %dec(%time());                                                                
              sprintf(%addr(msg):str:timeb:timea);                                                  
              dsply (%trimR(msg));                                                                  
                                                                                                    
              *inLR = *on ;                                                                         
              return;                                                                               
                                                                                                    
      /End-Free

取り立てて整形していないので数字そのままになってしまっていますが、実行結果が確認できます。

[Top Pageに戻る]

Ads by TOK2