Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

Come risolvere una lunga cascata di IF

Raccolta di codici sorgenti

Moderatore: Foto UtentePaolino

0
voti

[1] Come risolvere una lunga cascata di IF

Messaggioda Foto UtenteEcoTan » 23 ott 2021, 7:18

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.
Avatar utente
Foto UtenteEcoTan
6.200 4 10 13
Expert EY
Expert EY
 
Messaggi: 4149
Iscritto il: 29 gen 2014, 8:54

0
voti

[2] Re: Come risolvere una lunga cascata di IF

Messaggioda Foto UtenteMarcoD » 23 ott 2021, 8:06

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;
}
Avatar utente
Foto UtenteMarcoD
9.437 5 9 13
Master EY
Master EY
 
Messaggi: 4506
Iscritto il: 9 lug 2015, 16:58
Località: Torino

0
voti

[3] Re: Come risolvere una lunga cascata di IF

Messaggioda Foto Utentealev » 23 ott 2021, 8:25

In molti linguaggi, l'IF multiplo viene implementato con il meta CASE

Prova a vedere se è supportato nel tuo linguaggio
Avatar utente
Foto Utentealev
4.581 2 9 12
free expert
 
Messaggi: 4966
Iscritto il: 19 lug 2010, 14:38
Località: Altrove

0
voti

[4] Re: Come risolvere una lunga cascata di IF

Messaggioda Foto UtenteEcoTan » 23 ott 2021, 9:01

Il linguaggio è il C di XC16 di Microchip, dovrebbe essere standard.
Avatar utente
Foto UtenteEcoTan
6.200 4 10 13
Expert EY
Expert EY
 
Messaggi: 4149
Iscritto il: 29 gen 2014, 8:54

1
voti

[5] Re: Come risolvere una lunga cascata di IF

Messaggioda Foto UtentePietroBaima » 23 ott 2021, 9:05

Devi studiarti i puntatori a funzione.

(Per favore, il codice postatelo entro i tag “code”, se no non si capisce niente. Grazie)
Generatore codice per articoli:
nomi
emoticon
citazioni
formule latex
Avatar utente
Foto UtentePietroBaima
84,6k 7 12 13
G.Master EY
G.Master EY
 
Messaggi: 11097
Iscritto il: 12 ago 2012, 1:20
Località: Londra

2
voti

[6] Re: Come risolvere una lunga cascata di IF

Messaggioda Foto UtentePietroBaima » 23 ott 2021, 9:12

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.
Generatore codice per articoli:
nomi
emoticon
citazioni
formule latex
Avatar utente
Foto UtentePietroBaima
84,6k 7 12 13
G.Master EY
G.Master EY
 
Messaggi: 11097
Iscritto il: 12 ago 2012, 1:20
Località: Londra

0
voti

[7] Re: Come risolvere una lunga cascata di IF

Messaggioda Foto UtenteEcoTan » 23 ott 2021, 9:31

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.
Avatar utente
Foto UtenteEcoTan
6.200 4 10 13
Expert EY
Expert EY
 
Messaggi: 4149
Iscritto il: 29 gen 2014, 8:54

1
voti

[8] Re: Come risolvere una lunga cascata di IF

Messaggioda Foto UtentePietroBaima » 23 ott 2021, 9:40

Prego, figurati.

Ultima cosa: non usare l’istruzione “goto”, è veramente orribile. Gli anni 80 sono finiti da un pezzo.
Generatore codice per articoli:
nomi
emoticon
citazioni
formule latex
Avatar utente
Foto UtentePietroBaima
84,6k 7 12 13
G.Master EY
G.Master EY
 
Messaggi: 11097
Iscritto il: 12 ago 2012, 1:20
Località: Londra

0
voti

[9] Re: Come risolvere una lunga cascata di IF

Messaggioda Foto Utentealev » 23 ott 2021, 10:20

EcoTan ha scritto:spiaggia di Mondello, tempo splendido

Massima invidia :mrgreen:
Avatar utente
Foto Utentealev
4.581 2 9 12
free expert
 
Messaggi: 4966
Iscritto il: 19 lug 2010, 14:38
Località: Altrove

0
voti

[10] Re: Come risolvere una lunga cascata di IF

Messaggioda Foto Utentelucaking » 23 ott 2021, 10:25

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?
Avatar utente
Foto Utentelucaking
1.293 3 5 8
Expert
Expert
 
Messaggi: 1160
Iscritto il: 29 mag 2015, 14:28

Prossimo

Torna a Firmware e programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 5 ospiti