[avr-gcc] adres instrukcji

Loading thread data ...

Patryk Sielski napisał(a):

Z tego co mnie uczyli, to nie powinno się używać instrukcji goto w takim języku jakim jest C. Nie można tego rozwiązać inaczej? Konstrukcja "switch() + case:"?

Reply to
Virus_7

Użyć funkcji ?

inline void etykietaA(void) {instrukcja1a;instrukcja2a;instrukcja3a;} inline void etykietaB(void) {instrukcja1b;instrukcja2b;instrukcja3b;} inline void etykietaC(void) {instrukcja1c;instrukcja2c;instrukcja3c;}

void (*funkcje[])(void)={etykietaA, etykietaB, etykietaC};

int main(void) { (*funkcje[0])(); (*funkcje[1])(); (*funkcje[2])(); }

Reply to
jarojuda

Albo bardziej podobne do działania goto :

inline void etykietaC(void) {instrukcja1c;instrukcja2c;instrukcja3c;} inline void etykietaB(void) {instrukcja1b;instrukcja2b;instrukcja3b;etykietaC();} inline void etykietaA(void) {instrukcja1a;instrukcja2a;instrukcja3a;etykietaB();}

void (*funkcje[])(void)={etykietaA, etykietaB, etykietaC};

Mam nadzieję, że kompilator też mnie zrozumie.

Reply to
jarojudaWYTNIJTO

W dniu 01-03-2007 20:35, Virus_7 napisał:

A ja uważam, że w pewnych wypadkach (na przykład wychodzenie ze złożonych zagnieżdżonych pętli/innych struktur) GOTO jest niezastąpione.

Reply to
Krzysiek

Spinacz biurowy, Virus_7 <virus_7@wytnij_to.o2.pl>!

Źle uczyli. Są sytuacje, w których goto w C jest najbardziej przejrzyste (głównie cleanup). Np.

if (warunek1) goto err1;

alloc_zasob_1(); if (warunek3) goto err2;

alloc_zasob_2(); if (warunek3) goto err3;

return 0;

err3: free_zasob_2(); err2: free_zasob_1(); err1: return -1;

Reply to
Adam Wysocki
Reply to
Patryk Sielski
Reply to
Patryk Sielski

Jechac po tabeli, to tez porownania przeciez. To juz lepszy by byl ten switch na oko patrzac.

Albo przepisac ten kawalek jako wstawke assemblerową.

el es

Reply to
Lukasz Sokol
Reply to
Patryk Sielski

No to wstawka assemblerowa. Poszukaj, widzialem w jakims przykladzie, jak z pod wstawki wywolywac procedure zdefiniowaną gdzies indziej w c.

el es

Reply to
Lukasz Sokol
Reply to
Patryk Sielski
Reply to
Patryk Sielski

Jesli problemem jest dlugie "wykonanie rozkazu" to mozesz wstepnie transkodowac do jednego protokolu..

Kompilator powinien ocenic i zoptymalizowac. Czesto mu wyjdzie ze tak jak powyzej jest najlepiej.

Ogolnie C nie przewiduje.

J.

Reply to
J.F.

Ogólnie to owszem. Ale gcc posiada rozszerzenie, które w tym przypadku może się nadać - skoki wyliczane. Wygląda to mniej więcej tak:

void *gdzie;

gdzie = &&etykieta;

...

if (costam) goto *gdzie;

...

etykieta: /* tu dalszy ciag programu */

Nie żeby kod miał przez to ładniej wyglądać, ale do interpretera może się nadać.

Szeluś

Reply to
szelus

In the darkest hour on Thu, 01 Mar 2007 20:35:46 +0100, Virus_7 <virus_7@WYTNIJ_TO.o2.pl> screamed:

Źle uczyli. Przydaje się min. w sytuacji gdy chcesz zrobić wielopoziomowy break lub nie chcesz dublować pewnych instrukcji w instukcjach warunkowych obsługujących błąd w funkcji. To oczywiście tylko niektóre z przykładów kiedy wolę goto.

Reply to
Artur M. Piwko
Reply to
Patryk Sielski

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.