[C++] glutMainLoop() starten maakt this pointer stuk?

Pagina: 1
Acties:

  • dawuss
  • Registratie: Maart 2001
  • Laatst online: 24-11 12:28

dawuss

gadgeteer

Topicstarter
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
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 ©


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 13-09 00:05
Wat je nodig hebt is een call stack. Daar staat bovenaan de functie die is aangeroepen. Dat zal een member functie zijn, gezien de null pointer. Een nivo dieper zit een andere functie, en die heeft de null pointer gebruikt.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


  • Joad
  • Registratie: December 2000
  • Laatst online: 22-09 14:07

Joad

Dat kan

ColorOrgan.cpp
C++:
1
2
3
4
5
6
7
8
9
<snip>
int main(int argc, char **argv)
{
    
    ColorOrganController* c = new ColorOrganController();
    KeyboardInputReader* ir = new KeyboardInputReader((Sink*) c);
    

<snip>


Haal die KeyboardInputReader* eens weg :)

  • DroogKloot
  • Registratie: Februari 2001
  • Niet online

DroogKloot

depenisvanjezus

Uh... je declareert twee KeyboardInputReaders (een globale en een locale), maar je glutEvent() callback roept een member-functie van de globale reader aan en die instantieer je nergens:

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
// globally declared reader
KeyboardInputReader* ir;

void glutEvent(int key, int x, int y) {
    // call global reader member
    ir->glutEvent(key, x, y);
}

int main(int argc, char **argv)
{
    
    ColorOrganController* c = new ColorOrganController();
    // locally declared and instantiated reader
    KeyboardInputReader* ir = new KeyboardInputReader((Sink*) c); 


Wat dus een mooie segfault oplevert zodra je callback wordt uitgevoerd. ;)

[ Voor 13% gewijzigd door DroogKloot op 08-01-2007 00:21 ]


  • dawuss
  • Registratie: Maart 2001
  • Laatst online: 24-11 12:28

dawuss

gadgeteer

Topicstarter
Ah wat ontzettend dom zeg. Dat ik dat niet zelf zag :X Nu werkt het idd.

Waarschijnlijk ben ik gewend geraakt aan de chique stack-traces van Java :P

* dawuss moet weer eens vaker programmeren ;)

micheljansen.org
Fulltime Verslaafde Commandline Fetisjist ©