外部関数の構造化データ型

構造化データ型を使用する場合、構造要素の配置とサイズに注意することが重要です。 次の表に、Silk Performer スクリプトの関数宣言で使用できる一般的なすべてのデータ型のサイズを示します。

入力および出力パラメータとして許可される単純なデータ型は、以下のとおりです。
表 1. 通常のデータ型のサイズ
データ型 サイズ
Char、unsigned char 1
Short、unsigned short 2
Long 4
Double 8
Float 4
Char[x] x

C ソース コード

次の例では、単純なデータ型をすべて含むデータ構造を示すことによって、構造の組成を明らかにします。

// declare a demo data structure
#pragma pack(1) // alignment to 1-byte boundaries
typedef struct {
  char           myChar;       // size: 1 byte pos: 1
  short          myShort;      // size: 2 bytes pos: 2
  long           myLong;       // size: 4 bytes pos: 4
  double         myDouble;     // size: 8 bytes pos: 8
  float          myFloat;      // size: 4 bytes pos: 16
  unsigned short myUShort;     // size: 2 bytes pos: 20
  char           myString[10]; // size: 10 bytes pos: 22
  unsigned char  myUChar;      // size: 1 byte pos: 32
} TESTSTRUCT;
#pragma pack()

 char* T_STRUCT(TESTSTRUCT * s)
{
  char sBuf[10000];
  // manipulate values of data structure and generate a
  // return value for demonstration purpose
  ...
  return sBuf;
}

BDL 外部関数の宣言

BDL は、構造化データ型を処理するために、適切な長さの文字列および型に従った数値の Get 関数および Set 関数を使用します。 関数に渡される各構造化データ型に対して、inout 文字列パラメータを定義する必要があります。 これらの文字列は、DLL で定義されているデータ構造と正確に一致する必要があります。

構造化データ型を保持できる BDL 文字列の最初の位置は 1 です。 変数が 1 バイト境界に配置されている場合、次の要素の開始位置は、現在の位置を現在の要素のサイズに加えることによって求めることができます。 上記の例で宣言されたデータ構造の場合、32 バイトの文字列が必要となります。

"T_STRUCT"
  function t_struct(inout string(32)): string(1000);

BDL 外部関数の呼び出し

以下の例では、データ構造のすべての要素に対して、対応する Set 関数を使用して任意の値が割り当てられます。 次に、外部関数 t_struct が呼び出されて、データ構造を操作します。

dcltrans
  transaction TMain
  var
    n1, n2, n3, n4, n5  : number;
    n6, n7, n8, n9, n10 : number;
    f1, f2, f3, f4      : float;
    sStruct             : string(100);
    sRet                : string(1000);
  begin
    /* one-byte alignment */
    SetChar (sStruct, 1, 127);
    SetShort (sStruct, 2, 32000);
    SetLong (sStruct, 4, 2000000);
    SetDouble(sStruct, 8, 12345.12345);
    SetFloat (sStruct, 16, 12.99);
    SetUShort(sStruct, 20, 64000);
    SetString(sStruct, 22, "123456789", 10);
    SetUChar (sStruct, 32, 255);
    sRet := t_struct(sStruct);
  end TMain;