AVRGCC instrukcja switch - pytanie

Mar 10, 2005 25 Replies

Witam,



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



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.

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æ

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.

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

A jednak uwazam ze powinienes rozwazyc dobra rade i przemyslec projekt :-)

J.

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

----- Original Message ----- From: "J.F." <jfox snipped-for-privacy@poczta.onet.pl>

Newsgroups: pl.misc.elektronika Sent: Thursday, March 10, 2005 9:20 PM Subject: Re: AVRGCC instrukcja switch - pytanie

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.

JS

----- Original Message ----- From: "Waldemar" snipped-for-privacy@t-online.de Newsgroups: pl.misc.elektronika Sent: Thursday, March 10, 2005 9:23 PM Subject: Re: AVRGCC instrukcja switch - pytanie

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

JS napisał(a):

No nie wiem... Ja bym chętnie usłyszał, jak się powinno pisać programy. :)

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.

W artykule <4230b906$0$3209$ snipped-for-privacy@mamut2.aster.pl> autorem którego mieni się JS (ale inny ;)), napisano:

int wariant=0;

if( zmienna == wariant++ ) robota(); else if( zmienna == wariant++ ) spoczynek(); ...

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.

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

Pozdrawiam Tomek

JS <_do_not_use snipped-for-privacy@polbox.com wrote: [...]

typedef void(*procptr)();

void proc1() { }

void proc2() { }

void proc3() { }

int main() { procptr procedures[]={proc1,0,proc2,proc3};

int index; index=0; for(;;) { if(index>=(sizeof(procedures)/sizeof(procptr))) index=0; if(procedures[index]!=0) procedures[index](); index++; } return 0; }

Napisane na kolanie w minute, ale dziala. Nie musisz nic definiowac, kolejnosc jaka sobie zamarzysz.

pzdr. j.

<ciach>

Sprytne i fajne. A jak wyglada takie cos po kompilacji? Nie zajmuje zbyt wiele pamieci? Pozdrawiam Tomek

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.

Okazuje siê, ¿e s± ludzie, którzy chc± i potrafi± pomóc. Teraz mam kilka rozwi±zañ. Dziêki serdeczne wszystkim.

Pozdrawiam JS

To mam dla Ciebie jeszcze jedna rade: nie rob awantur ludziom, ktorzy na projektowaniu programow znaja sie lepiej niz Ty.

pzdr. j.

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

[...]

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