2013-11-03 90 views
0

我目前在C++課程中學習開關,我們的教師希望我們編輯一些openGL 3D代碼的主體。我們應該把它從一個如果其他的切換到一個切換。我做到了,但現在我的代碼無法運行。下面是代碼:C++ switch語句不起作用

void key(unsigned char k, int x, int y) 
{ 
    k = tolower(k); 

    switch(k) 
    { 
      case 'a' : b_animate = !b_animate; 
         if (b_animate) 
         { 
          glutTimerFunc(33, myTimer, 1); 
         } 
         break; 
      case 'h' : b_showHints = !b_showHints; 
         glutPostRedisplay(); 
         break; 
      case 'f' : toggleFullScreen(); 
         break; 
      case 'o' : gi_projection_type = ORTHO_3D; 
         myReshape(g_windowWidth, g_windowHeight); 
         glutPostRedisplay(); 
         break; 
      case 'p' : gi_projection_type = PERSPECTIVE; 
         myReshape(g_windowWidth, g_windowHeight); 
         glutPostRedisplay(); 
         break; 
      case '1' : 
      case '2' : 
      case '3' : 
      case '4' : 
      case '5' : 
      case '6' : 
      case '7' : 
      case '8' : 
      case '9' : double alpha = (k - '0') * 0.1; 
         if (alpha == 0) 
         alpha = 1.0; 
         setAlphaChannel(alpha); 
         glutPostRedisplay();  
         break; 
      case '+' : per_angle += 2; 
         myReshape(g_windowWidth, g_windowHeight); 
         glutPostRedisplay(); 
         break; 
      case '-' : per_angle -= 2; 
         myReshape(g_windowWidth, g_windowHeight); 
         glutPostRedisplay(); 
         break; 
      case 'm' : printModelViewMatrix(); 
         break; 
      case 'w' : b_wireFrame = !b_wireFrame; 
         glutPostRedisplay(); 
         break; 
      case 'q' : b_useOpenGLtransform = !b_useOpenGLtransform; 
         glutPostRedisplay(); 
         break; 
      case 'n' : g_model = (g_model + 1)%8; 
         glutPostRedisplay(); 
         break; 
      case 't' : b_texture = !b_texture; 
         glutPostRedisplay(); 
         break; 

      case 'l' : b_lighting = !b_lighting; 
         glutPostRedisplay(); 
         break; 

    } 

這裏是原代碼(對不起它得到搞砸了一點點,我複製並粘貼到註釋):

if(k == 'a'){ 
    b_animate = !b_animate; 
    if (b_animate){ 
     glutTimerFunc(33, myTimer, 1); 

    }else if (k == 'h'){ 
    b_showHints = !b_showHints; 
    glutPostRedisplay(); 

    }else if(k == 'f'){ 
    toggleFullScreen(); 

    }else if (k == 'o'){ 
     gi_projection_type = ORTHO_3D; 
     myReshape(g_windowWidth, g_windowHeight); 
     glutPostRedisplay(); 
    }else if (k == 'p'){ 
     gi_projection_type = PERSPECTIVE; 
     myReshape(g_windowWidth, g_windowHeight); 
     glutPostRedisplay(); 
    }else if (k >= '0' && k <= '9'){ 
    double alpha = (k - '0') * 0.1; 
    if (alpha == 0) 
     alpha = 1.0; 
    setAlphaChannel(alpha); 
    glutPostRedisplay();  
      }else if (k == '+'){ 
     per_angle += 2; 
     myReshape(g_windowWidth, g_windowHeight); 
     glutPostRedisplay(); 

      }else if (k == '-'){ 
     per_angle -= 2; 
     myReshape(g_windowWidth, g_windowHeight); 
     glutPostRedisplay(); 

     }else if (k == 'm'){ 
     printModelViewMatrix(); 

     }else if (k == 'w'){ 
     b_wireFrame = !b_wireFrame; 
     glutPostRedisplay(); 

     }else if (k == 'q'){ 
     b_useOpenGLtransform = !b_useOpenGLtransform; 
     glutPostRedisplay(); 

     }else if (k == 'n'){ 
     g_model = (g_model + 1)%8; 
     glutPostRedisplay(); 

     }else if (k == 't'){ 
     b_texture = !b_texture; 
     glutPostRedisplay(); 

     }else if (k == 'l'){ 
     b_lighting = !b_lighting; 
     glutPostRedisplay(); 
     } 
     }  
} 

的,如果再else語句會仍然運行。我與交換機收到的錯誤是:前未申報的「雙重」

「阿爾法」 語法錯誤(在一次使用此功能)

+0

在switch語句之前聲明'double alpha'。看到http://stackoverflow.com/questions/1231198/declaring-variables-inside-a-switch-statement –

+5

「但現在我的代碼不會運行」 - 不管是什麼意思?請明確點。如果你不這樣做,你基本上懶惰或要求我們推測 – sehe

回答

1

每當你需要聲明的情況下,內部變量,把它放在之間捲曲brackets.-

case '9' : { 
    double alpha = (k - '0') * 0.1; 
    if (alpha == 0) 
     alpha = 1.0; 
    setAlphaChannel(alpha); 
    glutPostRedisplay();  
    break; 
} 
2

你不能在switch語句中聲明變量,除非你把它們放在一個塊(與{}環繞聲):

switch(k) 
{ 
     case 'a' : b_animate = !b_animate; 
        if (b_animate) 
        { 
         glutTimerFunc(33, myTimer, 1); 
        } 
        break; 
     case 'h' : b_showHints = !b_showHints; 
        glutPostRedisplay(); 
        break; 
     case 'f' : toggleFullScreen(); 
        break; 
     case 'o' : gi_projection_type = ORTHO_3D; 
        myReshape(g_windowWidth, g_windowHeight); 
        glutPostRedisplay(); 
        break; 
     case 'p' : gi_projection_type = PERSPECTIVE; 
        myReshape(g_windowWidth, g_windowHeight); 
        glutPostRedisplay(); 
        break; 
     case '1' : 
     case '2' : 
     case '3' : 
     case '4' : 
     case '5' : 
     case '6' : 
     case '7' : 
     case '8' : 
     case '9' : {        // Note: begin of block 
        double alpha = (k - '0') * 0.1; 
        if (alpha == 0) 
        alpha = 1.0; 
        setAlphaChannel(alpha); 
        glutPostRedisplay();  
        break; 
     }           // Note: end of block 
     case '+' : per_angle += 2; 
        myReshape(g_windowWidth, g_windowHeight); 
        glutPostRedisplay(); 
        break; 
     case '-' : per_angle -= 2; 
        myReshape(g_windowWidth, g_windowHeight); 
        glutPostRedisplay(); 
        break; 
     case 'm' : printModelViewMatrix(); 
        break; 
     case 'w' : b_wireFrame = !b_wireFrame; 
        glutPostRedisplay(); 
        break; 
     case 'q' : b_useOpenGLtransform = !b_useOpenGLtransform; 
        glutPostRedisplay(); 
        break; 
     case 'n' : g_model = (g_model + 1)%8; 
        glutPostRedisplay(); 
        break; 
     case 't' : b_texture = !b_texture; 
        glutPostRedisplay(); 
        break; 

     case 'l' : b_lighting = !b_lighting; 
        glutPostRedisplay(); 
        break; 

} 

或者,在switch語句之前聲明alpha

+0

感謝您的幫助!我不知道爲什麼我不記得那個... – user2950697

0

你應該換辦案人員在{}像

  case '9' : 
       { 
        double alpha = (k - '0') * 0.1; 
        if (alpha == 0) 
        alpha = 1.0; 
        setAlphaChannel(alpha); 
        glutPostRedisplay();  
        break; 
       } 

,因爲它可能只在開關殼體結構內範圍聲明新的變量

0

您需要添加範圍爲double

 case '9' : { 
        double alpha = (k - '0') * 0.1; 
        if (alpha == 0) 
         alpha = 1.0; 
        setAlphaChannel(alpha); 
        glutPostRedisplay();  
       } 
       break; 

,你需要添加

 case '0': 

以前的清單! (你意外地只有'1''9'

+0

我沒有注意到這個情況,謝謝指出! – user2950697

2

你已經成爲「一體式」功能設計的受害者。你的功能的身體是不可讀的混亂。

當然,你可以根據需要儘可能地挖掘這個混亂,直到你修復它。但更好的重新思考整體設計。將其拆分爲更小的功能,每個鍵一個:

case 'a' : OnKeyA(); break; 
case 'h' : OnKeyH(x, y, z); break 
case 'f' : OnKeyF(x); break; 

.... 

void OnKeyA() 
{ 
    b_animate = !b_animate; 
    if (b_animate) 
    { 
     glutTimerFunc(33, myTimer, 1); 
    } 
} 

它是否更清潔?案例陳述變成單行,所有邏輯都轉到功能上。你將永遠不會迷失在花括號裏。

告訴你的老師關於 「Separation of concerns」 和 「Single responsibility principle」,他將留下深刻的印象=)

編碼愉快!