2016-07-31 8 views
-2

Bevor Sie als Duplikat markieren, habe ich den Beitrag here gelesen und kann nicht herausfinden, wie sich dies auf meinen Code bezieht.Fehler: Sprung zur Groß-/Kleinschreibung und Kreuze Initialisierung

ich einige Kompilierungsfehlern bin immer:

controller.cc: In member function ‘void Controller::start()’: 
controller.cc:50:9: error: jump to case label [-fpermissive] 
controller.cc:44:17: error: crosses initialization of ‘uint32_t c’ 

Hier ist mein Code:

void Controller::start(){ 

    int curPosX = view->getWidth()/2; 
    int curPosY = view->getHeight()/2; 
    uint32_t color = 0xFFFFFF; 

    DeviceHandler player = DeviceHandler("/dev/input/js0", false); 
    player.flush(); 

    while(1){ 

     button_event_t press; 
     bool ret = player.poll(&press); 

     if(ret && press.type == PRESS){ 
      switch(press.name){ 

       case DPAD_UP: 
        curPosY += 1; 
        break; 
       case DPAD_DOWN: 
        curPosY -= 1; 
        break; 
       case DPAD_RIGHT: 
        curPosX += 1; 
        break; 
       case DPAD_LEFT: 
        curPosX -= 1; 
        break; 
       case BUTTON_LB: 
        view->clear(); 
        break; 
       case BUTTON_RB: 
        uint32_t c = rand() & 0xff; 
        c |= (rand() & 0xff) << 8; 
        c |= (rand() & 0xff) << 16; 
        c |= (rand() & 0xff) << 24; 
        color = c; 
        break; 
       case BUTTON_A: 
        color = 0x000000; 
        break; 
      } 

     } 
     //color = 0x000000; 
     view->drawPixel(curPosY,curPosX, color); 
     usleep(500); 
    } 
} 

Jetzt liegt das Problem in case BUTTON_RB: und case BUTTON_A: Aussagen. Wenn ich entferne, kompiliert es fein. Der Post, den ich oben verlinkt habe, besagt, dass dieser Fehler nur dann auftritt, wenn Sie eine initialisierte Variable in einer anderen case-Anweisung verwenden, außer dort, wo sie definiert wurde. Dies ist hier nicht der Fall.

Die einzige Variable, die ich definiere, ist uint32_t c, die ich sonst nicht verwende. Ich habe versucht, diese Anweisungen in explizite Blöcke umzuwandeln, wie es in anderen Posts vorgeschlagen wird, und es kompiliert, scheint aber nicht korrekt zu fangen.

+1

'Der Beitrag, den ich oben verlinkt habe, besagt, dass dieser Fehler nur dann auftritt, wenn Sie eine initialisierte Variable in einer anderen case-Anweisung als wo definiert verwenden. Nein, tut es nicht. – cpplearner

+0

Tatsächlich sagt das nicht. Dies ist auf dieser anderen Frage bereits mehr als gut beantwortet. – hvd

+0

Zum Beispiel "Ich habe versucht, diese Anweisungen in explizite Blöcke umzuwandeln, wie es in anderen Posts vorgeschlagen wird, und es kompiliert, scheint aber nicht korrekt zu fangen." - Ich habe Schwierigkeiten herauszufinden, was du damit meinst. Es gibt keine Ausnahmebehandlung, daher verwenden Sie nicht die Standardbedeutung von "catch". Wenn Sie meinen, dass es nicht zur richtigen Case-Bezeichnung springt, dann ist das falsch. Wenn du etwas anderes meinst, dann sei bitte klar, was du meinst. – hvd

Antwort

1

Die Tatsache, dass Sie es nur innerhalb der case BUTTON_RB verwenden, ändert nicht die Tatsache, dass es lokalen Geltungsbereich hat. Setzen Sie es in seinen eigenen Bereich oder noch besser in seine eigene Funktion.

rand() ist wirklich veraltet, und Sie werden viel einfacher wegkommen, wenn Sie nur einen der STD 32-Bit-Zufallsgeneratoren verwendet haben.