Explizit den Wert eines Zeigers festlegen

7

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?

    
Brian 08.08.2011, 17:37
quelle

4 Antworten

5

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:

%Vor%

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 .

    
Praetorian 08.08.2011, 18:02
quelle
6

Es scheint, dass Sie eine double , die ein Fließkommatyp ist, nicht als Repräsentation einer Adresse im Speicher verwenden können, die inhärent ein ganzzahliger Wert ist.

Ich schätze, dass Ihr input_arg als MATLAB int -Typ definiert werden sollte, nicht als double .

    
sergio 08.08.2011 17:49
quelle
5

Warum ist input_arg ein Double? Zeiger haben immer einen ganzzahligen Typ.

Dies kann die "Umwandlung von Double in Double *" lösen.

    
Sam Hoice 08.08.2011 17:43
quelle
5

Versuchen Sie:

double *pointer = (double *)0x00C2E4E8;

(addiere 0x)

    
neodelphi 08.08.2011 17:41
quelle

Tags und Links