Witam. Pisze program i natknąłem się na blok warunkowy w którym muszę sprawdzić jednocześnie siedem flag. Ma to działać na zasadzie jeżeli którakolwiek z nich jest ustawiona wykona się blok warunkowy. Moje pytanie jest następujące - czy pisać półkilometrową linijkę, czy jest jakiś bardziej elegancki sposób o którym nie wiem?
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Oczywiście ważne jest aby korzystać w programie z pojedynczych bitów, bo dość często wykorzystuje się cały bajt wykorzystując tylko dwa stany marnując jego potencjał. Ma to uzasadnienie gdy zależy na szybkości i objętości kodu.
Sylwek a powiedź proszę jak to się ma do szybkości działania? W BB są opisane pola bitowe z lakoniczną informacją, że oszczędność kodu jest kosztem szybkości dostępu do pojedynczych bitów i że programista sam musi określić, co jest bardziej istotne. Czy mógłbyś to trochę rozjaśnić? Myślę, że autor pytania również skorzysta, bo twoja propozycja jest zdecydowanie "ładniejsza" niż 7 warunków if.
Sylwek a powiedź proszę jak to się ma do szybkości działania?
Jeśli się kolega tak mocno zastanawia nad szybkością działania to najpierw powiedz o jaką szybkość ci chodzi i do czego ta szybkość ?
Tom277 napisał(a):
W BB są opisane pola bitowe z lakoniczną informacją
Skoro masz pola bitowe to wiadomo, że ładnie wygląda to dla oka, ale jeśli się je źle zorganizuje np jakieś pole kilkubitowe będzie leżało na granicy dwóch bajtów ... to już w ogóle aby mieć do tego dostęp kompilator będzie musiał wygenerować sporo operacji maskowania aby się dostać do potrzebnych bitów ...
Tom277 napisał(a):
że oszczędność kodu jest kosztem szybkości dostępu do pojedynczych bitów i że programista sam musi określić, co jest bardziej istotne.
Dlatego jak jest sporo pamięci ram a potrzeba zaledwie kilku prostych flag do których odwołujemy się sporadycznie w programie i pojedynczo to absolutnie dużo szybciej wyjdzie odwoływać się nawet do flagi jedno-bitowej umieszczonej w jednym bajcie (pomimo marnotrawstwa 7 bitów)
ja wprawdzie nie jestem SylwekK ale w odpowiedzi na pytanie
Tom277 napisał(a):
Czy mógłbyś to trochę rozjaśnić?
Jeśli zaś przychodzi nam często korzystać z kilku flag naraz to tak jak pisze Sylwek warto je grupować w ramach jednego bajtu i ... no co trzeba robić aby dowiadywać się o stanie np kilku z nich naraz ? MASKOWAĆ panie - maskować
oczywiście idealną sytuacją jest gdy ktoś chce po prostu sprawdzić tylko (tak jak autor w pierwszym poście) czy któraś flaga jest = 1
to co za problem umieścić je wszystkie w ramach JEDNEGO bajtu - a tak na prawdę to co oznacza umieszczenie ? Nic ... tyle co nadanie nazwy zmiennej, np
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
A jeśli będziesz chciał je sprawdzać grupami czy np tylko kilka z nich jest = 1 a inne są = 0 ... to przygotowujesz sobie odpowiednie maski dla takich grupek zgodnie z poradnikiem wyżej i po prostu dajesz warunek z odpowiednią maską
Ło matko! Mirku po Twoim rozwinięciu już chyba wszystkie wątpliwości powinny być rozwiane. Swoim kosztem zaoszczędziłeś mi kupę klikania Tylko podziękować i złocisty napój postawić
O kurcze dzięki Mirku. A o jaką szybkość mi chodzi, normalną Po prostu natknąłem się na informację, że stosowanie pól bitowych jest kosztem szybkości dostępu do nich no i nie miałem zielonego pojęcia o jak duże spowolnienie chodzi, jaki jest to rząd wielkości. Wiesz jak jest? Dla uczącego się, non stop pojawią się pytania i niejasność. Później wiele z tych rzeczy okazuje się nieistotne, ale to przychodzi z doświadczeniem, więc pytam.
Mirku po Twoim rozwinięciu już chyba wszystkie wątpliwości powinny być rozwiane
Jeszcze można do proponowanej struktury dodać unię, aby odwoływać się po różnej części (po bitach lub po całych bajtach) tej samej zmiennej. Jak praktycznie zastosować unię można znaleźć w Mirkowym poradniku.
Skompiluj sobie prosty przykład z zastosowaniem zmiennych w kilku bajtach oraz w kilku bitach jednego bajtu i porównaj pliki .lss - powinieneś zobaczyć różnice.
Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 1 gość
Nie możesz rozpoczynać nowych wątków Nie możesz odpowiadać w wątkach Nie możesz edytować swoich postów Nie możesz usuwać swoich postów Nie możesz dodawać załączników