U¿ywam w programie instrukcji switch w typowy sposób: switch(zmienna) { case 0: ..... break; case 1: ...... break; itd }
Zdarza siê, ¿e muszê pod np. "case 4" wstawiæ now± tre¶æ, dotychczasowy blok "case 4" przenumerowaæ na "case 5", dotychczasowy "case 5" na "case 6" itd. Poniewa¿ bloczków jest sporo, takie przenumerowywanie rêczne jest uci±¿liwe. Czy jest jaka¶ konstrukcja w (AVR)GCC, która przyporz±dkuje automatycznie te numerki na podstawie kolejno¶ci wystêpowania bloków?
Pozdrawiam JS
Didn't find your answer? Ask the community — no account required.
J
J.F.
sposob moze by i sie znalazl .. ale to byloby imo zupelnie bezuzyteczne. A cala sytuacja sugeruje ze nie masz kompletnego pojecia o projektowaniu programow :-(
J.
A
Andy
U¿ytkownik "JS" snipped-for-privacy@poczta.onet.pl> napisa³ w wiadomo¶ci news:42308bf4$0$3221$ snipped-for-privacy@mamut2.aster.pl...
tak do konca to nie wiem co chcesz osiagnac i czy case'y musza miec wartosci jawne
bo mozna dac jakies symbole a te z kolei zadeklarowac enum'em
np
enum { C_BLE, C_AAA };
switch(zmienna) { case C_BLE: ..... break; case C_AAA: ...... break; }
teraz mozesz w enumie wstawic sobie nowy symbol i nie musisz wszystkiego przenumerowaæ
J
JS
Ekspercie Wszechwiedz±cy! Dziêki Ci, ¿e ustawi³e¶ mnie we w³a¶ciwym miejscu na Drodze_Poznania _Tajników_Programowania.
Guru Znakomity! Dziêki Ci, ¿e nie chcesz mnie przyt³oczyæ ogromem swojej wiedzy.
Zbawco! Dziêki Ci, ¿e oszczêdzasz moje biedne szare komórki przed zagadniniami, których nie pojmê.
Demiurgu Wiedzy! Dziêki Ci, ¿e o¶wietlasz swoim geniuszem maluczkich na szarej ma³ej planecie zwanej Ziemi±.
Pozdrawiam (ch³odno) JS
PS. To, ¿e jest to zupe³nie bezu¿yteczne. to tylko Twoja opinia.
J
JS
U¿ytkownik "Andy" snipped-for-privacy@ceti.pl napisa³ w wiadomo¶ci news:d0q75v$5p$ snipped-for-privacy@inews.gazeta.pl...
ciach....
Dziêki serdeczne, to rozwi±zuje problem.
Pozdrawiam JS
J
J.F.
A jednak uwazam ze powinienes rozwazyc dobra rade i przemyslec projekt :-)
J.
W
Waldemar
przecież to nie ma sensu. Jakby ci kompilator bloki przenumerował, to byś się za cholerę nie pozbierał. Przecież procek ma coś robić, jak wartość zmiennej jest 7, jak coś wstawisz i kompilator ci to na 8 przerobi, to będzie bardach. A kolejność warunków w switchu może być przecież dowolna: najpierw case 217 a potem case 3, potem 23.
Waldek
J
JS
----- Original Message ----- From: "J.F." <jfox snipped-for-privacy@poczta.onet.pl>
Ludzie! Jasnowidz! Zdalnie przejrza³ moje ¼ród³a! Szkoda tylko, ¿e niegrzeczny i nadal nie zrozumia³. Ch³opie, Ty mi nie da³e¶ ¯ADNEJ rady! Ja chêtnie przemy¶lê projekt, ale nie s±dzê, ¿e instrukcja switch wysz³a z mody. Napisz, co wg Ciebie robiê ¼le. Tylko na priva, bo grupa to miejsce do wymiany konkretnych informacji, a ta dyskusja zakrawa ju¿ na za¶miecanie.
Kolejno¶æ "case" w ¿ródle programu jest rzeczywi¶cie dowolna. Wykona siê ten blok, na który aktualnie wska¿e zmienna "switch-a". W moim programie ta zmienna to licznik który narasta. W zwi±zku z tym przy którym¶tam wej¶ciu do switcha wykona siê blok o numerze n, a za chwilê przy nastêpnym wej¶ciu (po zmianie licznika oczywi¶cie) wykona siê blok n+1. Ka¿dy blok to zestaw czynno¶ci typu "w³±cz przeka¼nik", "sprawd¼ timeout" itp. Podczas uruchamiania urz±dzenia wychodz± ró¿ne pluskwy i np. okazuje siê, ¿e miêdzy blokiem n w³±czaj±cym przeka¼nik a nastêpnym blokiem n+1 trzeba wstawiæ opó¼nienie. Wtedy blok n zostaje, n+1 musi byæ przemianowany na n+2 a w/w opó¼nienie musi wej¶æ jako n+1. Gdy bloków jest 50 czy 60 to reczne przenumerowanie jest uci±¿liwe. I tu dochodzimy do wniosku, ¿e ³atwiej jest to zrobiæ ( a tak¿e ¶ledziæ wykonanie programu) gdy bloki s± u³o¿one w ¼ródle po kolei - jakkolwiek nie jest to warunek konieczny a tylko dla wygody. My¶la³em, ¿e mo¿e da siê zrobiæ w ten sposób, aby w odpowiednie miejsce ¿ród³a, miêdzy dwa "case-y" wpisaæ nowy blok case z jako¶tam_zdefiniowanym_numerem i ca³o¶æ siê przenumeruje w trakcie kompilacji. Stosuj±c rozwi±zanie zaproponowane przez Andy-ego mo¿na blok zapisaæ w ¿±danym miejscu a symbol jego numeru umie¶ciæ w enum. Jest to proste do wykonania i skuteczne.
Pozdrawiam JS
V
Virus_7
JS napisał(a):
No nie wiem... Ja bym chętnie usłyszał, jak się powinno pisać programy. :)
J
J.F.
O tym, przyznaje, nie pomyslalem.
Uwazaj potem - jedna pomylka z miejscem w tym enumie i dlugo bedziesz szukal co jest zle ..
A patrzyles jak ci gcc kompiluje takiego switcha ? Moze nie musisz tak kombinowac.
J.
J
JS
W artykule <4230b906$0$3209$ snipped-for-privacy@mamut2.aster.pl> autorem którego mieni się JS (ale inny ;)), napisano:
Można swobodnie zmieniać kolejność czynności i dodawać nowe, jednak nie wiadomo z góry (bez analizy kodu), jaka wartość "zmienna" odpowiada jakiej czynności.
T
Tomasz Sliwa
Ja czesto stosuje #define #define ROBOTA_1 0 #define ROBOTA_2 1 #define ROBOTA_3 2
int ktora_robota = 0;
switch(ktora_robota) { case ROBOTA_1: robota_1(); break; case ROBOTA_2: robota_2(); break; case ROBOTA_3: robota_3(); break; }
ktora_robota++;
W razie przerobek programu wystarczy zmienic numerki w #define a kolejnosc bezpieczniejsza jest niz w enum
Napisane na kolanie w minute, ale dziala. Nie musisz nic definiowac, kolejnosc jaka sobie zamarzysz.
pzdr. j.
T
Tomasz Sliwa
<ciach>
Sprytne i fajne. A jak wyglada takie cos po kompilacji? Nie zajmuje zbyt wiele pamieci? Pozdrawiam Tomek
J
Jacek R. Radzikowski
Rzeklbym raczej ze jeden z bardziej popularnych "trikow na kazda okazje" z zestawu standardowego kazdego nieco bardziej doswiadczonego programisty w C :)
Po kompilacji z -O3 caly main zajmuje ok. 80B. Ale powinno dac sie urwac kilka bajtow. Np. zamiana typu index na unsigned char i zastapienie inkrementacji index preinkrementacja w pierwszym ifie zmniejsza wielkosc kodu o 10B. Wyrzucenie drugiego ifa zmniejsza kod o kolejne 4B. Po kompilacji dla atmega8535 main zmalal do 60B.
pzdr. j.
J
JS
Okazuje siê, ¿e s± ludzie, którzy chc± i potrafi± pomóc. Teraz mam kilka rozwi±zañ. Dziêki serdeczne wszystkim.
Pozdrawiam JS
J
Jacek R. Radzikowski
To mam dla Ciebie jeszcze jedna rade: nie rob awantur ludziom, ktorzy na projektowaniu programow znaja sie lepiej niz Ty.
pzdr. j.
J
JS
Sorry, chcia³em ju¿ zakoñczyæ w±tek, ale widzê, ze wymaga jeszcze wyja¶nienia. To, ¿e na ¶wiecie jest milion programistów znaj±cych siê lepiej na rzeczy ode mnie, to jestem tego ¶wiadom. Jest pewnie drugi milion mniej zaawansowanych - i dobrze. Zak³adam, ¿e PT J.F. jest w czo³ówce tego pierwszego miliona. I ¿yczê mu jak najlepiej. Nie tolerujê natomiast zachowañ typu "wiem, nie powiem, a ty jeste¶ d..ek". Facet nie wie co i w jaki sposób robiê, po co mi to potrzebne i czego do tej pory dokona³em. Je¶li nie chce / nie umie poradziæ czego¶ sensownego to po co siê odzywa na dodatek nezbyt elegancko. Podchodz±c w ten sposób powinni¶my besztaæ wszystkich, którzy pytaj± jak pod³aczyæ niebieskiego LED-a do akumulatora. Grupa jest po to, aby wymieniaæ informacje na ró¿nym poziomie zaawansowania wiedzy. Dziêki kilku innym osobom dosta³em wskazówki, jak rozwi±zaæ problem i jestem im wdziêczny. J.F. dosta³ kube³ wody na g³owê, nie ze wzglêdu na jego fachowo¶æ, ktorej nota bene nie okaza³, ale za zachowanie. I to nie w kategoriach awantury ale drwiny. Mam nadziejê, ¿e wyci±gn±³ ju¿ wnioski i jest po sprawie.
Pozdrawiam JS
R
RoMan Mandziejewicz
[...]
formatting link
[...]
Join the Discussion
Have something to add? Share your thoughts — no account required.
Didn't find your answer?
Ask the community — no account required
Report Content
You are reporting this content to the moderators. They will look at it
ASAP.