2009-07-25 12 views
7

Estoy usando la interfaz MEX para ejecutar código C++ en MATLAB. Me gustaría añadir varias funciones de MATLAB para el manejo de un objeto System:Interfaz MATLAB MEX para un objeto de clase con funciones múltiples

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

Dado que cada DLL MEX puede contener una función, tengo que encontrar una manera de almacenar el puntero a la System objeto global que existirá hasta borrado por una llamada al sysExit.

¿Cómo puedo hacer esto en MATLAB correctamente? ¿Hay alguna forma de almacenar punteros globales en llamadas a funciones MEX?

Respuesta

8

Un enfoque común es tener varias funciones m-file que proporcionan la interfaz pública, p. sysInit.m, sysRefresh.m, etc.

Cada uno de estos archivos m llama a la función mex con algún tipo de manejador, una cadena (o número) que identifica la función a llamar y cualquier argumento adicional. Por ejemplo, sysRefresh.m podría ser:

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

En su función de Sysmex mex, puede ser el mango tiene un puntero montón prima (fácil, pero no es muy seguro), o se puede mantener una asignación en C/C++ desde el identificador del identificador a los punteros del objeto real. Esta solución requiere un poco de trabajo extra, pero es mucho más segura. De esta forma, alguien no puede pasar accidentalmente un número arbitrario como manejador, que actúa como un puntero colgante. Además, puede hacer cosas más sofisticadas como usar una función onCleanup para liberar toda la memoria y los recursos cuando descargue la función mex (por ejemplo, para que no tenga que reiniciar matlab cuando recompila la función mex).

Puede ir un poco más lejos si le gusta y esconde el mango detrás de una clase Matlab. Lea sobre las características de OO para Matlab en los documentos si le interesa. Si está utilizando una versión reciente, puede aprovechar sus objetos de manejo mucho más limpios.

+1

Gracias Sr. Fooz. Lo he implementado con handle (directamente como el puntero) y parece estar funcionando. Esto es un poco sorprendente para mí que el objeto de clase asignado en el montón, no se borre cuando la función mex regrese. ¿Es este un comportamiento normal en el que puedo confiar en Windows (XP, Vista y 7)? Muchas gracias de nuevo. – Paul

+1

Si asigna objetos utilizando el asignador de Matlab, estos se eliminan automáticamente al regresar de la función mex. Si usa malloc o new, entonces Matlab no los conoce y, por lo tanto, no se desasigna. –

3

Alternativamente, puede salirse con la suya sin usar MEX en absoluto. En matlab (en Windows) puede cargar cualquier dll genérico con loadlibrary y llamar a cualquiera de sus funciones con callib. Sin embargo, esto probablemente no sea portátil en todos los sistemas operativos.

+0

Esto también es una buena pista. Preferiría usar la interfaz de mex ya que es la forma oficial de extender MATLAB y espero integrarme estrechamente con MATLAB. Muchas gracias. – Paul

+0

Esta parece ser una forma compatible para hacerlo. Las funciones están documentadas aquí: http://www.mathworks.com/help/matlab/using-c-shared-library-functions-in-matlab-.html Un ejemplo de su uso está aquí: https: // github .com/smitec/rustlab/blob/d239e23a57c6c53dffd1b11c3e0e4fc193a3a0f7/src/test.m –

Cuestiones relacionadas