例 - 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 で番号が振られます。