PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : glutDisplayFunc und c++


Gast
2008-02-15, 16:57:24
Hi,
ich versuche Glut unter Linux und c++ zu verwenden.Ich habe eine Funktion display in einer Klasse und die Funktion will ich glutDisplayFunc zuweisen. Unte c und ohne eine Klasse klappt das ganze.

glutDisplayFunc(display);

aber unter c++ gibt es folgende Meldung:

Assignment.cpp:7: error: argument of type ‘void (Assignment::)()’ does not match ‘void (*)()’

Ich hab versuch nach (void *) zu casten, aber das hat auch nichts gebracht.
Wer weiss hier weiter?

Expandable
2008-02-15, 17:06:52
Ist deine Funktion eine Methode eines Objekts? Dann wird das wohl schiefgehen, weil einObjekt.eineMethode() intern in eineMethode(einObjekt) übersetzt wird und somit keine void-Funktion mehr ist.

Gast
2008-02-15, 17:19:04
ok thx, dann werden ich wohl die Funktionen aus der Klasse rausnehmen.

Gast
2008-02-15, 17:29:36
Das macht man üblicherweise mit einer Trampolinfunktion, da das ganze aber einen Funktionspointer erwartet muss man da eventuell etwas rumfrickeln/aufpassen (je nach dem wie der Compiler mit Funktionszeiger umgeht).

Gast
2008-02-16, 00:28:36
Das macht man üblicherweise mit einer Trampolinfunktionwas ist das denn feines?

Gast
2008-02-16, 02:14:29
Verwendet man öfters mal bei Freds, sieht dann etwa so aus:

// c-library: (wäre z.B. bei pthreads ähnlich/genauso)
void create_fred(void (fredfunc*)(void*), void* parameter);

// wäre ein ansatz für eine java-like thread
struct Fred {
virtual void run() = 0;
static void trampolin(void *parameter) {
reinterpret_cast<Fred*>(parameter)->run();
}
void start() {
create_fred(&Fred::trampolin, this);
}
};

struct EchterFred : Fred {
void run() {
// mach was ganz gutes
}
};

EchterFred fred;
fred.start();

Hier gibts aber kein (ansonsten üblicher) Parameter, müsste man wohl mit einer globalen Variablen arbeiten. Wenigstens muss man sich hier über Synchronisationsprobleme keine Gedanken machen (vorrausgesetzt es kommt zu keinem Wechsel der DisplayFunc.

Alles ungetestet und ohne Nachdenken und Biereinfluss.

Gast
2008-02-16, 18:11:11
Verwendet man öfters mal bei Freds, sieht dann etwa so aus:
[Code, der besser in einem Code-Tag aufgehoben gewesen wäre]
ach so was meinst du. Wieso nennt man das denn Trampolin-Funktion?
Man könnte die Funktion übrigens auch als statische Methode der Klasse realisieren. Das würde den Zugriff auf private Member ermöglichen und den engen Zusammenhang der Funktion zur Klasse herausstellen.

Hier gibts aber kein (ansonsten üblicher) Parameter, müsste man wohl mit einer globalen Variablen arbeiten. in GLUT-Programmen mache ich für gewöhnlich von der Klasse, auf die ich in der Display-Funktion zugreifen muss, eine globale Instanz.

Wenigstens muss man sich hier über Synchronisationsprobleme keine Gedanken machen (vorrausgesetzt es kommt zu keinem Wechsel der DisplayFunc.das bringt mich auf eine Frage, die ich mir auch schon mal gestellt habe: wie sieht es eigentlich mit der Multithreading-Unterstützung von GLUT aus? GLUT enthält zwar keine Threading-API (wie QT oder SDL), aber theoretisch könnte man einen Thread mit einer anderen API erstellen und von diesem aus dann immer glutPostRedisplay() aufrufen. Hab ich aber auch noch nie ausprobiert...