- posted
17 years ago
[avr-gcc] adres instrukcji
- Vote on answer
- posted
17 years ago
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:"?
- Vote on answer
- posted
17 years ago
- Vote on answer
- posted
17 years ago
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])(); }
- Vote on answer
- posted
17 years ago
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.
- Vote on answer
- posted
17 years ago
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.
- Vote on answer
- posted
17 years ago
- Vote on answer
- posted
17 years ago
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;
- Vote on answer
- posted
17 years ago
- Vote on answer
- posted
17 years ago
- Vote on answer
- posted
17 years ago
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
- Vote on answer
- posted
17 years ago
- Vote on answer
- posted
17 years ago
No to wstawka assemblerowa. Poszukaj, widzialem w jakims przykladzie, jak z pod wstawki wywolywac procedure zdefiniowaną gdzies indziej w c.
el es
- Vote on answer
- posted
17 years ago
- Vote on answer
- posted
17 years ago
- Vote on answer
- posted
17 years ago
- Vote on answer
- posted
17 years ago
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.
- Vote on answer
- posted
17 years ago
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ś
- Vote on answer
- posted
17 years ago
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.
- Vote on answer
- posted
17 years ago