Ik weet niet hoe ik dit moet omschrijven, maar ik heb een simpele applicatie die op dit moment nog niet veel anders doet dan toetsaanslagen detecteren. Daarvoor maak ik gebruik van Glut, omdat ik later ook OpenGL in dat window wil gaan stoppen.
Het geheel wordt geïnitialiseerd als volgt:
ColorOrgan.cpp
GLUT wordt geïnitialiseerd en gebruikt de functie glutEvent als callback voor events die op zijn beurt de glutEvent methode van een instantie van mijn KeyboardInputReader object aanroept.
KeyboardInputReader.cpp
Als ik dit echter compile en run, werken de testaanroepen wel, maar gaat het stuk zodra de glutMainLoop gestart wordt:
De this pointer is daar 0. Nu ben ik erg onervaren met C++ en heb ik werkelijk geen idee wat hier mis gaat. Kan iemand me daar mee helpen?
De rest van de code is overigens hier te bekijken.
Het geheel wordt geïnitialiseerd als volgt:
ColorOrgan.cpp
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
| <snip> KeyboardInputReader* ir; void glutEvent(int key, int x, int y) { ir->glutEvent(key, x, y); } int main(int argc, char **argv) { ColorOrganController* c = new ColorOrganController(); KeyboardInputReader* ir = new KeyboardInputReader((Sink*) c); // test event ir->glutEvent(0,0,0); // Initialize GLUT. glutInit(&argc, argv); // Make a 3D window. <snip> // test ir->glutEvent(1,1,1); try { printf("Starting GLUT\n"); glutMainLoop(); } <snip> } |
GLUT wordt geïnitialiseerd en gebruikt de functie glutEvent als callback voor events die op zijn beurt de glutEvent methode van een instantie van mijn KeyboardInputReader object aanroept.
KeyboardInputReader.cpp
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| <snip> KeyboardInputReader::KeyboardInputReader(Sink* s) { this->addSink(s); s->sendMessage("TestMessage"); this->output->sendMessage("Test2"); this->sendToSinks("Test3"); printf("Instantiated KeyboardInputReader: %d\n", this); } KeyboardInputReader::~KeyboardInputReader() { printf("KeyboardInputReader %d destroyed\n"); } void KeyboardInputReader::glutEvent(int key, int x, int y) { printf("KeyboardInputReader[%d]: Event: %d, %d, %d\n", this, key, x, y); sendToSinks("bla"); <snip> |
Als ik dit echter compile en run, werken de testaanroepen wel, maar gaat het stuk zodra de glutMainLoop gestart wordt:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
| Registered sink: 5269520 Sink 5269520 received: TestMessage Sink 5269520 received: Test2 sendToSinks call Sending message to sink 5269520 Sink 5269520 received: Test3 Instantiated KeyboardInputReader: 5269536 KeyboardInputReader[5269536]: Event: 0, 0, 0 sendToSinks call Sending message to sink 5269520 Sink 5269520 received: bla sendToSinks call Sending message to sink 5269520 Sink 5269520 received: bla KeyboardInputReader[5269536]: Event: 1, 1, 1 sendToSinks call Sending message to sink 5269520 Sink 5269520 received: bla sendToSinks call Sending message to sink 5269520 Sink 5269520 received: bla Starting GLUT KeyboardInputReader[0]: Event: 97, 373, 321 Bus error |
De this pointer is daar 0. Nu ben ik erg onervaren met C++ en heb ik werkelijk geen idee wat hier mis gaat. Kan iemand me daar mee helpen?
De rest van de code is overigens hier te bekijken.
micheljansen.org
Fulltime Verslaafde Commandline Fetisjist ©