例 - RDML 作業リストの操作

2 番目の例は、最初に紹介した例の簡単なバリエーションです。  

これは、UD_AVERAGE_LIST により呼び出され、複数の番号からなる RDML "作業リスト" を引き渡せるようにします。

このリストの値はすべて集められ、その平均値が算出されます。

このファンクションの一意識別子は 414 です。

必須の引数が 1 つあり、それは、複数の数値からなる作業リストです。

必須の戻り値も 1 つで、これが数値リストの平均値です。

この RDML ファンクションで使用され、平均値を算出するエントリーは 1,000 までサポートされます。

     define field(#number) type(*dec) length(7)                 
  def_list name(#list) fields(#number) type(*working)       
           entrys(1000)                                     
  define field(#mean) type(*dec) length(7)                  
                                                             
  use  ud_average_list with_arg(#list) to_get(#mean)        

  UD_AVERAGE_LIST を導入するために必要となるユーザー定義組み込み関数のコードは例えば以下のようになります。 
/ ================================================================= */
/* ========== ユーザー定義組み込み関数の定義  =========== */
/* ================================================================ */
/*                                                                  */
/* ソース ファイル           : U_BIF414.C                           */
/* エントリー ポイント名     : U_Builtin_414                        */
/* リンク先 DLL 名         : U_BIF414.DLL                         */
/* 共有オブジェクト名        : u_bif414.O                           */
/* OS/依存性           : Yes/No                               */
/*                                                                  */
/* 修正履歴   :                                             */
/*                                                                  */
/* タスクID  日付    説明                                     */
/* =======   ====    ===========                                    */
/*                                                                  */
/* ================================================================ */
#define U_BIF_FUNCTION       U_Builtin_414
#define U_BIF_FUNCTION_NAME "U_Builtin_414"
#define U_BIF_DESCRIPTION   "この組み込み関数の説明" 

#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <limits.h>

#include "x_glodef.h"
#include "x_glousr.h"

#ifdef X_OPERATING_SYSTEM_WIN
#include <windows.h>
#endif

#include "x_funstr.h"
#include "x_funpro.h"
#include "x_bif000.h"
/*==================================================================*/
/*                                                                  */
/* 引数          : pX_Ids       - 標準 X_IDS システム定義   */
/*                 pX_Pro       - 標準 X_PRO プロセス定義 */
/*                pX_Fun       - 標準 X_FUN ファンクション定義 */
/*                pX_Bif       - 標準 X_BIF 組み込み関数定義 */
/*                X_Fld[:      - 標準 X_FLD フィールド定義   */
/*                X_List[:     - 標準 X_LIST リスト定義   */
/*                sInCount     - 引き渡された引数の数   */
/*                sInVec[:     - 引数のベクター              */
/*                sRetCount    - 戻り値の数             */
/*                 sRetVec[:    - 戻り値のベクター           */
/*                                                                  */
/*==================================================================*/
 X_VOID_FUNCTION U_BIF_FUNCTION ( U_BIF_STANDARD_PARAMETERS )
{

   /* ------------------------------------------------------------- */
   /* シャットダウン要求の処理 (通常はアクティビティは不要)    */
   /* ------------------------------------------------------------- */
    if (U_BIF_SHUTDOWN_REQUEST)
   {
      U_BIF_SET_GOOD_RETURN
   }
   /* ------------------------------------------------------------- */
   /* それ以外 (ELSE) は要求のアクティビティを実行                  */
   /* ------------------------------------------------------------- */
    else
   {

      U_BIF_DECLARE_LIST_POINTER (pListArg1)
      X_SHORT  sEntrys  = 0;
      X_LONG   lAverage = 0;

      /* ---------------------------------------------- */
      /* リスト ポインターを設定し、エントリー数を取得  */
      /* ---------------------------------------------- */

       U_BIF_SET_ARG_LIST_POINTER (pListArg1, 0)
       U_BIF_GET_LIST_CURRENT_ENTRYS (pListArg1, sEntrys)

      /* ------------------------------------- */
      /*  リストにエントリーが存在する場合   */
      /* ------------------------------------- */

       if (sEntrys > 0)
      {
         X_SHORT  sCurrentEntry;
         X_CHAR   chFound;
         X_LONG   lValue;
         X_DOUBLE dTotal = 0;

         /* -------------------------------------- */
         /* リストのエントリーすべてを処理し、 */
         /* 全エントリー値の平均を算出       */
         /* -------------------------------------- */

      for (sCurrentEntry = 1; sCurrentEntry <= sEntrys; sCurrentEntry++)
        {
           U_BIF_GET_ENTRY_FROM_LIST (pListArg1, sCurrentEntry, chFound)
           U_BIF_GET_LIST_COLUMN_AS_LONG (pListArg1, 0, lValue)
           dTotal = dTotal + lValue;
         }
          lAverage = dTotal / sEntrys;
       }
      /* ------------------------------------- */
      /* 結果を値 1 に返す   */
      /* ------------------------------------- */
        U_BIF_SET_RET_FROM_LONG (0, lAverage);
        U_BIF_SET_GOOD_RETURN
    }

   /* ------------------------------------------------------------- */
   /* コントロールを呼び出し元に返す                                */
   /* ------------------------------------------------------------- */
    U_BIF_RETURN;
}

この例に関する注意点は以下の通りです。

  • 作業リストの操作について。組み込み関数に引き渡された作業リストは、簡単な U_BIF を利用することで、読み込んで更新したり、データを追加、もしくはクリアすることができます。

  • 引数や戻り値とは異なり、作業リストのエントリーは、 0 から (N-1) ではなく、1 から N で番号が振られます。
  • No labels