Artur M. Piwko napisał(a):
Ok. Przyjmuję do wiadomości. ;)
Artur M. Piwko napisał(a):
Ok. Przyjmuję do wiadomości. ;)
Spinacz biurowy, Patryk Sielski snipped-for-privacy@elka-usun.pw.edu.pl>!
Jeżeli potrzebujesz wskoczyć w środek jakiejś funkcji z innej funkcji to znaczy, że funkcja jest źle zaprojektowana.
Funkcja to czarna skrzynka. Opcjonalnie dostaje coś na wejście, robi coś i opcjonalnie zwraca coś na wyjściu.
Jeżeli naprawdę bardzo potrzebujesz, to sparametryzuj te skoki.
enum egoto { GOTO1, /* ... */ };
typedef enum egoto goto_t;
void f2(goto_t arg) { if (arg == GOTO1) goto etyk1;
/* ... */
etyk1: /* ... */ }
void f1(void) { f2(GOTO1); }
Spinacz biurowy, Patryk Sielski snipped-for-privacy@elka-usun.pw.edu.pl>!
A jeszcze szybciej wyszukiwać binarnie...
A jeszcze szybciej sparametryzować tabelę rozkazem.
#include <stdio.h>
static void hnd1(int param) { printf("hnd1, param=%d\n", param); } static void hnd2(int param) { printf("hnd2, param=%d\n", param); } static void hnd3(int param) { printf("hnd3, param=%d\n", param); }
static void parse(unsigned int rozkaz, int param) { typedef void (*fn_t) (int param);
const fn_t fn[] = { hnd1, hnd2, hnd3 };
if (rozkaz >= sizeof(fn) / sizeof(*fn)) { printf("blad\n"); return; }
fn[rozkaz](param); }
int main(void) { parse(0, 123); parse(1, 456); parse(2, 789); parse(3, 0);
return 0; }
Po uruchomieniu:
[gophi@avenger ~]$ ./dupa hnd1, param=123 hnd2, param=456 hnd3, param=789 blad [gophi@avenger ~]$Spinacz biurowy, Patryk Sielski snipped-for-privacy@elka-usun.pw.edu.pl>!
Bo to jest naprawdę dużo lepszy pomysł.
Jest to opisane w manualu do avr-libc...
Pozdrawiam Marcin Stanisz
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.