[英]C++ switch statement won't work
我目前正在參加C ++課程,並且要學習有關開關的知識,我們的講師希望我們編輯一些openGL 3D代碼的正文。 我們應該將其從if if else更改為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();
}
}
}
if then else語句仍將運行。 我通過開關得到的錯誤是:“ double”之前的語法錯誤
未聲明“ alpha”(此功能的首次使用)
您不能在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
。
您已經成為“多合一”功能設計的受害者。 您函數的正文是難以理解的爛攤子。
當然,您可以根據需要盡可能多地挖掘此混亂,直到修復它。 但是最好重新考慮整體設計。 將其拆分為較小的功能,每個鍵一個:
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);
}
}
是不是更干凈? 案例陳述成為一線書,所有邏輯都轉化為功能。 大括號絕對不會讓您迷路。
告訴您的講師“ 關注點分離 ”和“ 單一責任原則 ”,他會留下深刻的印象=)
編碼愉快!
每當您需要在案例中聲明變量時,請將其放在大括號之間。
case '9' : {
double alpha = (k - '0') * 0.1;
if (alpha == 0)
alpha = 1.0;
setAlphaChannel(alpha);
glutPostRedisplay();
break;
}
您應該將案例處理程序包裝在{}中,例如
case '9' :
{
double alpha = (k - '0') * 0.1;
if (alpha == 0)
alpha = 1.0;
setAlphaChannel(alpha);
glutPostRedisplay();
break;
}
因為僅在開關案例構造的范圍內才可以聲明新變量
您需要為double
添加一個范圍:
case '9' : {
double alpha = (k - '0') * 0.1;
if (alpha == 0)
alpha = 1.0;
setAlphaChannel(alpha);
glutPostRedisplay();
}
break;
你需要添加
case '0':
到之前的清單! (您不小心只有'1'
到'9'
)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.