• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

SFML - Niejasność względem błędu zgłaszanego przez kompilator [switch stat]

Object Storage Arubacloud
0 głosów
153 wizyt
pytanie zadane 8 listopada 2016 w C i C++ przez Poeta Doctus Użytkownik (740 p.)
Witajcie

Od dziś uczę się biblioteki SFML. Z początku szło nieźle. Lecz pojawia się mały problem, który z początku nie wydawał się groźny, a to dlatego, że nie komplikował kompilacji. Niestety jednak po jakimś czasie gdy w kodzie przybyło pętli to powodował problem. Mianowicie instrukcja "switch( event.type )". Obok niej pojawia się złowieszczy napis: 21 enumeration values not handled in switch: "resized", "LostFocus", "GainFocus"..

Zaś im więcej takich pętli tym liczby początkowa się zwiększa. W drugiej pętli jest juz 101 takich przypadków. Trochę to analizowałem i tak myślę, że jest to coś na zasadzie błędu, że kompilator domaga się wszystkich deklaracji? Choć to z mojego punktu widzenia trochę bez sensu bo przecież nie od razu chce tam wszystko ładować. Dlatego liczę na waszą pomoc.

2 odpowiedzi

0 głosów
odpowiedź 8 listopada 2016 przez criss Mędrzec (172,590 p.)

21 enumeration values not handled in switch: "resized", "LostFocus", "GainFocus"..

To jest error (przerywa kompilacje) czy tylko warning? Bo nie powinien z tego powodu przerywać kompilacji. Najlepiej pokaż kod. 

komentarz 8 listopada 2016 przez Poeta Doctus Użytkownik (740 p.)
#include <SFML/Graphics.hpp>
#include <iostream>




int main(int, char const**)
{
   
    sf::RenderWindow window( sf::VideoMode(400,500), "Okno");
    
    while(window.isOpen())
 {
        sf::Event event;
        while(window.pollEvent(event))
  {
            
            
            switch( event.type )
   {
                case sf::Event::Closed:  window.close();
                break;
                    
                case sf::Event::KeyPressed: std::cout<<"Key has been pressed"<<std::endl;
                break;
           
           switch(event.key.code)
       {
           case sf::Keyboard::A:  std::cout<<"A"<<std::endl; break;
               
           case sf::Event::KeyReleased: std::cout<<"key has been released"<<std::endl; break;
     switch(event.key.code)
           {
               case sf::Keyboard::J:
               {
                   sf::Keyboard::J: 
        std::cout<<"J RELEASED"<< std::endl;
break;
                  
               }
           }
       }
   }
            
  }
        
        
        
        
        window.clear();
        
        window.display();
 }
    
    
    return 0;
}

 

komentarz 8 listopada 2016 przez Poeta Doctus Użytkownik (740 p.)
Kod może nie jest super klarowny, pracuję nad tym :D

jeśli chodzi o te błędy, są to żółte, czyli raczej warmingi. Zaś w tej ostatniej instrukcji "sf::Keyboard::J:" występuje błąd na czerwono, który przerywa kompilacje.

ps. Po zmianie tej pętli czyli zamknięcie je w klamry błąd krytyczny znika ale pojawia się coś na zielono: thread 1: breakpoint 1.1 przy window.clear();
komentarz 8 listopada 2016 przez criss Mędrzec (172,590 p.)
edycja 8 listopada 2016 przez criss

Tak, bo linii 36 nie powinno być. Nie wiem dlaczego tam jest i nie bardzo wiem jak ci to wyjaśnić bo to po prostu nie ma sensu, no ale nie powinno.

Poza tym: zauważ, że w case sf::Event::KeyReleased po cout-cie masz masz instrukcje break a zaraz potem zagnieżdżony w tym case-ie ("kejsie"?) switch. Ten switch nigdy się nie wykona, bo wykonywane case-a zawsze kończy się z chwilą napotkania instrukcji break. 

No klamry przy case-ach są niepotrzebne. O czym chyba wiesz, bo przy innych ich nie ma, ale z jakiegoś powodu tutaj się pojawił. 

Podsumowując - ten case powinien wyglądać tak:

case sf::Event::KeyReleased: 
	std::cout<<"key has been released"<<std::endl; 
    switch(event.key.code)
    {
        case sf::Keyboard::J: std::cout<<"J RELEASED"<< std::endl;
							  switch(event.key.code)
							  {
								case sf::Keyboard::J: std::cout<<"J RELEASED"<< std::endl; break;                
							  }
    }
    break;

Inną sprawą jest , że case sf::Event::KeyReleased w switch(event.key.code) nie bardzo ma sens, bo event.key.code nie przyjmuje takiej wartości (event.key.code jest typu enum sf::Keyboard::Key) - tzn. przyjmuje ale w tym enumie odpowiada wartości sf::Keyboard::Key::G.

Btw. jak ci się udało ten kod tak porozpieprzać? XD (chodzi mi raczej o wcięcia :P)

Protip: poczytaj sobie dokumentacje klasy sf::Event i pozostałych (sf::KeyEvent, sf::MouseButtonEvent itd.) i spróbuj zrozumieć jak powinno się z niej korzystać, bo widać, że nie łapiesz do końca.

komentarz 8 listopada 2016 przez Poeta Doctus Użytkownik (740 p.)
Dzięki wielkie.
0 głosów
odpowiedź 8 listopada 2016 przez niezalogowany

To raczej jedynie sugestia, a nie error czy coś. Zawsze możesz zrobić coś takiego

case(..)
{
... // <- obsługa interesujących cię eventów

default: // skip calej reszty
    break;
}

 

komentarz 8 listopada 2016 przez Poeta Doctus Użytkownik (740 p.)
Jak wspomnialem, czerwony błąd usuwa, lecz pojawia się zielony przy window.close();   a brzmi tak: Thread 1: breakpoint 1.1

Podobne pytania

0 głosów
1 odpowiedź 248 wizyt
pytanie zadane 5 czerwca 2016 w C i C++ przez Maciek123233 Gaduła (3,400 p.)
0 głosów
1 odpowiedź 119 wizyt
pytanie zadane 4 marca 2017 w C i C++ przez Roshoy Nowicjusz (150 p.)
0 głosów
3 odpowiedzi 280 wizyt
pytanie zadane 23 września 2015 w C i C++ przez krolkoreipolnocnej Nowicjusz (240 p.)

92,615 zapytań

141,465 odpowiedzi

319,779 komentarzy

61,997 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...