2009-07-25 7 views
7

Sto utilizzando l'interfaccia MEX per eseguire codice C++ in MATLAB. Vorrei aggiungere diverse funzioni di MATLAB per la gestione di un oggetto System:MATLAB Interfaccia MEX a un oggetto di classe con più funzioni

sysInit() 
sysRefresh() 
sysSetAttribute(name, value) 
String = sysGetAttribute(value) 
sysExit() 

Dal momento che ogni dll MEX può contenere una funzione, ho bisogno di trovare un modo per memorizzare il puntatore System all'oggetto globale che esisterà fino a quando cancellato da una chiamata a sysExit.

Come posso farlo correttamente in MATLAB? Esistono modi per archiviare i puntatori globali attraverso le chiamate alle funzioni MEX?

risposta

8

Un approccio comune è quello di avere diverse funzioni di m-file che forniscono l'interfaccia pubblica, ad es. sysInit.m, sysRefresh.m, ecc.

Ognuno di questi m-file chiama la funzione mex con una sorta di handle, una stringa (o numero) che identifica la funzione da chiamare e qualsiasi argomento aggiuntivo. Ad esempio, sysRefresh.m potrebbe essere simile:

function sysRefresh(handle) 
return sysMex(handle, 'refresh') 

Nella funzione di Sysmex mex, è possibile avere il manico sia un puntatore mucchio grezzo (facile, ma non molto sicuro), oppure si può mantenere una mappatura C/C++ dall'ID di handle ai puntatori di oggetto reali. Questa soluzione richiede un piccolo lavoro extra, ma è molto più sicuro. In questo modo, qualcuno non può passare accidentalmente un numero arbitrario come una maniglia, che agisce come un puntatore pendente. Inoltre, puoi fare cose più elaborate, ad esempio utilizzare una funzione onCleanup per rilasciare tutta la memoria e le risorse quando si scarica la funzione mex (ad esempio in modo da non dover riavviare matlab quando si ricompila la funzione mex).

Puoi andare un po 'più avanti se preferisci e nascondere la maniglia dietro una classe Matlab. Leggi le caratteristiche di OO per Matlab nei documenti se sei interessato. Se stai utilizzando una versione recente, puoi trarre vantaggio dai loro oggetti maneggevoli molto più puliti.

+1

Grazie signor Fooz. Ho implementato con handle (direttamente come puntatore) e sembra che funzioni. Questo è un po 'sorprendente per me che l'oggetto di classe allocato nell'heap non viene cancellato quando la funzione mex restituisce. Si tratta di un comportamento normale su cui posso fare affidamento su Windows (XP, Vista e 7)? Grazie mille ancora. – Paul

+1

Se si assegnano oggetti usando l'allocatore di Matlab, questi vengono automaticamente cancellati al ritorno dalla funzione mex. Se usi malloc o new, allora Matlab non li conosce e quindi non disalloca. –

3

In alternativa, è possibile evitare di utilizzare MEX. In MATLAB (su Windows) è possibile caricare qualsiasi DLL generica con loadlibrary e chiamare qualsiasi delle sue funzioni con callib. Questo probabilmente non è portatile tra i sistemi operativi, però.

+0

Anche questo è un buon suggerimento. Preferirei usare l'interfaccia mex in quanto è il modo ufficiale di estendere MATLAB e mi aspetto di integrarmi strettamente con MATLAB. Grazie mille. – Paul

+0

Questo sembra essere un modo supportato per farlo. Le funzioni sono documentate qui: http://www.mathworks.com/help/matlab/using-c-shared-library-functions-in-matlab-.html Un esempio di utilizzo è qui: https: // github .com/Smitec/rustlab/blob/d239e23a57c6c53dffd1b11c3e0e4fc193a3a0f7/src/test.m –

Problemi correlati