新規投稿 記事一覧 ホーム
●ご利用方法,ご利用に際しての規約はこちらをお読みください。
こちらからの投稿は、先頭に表示されているコメントへの返信になります。
プロシージャーの戻り値の複数定義は可能ですか 伊集院博 さん [ 10月21日(火) 9時25分 ]

    いつもお世話になっています。
    貴社の「Tips&Tecniques」をいつも参考にさせていただいています。
    サブプログラムのプロシージャー化を検討してみたいと思っております。
    タイトルにも有るようにプロシージャーの戻り値を複数定義は可能でしょうか?
    例えば文字列分割の機能をプロシージャー化する場合、
    どのように定義したらよいでしょうか。

    RE:プロシージャーの戻り値の複数定義は可能ですか IKD さん [ 10月24日(金) 14時35分 ]

      こちらこそ、お世話になります。
      プロシージャーの戻り値を複数定義することはできません。
      しかし、現実はご指摘のように結果として TRUE または FALSE を
      戻して、TRUE であれば、初めて戻り値を取得したい、というような
      処理の必要性があります。
      これを解決するにはプロシージャーのパラメータにポインターを
      定義することです。
      ポインターをパラメータとして渡して、渡されたプロシージャー側で
      そのポインターを基底とする変数を更新してやれば元の変数の実体を変更することが
      できます。
      この手法は他の言語でもよく使用されている方法です。
      下記にそのサンプルをご紹介します。
      この例では品種名 HNSNAM のポインターをパラメータ値として渡しています。
      このようなテクニックは EnterpriseServer Ver5.1 のヘルプでも
      詳細な解説を予定しています。

      Source: http://218.44.135.18/QSYS.LIB/PGMRLIB.LIB/QRPGLESRC.FILE/TESTPTR.MBR

      0001.00 H DFTNAME(TESTPTR) DATEDIT(*YMD/) DFTACTGRP(*NO)                       
      0002.00 F**********  品種マスターの照会 ***************************************
      0003.00 FHINSHU    IF   E           K DISK                                     
      0004.00 F**********************************************************************
      0005.00 D GET_HINSHU      PR             4S 0                                  
      0006.00 D  HNSCOD                        4A   VALUE                            
      0007.00 D  HNSNAM_P                       *   VALUE                            
      0008.00                                                                        
      0009.00 D RES             S              4S 0                                  
      0010.00 D TRUE            S              4S 0 INZ(0)                           
      0011.00 D FALSE           S              4S 0 INZ(-1)                          
      0012.00                                                                        
      0013.00 C                   MOVEL     '0001'        HNSCOD                     
      0014.00 C                   EVAL      RES = GET_HINSHU(HNSCOD: %ADDR(HNSNAM))  
      0015.00 C                   IF        RES = TRUE                               
      0016.00 C*  ( 取得成功 ! )                                                     
      0017.00 C     'HNSNAM='     CAT(P)    HNSNAM:0      DSP40            40        
      0018.00 C     DSP40         DSPLY                   ANS               1        
      0019.00 C                   ELSE                                               
      0020.00 C*  ( 取得失敗 ! )                                                     
      0021.00 C     'FAILED'      DSPLY                   ANS                      
      0022.00 C                   END                                              
      0023.00 C                   SETON                                        LR  
      0024.00 C******************************************************              
      0025.00  *   GET_HINSHU :   品種名の取得                                     
      0026.00 C******************************************************              
      0027.00 P GET_HINSHU      B                   EXPORT                         
      0028.00 D                 PI             4S 0                                
      0029.00 D  HNSCOD                        4A   VALUE                          
      0030.00 D  HNSNAM_P                       *   VALUE                          
      0031.00                                                                      
      0032.00 D  RTNNAME        S             14    BASED(HNSNAM_P)                
      0033.00 C                   SETOFF                                       99  
      0034.00 C     HNSCOD        CHAIN     HINSHU                             99  
      0035.00 C     *IN99         IFEQ      *OFF                                   
      0036.00 C                   MOVEL     HNSNAM        RTNNAME                  
      0037.00 C                   RETURN    TRUE                                   
      0038.00 C                   ELSE                                             
      0039.00 C                   RETURN    FALSE                                  
      0040.00 C                   END                                              
      0041.00 P                 E                                                  

      RE:プロシージャーの戻り値の複数定義は可能ですか 伊集院博 さん [ 10月24日(金) 16時55分 ]

        なるほど...。
        戻り値のポインターを返す事ができるのですね。
        これであれば戻り値を複数定義する事も可能ですね。
        色々応用できそうです。
        ありがとうございました。

お名前
パスワード
e-mailアドレス
タイトル
ホームページ
アドレス