Newsgroup: it.comp.lang.delphi
Titolo: Uso di IF - THEN

Ciao a tutti, questa volta vi pongo questo dubbio
Mettiamo il caso che in una procedura io possa passare un parametro che può
avere3 cambiamenti.
Es TParametro = (P1, P2, P3);
All'interno della procedura faccio una cosa così
procedure Guarda(Tipo : TParametro);
begin
if tipo = p1 then
...
...
if tipo = p2 then
...
...
if tipo = p3 then
...
...
end;
Ecco.
 Tenendo conto che i parametri sono solo 3, è inutile fare un altro IF???
Basterebbe solo l'ELSE, in modo che se non è uno e non è l'altro è per forza
il terzo, ma in realtà cosa cambia? Velocità? Lettura???
E' sbagliato l'esempio sopra???
Grazie e Ciao

Se ho capito bene, nel tuo caso non cambia a livello di risultato ma solo al
livello di velocità!
Infatti se fai 3 distinti if, indipendentemente dall'aver già trovato quello
giusto la procedure và e controlla anche gli altri!
A volte questo metodo può anche essere sbagliato infatti TParametro potrebbe
essere ad es. sia P1 che P2...comunque non è il tuo caso.
La procedura più veloce (a livello di tempo di processo) è la seguente e
come dicevi è inutile fargli fare il 3° controllo specificandolo:
procedure Guarda(Tipo : TParametro);
begin
if tipo = p1 then
begin
    ...
    ...
end
else if tipo = p2 then
begin
    ...
    ...
end
else
begin
    ...
    ...
end;
Paolo.
Ciao.


E perchè non usare "case tipo of p1:...;p2:...;p3:...;else...end;" ?
IceCream

 E perchč non usare "case tipo of p1:...;p2:...;p3:...;else...end;" ?
Dipende dal tipo del selettore, che deve essere o integer o se non 
sbaglio al max char. ;)

sbaglio al max char. ;)
dev'essere un tipo ordinale.

carlo bosich wrote:


E quindi la mia proposta era valida (e anche più chiara secondo me)
IceCream
---------------------------------------------------------------------------
Messaggio inviato attraverso 
http://www.trucchiperpc.it
 - sezione newsgroup

 E quindi la mia proposta era valida (e anche più chiara secondo me)
Certo. Se si può essere più eleganti e chiari...Perchè no? :)

Nell'esempio mostrato da voi, c'era
if p1 then
....
ELSE if p2 then
Come mai occorre mettere l'ELSE???

 's  message dated Thu, 09 Jan
2003 16:43:43 GMT:

...perchè se il primo if è TRUE ti farebbe lo stesso gli altri IF se
non ci fossero gli ELSE.
Ciao! :)
Peppe
_____
ICQ #9759626
Togli levaccà per contattarmi via email.


Mi sento chiamato in causa xchè ti stai riferendo alla mia risposta.
Cerchiamo di dare un taglio a questa discussione una volta per tutte!
Allora mettere 3 if come dicevi all'inizio è giustooooooo!!!!!!!!! Quindi se
non ci capisci il verso fai pure così!
Oppure o ti fidi o cerchi di capire quello che ti scrivo di seguito...
Se accade che la tua variabile non assuma il valore in corrispondenza del 3°
if, allora il tuo metodo perde in prestazione; infatti, supponendo che il 1°
if venga soddisfatto, la tua procedura esegue indifferentemente altri 2
controlli completamente inutili!!!!!!
Per evitare ciò si inseriscono quei cavoli di else.
Quindi usando gli if-else (e non altre cose come switch-case o simili, che
per altro non hai richiesto e probabilmente neanche conosci....):
procedure Guarda(Tipo : TParametro);
begin
if Tipo = p1 then
    begin
        ...
        ...
    end
else
    begin
        if Tipo = p2 then
        begin
            ...
            ...
        end
        else
            begin
                ...
                ...
            end;
    end;
end.
Ho messo dei tab e dei begin-end in più in modo che sia ancora più
comprensibile :-)
Supponiamo Tipo = p1:
-> succede che viene fatto il primo controllo in corrispondenza del 1° if e
viene eseguito tutto quello che è compreso tra (il suo) then begin  ed end e
basta!!! tutto il resto viene saltato xchè è conglobato nell'else (del 1°
if)!
Supponiamo Tipo = p2:
->succede che viene eseguito il primo controllo->risulta negativo -> allora
viene eseguito tutto quello che c'è nell'else del 1° if: incontra il 2°
if ->OK, esegue ciò che è compreso tra then begin  ed end e si ferma.
Supponiamo che sia Tipo = p3:
->questo è l'unico caso che esegue tutti i controlli, però ne fà sempre uno
meno, infatti non è stato detto di controllare che fosse = p3 è stato detto:
non è p1 non è p2 allora è per forza p3! ed esegue quello che c'è nel 2°
else (del 2° if).
Basta è tardi e anche per questo credo di non essere stato tanto chiaro come
avrei voluto...
Pazienza
Ciao.

La risposta di Paolo è giusta, anche se un poco lunghetta. Se vuoi
risparmiare tempo, l'else è utile, anche se nel tuo caso il tempo perso è
ridicolo (ma in altri casi non si sa mai). Ma comunque, l'equivalente che
ho
proposto il 6 gennaio, con CASE, combina leggibilità e rapidità. Ed è
valido
sintassicamente.
Buona fortuna


il terzo, ma in realtà cosa cambia? Velocità? Lettura???
Non capisco come si possa generare un tred cosi'
lungo su una domanda come questa...
Una cosa molto bella di delphi (una volta non
esisteva) e' la finestra "CPU" che ti fa vedere
come il tuo programma pascal e' stato tradotto
in assembler dal compilatore, usando questa
finestra e' possibile rispondere a qualsiasi domanda
di questo tipo tenendo ben presente che
i processori attuali utilizzano l'esecuzione speculativa
e possiedono diverse unita' di elaborazione hardware
parallele (senza contare la frequenza elevatissima di
funzionamento).
Tanto per dirtene una, il numero di cicli di clock che
vengono utilizzati dalle singole istruzioni non e' piu'
stato pubblicato da Intel a partire dal Pentium 3 dato
che questa informazione ormai non puo' piu' essere
utilizzata dato il pesante parallelismo del p3.
Attualmente i processori moderni eseguono, in
media, 2 istruzioni macchina per ciclo di clock
(Pentium 3/tualatin/S, Celeron Tualatin, Duron e
Athlon XP) quindi a una frequenza "bassa" di 1
GHz vengono eseguite circa 2 miliardi di istruzioni
macchina al secondo.
spero di esserti stato utile
carlo