Telefonino.net network
 
| 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 » |

Torna indietro   WinTricks Forum > Software > Office suite

Notices

Rispondi
 
Strumenti discussione
Vecchio 11-10-2017, 19.53.04   #1
LoryOne
Gold Member
WT Expert
 
Registrato: 09-01-2002
Loc.: None of your business
Messaggi: 5.505
LoryOne è un gioiello raroLoryOne è un gioiello raroLoryOne è un gioiello raro
Lightbulb Ma stiamo scherzando o cosa ?

Ho notato una cosa alquanto strana, direi pericolosa, in Excel 2k3.
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
ty è pari a 2.
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
ty è pari a -1, non a 0.
Guardate questo:
Codice:
Public Sub pippo()
Dim ty As Long

For ty = 1 To 1 step 1.5
Next
MsgBox ty
End Sub
Il risultato è 3: Micidiale.
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
Cosa l'ho scritto a fare il limite ?
___________________________________

Practice feeds Skill,Skill limits Failure,Failure enhances Security,Security needs Practice
LoryOne non è collegato   Rispondi citando
Vecchio 11-10-2017, 22.13.35   #2
Alexsandra
Senior Member
WT Expert
 
L'avatar di Alexsandra
 
Registrato: 19-05-2007
Loc.: Verona
Messaggi: 1.302
Alexsandra è conosciuto da tuttiAlexsandra è conosciuto da tuttiAlexsandra è conosciuto da tuttiAlexsandra è conosciuto da tuttiAlexsandra è conosciuto da tutti
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
Se guardi nella finestra immediata il valore di ty è uguale a 1 e vengono eseguite le istruzioni all'interno del ciclo 1 sola volta, ma usciti dal ciclo la variabile ty ha valore 2, come è logico per quanto esposto poco sopra.
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 -
Alexsandra non è collegato   Rispondi citando
Vecchio 11-10-2017, 22.27.15   #3
LoryOne
Gold Member
WT Expert
 
Registrato: 09-01-2002
Loc.: None of your business
Messaggi: 5.505
LoryOne è un gioiello raroLoryOne è un gioiello raroLoryOne è un gioiello raro
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
LoryOne non è collegato   Rispondi citando
Vecchio 11-10-2017, 22.41.30   #4
LoryOne
Gold Member
WT Expert
 
Registrato: 09-01-2002
Loc.: None of your business
Messaggi: 5.505
LoryOne è un gioiello raroLoryOne è un gioiello raroLoryOne è un gioiello raro
Rif: Ma stiamo scherzando o cosa ?

Quota:
Inviato da Alexsandra Visualizza messaggio
...
Diciamo che lo scopo del ciclo For è quello di eseguire un determinato n° di volte certe istruzioni, non di controllare le variabili...
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
LoryOne non è collegato   Rispondi citando
Vecchio 12-10-2017, 00.19.37   #5
borgata
Gold Member
WT Expert
 
L'avatar di borgata
 
Registrato: 23-06-2004
Loc.: Cagliari
Messaggi: 13.333
borgata è un gioiello raroborgata è un gioiello raroborgata è un gioiello raroborgata è un gioiello raro
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!
borgata non è collegato   Rispondi citando
Vecchio 12-10-2017, 00.43.09   #6
xilo76
Forum supporter
Global Moderator
 
Registrato: 23-08-2007
Messaggi: 2.704
xilo76 è conosciuto da tuttixilo76 è conosciuto da tuttixilo76 è conosciuto da tuttixilo76 è conosciuto da tutti
Rif: Ma stiamo scherzando o cosa ?

Hai provato --> If (ty is 1) Then Exit For
___________________________________

xilo76 non è collegato   Rispondi citando
Vecchio 12-10-2017, 01.01.13   #7
Alexsandra
Senior Member
WT Expert
 
L'avatar di Alexsandra
 
Registrato: 19-05-2007
Loc.: Verona
Messaggi: 1.302
Alexsandra è conosciuto da tuttiAlexsandra è conosciuto da tuttiAlexsandra è conosciuto da tuttiAlexsandra è conosciuto da tuttiAlexsandra è conosciuto da tutti
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 -
Alexsandra non è collegato   Rispondi citando
Vecchio 12-10-2017, 14.40.49   #8
LoryOne
Gold Member
WT Expert
 
Registrato: 09-01-2002
Loc.: None of your business
Messaggi: 5.505
LoryOne è un gioiello raroLoryOne è un gioiello raroLoryOne è un gioiello raro
Rif: Ma stiamo scherzando o cosa ?

Quota:
Inviato da borgata Visualizza messaggio
...
A questo punto uno dei valori (lo step immagino, che in pratica diventa due) viene arrotondato per eccesso all'unità successiva.
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
LoryOne non è collegato   Rispondi citando
Vecchio 12-10-2017, 14.41.36   #9
LoryOne
Gold Member
WT Expert
 
Registrato: 09-01-2002
Loc.: None of your business
Messaggi: 5.505
LoryOne è un gioiello raroLoryOne è un gioiello raroLoryOne è un gioiello raro
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
LoryOne non è collegato   Rispondi citando
Vecchio 13-10-2017, 02.41.19   #10
borgata
Gold Member
WT Expert
 
L'avatar di borgata
 
Registrato: 23-06-2004
Loc.: Cagliari
Messaggi: 13.333
borgata è un gioiello raroborgata è un gioiello raroborgata è un gioiello raroborgata è un gioiello raro
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
Prima iterazione
- 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!
borgata non è collegato   Rispondi citando
Vecchio 13-10-2017, 20.00.26   #11
LoryOne
Gold Member
WT Expert
 
Registrato: 09-01-2002
Loc.: None of your business
Messaggi: 5.505
LoryOne è un gioiello raroLoryOne è un gioiello raroLoryOne è un gioiello raro
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
LoryOne non è collegato   Rispondi citando
Vecchio 13-10-2017, 20.24.20   #12
LoryOne
Gold Member
WT Expert
 
Registrato: 09-01-2002
Loc.: None of your business
Messaggi: 5.505
LoryOne è un gioiello raroLoryOne è un gioiello raroLoryOne è un gioiello raro
Rif: Ma stiamo scherzando o cosa ?

Quota:
Inviato da LoryOne Visualizza messaggio
Se lo step coincide col limite, il next non può incrementare/decrementare..
Codice:
For Ty=1 to 1 [Step 1]
Next
DEVE Iterare solo una volta, non due perchè lo step è 1 anche se non si vede
Codice:
For Ty=1 to 2 [Step 1]
Next
DEVE Iterare solo due volte, non tre perchè lo step è 1 anche se non si vede
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
LoryOne non è collegato   Rispondi citando
Vecchio 13-10-2017, 21.28.04   #13
borgata
Gold Member
WT Expert
 
L'avatar di borgata
 
Registrato: 23-06-2004
Loc.: Cagliari
Messaggi: 13.333
borgata è un gioiello raroborgata è un gioiello raroborgata è un gioiello raroborgata è un gioiello raro
Rif: Ma stiamo scherzando o cosa ?

Quota:
Inviato da LoryOne Visualizza messaggio
Il next è utile solo a portare ty ad un valore ...
next non modifica il valore di ty, serve solo a chiudere il ciclo, consideralo una sorta di parentesi graffa.

Quota:
Inviato da LoryOne Visualizza messaggio
Non è possibile nel ciclo for...next una cosa del tipo ++ty o ty++ o ty-- o --ty.
Premessa di prima a parte, tu non puoi fare cose del tipo ty++, ma stai sicuro che chi ha implementato il ciclo ha potuto scegliere come farlo tra tutti i modi citati.

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:
Inviato da LoryOne Visualizza messaggio
DEVE Iterare solo due volte, non tre perchè lo step è 1 anche se non si vede
Il controllo è all'inizio del ciclo, quindi devi per forza fare un'iterazione in più prima di accorgerti che la condizione non è verificata.
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!
borgata non è collegato   Rispondi citando
Vecchio 14-10-2017, 19.41.18   #14
Alexsandra
Senior Member
WT Expert
 
L'avatar di Alexsandra
 
Registrato: 19-05-2007
Loc.: Verona
Messaggi: 1.302
Alexsandra è conosciuto da tuttiAlexsandra è conosciuto da tuttiAlexsandra è conosciuto da tuttiAlexsandra è conosciuto da tuttiAlexsandra è conosciuto da tutti
Rif: Ma stiamo scherzando o cosa ?

Quota:
Inviato da borgata Visualizza messaggio
--------

Nel caso in oggetto il comportamento mi pare quello classico, ossia prima incremento la variabile, poi controllo se il nuovo valore soddisfa le condizioni.
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 -
Alexsandra non è collegato   Rispondi citando
Vecchio 17-10-2017, 10.31.15   #15
LoryOne
Gold Member
WT Expert
 
Registrato: 09-01-2002
Loc.: None of your business
Messaggi: 5.505
LoryOne è un gioiello raroLoryOne è un gioiello raroLoryOne è un gioiello raro
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
ci si rende conto che la variabile Yt fuori dal ciclo nidificato for...next non avrebbe senso.
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
LoryOne non è collegato   Rispondi citando
Rispondi


Utenti attualmente attivi che stanno leggendo questa discussione: 1 (0 utenti e 1 ospiti)
 
Strumenti discussione

Regole di scrittura
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is ON
Gli smilies sono ON
[IMG] è ON
Il codice HTML è OFF

Vai al forum

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

Orario GMT +2. Ora sono le: 14.10.43.


E' vietata la riproduzione, anche solo in parte, di contenuti e grafica.
Copyright © 1999-2017 Edizioni Master S.p.A. p.iva: 02105820787 • Tutti i diritti sono riservati
L'editore NON si assume nessuna responsabilità dei contenuti pubblicati sul forum in quanto redatti direttamente dagli utenti.
Questi ultimi sono responsabili dei contenuti da loro riportati nelle discussioni del forum
Powered by vBulletin - 2010 Copyright © Jelsoft Enterprises Limited.