Page History
[ |../../index.htm#lansa/dsnbi_0230.htm]
現在地:
| Anchor | ||||
|---|---|---|---|---|
|
| Anchor | ||||
|---|---|---|---|---|
|
組み込み関数を 3GL プログラムとして定義
このセクションでは、組み込み関数をプログラムとして作成する際の手順を説明します。以下に示されているサンプルは非常に簡素なものですが、LANSA で組み込み関数がどのように利用されるのかの概要が理解できると思います。
シナリオ:これはユーザー定義の組み込み関数です。この組み込み関数を使って、システム値を取得します。
簡素な C プログラムです。このプログラムは、システム値の名前を渡し、システム値が返されます。
この名前は UD_AVERAGE です。
このサイトで次に利用可能な識別子は 413 です。
この組み込み関数は、 LANSA RDML 言語では以下のようにアクセスすることが可能です。
define field(#number1) type(*dec) length(7) define field(#number2) type(*dec) length(7) define field(#mean) type(*dec) length(7) request fields(#number1 #number2) use ud_average with_arg(#number1 #number2) to_get(#mean) pop_up fields(#mean)
次は、UD_AVERAGE という名前の C のユーザー定義組み込み関数で、引数として、2 つの 10 進数を受け取り、その平均値を返します。
引数と返り値はすべて必須の値です。
この組み込み関数は平凡なもので、これを利用することもないかもしれませんが、まずは簡単な取り掛かりとして紹介します。
BIF 定義 (IBM i は DC@F47 ファイル/Windows は LX_F47 ファイル)
...
- C マクロの多用について。U_BIF_xxxx 参照のすべてはヘッダーファイル(.H) X_BIF000.H に含まれているマクロへの参照です。 これらのマクロはコンパイル時に C コードに展開されます。可能なかぎり、組み込み関数と Visual LANSA 定義の間の"インターフェース"、もしくは呼び出しのインターフェースとして、これらのマクロを利用するようにしてください。こうすことで、将来変更があったとしても、アプリケーションを守ることができます。 U_BIF マクロは多数用意されています。全マクロの一覧は「提供の マクロは多数用意されています。全マクロの一覧は「提供の U_BIF マクロ」を参照してください。マクロ」を参照してください。
- タイプ (例: X_LONG) を使ったローカル変数の定義について。この定義は標準のヘッダー・ファイル X_GLODEF.H に含まれており、Visual LANSA から提供されます。U_BIF に渡される変数は、必ず (マクロ定義に示された) これらのタイプを使って宣言する必要があります。
変数宣言
ポインター宣言
関係する実際の C タイプ
X_VOID
X_PVOID
Void
X_BOOL
X_PBOOL
Int
X_SHORT
X_PSHORT
Short
X_USHORT
X_PUSHORT
符号なし short
X_LONG
X_PLONG
Long
X_ULONG
X_PULONG
符号なしd long
X_LONGLONG
X_PLONGLONG
LONGLONG (Windows): 64 ビット 符号付き整数WATCOMC との使用は推奨されません。
X_DOUBLE
X_PDOUBLE
double
X_CHAR
X_PCHAR
char (1 文字のみ)
X_VCHAR
X_PVCHAR
char ( > NULL/文字列終端を伴う 1 つの文字)
X_LIST_COUNT
X_LIST_COUNT *
Long
- C の番号の設定規則の使用について。慣例では、多くの C オブジェクトはオフセット ("N" 個のものについては 0 から N-1) により番号が振られています。 この規則がすべての U_BIF マクロにも使われています。ですから、"引数の番号 3" というのは、実際は U_BIF マクロ内では番号 2 として参照されています。 一般的にこのアプローチにより、コーディングしやすくなります。例えば、このファンクションをよりジェネリックなものにして、2 から 20 までの番号を引数として受け取るようにします (0 で除算するテストが不要)。これを行うためには、ファンクションのボディを次のように変更する必要があります。
{
X_LONG lArgValue;
X_SHORT sTotalArgs;
X_SHORT sCurrentArg;
X_DOUBLE dTotal = 0;
U_BIF_GET_ARGUMENT_COUNT (sTotalArgs)
for (sCurrentArg = 0; sCurrentArg < sTotalArgs; sCurrentArg++)
{
U_BIF_GET_ARG_AS_LONG (sCurrentArg, lArgValue)
dTotal = dTotal + lArgValue;
}
lAverage = dTotal / sTotalArgs;
U_BIF_SET_RET_FROM_LONG (0, lAverage)
U_BIF_SET_GOOD_RETURN
}
[ |../../index.htm#lansa/dsnbi_0230.htm]