Download Elektronische Messdatenverarbeitung

Transcript
5
53
MATLAB I : Messdatenerfassung
5.4
MEX-Funktionen und ‘Microsoft Foundation Classes’
Für kurze MEX-Programme oder solche, die Numerik-Aufgaben erledigen, reicht die beschriebene Vorgehensweise aus. Will man jedoch innerhalb der MEX-Funktion mit einer
Benutzeroberfläche arbeiten (Dialog o. ä.), ist es wünschenswert, die DLL innerhalb der
gewohnten Umgebung und mit deren Hilfsmitteln zu entwickeln. Dazu ist im Falle der
Microsoft-Entwicklungsumgebung für Visual C++ wie folgt vorzugehen:
• Als Projekttyp im Startfenster wird MFC AppWizard (dll) angewählt, im Folgefenster Regular DLL using shared MFC DLL markiert. Die Entwicklungsumgebung
erstellt daraufhin ein Gerüst für eine DLL.
• In der .def-Datei des Projekt wird unter EXPORTS der Name der zu exportierenden
Funktion mexFunction vermerkt.
• Mit
#include "mex.h"
und dem ‘Additional Include Directory:’
<MATLABPATH>\extern\include
werden dem Programm die nötigen Definitionen zugänglich gemacht.
• Die Bibliotheken libmx.lib, libmex.lib, libmatlbmx.lib und libmat.lib werden als zusätzliche Input-Dateien bei den Linker-Optionen angegeben, als zusätzlicher
Linker-Suchpfad
<MATLABPATH>\extern\lib\win32\microsoft\msvc60
(für andere von MATLAB unterstützte Compiler gegebenenfalls anzupassen).
Damit sind die Vorarbeiten erledigt, die MEX-Funktion kann implementiert werden:
void mexFunction( int nlhs, mxArray *plhs[],
int nrhs, const mxArray *prhs[] )
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
plhs[0] = mxCreateDoubleMatrix(CData::YSIZE, CData::XSIZE, mxREAL);
double * z = mxGetPr(plhs[0]);
CData DataDlg;
DataDlg.DoModal();
for ( int k=0; k<CData::YSIZE; k++ )
for ( int i=0; i<CData::XSIZE; i++ )
* (z + i*CData::YSIZE + k) = DataDlg.Z[k][i];
}
Wichtig ist das Makro AFX_MANAGE_STATE... in der ersten Funktionszeile (Hinweis dazu in der .CPP-Hauptdatei des Projekts). Die mexFunction() ruft hier einen modalen
mdv : mdvmatlabe.tex
7. Oktober 2004