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