[#1] Problemy z typem wyliczeniowym enum
Mam problem tego typu. Definiuje sobie typ wyliczeniowy by korzystac ze sterowania w grze gdzie kierunkom odpowiada kod strzalek... [mowa o c++]

enum DIRECTION {DIR_UP=38, DIR_DOWN=40, DIR_LEFT=37, DIR_RIGHT=39};

Pozniej w funkcji main() probuje zadeklarowac cos takiego

DIRECTION Kierunek = pobierzkierunek();


i teraz: czy funkcja pobierzkierunek() moze wygladac tak:
int pobierzkierunek()
{
    int kierunek;
    kierunek = getch();
    return kierunek;
}


Kompilator wywala mi blad bo nastepuje niepoprawna konwersja. Z tego co wiem funkcja powinna zwrocic wartosc typu DIRECTION ale jak? tzn jak powinna wygladac ta funkcja? Wiem wiem... jeszcze jestem slaby. ale robie wolne postepy

[#2] Re: Problemy z typem wyliczeniowym enum

@Lorak, post #1

DIRECTION pobierzkierunek()
{
int kierunek;
kierunek = getch();
return static_cast(kierunek);
}

[#3] Re: Problemy z typem wyliczeniowym enum

@smith, post #2

No wlasnie myslalem nad rzutowaniem ale czy to nie jest jakies obejscie tego? Tak powinno byc i tak sie zawsze robi czy to tylko sztuczka?

[#4] Re: Problemy z typem wyliczeniowym enum

@Lorak, post #1

Robisz tu niejawną (nie wyspecyfikowaną wprost) konwersję z typu int do typu DIRECTION. Kompilator burzy się, bo taka konwersja nie jest jednoznaczna, jednoznaczną konwersję mają tylko 4 wartości, przy pozostałych nie bardzo wiadomo jest co zrobić. Oczywiście Ty wiesz, że pobierzkierunek() zwróci jedną z tych 4 wartości, ale nie wie o tym kompilator. Możesz to zmienić definiując pobierzkierunek() tak, aby zwracała typ DIRECTION a nie int, niemniej to będzie tylko przepchnięcie problemu niżej - do linii kierunek=getch(). Nie ma żadnej gwarancji na to, że getch() zwróci coś z zakrezu 37-40. Najprościej jest wykonać jawne rzutowanie:
kierunek = (DIRECTION)getch();
W ten sposób niejako zdejmujesz z kompilatora odpowiedzialność za to co się stanie jeżeli wartość będzie spoza zakresu. Rozwiązaniem bardziej eleganckim (choć niekoniecznie najszybszym) byłoby napisanie czegoś takiego:
DIRECTION pobierzkierunek()
{
  switch(getch())
  {
    case 37: return DIR_LEFT;
    case 38: return DIR_UP;
    case 39: return DIR_RIGHT;
    case 40: return DIR_DOWN;
    default:  /* no i tu właśnie mamy problem, właściwie należałoby
rzucić wyjątkiem... albo dodać DIR_WRONG i jakoś to potem obsłużyć. */
  }
}




Ostatnia modyfikacja: 18.09.06 17:56
[#5] Re: Problemy z typem wyliczeniowym enum

@Grzegorz Kraszewski, post #4

Ooo wlasnie. mysle ze o to mi chodzilo [tzn o te druga czesc]. Wielkie dzieki. Pozdrawiam!

[#6] Re: Problemy z typem wyliczeniowym enum

@Lorak, post #5

No chyba was pogieło?!?

Przeciez i tak wynik pobierzkierunek() idzie do jakiegos switcha czy ifa wiec po co dwa razy
robic to samo? Bo sadze ze cos takiego tam zaplanowales.
Najlepiej zrob tak jak napisalem a wynik tej funkcji niech bedzie indeksem do tablicy o rozmiarze 256
i tam zrob 4 wskazniki do funkcji odpowiedzialnych za kierunki a reszte wypelni NULLami i sprawdzaj
czy uzyskany wskaznik jest NULLem zanim wywolasz funkcje lub zamiast NULLi wskaznik do funkcji ktora nic
nie robi i wtedy nawet nie musisz nic sprawdzac.

[#7] Re: Problemy z typem wyliczeniowym enum

@smith, post #6

a moze nie nullami wypelnic tylko funkcja zwracajac null ;)

Po drugie mozna przeciez zakres wyznaczyc

znak = getch();

if(znak >= 37 && znak <= 40)
kierunek = znak;
else
kierunek = 0;


szkoda tutaj funkcji w tablicach uzywac imo bo ten switch jest dosyc szybki lub if ktory pokazalem ;P

[#8] Re: Problemy z typem wyliczeniowym enum

@AmiChris, post #7

Przeciez napisalem ze mozna wypelnic funkcjami nic nie robiacymi. A co on chce zeby zwracaly to sobie zwroci. Poniewaz przedzial jest ciagly to mozna zrobic ifa z dwoma warunkami zamiast czterech ale zawsze jest if a w moim roziwazaniu nie trzeba zadnego ifa i wszystko jest robione w jednej linijce.

(*DirectionFunctions[pobierzkierunek()])();

[#9] Re: Problemy z typem wyliczeniowym enum

@smith, post #8

Ciebie to kiedys ogolimy,zobaczysz

[#10] Re: Problemy z typem wyliczeniowym enum

@smith, post #6

Znów ten uraz co do funkcji switch()?

Na stronie www.PPA.pl, podobnie jak na wielu innych stronach internetowych, wykorzystywane są tzw. cookies (ciasteczka). Służą ona m.in. do tego, aby zalogować się na swoje konto, czy brać udział w ankietach. Ze względu na nowe regulacje prawne jesteśmy zobowiązani do poinformowania Cię o tym w wyraźniejszy niż dotychczas sposób. Dalsze korzystanie z naszej strony bez zmiany ustawień przeglądarki internetowej będzie oznaczać, że zgadzasz się na ich wykorzystywanie.
OK, rozumiem