構造化データ型を使用する場合、構造要素の配置とサイズに注意することが重要です。 次の表に、Silk Performer スクリプトの関数宣言で使用できる一般的なすべてのデータ型のサイズを示します。
| データ型 | サイズ |
|---|---|
| Char、unsigned char | 1 |
| Short、unsigned short | 2 |
| Long | 4 |
| Double | 8 |
| Float | 4 |
| Char[x] | x |
次の例では、単純なデータ型をすべて含むデータ構造を示すことによって、構造の組成を明らかにします。
// 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 は、構造化データ型を処理するために、適切な長さの文字列および型に従った数値の Get 関数および Set 関数を使用します。 関数に渡される各構造化データ型に対して、inout 文字列パラメータを定義する必要があります。 これらの文字列は、DLL で定義されているデータ構造と正確に一致する必要があります。
構造化データ型を保持できる BDL 文字列の最初の位置は 1 です。 変数が 1 バイト境界に配置されている場合、次の要素の開始位置は、現在の位置を現在の要素のサイズに加えることによって求めることができます。 上記の例で宣言されたデータ構造の場合、32 バイトの文字列が必要となります。
"T_STRUCT" function t_struct(inout string(32)): string(1000);
以下の例では、データ構造のすべての要素に対して、対応する 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;