C++-Prozedur als C-Callback-Funktion
Verfasst: Fr Mai 14, 2021 7:36 am
Hallo zusammen,
ich habe hier ein kniffeliges Problemchen, an dem ich gestern den ganzen Tag herumgebastelt habe und eine Lösung gefunden habe, die aber eher unschön ist.
Ziel: Ich möchte ein vollständig objektorientiertes 3D-Progrämmchen basteln, das mir stereoskopische Bilder auf den 3D-Fernseher anzeigt.
Hierzu habe ich eine Klasse "window" definiert, die sich um das ganze Anzeige-Gedöns kümmern soll (MVC-Pattern halt).
Um mit der OpenGL-Hardware sprechen zu können, muss ich jedoch z.B. einen ErrorCallback als Funktionspointer an die genutzte Bibliothek übergeben.
Grobe Struktur ist also zur Zeit recht einfach:
Das Problem besteht im Konstruktor der Klasse, wo der Funktionspointer in die Grafikbibliothek eingespeist werden muss.
Meine Lösung:
Beim Kompilieren bekomme ich jedoch ein Warning ausgeworfen:
Wer von Euch kann mir sagen, wie ich es so programmiere, dass die Pointerübergabe ohne Compiler-Warning funktioniert?
Viele Grüße,
Lev
ich habe hier ein kniffeliges Problemchen, an dem ich gestern den ganzen Tag herumgebastelt habe und eine Lösung gefunden habe, die aber eher unschön ist.
Ziel: Ich möchte ein vollständig objektorientiertes 3D-Progrämmchen basteln, das mir stereoskopische Bilder auf den 3D-Fernseher anzeigt.
Hierzu habe ich eine Klasse "window" definiert, die sich um das ganze Anzeige-Gedöns kümmern soll (MVC-Pattern halt).
Um mit der OpenGL-Hardware sprechen zu können, muss ich jedoch z.B. einen ErrorCallback als Funktionspointer an die genutzte Bibliothek übergeben.
Grobe Struktur ist also zur Zeit recht einfach:
Code: Alles auswählen
class window { ... Definitionsbums ... };
void window::ErrorCallback( int errorNo, const char* description ) { ... }
Meine Lösung:
Code: Alles auswählen
window::window() {
void (*fcnPtr)(int, const char*);
fcnPtr = reinterpret_cast<void(*)(int, const char*)>(&window::ErrorCallback); // C-Funktionspointer auf C++-Prozedur (Yay!!) - aber mit Warning (Nay!!). :)
glfwSetErrorCallback( fcnPtr );
std::cout << "Constructor window class" << std::endl;
}
Code: Alles auswählen
g++ -c -std=c++17 -O2 -o window.o /home/torben/Development/eclipse-workspace/OpenGL-3D/window.cpp
/home/torben/Development/eclipse-workspace/OpenGL-3D/window.cpp: In Konstruktor »window::window()«:
/home/torben/Development/eclipse-workspace/OpenGL-3D/window.cpp:35:80: Warnung: Umwandlung von »void (window::*)(int, const char*)« nach »void (*)(int, const char*)« [-Wpmf-conversions]
35 | fcnPtr = reinterpret_cast<void(*)(int, const char*)>(&window::ErrorCallback); // C-Funktionspointer auf C++-Prozedur (Yay!!) - aber mit Warning. :)
| ^
g++ -lglfw -lGLEW -o OpenGL-3D OpenGL-3D.o window.o
Viele Grüße,
Lev