Pagina 1 di 4

Come risolvere una lunga cascata di IF

MessaggioInviato: 23 ott 2021, 7:18
da EcoTan
Ho una routine ISR fatta più o meno così:
Codice: Seleziona tutto
void __attribute__((no_auto_psv)) _ISRFAST _MI2C1Interrupt(void) { //I2C master 

if (stato == 0) {   
......;......;......;......;......;......;......;
stato++; goto ex; }

if (stato == 1) {   
......;......;......;......;......;......;......;
stato++; goto ex; }

if (stato == 2) {   
......;......;......;......;......;......;......;
stato++; goto ex; }

................................................

if (stato == 100) {   
......;......;......;......;......;......;......;
stato++; goto ex; }

if (stato == 101) {   
......;......;......;......;......;......;......;
stato=0; }

ex: IFS1bits.MI2C1IF = 0; } // reset interrupt flag e uscita ISR

In questo modo funziona ma sicuramente si può fare meglio, però io non sono capace.

Re: Come risolvere una lunga cascata di IF

MessaggioInviato: 23 ott 2021, 8:06
da MarcoD
Guarda se il tuo linguaggio possiede la funzione switch

switch
Examples
Codice: Seleziona tutto
int num = 1;

switch(num) {
  case 0:
    println("Zero");  // Does not execute
    break;
  case 1:
    println("One");  // Prints "One"
    break;
}

Re: Come risolvere una lunga cascata di IF

MessaggioInviato: 23 ott 2021, 8:25
da alev
In molti linguaggi, l'IF multiplo viene implementato con il meta CASE

Prova a vedere se è supportato nel tuo linguaggio

Re: Come risolvere una lunga cascata di IF

MessaggioInviato: 23 ott 2021, 9:01
da EcoTan
Il linguaggio è il C di XC16 di Microchip, dovrebbe essere standard.

Re: Come risolvere una lunga cascata di IF

MessaggioInviato: 23 ott 2021, 9:05
da PietroBaima
Devi studiarti i puntatori a funzione.

(Per favore, il codice postatelo entro i tag “code”, se no non si capisce niente. Grazie)

Re: Come risolvere una lunga cascata di IF

MessaggioInviato: 23 ott 2021, 9:12
da PietroBaima
Ti incollo qui un pezzo di codice che dovrebbe farti capire come risolvere il problema che hai:

Codice: Seleziona tutto
#include <stdio.h>
void add(int a, int b)
{
    printf("Addition is %d\n", a+b);
}
void subtract(int a, int b)
{
    printf("Subtraction is %d\n", a-b);
}
void multiply(int a, int b)
{
    printf("Multiplication is %d\n", a*b);
}
 
int main()
{
    // fun_ptr_arr is an array of function pointers
    void (*fun_ptr_arr[])(int, int) = {add, subtract, multiply};
    unsigned int ch, a = 15, b = 10;
 
    printf("Enter Choice: 0 for add, 1 for subtract and 2 "
            "for multiply\n");
    scanf("%d", &ch);
 
    if (ch > 2) return 0;
 
    (*fun_ptr_arr[ch])(a, b);
 
    return 0;
}


Fonte: qui, esempio 5.

Re: Come risolvere una lunga cascata di IF

MessaggioInviato: 23 ott 2021, 9:31
da EcoTan
Grazie. Per ora sono con lo smartfon (spiaggia di Mondello, tempo splendido, certa animazione per Triathlon internazionale) poi col PC portatile "porterò" più comodamente l'esempio nel mio programma.

Re: Come risolvere una lunga cascata di IF

MessaggioInviato: 23 ott 2021, 9:40
da PietroBaima
Prego, figurati.

Ultima cosa: non usare l’istruzione “goto”, è veramente orribile. Gli anni 80 sono finiti da un pezzo.

Re: Come risolvere una lunga cascata di IF

MessaggioInviato: 23 ott 2021, 10:20
da alev
EcoTan ha scritto:spiaggia di Mondello, tempo splendido

Massima invidia :mrgreen:

Re: Come risolvere una lunga cascata di IF

MessaggioInviato: 23 ott 2021, 10:25
da lucaking
Scusate l' ignoranza, ma se ho be capito il puntatore a funzione è un modo più efficente per "saltare" nella funzione desiderata, ma la sfilza di if e il problema degli innumerevoli stati resta, o si può fare qualcosa di piu smart?