Pagina 1 di 4
Come risolvere una lunga cascata di IF

Inviato:
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

Inviato:
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

Inviato:
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

Inviato:
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

Inviato:
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

Inviato:
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

Inviato:
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

Inviato:
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

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

Re: Come risolvere una lunga cascata di IF

Inviato:
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?