AVRGCC instrukcja switch - pytanie

Loading thread data ...

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.

Reply to
J.F.

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

J.

Reply to
J.F.

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

Reply to
Waldemar

JS napisał(a):

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

Reply to
Virus_7

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.

Reply to
J.F.

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.

Reply to
JS

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

Reply to
Tomasz Sliwa

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.

Reply to
Jacek R. Radzikowski
<ciach>

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

Reply to
Tomasz Sliwa

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.

Reply to
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.

Reply to
Jacek R. Radzikowski

[...]

formatting link
[...]

Reply to
RoMan Mandziejewicz

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.