Ich schreibe eine mex-Datei (mit C ++), die eine Speicheradresse als Eingabe akzeptiert und Daten an dieser Speicheradresse bearbeitet. Da ich gezwungen bin, MATLAB als meine Umgebung zu verwenden, kann mein Programm MATLAB-Datentypen nur als Eingaben akzeptieren (char, bool, float, double und int). Wie kann ich meinen Eingabewert einem Zeiger zuweisen?
Pseudocode:
%Vor%Grundsätzlich kann dies so interpretiert werden, dass ich den Wert eines Zeigers fest codiere, der ähnlich ist wie:
%Vor%Ich erhalte den Fehler:
Fehler C2440: '=': kann nicht von 'doppelt' in 'doppelt *' konvertieren
Ich habe auch versucht, static / const / reinterpret / dynamic_cast zu verwenden, aber ich verstehe nicht wirklich, wie sie funktionieren (und ich konnte sie nicht zur Arbeit bringen). Ist es überhaupt möglich Zeigeradressen manuell auf Zeiger zu legen?
Was Sie zu tun versuchen, ist gefährlich, weil Sie unformatierte Zeiger auf einen C ++ - Code übergeben, Annahmen darüber treffen, was an diesem Ort existiert und Code basierend auf diesen Annahmen ausführen. Nehmen wir an, Sie haben sich um all diese Sicherheitsprobleme gekümmert.
Wahrscheinlich möchten Sie den Zeiger als UINT64 an Ihre MEX-Datei übergeben (so dass der Code wie bei einer 64-Bit-Installation von MATLAB neu kompiliert und verwendet werden kann).
Auf der MATLAB-Seite:
%Vor%Innerhalb Ihrer mex-Funktion:
%Vor% Hinweis: Sie können das Gleiche auch mit einem Double tun, ändern Sie einfach den mxGetClassID
check, um nach mxDOUBLE_CLASS
zu suchen. In diesem Fall wird der Cast-Ausdruck:
BEARBEITEN:
Was ich gesagt habe über diesen Code auf einem 32 oder 64-Bit-Rechner zu arbeiten, ist nur wahr, wenn beide Maschinen Little Endian sind. Andernfalls, wenn Sie einen 32-Bit-Zeiger in einem 64-Bit-Uint auf einem Big-Endian-Computer übergeben und ihn in double *
umwandeln, erhalten Sie einen Zeiger, der 0x00000000
ist.
Sie können die Endianness-Probleme umgehen, indem Sie die MATLAB-Funktion computer
verwenden, um den Computer zu erkennen Endianheit. Wenn Byte-Swapping erforderlich ist, können Sie swapbytes
verwenden. Um diese Funktionen aus Ihrem C ++ - Code auszuführen, verwenden Sie mexCallMATLABWithTrap
.