[avr-gcc] adres instrukcji

Artur M. Piwko napisał(a):

Ok. Przyjmuję do wiadomości. ;)

Reply to
Virus_7
Loading thread data ...

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); }

Reply to
Adam Wysocki

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 ~]$
Reply to
Adam Wysocki

Spinacz biurowy, Patryk Sielski snipped-for-privacy@elka-usun.pw.edu.pl>!

Bo to jest naprawdę dużo lepszy pomysł.

Reply to
Adam Wysocki
Reply to
identyfikator: 20040501

Jest to opisane w manualu do avr-libc...

Pozdrawiam Marcin Stanisz

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