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.
fonte
2009-07-27 11:46:38
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
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. –