Come usare la libreria C creata da MATLAB Coder codegen nel programma C con argomenti emxArray?

La funzione C (libreria statica C) creata da codegen accetta un argomento di input di tipo const emxArray_uint32_T e restituisce valori di tipo emxArray_struct_T . Come suggerisce il tipo, l’input è una matrice di uint32 e l’output è una matrice di struct.

Non sono sicuro di come utilizzare questa funzione nel mio programma C. Per l’input, dovrei dichiarare un array di tipo uint32_T o usare il tipo emxArray_uint32_T ? Per l’output, perché non conosco la dimensione della matrice di output, come dichiarare la matrice di struct per ricevere i valori di ritorno dalla funzione?

Ho posto la domanda nelle risposte MATLAB ma non ho fortuna ..

Grazie!

Se si guarda nella directory in cui è stato generato il codice, si dovrebbe trovare un file denominato _emxAPI.h . Questo file dichiara alcune funzioni di utilità che semplificano la costruzione e la distruzione emxArray valori emxArray . emxArray per creare valori emxArray garantisce che tutti i campi siano inizializzati correttamente e isolino il codice da eventuali modifiche al tipo emxArray .

In un esempio che ho fatto che prende una matrice di valori uint32 e restituisce anche un array di questo tipo, vedo le seguenti funzioni:

 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); 

Le prime quattro funzioni possono essere utilizzate per creare valori emxArray in diverse situazioni.

La prima coppia, ad esempio emxCreateWrapper_uint32_T, emxCreateWrapperND_uint32_T , può essere utilizzata per creare un uint32 emxArray con il numero specificato di dimensioni e dimensioni dai dati esistenti. Pertanto, se in una memoria sono già stati assegnati dati di input, queste funzioni emxArray il wrapping di tali dati in un emxArray della dimensione specificata senza allocare memoria aggiuntiva per i dati.

 /* 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); 

La seconda coppia, ad esempio emxCreate_uint32_T, emxCreateND_uint32_T , crea anche valori emxArray . Tuttavia, memorizzano anche l’allocazione della memoria per il campo data di emxArray . Questa memoria sarà abbastanza grande da contenere il numero di elementi specificati nei rispettivi argomenti di dimensione Dopo emxArray richiamati, sarà necessario popolare i dati memorizzati nel campo data della struttura emxArray restituita:

 /* 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); 

L’ultimo, emxDestroyArray_uint32_T , verrà utilizzato per distruggere l’array e deallocare qualsiasi memoria allocata con i metodi precedenti.

Infine, per acquisire l’output, è ansible utilizzare emxCreate_struct_T o emxCreateND_struct_T per creare un emxArray vuoto di struct_T valori con il numero corretto di dimensioni passando 0 per una o più dimensioni, ove appropriato. Il codice generato allocherà memoria sufficiente per contenere i dati risultanti emxArray output in fase di esecuzione. È quindi ansible controllare il campo delle size di questo emxArray output per visualizzare le dimensioni delle dimensioni del campo data ed estrarre i dati come desiderato.

La documentazione per l’utilizzo emxArray argomenti emxArray è disponibile qui .

È necessario utilizzare emxArray_uint32_T e emxArray_struct_T . Tutto il codificatore MATLAB definito tipi di dati che il codice utilizza (e che è necessario utilizzare) sono definiti nel file di intestazione _types.h YourLibName.