Thread View: pl.comp.lang.c
18 messages
18 total messages
Started by Maciek
Tue, 02 Jan 2018 13:17
Pewne ostrzeżenie podczas kompilacji ...
Author: Maciek
Date: Tue, 02 Jan 2018 13:17
Date: Tue, 02 Jan 2018 13:17
14 lines
1807 bytes
1807 bytes
Cześć. Mam typ enum w którym jest kilka wartości. Następnie testuje coś za pomocą instrukcji switch / case. Czy jeśli nie testuje wszystkich możliwych wartości które są w tym typie, a tylko te które w danym momencie mnie interesują, to czy jest powód do ostrzeżenia: /Users/Maciek0/Projekty/books/books/window.cpp:223:11: Enumeration values 'b_n', 'ean', and 'isbn' not handled in switch ?? Kompilacja na Macu: Apple LLVM version 9.0.0 (clang-900.0.39.2) Target: x86_64-apple-darwin17.3.0 Thread model: posix Pozdrawiam, M.
Re: Pewne ostrzeżenie podczas kompilacji ...
Author: M.M.
Date: Tue, 02 Jan 2018 13:30
Date: Tue, 02 Jan 2018 13:30
26 lines
2561 bytes
2561 bytes
On Tuesday, January 2, 2018 at 2:17:11 PM UTC+1, Maciek wrote: > Cześć. Mam typ enum w którym jest kilka wartości. Następnie testuje coś za pomocą instrukcji switch / case. > Czy jeśli nie testuje wszystkich możliwych wartości które są w tym typie, a tylko te które w danym momencie mnie interesują, to czy jest powód do ostrzeżenia: > > /Users/Maciek0/Projekty/books/books/window.cpp:223:11: Enumeration values 'b_n', 'ean', and 'isbn' not handled in switch > > ?? > > Kompilacja na Macu: > > Apple LLVM version 9.0.0 (clang-900.0.39.2) > Target: x86_64-apple-darwin17.3.0 > Thread model: posix > > Pozdrawiam, M. Nie wiem co to znaczy dla Ciebie 'powód'. Kompilatory nie są tak inteligentne, aby na podstawie kodu źródłowego odgadnąć, jakie są intencje programisty i jakie są sensowne wartości do testowania. Tego pierwszego chyba w ogóle nie można odgadnąć, bo programista z jakiś powodów może celowo popełnić błąd. To działa mechanicznie, nie sprawdzasz wszystkich wartości, to kompilator rzuca ostrzeżenie - ja mówię że to dobrze, nieraz zaoszczędziło mi czasu. Pozdrawiam
Re: Pewne ostrzeżenie podczas kompilacji ...
Author: AK
Date: Tue, 02 Jan 2018 13:55
Date: Tue, 02 Jan 2018 13:55
15 lines
1534 bytes
1534 bytes
Użytkownik "Maciek" <moblaza@gmail.com> napisał: >Cześć. Mam typ enum w którym jest kilka wartości. Następnie testuje coś za pomocą instrukcji switch >/ case. > Czy jeśli nie testuje wszystkich możliwych wartości które są w tym typie, a tylko te które w danym > momencie > mnie interesują, to czy jest powód do ostrzeżenia: > /Users/Maciek0/Projekty/books/books/window.cpp:223:11: Enumeration values 'b_n', 'ean', and 'isbn' > not handled in switch Nie jest, ale.. od nadmiaru glowa nie boli. PS: Powinno pomoc puste default: default: break; AK
Re: Pewne ostrzeżenie podczas kompilacji ...
Author: Sebastian Biały
Date: Tue, 02 Jan 2018 15:11
Date: Tue, 02 Jan 2018 15:11
8 lines
1233 bytes
1233 bytes
On 1/2/2018 2:17 PM, Maciek wrote: > Cześć. Mam typ enum w którym jest kilka wartości. Następnie testuje coś za pomocą instrukcji switch / case. > Czy jeśli nie testuje wszystkich możliwych wartości które są w tym typie, To dodajesz: default: assert( !"unexpected value" );
Re: Pewne ostrzeżenie podczas kompilacji ...
Author: M.M.
Date: Tue, 02 Jan 2018 18:07
Date: Tue, 02 Jan 2018 18:07
14 lines
1926 bytes
1926 bytes
On Tuesday, January 2, 2018 at 4:11:56 PM UTC+1, Sebastian Biały wrote: > On 1/2/2018 2:17 PM, Maciek wrote: > > Cześć. Mam typ enum w którym jest kilka wartości. Następnie testuje coś za pomocą instrukcji switch / case. > > Czy jeśli nie testuje wszystkich możliwych wartości które są w tym typie, > > To dodajesz: > > default: > assert( !"unexpected value" ); Ten wykrzyknik zamieni na false? Sprytne, ale nie zauważyłem od razu że wykrzyknij jest poza cudzysłowem :) Pozdrawiam
Re: Pewne ostrzeżenie podczas kompilacji ...
Author: Sebastian Biały
Date: Tue, 02 Jan 2018 20:09
Date: Tue, 02 Jan 2018 20:09
7 lines
1313 bytes
1313 bytes
On 1/2/2018 7:07 PM, M.M. wrote: >> assert( !"unexpected value" ); > Ten wykrzyknik zamieni na false? Sprytne, ale nie zauważyłem od razu > że wykrzyknij jest poza cudzysłowem :) Istotne jest ze zawartośc asercji wyląduje w postaci message w systemie opisując błąd.
Re: Pewne ostrzeżenie podczas kompilacji ...
Author: M.M.
Date: Tue, 02 Jan 2018 20:39
Date: Tue, 02 Jan 2018 20:39
21 lines
2149 bytes
2149 bytes
On Tuesday, January 2, 2018 at 9:09:25 PM UTC+1, Sebastian Biały wrote: > On 1/2/2018 7:07 PM, M.M. wrote: > >> assert( !"unexpected value" ); > > Ten wykrzyknik zamieni na false? Sprytne, ale nie zauważyłem od razu > > że wykrzyknij jest poza cudzysłowem :) > > Istotne jest ze zawartośc asercji wyląduje w postaci message w systemie > opisując błąd. Tak, oczywiście. Ze względu na przejrzystość, ja robię (w przybliżeniu) tak: assert( false , "message" ); lub tak: assert( false ); W drugim przypadku preprocesor sam wygeneruje message jako numer linii, nazwę pliku, datę kompilacji... Pozdrawiam
Re: Pewne ostrzeżenie podczas kompilacji ...
Author: Wojciech Muła
Date: Tue, 02 Jan 2018 22:08
Date: Tue, 02 Jan 2018 22:08
15 lines
2383 bytes
2383 bytes
On Tuesday, January 2, 2018 at 2:17:11 PM UTC+1, Maciek wrote: > Cześć. Mam typ enum w którym jest kilka wartości. Następnie testuje coś za pomocą instrukcji switch / case. > Czy jeśli nie testuje wszystkich możliwych wartości które są w tym typie, a tylko te które w danym momencie mnie interesują, to czy jest powód do ostrzeżenia: > > /Users/Maciek0/Projekty/books/books/window.cpp:223:11: Enumeration values 'b_n', 'ean', and 'isbn' not handled in switch To może oznaczać, że Twój typ enum obejmuje za wiele przypadków. Powinieneś mieć typ, który zawiera tylko takie wartości, jakie Cię interesują w danym miejscu programu. Załatwianie wszystkiego jednym enumem i używanie defaultów to proszenie się o kłopoty. Niestety, typy wyliczeniowe są w C++ koślawe (z mikro-poprawką na enum class), więc modelowanie za ich pomocą jest męczące. w.
Re: Pewne ostrzeżenie podczas kompilacji ...
Author: M.M.
Date: Wed, 03 Jan 2018 14:02
Date: Wed, 03 Jan 2018 14:02
44 lines
3147 bytes
3147 bytes
On Tuesday, January 2, 2018 at 11:08:07 PM UTC+1, Wojciech Muła wrote:
> On Tuesday, January 2, 2018 at 2:17:11 PM UTC+1, Maciek wrote:
> > Cześć. Mam typ enum w którym jest kilka wartości. Następnie testuje coś za pomocą instrukcji switch / case.
> > Czy jeśli nie testuje wszystkich możliwych wartości które są w tym typie, a tylko te które w danym momencie mnie interesują, to czy jest powód do ostrzeżenia:
> >
> > /Users/Maciek0/Projekty/books/books/window.cpp:223:11: Enumeration values 'b_n', 'ean', and 'isbn' not handled in switch
>
> To może oznaczać, że Twój typ enum obejmuje za wiele przypadków.
> Powinieneś mieć typ, który zawiera tylko takie wartości, jakie Cię
> interesują w danym miejscu programu. Załatwianie wszystkiego jednym
> enumem i używanie defaultów to proszenie się o kłopoty.
Ja bardzo często w enum mam 'dodatkowe' pole na końcu typu. Np.:
enum Enum {
field_0,
field_1,
field_2,
.......
filed_N,
size_of_enum,
};
W niektórych przypadkach, po dodaniu pola field_N+1, wszystkie algorytmy
działają bez przepisywania, bo np. mam gdzieś tablicę:
QVector<...> table( size_of_enum , init_value );
Niestety w swich-case z reguły nigdy nie wykorzystuję pola size_of_enum i
kompilator krzyczy...
> Niestety, typy wyliczeniowe są w C++ koślawe (z mikro-poprawką na
> enum class),
Chyba nie używałem nigdy enum class, może pora się zapoznać.
> więc modelowanie za ich pomocą jest męczące.
Ale i tak często ułatwia rozwój aplikacji i zwiększa przejrzystość. A to
co powyżej opisałem z size_of_enum na końcu, jeszcze bardziej pomaga.
Pozdrawiam
Re: Pewne ostrzeżenie podczas kompilacji ...
Author: Krzysiek
Date: Wed, 03 Jan 2018 19:36
Date: Wed, 03 Jan 2018 19:36
24 lines
1990 bytes
1990 bytes
W dniu 2018-01-03 o 15:02, M.M. pisze:
>> To może oznaczać, że Twój typ enum obejmuje za wiele przypadków.
>> Powinieneś mieć typ, który zawiera tylko takie wartości, jakie Cię
>> interesują w danym miejscu programu. Załatwianie wszystkiego jednym
>> enumem i używanie defaultów to proszenie się o kłopoty.
>
> Ja bardzo często w enum mam 'dodatkowe' pole na końcu typu. Np.:
>
> enum Enum {
> field_0,
> field_1,
> field_2,
> .......
> filed_N,
> size_of_enum,
> };
To właśnie jeden z przykładów na koślawość i ułomność enumów w C++.
Czemu nie można załatwić tego czymś w rodzaju std::size(Enum) zamiast
stosować takich protez?
Pozdrawiam,
Krzysiek
Re: Pewne ostrzeżenie podczas kompilacji ...
Author: M.M.
Date: Wed, 03 Jan 2018 21:04
Date: Wed, 03 Jan 2018 21:04
30 lines
2474 bytes
2474 bytes
On Wednesday, January 3, 2018 at 8:36:05 PM UTC+1, Krzysiek wrote:
> W dniu 2018-01-03 o 15:02, M.M. pisze:
>
> >> To może oznaczać, że Twój typ enum obejmuje za wiele przypadków.
> >> Powinieneś mieć typ, który zawiera tylko takie wartości, jakie Cię
> >> interesują w danym miejscu programu. Załatwianie wszystkiego jednym
> >> enumem i używanie defaultów to proszenie się o kłopoty.
> >
> > Ja bardzo często w enum mam 'dodatkowe' pole na końcu typu. Np.:
> >
> > enum Enum {
> > field_0,
> > field_1,
> > field_2,
> > .......
> > filed_N,
> > size_of_enum,
> > };
>
> To właśnie jeden z przykładów na koślawość i ułomność enumów w C++.
> Czemu nie można załatwić tego czymś w rodzaju std::size(Enum) zamiast
> stosować takich protez?
>
> Pozdrawiam,
> Krzysiek
Może dlatego, że większe możliwości enum wkraczałyby w kompetencje
klas?
Pozdrawiam
Re: Pewne ostrzeżenie podczas kompilacji ...
Author: AK
Date: Thu, 04 Jan 2018 18:11
Date: Thu, 04 Jan 2018 18:11
27 lines
1903 bytes
1903 bytes
Użytkownik "M.M." <mmarszik@gmail.com> napisał:
> > Ja bardzo często w enum mam 'dodatkowe' pole na końcu typu. Np.:
> >
> > enum Enum {
> > field_0,
> > field_1,
> > field_2,
> > .......
> > filed_N,
> > size_of_enum,
> > };
>
> To właśnie jeden z przykładów na koślawość i ułomność enumów w C++.
> Czemu nie można załatwić tego czymś w rodzaju std::size(Enum) zamiast
> stosować takich protez?
>
> Pozdrawiam,
> Krzysiek
> Może dlatego, że większe możliwości enum wkraczałyby w kompetencje klas?
Niekoniecznie.
Wystarczylo by aby sizeof(Enum) zwracal ilosc enumow a nie dlugosc elementu Enum.
No srednio by to bylo spojne z sizeof(Klasa), ale byc moze warte tego odstepstwa ?
AK
Re: Pewne ostrzeżenie podczas kompilacji ...
Author: Piotr Gałka
Date: Thu, 04 Jan 2018 18:19
Date: Thu, 04 Jan 2018 18:19
12 lines
1538 bytes
1538 bytes
W dniu 2018-01-04 o 19:11, AK pisze:
> Niekoniecznie.
> Wystarczylo by aby sizeof(Enum) zwracal ilosc enumow a nie dlugosc
> elementu Enum.
> No srednio by to bylo spojne z sizeof(Klasa), ale byc moze warte tego
> odstepstwa ?
>
A dla:
enum Flags{Flag0=0x01,Flag1=0x02,Flag2=0x04,Flag3=0x08};
jakie byłoby sizeof(Flags)?
P.G.
Re: Pewne ostrzeżenie podczas kompilacji ...
Author: AK
Date: Thu, 04 Jan 2018 18:32
Date: Thu, 04 Jan 2018 18:32
13 lines
1607 bytes
1607 bytes
Użytkownik "Piotr Gałka" <piotr.galka@cutthismicromade.pl> napisał:
> A dla:
> enum Flags{Flag0=0x01,Flag1=0x02,Flag2=0x04,Flag3=0x08};
> jakie byłoby sizeof(Flags)?
> P.G.
4
Oczywiscie przydalby sie iterator po elementach ale.. to juz by
wymagalo przynajmniej first-class co juz zupelnie odbiegalo by od C++
wiec to tylko takie sobie moje dywagacje.
AK
Re: Pewne ostrzeżenie podczas kompilacji ...
Author: Wojciech Muła
Date: Thu, 04 Jan 2018 20:00
Date: Thu, 04 Jan 2018 20:00
47 lines
2859 bytes
2859 bytes
On Thursday, January 4, 2018 at 7:32:33 PM UTC+1, AK wrote:
> Użytkownik "Piotr Gałka" <piotr.galka@cutthismicromade.pl> napisał:
>
> > A dla:
> > enum Flags{Flag0=0x01,Flag1=0x02,Flag2=0x04,Flag3=0x08};
> > jakie byłoby sizeof(Flags)?
> > P.G.
>
> 4
> Oczywiscie przydalby sie iterator po elementach ale.. to juz by
> wymagalo przynajmniej first-class co juz zupelnie odbiegalo by od C++
> wiec to tylko takie sobie moje dywagacje.
W Adzie to ładnie rozwiązali, bo tam jest pojęcie zakresu.
Ale iterowanie to najmniejszy problem.
Brakuje możliwości kompozycji, czyli powiedzenia, że
typ enum jest nadzbiorem jednego lub wielu innych typów.
Np. jak robisz parser, to naturalnie chciałbyś mieć:
enum ArithmeticOperator {
Plus,
Minus,
Mult,
Div
}
enum BooleanOperator {
And,
Or,
Xor
}
enum Node {
use ArithmericOperator,
use BooleanOperator,
Constant,
Scalar,
Function
}
W obecnym C++ zamiast "use" robisz kopiuj-wklej
i ręcznie kodujesz konwersje. Za to już w C++20
będzie operator kropki. :)
w.
Re: Pewne ostrzeżenie podczas kompilacji ...
Author: Wojciech Muła
Date: Thu, 04 Jan 2018 20:06
Date: Thu, 04 Jan 2018 20:06
13 lines
2236 bytes
2236 bytes
On Wednesday, January 3, 2018 at 3:02:20 PM UTC+1, M.M. wrote: > > Niestety, typy wyliczeniowe są w C++ koślawe (z mikro-poprawką na > > enum class), > Chyba nie używałem nigdy enum class, może pora się zapoznać. Bardzo polecam. Bo jedyna różnica z Twojej perspektywy to konieczność kwalifikowania literału nazwą enuma. Czyli Enum::field_1, Enum::field_N. Plus jest taki, że możesz mieć wiele enumów o tych samych literałach i się nie pogryzą. :) Samo kwalifikowanie nazwą też dodaje trochę do czytelności; szczególnie jak masz jakiś ogólne nazwy w stylu None, Invalid, OK. w.
Re: Pewne ostrzeżenie podczas kompilacji ...
Author: M.M.
Date: Thu, 04 Jan 2018 21:13
Date: Thu, 04 Jan 2018 21:13
18 lines
2470 bytes
2470 bytes
On Thursday, January 4, 2018 at 9:06:16 PM UTC+1, Wojciech Muła wrote: > On Wednesday, January 3, 2018 at 3:02:20 PM UTC+1, M.M. wrote: > > > Niestety, typy wyliczeniowe są w C++ koślawe (z mikro-poprawką na > > > enum class), > > Chyba nie używałem nigdy enum class, może pora się zapoznać. > > Bardzo polecam. Bo jedyna różnica z Twojej perspektywy to konieczność kwalifikowania literału nazwą enuma. Czyli Enum::field_1, Enum::field_N. > > Plus jest taki, że możesz mieć wiele enumów o tych samych literałach > i się nie pogryzą. :) Samo kwalifikowanie nazwą też dodaje trochę do > czytelności; szczególnie jak masz jakiś ogólne nazwy w stylu None, > Invalid, OK. Tak, to wszystko racja. Podoba mi się. I chyba jeszcze ponad to co napisałeś, można wskazać typ podstawowy w enum class? Czy wcześniej też była taka możliwość? Pozdrawiam
Re: Pewne ostrzeżenie podczas kompilacji ...
Author: M.M.
Date: Thu, 04 Jan 2018 21:20
Date: Thu, 04 Jan 2018 21:20
37 lines
2878 bytes
2878 bytes
On Thursday, January 4, 2018 at 7:11:30 PM UTC+1, AK wrote:
> Użytkownik "M.M." <mmarszik@gmail.com> napisał:
>
> > > Ja bardzo często w enum mam 'dodatkowe' pole na końcu typu. Np.:
> > >
> > > enum Enum {
> > > field_0,
> > > field_1,
> > > field_2,
> > > .......
> > > filed_N,
> > > size_of_enum,
> > > };
> >
> > To właśnie jeden z przykładów na koślawość i ułomność enumów w C++.
> > Czemu nie można załatwić tego czymś w rodzaju std::size(Enum) zamiast
> > stosować takich protez?
> >
> > Pozdrawiam,
> > Krzysiek
>
> > Może dlatego, że większe możliwości enum wkraczałyby w kompetencje klas?
>
> Niekoniecznie.
> Wystarczylo by aby sizeof(Enum) zwracal ilosc enumow a nie dlugosc elementu Enum.
> No srednio by to bylo spojne z sizeof(Klasa), ale byc moze warte tego odstepstwa ?
>
> AK
Też nie jestem pewny, czy warte takiego odstępstwa. Może obecny
sizeof(Enum) przydaje się zbyt bardzo w innych sytuacjach? W C++, gdy
typ enum nie wystarcza, to niby powinna być klasa. Klasa powinna
mieć odpowiednią metodę size, a nawet powinno być const expresion
zwracające ilość pól. Hmmmm chyba myślę, że obecne działanie sizeof
jest lepsze, spójność jest dobra.
Pozdrawiam
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads