Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

Istruzione salto C

Raccolta di codici sorgenti

Moderatore: Foto UtentePaolino

0
voti

[11] Re: Istruzione salto C

Messaggioda Foto Utentewizard » 16 set 2013, 19:02

Ok ho risolto!! :D
Era rimasto un else if :?
Grazie ad entrambi :-)
Avatar utente
Foto Utentewizard
25 1 5
Frequentatore
Frequentatore
 
Messaggi: 162
Iscritto il: 12 gen 2013, 17:48

3
voti

[12] Re: Istruzione salto C

Messaggioda Foto UtenteDirtyDeeds » 16 set 2013, 20:51

Se le condizioni sono delle uguaglianze con costanti intere, la cosa migliore è usare un'istruzione switch. Bisogna ricordarsi che l'istruzione switch permette la discesa lungo i diversi case. Quindi, per esempio:

Codice: Seleziona tutto
switch (var){
    case CONDIZIONE_1:
        // Codice condizione 1 (senza break alla fine!)
    case CONDIZIONE_2:
        // Codice condizione 2 (senza break alla fine!)
    case CONDIZIONE_3:
        // Codice condizione 3
}


Funziona così: se var == CONDIZIONE_1, vengono eseguiti tutti e tre i segmenti di codice; se var == CONDIZIONE_2, vengono eseguiti solo i segmenti di codice 2 e 3; se var == CONDIZIONE_3, viene eseguito solo il terzo segmento.

Un pezzo di codice celebre che usa questo trucco è il seguente:

Codice: Seleziona tutto
void Send(int * to, const int* from, const int count)
{
    int n = (count+7) / 8;
    switch(count%8)
    {
       case 0: do { *to++ = *from++;
       case 7:      *to++ = *from++;
       case 6:      *to++ = *from++;
       case 5:      *to++ = *from++;
       case 4:      *to++ = *from++;
       case 3:      *to++ = *from++;
       case 2:      *to++ = *from++;
       case 1:      *to++ = *from++;
        } while (--n>0);
    }
}


Chi sa a cosa serve? ;-)
It's a sin to write sin instead of \sin (Anonimo).
...'cos you know that cos ain't \cos, right?
You won't get a sexy tan if you write tan in lieu of \tan.
Take a log for a fireplace, but don't take log for \logarithm.
Avatar utente
Foto UtenteDirtyDeeds
55,9k 7 11 13
G.Master EY
G.Master EY
 
Messaggi: 7012
Iscritto il: 13 apr 2010, 16:13
Località: Somewhere in nowhere

0
voti

[13] Re: Istruzione salto C

Messaggioda Foto Utentewizard » 17 set 2013, 10:11

Grazie Foto UtenteDirtyDeeds
E' certamente un altro modo di vedere la cosa :-)
Avatar utente
Foto Utentewizard
25 1 5
Frequentatore
Frequentatore
 
Messaggi: 162
Iscritto il: 12 gen 2013, 17:48

1
voti

[14] Re: Istruzione salto C

Messaggioda Foto UtenteShockwaver » 17 set 2013, 10:18

DirtyDeeds ha scritto:Un pezzo di codice celebre che usa questo trucco è il seguente:

Codice: Seleziona tutto
void Send(int * to, const int* from, const int count)
{
    int n = (count+7) / 8;
    switch(count%8)
    {
       case 0: do { *to++ = *from++;
       case 7:      *to++ = *from++;
       case 6:      *to++ = *from++;
       case 5:      *to++ = *from++;
       case 4:      *to++ = *from++;
       case 3:      *to++ = *from++;
       case 2:      *to++ = *from++;
       case 1:      *to++ = *from++;
        } while (--n>0);
    }
}


Chi sa a cosa serve? ;-)

La Duff's Device...
E' un'ottimizzazione simpatica di una copia seriale.
Tra i vari motivi per i quali la conosco è che quando si pensa che Tom Duff l'abbia scoperta/implementata era più o meno quando sono nato :lol: :mrgreen:
Anyone who has never made a mistake has never tried anything new
Two things are infinite: universe and human stupidity, and I'm not sure about the former
You did not really understand something unless you can explain it to your grandmother
A. Einstein
Avatar utente
Foto UtenteShockwaver
770 1 5 11
Expert
Expert
 
Messaggi: 859
Iscritto il: 3 mar 2010, 18:56

1
voti

[15] Re: Istruzione salto C

Messaggioda Foto UtenteDirtyDeeds » 17 set 2013, 20:31

Shockwaver ha scritto:La Duff's Device...


Proprio quello! E' un esempio classico di loop unrolling per fare la copia di due array (anche se l'originale di Duff è leggermente diverso perché non copiava tra due vettori). Qui un post di Tom Duff sull'origine del codice. Fu reso "famoso" da Stroustrup che lo presentò come esercizio nella prima edizione del suo libro sul C++.

wizard ha scritto:E' certamente un altro modo di vedere la cosa


Tieni presente che il codice con lo switch è generalmente più chiaro di quello con il condizionale if; ma non solo: nel caso in cui la velocità di esecuzione sia un problema, il compilatore può implementare lo switch con un codice più efficiente di quello che fa uso dell'if, per esempio mediante una tabella di salti.
It's a sin to write sin instead of \sin (Anonimo).
...'cos you know that cos ain't \cos, right?
You won't get a sexy tan if you write tan in lieu of \tan.
Take a log for a fireplace, but don't take log for \logarithm.
Avatar utente
Foto UtenteDirtyDeeds
55,9k 7 11 13
G.Master EY
G.Master EY
 
Messaggi: 7012
Iscritto il: 13 apr 2010, 16:13
Località: Somewhere in nowhere

0
voti

[16] Re: Istruzione salto C

Messaggioda Foto UtenteShockwaver » 17 set 2013, 21:15

Adoro quel post che sei andato a spulciare!
Ad ogni modo non è stato certo lui a inventare il loop unrolling ;-)
E' vero la versione originale prevedeva (se ricordo bene) un gerneralissimo MMIO come uscita... correggimi se sbaglio..
Anyone who has never made a mistake has never tried anything new
Two things are infinite: universe and human stupidity, and I'm not sure about the former
You did not really understand something unless you can explain it to your grandmother
A. Einstein
Avatar utente
Foto UtenteShockwaver
770 1 5 11
Expert
Expert
 
Messaggi: 859
Iscritto il: 3 mar 2010, 18:56

Precedente

Torna a Firmware e programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 6 ospiti