2009-07-25 19 views
7

Używam interfejsu MEX do uruchamiania kodu C++ w MATLAB. Chciałbym dodać kilka funkcji do MATLAB za dotknięciem System obiektu:Interfejs MATLAB MEX do obiektu klasy z wieloma funkcjami

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

ponieważ każdy dll MEX może zawierać jedną funkcję, muszę znaleźć sposób na przechowywanie wskaźnik do globalnego System obiektu, który będzie istnieć, dopóki usunięte przez połączenie z numerem sysExit.

Jak zrobić to poprawnie w MATLAB? Czy są jakieś sposoby przechowywania globalnych wskaźników przez wywołania funkcji MEX?

Odpowiedz

8

Jednym z powszechnych podejść jest posiadanie kilku funkcji m-plików, które udostępniają interfejs publiczny, np. sysInit.m, sysRefresh.m, itp.

Każdy z tych plików m wywołuje funkcję mex z jakimś uchwytem, ​​ciągiem (lub liczbą) identyfikującą funkcję, która ma zostać wywołana, oraz wszelkie dodatkowe argumenty. Na przykład, sysRefresh.m może wyglądać następująco:

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

w funkcji SYSMEX mex, można mieć uchwyt być surowy wskaźnik stosu (łatwe, ale nie bardzo bezpieczne), czy można utrzymać mapowanie w C/C++ od identyfikatora uchwytu do rzeczywistych wskaźników obiektu. To rozwiązanie wymaga trochę dodatkowej pracy, ale jest o wiele bezpieczniejsze. W ten sposób ktoś nie może przypadkowo przekazać dowolnej liczby jako uchwytu, który działa jak zwisający wskaźnik. Możesz także robić bardziej wyrafinowane rzeczy, takie jak użycie funkcji onCleanup, aby zwolnić całą pamięć i zasoby, gdy rozładujesz funkcję mex (np. Abyś nie musiał ponownie uruchamiać programu matlab podczas ponownej kompilacji funkcji mex).

Możesz pójść trochę dalej, jeśli chcesz i ukryć uchwyt za klasą Matlab. Zapoznaj się z funkcjami OO dla Matlaba w dokumentach, jeśli jesteś zainteresowany. Jeśli korzystasz z najnowszej wersji, możesz skorzystać z ich znacznie czystszych obiektów uchwytów.

+1

Dzięki, Panie Fooz. Zaimplementowałem z uchwytem (bezpośrednio jako wskaźnik) i wygląda na to, że działa. To jest dla mnie zaskakujące, że obiekt klasy przydzielony w stercie, nie jest usuwany, gdy funkcja mex zwraca. Czy to normalne zachowanie, na którym mogę polegać w systemie Windows (XP, Vista i 7)? Wielkie dzięki. – Paul

+1

Jeśli przydzielasz obiekty przy użyciu alokatora Matlaba, są one automatycznie usuwane po powrocie z funkcji mex. Jeśli używasz malloc lub new, to Matlab nie wie o nich, a tym samym nie cofa alokacji. –

3

Ewentualnie można uciec, nie używając w ogóle MEX. W programie Matlab (w systemie Windows) można załadować dowolną ogólną bibliotekę dll za pomocą loadlibrary i wywołać dowolną z jej funkcji za pomocą callib. Prawdopodobnie nie jest to jednak przenośne w systemach operacyjnych.

+0

To także dobra wskazówka. Wolałbym używać interfejsu mex, ponieważ jest to oficjalna metoda rozszerzenia MATLAB i oczekuję ścisłej integracji z MATLAB. Dziękuję bardzo. – Paul

+0

Wygląda na to, że jest to obsługiwany sposób. Funkcje są udokumentowane tutaj: http://www.mathworks.com/help/matlab/using-c-shared-library-functions-in-matlab-.html Przykład ich użycia znajduje się tutaj: https: // github .com/smitec/rustlab/blob/d239e23a57c6c53dffd1b11c3e0e4fc193a3a0f7/src/test.m –

Powiązane problemy