注釈: この記事は、Passing and Receiving Pointers with C/C++ DLLs from LabVIEW を翻訳したものです。内容に相違がある場合、英語の資料が正文となっております。
CやC++の関数は多くの場合、関数プロトタイプでポインタを受け付けます。ポインタとはメモリアドレスを表す整数値です。
ポインタをDLLに渡す、つまり値のメモリアドレスをLabVIEWからDLLに渡すためには、ライブラリ関数呼び出しノードを構成して値を参照渡しする必要があります。ただし、LabVIEWはデータのメモリ割り当てを公開しないため、メモリアドレスを直接渡すことはできません。
下記のライブラリ関数呼び出しノードの構成は、整数値へのポインタを受け付ける関数に適応できます。パスリストボックスを、値へのポインタに変更します。
void ReturningValuesByReference_Integer(int x, int y, int *sum);
C/C++では、配列はポインタとして定義されています。これは、配列変数が配列の先頭要素のメモリアドレスを保持していることを示します。
下記のライブラリ関数呼び出しノードの構成は、整数配列を受け付ける関数に適応できます。タイプを配列に設定します。適切な配列のデータタイプを指定し(この場合は整数)、配列フォーマットをデフォルトの配列データポインタにします。
int PassingParamters_ArrayOfIntegers (int x[], int length);
文字列は、charタイプの配列として定義されているため特殊です。このため、文字列は既に参照渡しされています。
下記のライブラリ関数呼び出しノードの構成は、文字列入力を受け付ける関数に適応できます。文字列フォーマットをデフォルトのC文字列ポインタにします。
int PassingParamters_String (char *str);
下記のライブラリ関数呼び出しノードの構成は、構造体と構造体へのポインタを受け付ける関数に適応できます。構造体を渡すためには、構造体の要素を順番に渡し、構造体へのポインタは、構造体を表すクラスタを入力し、タイプをタイプに適応、データフォーマットを値へのハンドルに設定します。
void ReturningValuesByReference_SimpleStruct (struct simpleStructCircle circle, struct simpleStructCircle *largerCircle);
C/C++のDLLは要求された値のメモリ位置へのポインタを使用してデータを返します。これには2通りの方法があります。
1. ポインタを戻す: 下記のように、ポインタが関数の戻り値として返されます。
int * ReturnAValue_PointerToInteger(void)
{
int *x = (int *) malloc(sizeof(int));
*x = 5;
return x;
}
ライブラリ関数呼び出しノードは、整数、文字列、とvoidタイプの戻り値のみを返すため、ポインタをメモリアドレスを表す整数として受け取り、手動でポインタをデリファレンスして値を取得する必要があります。
詳しくは ポインタをメモリアドレスとして受け取り手動でデリファレンスセクションを参照してください。
2. 参照渡し: ポインタが関数の引数を通して返されます。
void ReturningValuesByReference_Integer (int x, int y, int *sum)
{
//sum is a pointer
*sum = x + y;
}
返されるデータタイプにより、自動的にポインタをデリファレンスする(数値やシンプルな構造体など)、もしくはポインタをメモリアドレスを表す整数として受け取り、手動でポインタをデリファレンスして値を取得します。
詳しくは ポインタをメモリアドレスとして受け取り手動でデリファレンス と ポインタを受け取り自動的にデリファレンスセクションを参照してください。
ライブラリ関数呼び出しノードは、数値やシンプルな構造体などのLabVIEWの一般的なデータタイプへのポインタを自動的にデリファレンスすることが可能です。この方法は、DLLにポインタを渡す方法とまったく同じで、引数を入力ではなく出力として扱います。
ポインタを受け取るためには、ライブラリ関数呼び出しノードを整数値を受け取れるように構成します。この整数値がメモリアドレスです。値を取得するためには、このメモリアドレスをデリファレンスする必要があります。
ライブラリ関数呼び出しノードでポインタを受け取るように構成するためには、タイプを数値、データタイプを符号付きポインタサイズ整数に設定します。ポインタサイズ整数は、ライブラリ関数呼び出しノードでOSやLabVIEWにより、自動的にポインタサイズ(32ビットか64ビット)を決定します。
メモ:この入力に32ビット整数を配線すると、32ビットOSでも強制ドットが発生します。
ポインタをデリファレンスする(ポインタが指す値を受け取る)方法の詳細は、下記の記事に記載されています。
LabVIEW で C/C++ の DLL からのポインタをデリファレンスする
LabVIEWでポインタをデリファレンスする方法や特殊なケースについては、下記の記事に記載されています。
LabVIEW で C/C++ の DLL からのポインタをデリファレンスする
ポインタを上記の方法で扱うサンプルは、下記の記事に記載されています。
様々なデータタイプを含む C/C++ の DLL を LabVIEW から呼び出す