2

codegen によって作成された C 関数 (C スタティック ライブラリ) は、型const emxArray_uint32_Tの入力引数を取り、型emxArray_struct_Tの値を返します。型が示すように、入力は uint32 の配列で、出力は struct の配列です。

C プログラムでこの関数を使用する方法がわかりません。入力に対して、タイプuint32_Tの配列を宣言するか、タイプemxArray_uint32_Tを使用する必要がありますか? 出力について、出力配列のサイズがわからないので、関数から戻り値を受け取る構造体の配列を宣言するにはどうすればよいですか?

質問をMATLABの回答に入れましたが、運がありません..

ありがとう!

4

2 に答える 2

4

C++ を使用したことがある場合、emxArrayデータ型は生成された C のstd::vector. つまり、これは生成されたコードが動的に割り当てられた配列を表す方法です。それらは、データとサイズのポインター、およびその他のいくつかの詳細を保存します。

コードを生成したディレクトリを見ると、 という名前のファイルが見つかるはずです<functionName>_emxAPI.h。このファイルは、値の構築と破棄emxArrayをより簡単にするいくつかのユーティリティ関数を宣言します。それらを使用して値を作成emxArrayすると、すべてのフィールドが適切に初期化され、コードがemxArray型に変更される可能性がなくなります。

値の配列を取り、uint32そのような配列を返す私が作成した例では、次の関数が表示されます。

extern emxArray_uint32_T *emxCreateWrapperND_uint32_T(unsigned int *data, int
                                                      numDimensions, int *size);
extern emxArray_uint32_T *emxCreateWrapper_uint32_T(unsigned int *data, int rows,
                                                    int cols);
extern emxArray_uint32_T *emxCreateND_uint32_T(int numDimensions, int *size);
extern emxArray_uint32_T *emxCreate_uint32_T(int rows, int cols);
extern void emxDestroyArray_uint32_T(emxArray_uint32_T *emxArray);

emxArray最初の 4 つの関数は、さまざまな状況で値を作成するために使用できます。

最初のペア、つまりemxCreateWrapper_uint32_T, emxCreateWrapperND_uint32_Tを使用しuint32 emxArrayて、指定された数の次元とサイズで既存のデータから を作成できます。そのため、すでに入力データがメモリに割り当てられている場合、これらの関数は、データにemxArray追加のメモリを割り当てることなく、指定されたサイズの にそのデータをラップします。

/* Create a 10-by-10 C array of uint32 values and wrap an emxArray around it */
uint32_T x[100];
emxArray *pEmx = NULL;
int k = 0;
for (k = 0; k < 100; k++) {
    x[k] = (uint32_T) k;
}

pEmx = emxCreateWrapper_uint32_T(x, 10, 10);

/* Use pEmx here*/

/* Deallocate any memory allocated in pEmx. */
/* This DOES NOT free pEmx->data because the "wrapper" function was used */
emxDestroyArray_uint32_T(pEmx);

2 番目のペア、つまりemxCreate_uint32_T, emxCreateND_uint32_Tも値を作成しemxArrayます。ただしdataemxArray. このメモリは、それぞれのサイズ引数で指定された要素数を保持するのに十分な大きさになります。これらを呼び出した後、返された構造体のdataフィールドに格納されたデータを設定する必要があります。emxArray

/* Allocate a 10-by-10 uint32 emxArray and fill the values */
int k = 0;
emxArray *pEmx = emxCreate_uint32_T(10, 10);
for (k = 0; k < 100; ++k) {
    pEmx->data[k] = (uint32_T) k;
}

/* Use pEmx here*/

/* Deallocate any memory allocated in pEmx. */
/* This DOES free pEmx->data */
emxDestroyArray_uint32_T(pEmx);

最後の ,emxDestroyArray_uint32_Tは、配列を破棄し、前のメソッドによって割り当てられたメモリの割り当てを解除するために使用されます。

最後に、出力をキャプチャするために、適切な場所で 1 つ以上のサイズに 0 を渡すことにより、適切な次元数で空の値を作成するためにemxCreate_struct_Torを使用できます。生成されたコードは、実行時に結果のデータを出力に保持するのに十分なメモリを割り当てます。次に、この出力のフィールドをチェックして、フィールドのディメンションのサイズを表示し、必要に応じてデータを抽出できます。emxCreateND_struct_TemxArraystruct_TemxArraysizeemxArraydata

emxArray引数の使用に関するドキュメントは、こちらから入手できます。

于 2014-06-17T19:02:01.863 に答える
1

emxArray_uint32_TemxArray_struct_Tを使用する必要があります。コードが使用する (そしてユーザーが使用する必要がある) MATLAB Coder 定義のデータ型はすべて、YourLibName _types.h ヘッダー ファイルで定義されています。

于 2014-06-15T14:28:32.200 に答える