Newsgroup: it.comp.lang.visual-basic
Titolo: Dichiarazione di variabili

Ok, è una cosa stupida però non saprei come funge in VB...
Nel caso di:
Private Sub cmdRiprendi_Click()
Dim Sql As String
Dim RS As ADODB.Recordset
    If CtrlUtente("PIANIFICAZIONE") = False Then Exit Sub
End Sub
Piuttosto che
Private Sub cmdRiprendi_Click()
    If CtrlUtente("PIANIFICAZIONE") = False Then Exit Sub
Dim Sql As String
Dim RS As ADODB.Recordset
End Sub
Il secondo caso mi piace meno...però mi chiedo in che momento vengono
stanziate da VB le due variabili?
Forse il secondo caso è più ottimizzato poichè se il controllo sfugge non le
dichiara?
Alex

 stanziate da VB le due variabili?
Non c'è alcuna differenza. Vai passo-passo e noterai che dalle Dim ... non
passa mai. Ovvero le Dim vengono comunque "eseguite" quando entri nella Sub,
anche se esci subito. Si potrebbe dire (non so se tecnicamente è corretto)
che sono dichiarazioni, non istruzioni.
C'è chi preferisce dimensionare tutto in testa, altri, per questioni di
leggibilità, al momento dell'uso.


Però prova questi due pezzetti di codice:
1°
Private Sub Command1_Click()
  Debug.Print "C: " & c
  Dim c As Integer
End Sub
2°
Private Sub Command1_Click()
  Dim c As Integer
  Debug.Print "C: " & c
End Sub
Il primo dà errore di variabile non definita, il secondo no...

 Il primo dà errore di variabile non definita, il secondo no...
Te ne accorgi solo se fai un
Dim c(1 to 5000000) as long
e vai in task manager (potresti anche accorgerti dal tempo che VB 
impiega ad allocare l'array)
Ciao

 impiega ad allocare l'array)
Fammi capire, Zanna: il dimensionamento richiede un certo tempo e quindi
l'istruzione che fa riferimento alla variabile (dimensionata "dopo" tale
riferimento) non la trova "pronta"?
Non mi pare. Credo che il problema risieda nel fatto che la "c" viene
implicitamente dimensionata (variant) al primo riferimento e poi s'arrabbi
per una "doppia dichiarazione..."

 Il primo dà errore di variabile non definita, il secondo no...
Azz, mi interesserebbe approfondire questo punto! O_o
Come mai accade cio' ?

 entri nella Sub, anche se esci subito.
Sě quello lo sapevo...quindi entra e prima la scorre istanziando tutte le
dim e poi fa passo passo?
Alex

> Il primo dà errore di variabile non definita, il secondo no...
Infatti io penso che stanzi la variabile nel momento in qui la dichiaro
perchè mi sembra strano che appena entra
in una sub stanzi tutte le DIM e poi dopo scorra...
Alex

 per una "doppia dichiarazione..."
mmm quindi alla fine:
A)  la dichiarazione viene eseguita come se fosse una normale istruzione nel
punto in cui si trova
B) la dichiarazione viene effettuata all'entrata nella sub
??


Sinceramente anche a me piacerebbe saperlo, in effetti nel primo caso la
variabile C non esiste penso, altrimenti avrebbe valore zero. Vado a pranzo
e ci penso, Ciao!
Mattia

*Gigio2k [work]* ha scritto:

Mah, ora ho dei dubbi clamorosi anch'io. Resta il fatto che le varie dim non
vengono eseguite come normali istruzioni (per questo le ho definite
dichiarazioni), quindi (a questo punto, dico "immagino") deduco che le
stesse vengano "dichiarate" in blocco. Nel caso specifico credo che sia
chiaro:
Se faccio "debug.Print c" è come se dicessi "Istanzia una variant c",
chiaramente vuota, e questa è già visibile come Variant/Empty nelle
espressioni di controllo. Poi, quando gli assegno una dim esplicita, si
arrabbia perchè, chiaramente, non posso dimensionare un'altra volta qualcosa
di già definito. Insomma non è una ReDim di un vettore/matrice...

 se dicessi "Istanzia una variant c"
Questo solo perche' non usi Option Explicit :)
In merito alla questione originale, VB si comporta a livello
di "formalismo" come altri linguaggi in cui "posso usare una
variabile solo dopo che l'ho dichiarata", ma a livello di
"esecuzione" l'allocazione delle variabili dichiarate in una
routine viene fatta in blocco all'ingresso della medesima.
In .NET le variabili vengono allocate al momento della
dichiarazione (come avviene in C/C++ ecc.).
Happy Coding =)
Lokar
-- 
Sito Comune: 
http://www.it-lang-vb.net/
Manifesto: 
http://www.it-lang-vb.net/docs/Manifesto.txt
UGIdotNET - 
http://www.ugidotnet.org

 dichiarazione (come avviene in C/C++ ecc.).
Quindi se le dichiaro dentro un if risparmio in tutti i casi in cui non
entro...
Alex

 Ahah..qcuno che lo sa c'è allora :-)
  Naturalmente, basta che stai attento a chi dai retta, sai nell' NG si posso
fare brutti incontri, come nei boschi!
Ciaooo
--------------------------------
Inviato via 
http://usenet.libero.it

 entro...
Non solo: quando esci dall'if quella variabile non esiste più, quindi la
puoi ri-dichiarare in un altro blocco.
Comodissimo ad es. per i for, e per indicare che una var viene usata "solo
lì".
Ciao
--
Math Parser : 
http://www.neodatatype.net
Sito Comune : 
http://www.it-lang-vb.net

 fare brutti incontri, come nei boschi!
Ah, sě, perchč io cos'avevo detto? Imbecille.

 Ah, sě, perchč io cos'avevo detto? Imbecille.
  Ma...?????????????????? Immagino che tu abbia sbagliato a postare !


 "solo lì".
Devo fare delle prove sul .NET ^_^ Interessante però ^_^
Ale