Ich sehe seltsames Verhalten versuchen, C++ - und C-Code zu kombinieren. Ich benutze eine C++ - Klasse in C-Code mit static_cast
mit einem void*
an die Klasse. Dies geschieht auf folgende Weise.C++ Zeiger Wert ändert sich mit static_cast
//C++ code
void* newCSPI() {
return static_cast<void*>(new XSpi);
}
Diese Funktion wird in der Kopfzeile wie folgt deklariert.
//C++ code
extern "C" void* newCSPI(void);
Ich kann dann die C++ Funktionen im C-Code aufrufen. Ein Beispiel für die Implementierung der anderen Funktionen ist unten zu sehen.
//C++ code
void selectCSlave(void* spi) {
static_cast<SPI*>(spi)->selectSlave();
}
Diese Funktion wird auch als extern "C"
im Header deklariert.
Diese Casting-Funktion wird wie folgt implementiert.
//C++ code
void SPI::selectSlave(void) {
// Select the slave by setting the slave select to low
XGpio_DiscreteWrite(&slaveSelectDevice, 1, 0x00);
}
Ich versuche, den folgenden Codeblock auszuführen. Alles gelingt, bis auf die allerletzte Zeile.
//C code
void* spi = newCSPI();
/* Select device. */
selectCSlave(spi);
/* Transfer data over SPI*/
transferC(spi, MOSI, MISO, ByteNum);
// It breaks here //
/* Transfer data over SPI*/
transferC(spi, MOSI, MISO, ByteNum);
/* Un-select device. */
deselectCSlave(spi);
Während des zweiten transferC(spi)
Aufruf ändert sich der Zeiger irgendwie Wert. Innerhalb der Darstellungsfunktion hat der Zeiger immer noch denselben Wert. Innerhalb der Funktion, in die es umgewandelt wird, ändert sich der Wert. Die Implementierung ist genau die gleiche wie die erste transferC(spi)
, die funktioniert. Zwischen diesen beiden Aufrufen gibt es keinen Code.
Ich kann nicht sehen, warum der Wert plötzlich ändern würde. Was fehlt mir hier?
Der Code für deselectCSlave()
und SPI::deselectSlave(void)
:
void deselectCSlave(void* Cspi) {
static_cast<SPI*>(Cspi)->deselectSlave();
}
void SPI::deselectSlave(void) {
// Deselects the slave by setting the slave select to high
XGpio_DiscreteWrite(&slaveSelectDevice, 1, 0xFF);
}
Die 0x00
und 0xFF
die Werte geschrieben werden.
Haben Sie noch nicht alles gelesen, aber Sie können eine undurchsichtige Struct-Definition für den Typedef verwenden, ersparen Sie sich eine Menge Casting in Ihrer Implementierung. – StoryTeller
Bitte geben Sie eine [mcve] an.Außerdem ist es sehr verwirrend, eine Typedef für 'void *' zu haben - besonders wenn 'CSPI'' void * 'ist, aber' SPI' ist eigentlich ein Typ. – Barry
Was lässt Sie denken, dass sich der Wert ändert? Erzählst du vom Debugger? Vielleicht zeigt der Debugger das Falsche an. Funktioniert der Code noch? – KABoissonneault