1つ前の例を変更して、RDMLX リストを操作することができます。
以下に示すように、C コードの始めの部分で #include "x_bif000.h" の直前に #ifdef … #endif のセットを使用して、X_ALLOW_10_0_STRUCTURES 定義を無効にする必要があります。
#ifdef X_ALLOW_10_0_STRUCTURES
#undef X_ALLOW_10_0_STRUCTURES
#endif
また、リスト・エントリーのカウンターとリスト・エントリーのインデックス・タイプも X_SHORT から X_LIST_COUNT に変更する必要があります。
この RDMLX ファンクションで使用され、平均値を算出するエントリーは 999999 までサポートされます。
define field(#number) type(*dec) length(7) def_list name(#list) fields(#number) type(*working) entrys(999999) 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" /* RDMLX リストの有効化 */ #ifdef X_ALLOW_10_0_STRUCTURES #undef X_ALLOW_10_0_STRUCTURES #endif #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_LIST_COUNT lEntrys = 0 ; /* Instead of X_SHORT sEntrys = 0; */ X_LONG lAverage = 0; /* ------------------------------------- */ /* リスト ポインターを設定し、エントリー数を取得 */ /* ------------------------------------- */ U_BIF_SET_ARG_LIST_POINTER (pListArg1, 0) U_BIF_GET_LIST_CURRENT_ENTRYS (pListArg1, lEntrys) /* ------------------------------------- */ /* リストにエントリーが存在する場合 */ /* ------------------------------------- */ if (lEntrys > 0) \{ X_LIST_COUNT lCurrentEntry; /* Instead of X_SHORT sCurrentEntry; */ X_CHAR chFound; X_LONG lValue; X_DOUBLE dTotal = 0; /* -------------------------------------- */ /* リストのエントリーすべてを処理し、 */ /* 全エントリー値の平均を算出 */ /* -------------------------------------- */ for (lCurrentEntry = 1; lCurrentEntry <= lEntrys; lCurrentEntry ++) \{ U_BIF_GET_ENTRY_FROM_LIST (pListArg1, lCurrentEntry, chFound) U_BIF_GET_LIST_COLUMN_AS_LONG (pListArg1, 0, lValue) dTotal = dTotal + lValue; \} lAverage = dTotal / lEntrys; \} /* ------------------------------------- */ /* 結果を値 1 に返す */ /* ------------------------------------- */ U_BIF_SET_RET_FROM_LONG (0, lAverage); U_BIF_SET_GOOD_RETURN \} /* ------------------------------------------------------------- */ /* コントロールを呼び出し元に返す */ /* ------------------------------------------------------------- */ U_BIF_RETURN; \} |