[avr-gcc] adres instrukcji

Mar 01, 2007 25 Replies

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ł.

a przy okazji, kto¶ tu wspomina³ jak wstawia siê fragmenty assemblerowe do programu w C?

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

Pozdrawiam Marcin Stanisz

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required