forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   C++ (http://forum.boolean.name/forumdisplay.php?f=22)
-   -   Оператор switch (http://forum.boolean.name/showthread.php?t=14977)

maxturbo 24.06.2011 06:31

Оператор switch
 
Собственно вопрос :)
Перевожу код с Blitz3D на C++ и вот проблема:
Код на Blitz3D:
PHP код:

CamPick=xCameraPick(cam,xMouseX(),xMouseY())
If 
xAnimating(Menu)=False
If CamPick
Name
$=xEntityName(CamPick)
If 
xMouseHit(1)
Select Name$
    Case 
"#Game"
        
If st_options_menu=And st_about_menu=0
        st_game_menu
=1-st_game_menu
        
If st_game_menu=1
        st_game
=1
        xAnimate Menu
,3,1.5,1
        
Else If st_game_menu=0
        st_game
=2
        
EndIf
        EndIf
    Case 
"#Options"
        
If st_game_menu=And st_about_menu=0
        st_options_menu
=1-st_options_menu
        
If st_options_menu=1
        st_options
=1
        xAnimate Menu
,3,1.5,5
        
Else If st_options_menu=0
        st_options
=2
        
EndIf
        EndIf
    Case 
"#About"
        
If st_options_menu=And st_game_menu=0
        st_about_menu
=1-st_about_menu
        
If st_about_menu=1
        st_about
=1
        xAnimate Menu
,3,1.5,9
        
Else If st_about_menu=0
        st_about
=2
        
EndIf
        EndIf
    Case 
"#Exit"
        
End
End Select
EndIf
EndIf
Else
xFlushMouse
EndIf 

В коде на Blitz3D видно что когда мышкой указываешь на какой либо объект(entity) то в переменную Name возвращается имя entity ну и по структуре
PHP код:

Select
End Select 

понятно что там происходит(вызов каких либо событий)
Вопрос такой:
Как мне на C++ перевести структуру Select(Blitz3D) на switch(C++)
Пробовал так:
PHP код:

if(CamPick)
{
   
Name xEntityName(CamPick);
   if(
xMouseHit(1))
   {
     switch(
Name)
     {
          case 
"#Game":

          break;
          case 
"#Options":

          break;
          case 
"#About":

          break;
          case 
"#Exit":

          break;
     }
   }


Переменная Name записана const char* Name = "";
Но почему то компилятор ругается на такую запись структуры... Может, что еще и не осилил в С++ подскажите...
За ранее Спасибо...

YellowAfterlife 24.06.2011 09:17

Ответ: Оператор switch
 
Вы имеете в виду эту ошибку?

Только переменные перечисляемого типа могут быть использованы в switch().
Если вы хотите делать switch по значению строки, можно использовать следующие способы:
1. Заменить switch() на блок if-then-else. Тут: не забывайте, что в С++ сравнение строк нужно делать через <string.h> -> strcmp(char*, char*).
2. Использовать числовое значение строки. То есть написать (или взять с интернета) функцию, которая бы возращала для каждой строки более или менее уникальный int. Следовательно сравнения будут проводится над результатом такой функции.
3. Дать объектам дополнительную переменную (аля Tag в Delphi) по которой и определять, какой объект был клацнут.

Хорошего дня.

maxturbo 24.06.2011 11:51

Ответ: Оператор switch
 
Спасибо :)
Накатал такую функцию с возвращением int при сравнение строк:
PHP код:

int GetNameMenu(const charstring)
{
    if(
strcmp(string"#Game") == 0)
    {
        return 
1;
    }
    if(
strcmp(string"#Options") == 0)
    {
        return 
2;
    }
    if(
strcmp(string"#About") == 0)
    {
        return 
3;
    }
    if(
strcmp(string"#Exit") == 0)
    {
        return 
4;
    }


PHP код:

switch(GetNameMenu(Name))
                {
                case 
1:
                    break;
                case 
2:
                    break;
                case 
3:
                    break;
                case 
4:
                    return 
0;
                    break;
                } 

Если есть поправочки, пишите не стесняйтесь :)

falcon 24.06.2011 12:56

Ответ: Оператор switch
 
нафига так извращаться?
>> Может, что еще и не осилил в С++ подскажите...
уверяю тебя, там дофига чего можно осиливать на протяжении лет)))
открой для себя STL, старайся не использовать C-строки, юзай std::string.
там спешл фо ю перегрузили оператор сравнения.
но вообще хранить пункты меню в виде строк - кашмар. Их можно полностью определять в виде константного числа.
а ещё лучше мб заюзать паттерн state для реализации меню.. ведь объект приложение меняет своё состояние при выборе пункта меню.. так каждый пункт будет инкапсулирован в объект со своим поведением..

maxturbo 27.06.2011 03:16

Ответ: Оператор switch
 
Цитата:

Сообщение от falcon (Сообщение 192912)
нафига так извращаться?
>> Может, что еще и не осилил в С++ подскажите...
уверяю тебя, там дофига чего можно осиливать на протяжении лет)))
открой для себя STL, старайся не использовать C-строки, юзай std::string.
там спешл фо ю перегрузили оператор сравнения.
но вообще хранить пункты меню в виде строк - кашмар. Их можно полностью определять в виде константного числа.
а ещё лучше мб заюзать паттерн state для реализации меню.. ведь объект приложение меняет своё состояние при выборе пункта меню.. так каждый пункт будет инкапсулирован в объект со своим поведением..

В виде строк у меня не пункты меню идут, а просто идет 3D модель и таким методом я вызываю ту или иную функцию :) То есть пиками проверяю имена и при нажатие на мышь вызываю функцию в операторе switch


Часовой пояс GMT +4, время: 22:59.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot