|
| HOMEPAGE | INDICE FORUM | REGOLAMENTO | ::. | NEI PREFERITI | .:: | RSS Forum | RSS News | NEWS web | NEWS software | |
| PUBBLICITA' | | | ARTICOLI | WIN XP | VISTA | WIN 7 | REGISTRI | SOFTWARE | MANUALI | RECENSIONI | LINUX | HUMOR | HARDWARE | DOWNLOAD | | | CERCA nel FORUM » | |
11-10-2017, 19.53.04 | #1 |
Gold Member
WT Expert
Registrato: 09-01-2002
Loc.: None of your business
Messaggi: 5.505
|
Ma stiamo scherzando o cosa ?
Ho semplicemente immesso in un modulo il codice seguente: Codice:
Public Sub pippo() Dim ty As Long For ty = 1 To 1 Next MsgBox ty End Sub Eh no, non ci siamo. La variabile iterata ty acqusisce inizialmente il valore impostato by reference all'interno del ciclo for...to...next (For...to...[step]...next), per poi essere incrementata di uno step che, se non indicato, è pari ad 1 fino al limite imposto. Next dovrebbe iterare di un valore pari allo step fino a che non si raggiunge il limite: Se il limite è pari al valore iniziale, la variabile deve essere mantenuta identica, next non deve incrementare o decrementare in funzione dello step. Non è cosa da poco. Identica problematica si presenta al decrementare della variabile referenziata. Codice:
Public Sub pippo() Dim ty As Long For ty = 1 To 0 step -1 Next MsgBox ty End Sub Guardate questo: Codice:
Public Sub pippo() Dim ty As Long For ty = 1 To 1 step 1.5 Next MsgBox ty End Sub Provate a fare lo stesso in un ciclo Do[Until]...Loop o While...Wend. Ebbene, dovete forzatamente avere il pieno controllo della variabile all'interno del ciclo la cui condizione di uscita è l'unica ad essere verificata ad ogni iterazione. Vi pare normale una cosa del genere ? Codice:
Public Sub pippo() Dim ty As Long For ty = 1 To 1 Step 1 If ty = 1 Then Exit For Next MsgBox ty End Sub
___________________________________
Practice feeds Skill,Skill limits Failure,Failure enhances Security,Security needs Practice |
11-10-2017, 22.13.35 | #2 |
Senior Member
WT Expert
Registrato: 19-05-2007
Loc.: Verona
Messaggi: 1.302
|
Rif: Ma stiamo scherzando o cosa ?
Anche se il tuo ragionamento “fila” non è proprio così Lory. Immagina una situazione del genere
For ty = a TO b eseguendo un ciclo For, prima viene assegnato il valore rappresentato da a alla variabile ty, poi vengono eseguite tutte le istruzioni presenti nel ciclo fino a Next. Solo dopo viene incrementata la variabile ty di 1 e si ritorna all’inizio del ciclo ed è qui che avviene il confronto del valore corrente della variabile ty col valore rappresentato da b. Se ty è minore o uguale a b esegue nuovamente il ciclo altrimenti esce dal ciclo se modifichi il codice in questo modo Codice:
Public Sub pippo() Dim ty As Long For ty = 1 To 1 Debug.Print ty Next MsgBox ty End Sub Diciamo che lo scopo del ciclo For è quello di eseguire un determinato n° di volte certe istruzioni, non di controllare le variabili, anche se sarebbe una bella cosa azzerare tutte le variabili usate all'uscita dai cicli.
___________________________________
- Il primo fondamento della sicurezza non e' la tecnologia, ma l'attitudine mentale - |
11-10-2017, 22.27.15 | #3 |
Gold Member
WT Expert
Registrato: 09-01-2002
Loc.: None of your business
Messaggi: 5.505
|
Rif: Ma stiamo scherzando o cosa ?
Intanto grazie per l'intervento.
Non mi trovi in accordo. Il primo ciclo ha già la variabile posta al valore che indico. Il Next, valuta la variabile col limite: Se è inferiore alla variabile+step aggiunge lo step, se è uguale si ferma; Quindi la variabile non può superare il limite imposto +- lo step all'interno del cilco. Se il limite è uguale al valore iniziale, lo step supera il limite imposto e cio è male a mio avviso.
___________________________________
Practice feeds Skill,Skill limits Failure,Failure enhances Security,Security needs Practice |
11-10-2017, 22.41.30 | #4 |
Gold Member
WT Expert
Registrato: 09-01-2002
Loc.: None of your business
Messaggi: 5.505
|
Rif: Ma stiamo scherzando o cosa ?
Vero nel 99% dei casi, poichè quella che itera non viene presa in considerazione nel ciclo a discapito di altre, il cui valore viene controllato all'interno del ciclo stesso.
___________________________________
Practice feeds Skill,Skill limits Failure,Failure enhances Security,Security needs Practice |
12-10-2017, 00.19.37 | #5 |
Gold Member
WT Expert
Registrato: 23-06-2004
Loc.: Cagliari
Messaggi: 13.333
|
Rif: Ma stiamo scherzando o cosa ?
Il caso strano mi sembra quello con step 1.5.
Se il funzionamento è quello descritto (che mi sembra abbastanza plausibile), il valore finale dovrebbe essere 2,5 e non 3. Difatti il valore iniziale è 1, viene eseguito il ciclo, la variabile viene incrementata a 2,5 (1 + 1,5) e il ciclo non viene eseguito (perchè il limite massimo di 1 è superato). A questo punto uno dei valori (lo step immagino, che in pratica diventa due) viene arrotondato per eccesso all'unità successiva. Per verificare è sufficiente far eseguire al ciclo un numero sufficiente di iterazioni.
___________________________________
La risposta è dentro di te... e però, è sbagliata! |
12-10-2017, 00.43.09 | #6 |
Forum supporter
Global Moderator
Registrato: 23-08-2007
Messaggi: 2.704
|
Rif: Ma stiamo scherzando o cosa ?
Hai provato --> If (ty is 1) Then Exit For
___________________________________
|
12-10-2017, 01.01.13 | #7 |
Senior Member
WT Expert
Registrato: 19-05-2007
Loc.: Verona
Messaggi: 1.302
|
Rif: Ma stiamo scherzando o cosa ?
Per terminare il ciclo il valore della variabile deve essere maggiore dell'indice del ciclo stesso e NON quando è uguale
per cui il 1° ciclo lo esegue, (ty = 1) ma al 2° giro la variabile viene incrementata di 1 per cui assume il valore 2 e il ciclo termina. In questo caso il compilatore non può gestire i valori delle variabili senza istruzioni. Il problema della variabile ty è se viene usata ancora nella routine che ha già un valore "sballato" dal ciclo. A mio avviso è una cosa normale questa, le variabili andrebbero azzerate se usate ancora
___________________________________
- Il primo fondamento della sicurezza non e' la tecnologia, ma l'attitudine mentale - |
12-10-2017, 14.40.49 | #8 |
Gold Member
WT Expert
Registrato: 09-01-2002
Loc.: None of your business
Messaggi: 5.505
|
Rif: Ma stiamo scherzando o cosa ?
Direi che è la variabile definita come intero lungo che non può essere decimale, pertanto arrotonda per eccesso 2.5=3.
___________________________________
Practice feeds Skill,Skill limits Failure,Failure enhances Security,Security needs Practice |
12-10-2017, 14.41.36 | #9 |
Gold Member
WT Expert
Registrato: 09-01-2002
Loc.: None of your business
Messaggi: 5.505
|
Rif: Ma stiamo scherzando o cosa ?
Non è tanto il problema dell'incremento/decremento del valore attuale della variabile con lo step impostato all'interno del ciclo, è il fatto che il primo ciclo viene eseguito assegnando preventivamente il valore ad una variabile che coincide con lo step al prossimo cilco (next): All'uscita dal primo ciclo, la variabile non deve essere incrementata di uno (lo step), poichè il limite è il valore iniziale.
Il cilco for...next...step, si può riassumere in questo modo: - Pongo la variabile che itera al valore impostato (mov), e la salvo (push), poichè il registro accumulatore sarà sicuramente in uso per oprazioni successive - il valore di step, finisce nel contatore cx - Seguono tutte le istruzioni dell'eventuale iterazione - A questo punto, devo ripristinare il valore della variabile (pop) - Aggiungere o sottrarre lo step e compararla. - A seconda del valore della variabile+-lo step, salto ed esco dal cilco, oppure - itero il contatore Capite bene che alla fine del primo ciclo, dopo il next, la variabile è già stata incrementata dello step venendo meno al limite imposto; E' questo che non quadra, poichè io posso anche fare uso della stessa variabile iterata nel ciclo for...next anche dopo il next senza bisogno di definirne un'altra.
___________________________________
Practice feeds Skill,Skill limits Failure,Failure enhances Security,Security needs Practice |
13-10-2017, 02.41.19 | #10 |
Gold Member
WT Expert
Registrato: 23-06-2004
Loc.: Cagliari
Messaggi: 13.333
|
Rif: Ma stiamo scherzando o cosa ?
In effetti era troppa fatica controllare come erano state dichiarate le variabili
Si, giustamente deve essere quella ad essere stata arrotondata per eccesso (strano non abbia arrotondato per approssimazione invece). Per il resto, ricorda che la variabile può essere valutata prima o dopo l'incremento, dipende da come è stato implementato il linguaggio e nello specifico il ciclo for. L'importante è sapere come funziona, soprattutto se poi intendi usare il valore delle variabili all'esterno del ciclo (cosa abbastanza comune in C). In questo caso il comportamento mi sembra comunque abbastanza "standard". Nel ciclo: Codice:
For ty = 1 To 2 ... Next - assegno il valore iniziale a ty [=1] - verifico se il valore di ty [1] soddisfa la condizione finale (≤2) -> [OK] - eseguo le istruzioni - "torno su" (next) Seconda iterazione - incremento il valore [1+1=2] della variabile - verifico se il valore di ty [2] soddisfa la condizione finale (≤2) -> [OK] - eseguo le istruzioni - "torno su" (next) Terza iterazione - incremento il valore [2+1=3] della variabile - verifico se il valore di ty [2] soddisfa la condizione finale (≤2) -> [NO] - esco dal ciclo e riprendo il flusso delle istruzioni Alla fine della fiera quindi il valore di ty sarà 3, comportamento che mi pare corrispondente a quello ottenuto. Oltretutto cerchi di fare un discorso basato su un funzionamento troppo a basso livello, che in questo caso trovo non sia affatto utile.
___________________________________
La risposta è dentro di te... e però, è sbagliata! |
13-10-2017, 20.00.26 | #11 |
Gold Member
WT Expert
Registrato: 09-01-2002
Loc.: None of your business
Messaggi: 5.505
|
Rif: Ma stiamo scherzando o cosa ?
Non mi trovi in accordo.
Il valore di ty deve essere 2, non 3 ancorchè con step 1. Lo step può far superare il valore di ty ancorchè ty<ty+step o ty>ty-step. Il next è utile solo a portare ty ad un valore che deve rimanere confinato all'interno del ciclo purchè inferiore al limite imposto. Se lo step coincide col limite, il next non può incrementare/decrementare. Non è possibile nel ciclo for...next una cosa del tipo ++ty o ty++ o ty-- o --ty. A incrementare o decrementare ty lo decide il valore positivo o negativo dello step, purchè il limite sia superiore al valore iniziale nello step incrementale, inferiore a quello iniziale se lo step è decrementale.
___________________________________
Practice feeds Skill,Skill limits Failure,Failure enhances Security,Security needs Practice |
13-10-2017, 20.24.20 | #12 | |
Gold Member
WT Expert
Registrato: 09-01-2002
Loc.: None of your business
Messaggi: 5.505
|
Rif: Ma stiamo scherzando o cosa ?
Quota:
Codice:
For Ty=1 to 1 [Step 1] Next Codice:
For Ty=1 to 2 [Step 1] Next Microsoft si basa sul verificare (o cnsentire di farlo) il valore di ty tra il for ed il next, ma non si cura del valore in uscita dal ciclo.
___________________________________
Practice feeds Skill,Skill limits Failure,Failure enhances Security,Security needs Practice |
|
13-10-2017, 21.28.04 | #13 | ||
Gold Member
WT Expert
Registrato: 23-06-2004
Loc.: Cagliari
Messaggi: 13.333
|
Rif: Ma stiamo scherzando o cosa ?
next non modifica il valore di ty, serve solo a chiudere il ciclo, consideralo una sorta di parentesi graffa.
Quota:
Nel caso in oggetto il comportamento mi pare quello classico, ossia prima incremento la variabile, poi controllo se il nuovo valore soddisfa le condizioni. Ovvio in questo caso che il valore d'uscita della variabile sia il valore che NON soddisfa la condizione. L'alternativa sarebbe controllare il valore prima di incrementare la variabile, utilizzando un valore temporaneo dato dalla somme tra variabile e step. Ma questo sarebbe uno spreco computazionale, perchè supponendo che un ciclo faccia mediamente un certo numero di iterazioni, dovresti per ogni iterazione eseguire un'operazione in più (che sia l'incremento del valore delle variabile dopo il controllo o la copia del valore temporaneo nella variabile). Quota:
Quindi tre iterazioni ma solo due ingressi all'interno del ciclo, ossia le due volte in cui la condizione è rispettata, la terza non è rispettata e il ciclo viene saltato ed interrotto. Se non sei convinto, prova a modificare il mio esempio per spiegare come si sarebbe dovuto comportare il ciclo.
___________________________________
La risposta è dentro di te... e però, è sbagliata! |
||
14-10-2017, 19.41.18 | #14 |
Senior Member
WT Expert
Registrato: 19-05-2007
Loc.: Verona
Messaggi: 1.302
|
Rif: Ma stiamo scherzando o cosa ?
E' questo lo scopo del ciclo, in ogni caso a livello accademico il ragionamento di Lory sarebbe giusto, che per soddisfarlo basterebbe un IF con Exit For prima del Next
___________________________________
- Il primo fondamento della sicurezza non e' la tecnologia, ma l'attitudine mentale - |
17-10-2017, 10.31.15 | #15 |
Gold Member
WT Expert
Registrato: 09-01-2002
Loc.: None of your business
Messaggi: 5.505
|
Rif: Ma stiamo scherzando o cosa ?
Non siamo a livello accademico:
Come ho già esplicitato, nel 99% dei casi ogni istruzione compresa tra il for ed il next risponde esattamente a quanto indicato nelle specifiche del ciclo, ma il problema si presenta al di fuori del ciclo stesso, quando la variabile iterata in uscita da esso viene riutilizzata, cosa fattibilissima, poichè la variabile referenziata può cambiare valore anche all'interno del ciclo. Se si prende come esempio il codice seguente: Codice:
Yt = 1 range(mRange).Select For Each s_Data In Selection Yy = 0: s = s_Data.Value For Tt = 1 To Yt If s <> mArray(Tt) Then Yy = Yy + 1 Next -> If Yt = Yy Then mArray(Yy) = s Yt = Yt + 1 ReDim Preserve mArray(1 To Yt) End If Next Infatti, poichè Tt ed Yt sono entrambe uguali ad 1 al primo ciclo, basterebbe sostituire If Yt = Yy Then con If Tt = Yy Then ...invece no. Poichè lo step è pari ad 1 anche se non evidenziato esplicitamente, Tt in uscita dal ciclo varrebbe 2, non 1 come esplicitamente imposto con For Tt = 1 To Yt Di conseguenza, For Each andrebbe a vuoto per tutte le successive iterazioni di s_Data.
___________________________________
Practice feeds Skill,Skill limits Failure,Failure enhances Security,Security needs Practice |
Utenti attualmente attivi che stanno leggendo questa discussione: 1 (0 utenti e 1 ospiti) | |
Strumenti discussione | |
|
|
Discussioni simili | ||||
Discussione | Autore discussione | Forum | Risposte | Ultimo messaggio |
Cosa sbaglio??? AIUTO | scorpio33 | Hardware e Overclock | 10 | 23-05-2005 18.51.32 |
Pensiero del momento [9] | Flying Luka | Chiacchiere in libertà | 1870 | 10-05-2005 20.05.41 |
cosa è media access in avvio automatico? | akunamatata | Windows 7/Vista/XP/ 2003 | 1 | 09-04-2005 10.06.56 |
"test"x La Serie Conosciamoci Meglio!!!! :-) | magicrainbow | Chiacchiere in libertà | 75 | 26-10-2003 11.19.39 |
cosa manca? | Etabeta | Chiacchiere in libertà | 17 | 28-05-2000 05.22.00 |