You are viewing an old version of this page. View the current version.

Compare with Current View Page History

Version 1 Next »

例 - 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