Pagina 1 di 3

Salto multiplo

MessaggioInviato: 19 set 2015, 19:36
da EcoTan
Ho scritto un programma in C dove c'è una variabile intera che può assumere tutti i valori da 0 a 50, ed una routine ISR che deve eseguire 50 diverse (sequenze di) istruzioni a seconda del valore presentato dalla detta variabile. Attualmente ho risolto con 50 istruzioni "if" che testano i singoli valori, ma si può fare di meglio dal punto di vista della rapidità di esecuzione della ISR?

Re: Salto multiplo

MessaggioInviato: 19 set 2015, 19:42
da Russell
non è possibile usare gli "switch" "case" ?

Re: Salto multiplo

MessaggioInviato: 19 set 2015, 19:45
da Candy
Sicuramente compito per uno switch, ma bruttissimo per una ISR. Dovresti ristrutturare il codice ed alleggerire la ISR, per come la vedo io. Per solo tu sai perché lo hai fatto...

Re: Salto multiplo

MessaggioInviato: 19 set 2015, 20:00
da simo85
Array di puntatori a funzione ?

Esempio (su Linux):

Codice: Seleziona tutto
#include <unistd.h>
#include <string.h>

void foo(void)
{
   write(1, __FUNCTION__ , strlen(__FUNCTION__));
   write(1, "\n", 1); 
}

void bar(void)
{
   write(1, __FUNCTION__ , strlen(__FUNCTION__));
   write(1, "\n", 1);
}

int main(void)

   void (*functions[])() = {foo, bar};
   /* call foo */
   functions[0]();
   /* call bar */
   functions[1]();

   return 0;
}


Poi, se ti va, fai delle prove con if - else, switch - case etc. ed osserva il disassembling del codice..

Re: Salto multiplo

MessaggioInviato: 19 set 2015, 21:45
da TardoFreak
Come suggerito da Foto Utentesimo85 la soluzione migliore è un'array di puntatori a funzione.
Scrivere una lista di "if" è equivalente a scrivere uno "switch", non cambia niente se non la sintassi. Questo sistema è vantaggioso solo per il primo (massì, anche per il secondo) caso, ma tremendamente svantaggioso per l'ultimo caso che necessita che vengano fatti tutti i confronti.
L'accesso ad un'array di puntatori a funzione è invece immediato ed estremamente veloce.

Re: Salto multiplo

MessaggioInviato: 19 set 2015, 22:29
da DirtyDeeds
Nota: se usi il compilatore gcc puoi usare un'estensione non standard che ti permette di implementare i computed goto (v. anche qui).

Re: Salto multiplo

MessaggioInviato: 19 set 2015, 23:00
da TardoFreak
GOTO :?:
Orrore, abominio, maledizione!

Il povero Dijkstra urla vendetta!

Amico mio, da te proprio non me lo sarei mai aspettato. :cry:

Re: Salto multiplo

MessaggioInviato: 20 set 2015, 0:13
da Candy
Tf, switch non è per nulla equivalente di if. Lo switch salta direttamente alla unica condizione senza controllare tutte le condizioni.

Re: Salto multiplo

MessaggioInviato: 20 set 2015, 0:22
da TardoFreak
No Mauro, non potrebbe farlo. Non è una tabella ma una comparazione multipla.

Re: Salto multiplo

MessaggioInviato: 20 set 2015, 0:24
da Candy
Allora non hai ancora disassemblato molto codice.