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, 18.53.04   #1
LoryOne
Gold Member
WT Expert
 
Registrato: 09-01-2002
Loc.: None of your business
Messaggi: 5.395
LoryOne ha un'aura spettacolareLoryOne ha un'aura spettacolareLoryOne ha un'aura spettacolare
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, 21.13.35   #2
Alexsandra
Senior Member
WT Expert
 
L'avatar di Alexsandra
 
Registrato: 19-05-2007
Loc.: Verona
Messaggi: 1.193
Alexsandra  un gioiello raroAlexsandra  un gioiello raroAlexsandra  un gioiello raroAlexsandra  un gioiello raro
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 allinizio 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, 21.27.15   #3
LoryOne
Gold Member
WT Expert
 
Registrato: 09-01-2002
Loc.: None of your business
Messaggi: 5.395
LoryOne ha un'aura spettacolareLoryOne ha un'aura spettacolareLoryOne ha un'aura spettacolare
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, 21.41.30   #4
LoryOne
Gold Member
WT Expert
 
Registrato: 09-01-2002
Loc.: None of your business
Messaggi: 5.395
LoryOne ha un'aura spettacolareLoryOne ha un'aura spettacolareLoryOne ha un'aura spettacolare
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 11-10-2017, 23.19.37   #5
borgata
Gold Member
WT Expert
 
L'avatar di borgata
 
Registrato: 23-06-2004
Loc.: Cagliari
Messaggi: 13.115
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 11-10-2017, 23.43.09   #6
xilo76
Forum supporter
Global Moderator
 
Registrato: 23-08-2007
Messaggi: 2.546
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, 00.01.13   #7
Alexsandra
Senior Member
WT Expert
 
L'avatar di Alexsandra
 
Registrato: 19-05-2007
Loc.: Verona
Messaggi: 1.193
Alexsandra  un gioiello raroAlexsandra  un gioiello raroAlexsandra  un gioiello raroAlexsandra  un gioiello raro
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, 13.40.49   #8
LoryOne
Gold Member
WT Expert
 
Registrato: 09-01-2002
Loc.: None of your business
Messaggi: 5.395
LoryOne ha un'aura spettacolareLoryOne ha un'aura spettacolareLoryOne ha un'aura spettacolare
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, 13.41.36   #9
LoryOne
Gold Member
WT Expert
 
Registrato: 09-01-2002
Loc.: None of your business
Messaggi: 5.395
LoryOne ha un'aura spettacolareLoryOne ha un'aura spettacolareLoryOne ha un'aura spettacolare
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, 01.41.19   #10
borgata
Gold Member
WT Expert
 
L'avatar di borgata
 
Registrato: 23-06-2004
Loc.: Cagliari
Messaggi: 13.115
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, 19.00.26   #11
LoryOne
Gold Member
WT Expert
 
Registrato: 09-01-2002
Loc.: None of your business
Messaggi: 5.395
LoryOne ha un'aura spettacolareLoryOne ha un'aura spettacolareLoryOne ha un'aura spettacolare
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, 19.24.20   #12
LoryOne
Gold Member
WT Expert
 
Registrato: 09-01-2002
Loc.: None of your business
Messaggi: 5.395
LoryOne ha un'aura spettacolareLoryOne ha un'aura spettacolareLoryOne ha un'aura spettacolare
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, 20.28.04   #13
borgata
Gold Member
WT Expert
 
L'avatar di borgata
 
Registrato: 23-06-2004
Loc.: Cagliari
Messaggi: 13.115
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, 18.41.18   #14
Alexsandra
Senior Member
WT Expert
 
L'avatar di Alexsandra
 
Registrato: 19-05-2007
Loc.: Verona
Messaggi: 1.193
Alexsandra  un gioiello raroAlexsandra  un gioiello raroAlexsandra  un gioiello raroAlexsandra  un gioiello raro
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, 09.31.15   #15
LoryOne
Gold Member
WT Expert
 
Registrato: 09-01-2002
Loc.: None of your business
Messaggi: 5.395
LoryOne ha un'aura spettacolareLoryOne ha un'aura spettacolareLoryOne ha un'aura spettacolare
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
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 17.51.32
Pensiero del momento [9] Flying Luka Chiacchiere in libert 1870 10-05-2005 19.05.41
cosa media access in avvio automatico? akunamatata Windows 7/Vista/XP/ 2003 1 09-04-2005 09.06.56
"test"x La Serie Conosciamoci Meglio!!!! :-) magicrainbow Chiacchiere in libert 75 26-10-2003 10.19.39
cosa manca? Etabeta Chiacchiere in libert 17 28-05-2000 04.22.00

Orario GMT +2. Ora sono le: 10.23.12.


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.