Newsgroup: it.comp.lang.visual-basic
Titolo: Array public ?

Ciao a tutti !
Una domandina facile facile (per voi..., per me č un enigma !):
Come faccio a passare un array tra 2 procedure in 2 moduli diversi ?
Esempio:
La routine che mi carica il mio array č:
Module1
Public sub CaricoArray()
       Public type myArray
              elemento (100) as String
       end type
       [... caricamento degli elementi]
End Sub
Se in un'altra Sub richiamo la CaricoArray, come faccio poi a gestire gli
elementi dell'array?
Esempio:
Module2
Public Sub miaSub()
       [... istruzioni varie]
       Call CaricoArray
       if Module1.CaricoArray.myArray.elemento ????? non funziona...
End Sub
Non so se sono riuscito a spiegarmi...
Grazie
-- 
Posted from  [212.80.178.35] 
via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 Come faccio a passare un array tra 2 procedure in 2 moduli diversi ?
sub MiaSubCaricoArray(MioArray() as MioTipo)
...
End sub

Ah, dimenticavo... volevo evitare di dichiarare l'array nella miaSub nel
Module2...
-- 
Posted from  [212.80.178.36] 


 ha scritto
| Ciao a tutti !
| Una domandina facile facile (per voi..., per me è un enigma !):
Una risposta veloce veloce: dovresti imparare qualcosina di più sulle regole di visibilità (scope)
delle variabili. Se non impari quelle (e suppongo altre cosette) non riuscirai mai a programmare
autonomamente!
Quindi, dall'help in linea del tuo visual basic (menu "?", voce: "sommario") cerca:
MSDN Library Visual Studio X.0
/ Visual Basic Documentation
/ Using VB
/ Programmer's Guide
/ Part 1: VB Basics
/ Programming fundamentals
/ Introduction to Variables, Constants ...
/ *.*
Se non sai l'ingelse, prova a cercare tra i siti che forniscono info sulla programmazione
strutturata e ad oggetti in VB.

 End sub
In questo modo però dovrei dichiararmi l'array anche nella Sub chiamante
(sbaglio ?)...
Io volevo evitarlo, per potere richiamare la Sub CaricaArray tutte le volte che
voglio e da qualsiasi modulo senza dovere dichiarare nulla... tipo una dll...
Non è possibile ?


 ha scritto
| Module1
|
| Public sub CaricoArray()
|
|        Public type myArray
|               elemento (100) as String
|        end type
|
|        [... caricamento degli elementi]
|
| End Sub
Il tuo problema sta nel dichiarare un tipo di dato che viene visto SOLO in una Sub. Sappi che di
solito gli UDT (User-Defined Data Types) vanno dichiarati a livello di modulo. Ed anche le variabili
globali (Private se vuoi che siano visibili SOLO all'interno del modulo, Public se vuoi che siano
visibili da altri moduli).

.
. Il tuo problema sta nel dichiarare un tipo di dato che viene visto SOLO in
una Sub. Sappi che di
. solito gli UDT (User-Defined Data Types) vanno dichiarati a livello di
modulo. Ed anche le variabili
. globali (Private se vuoi che siano visibili SOLO all'interno del modulo,
Public se vuoi che siano
. visibili da altri moduli).
Quindi mi consigli, oltre che a leggermi il manuale (cosa che ho già fatto, ma
non ho trovato le risposte che cercavo), di dichiararmi il mio array a livello
di MDIForm come Public, così lo posso usare dove e quando voglio ?
-- 
Posted from  [212.80.178.36] 


 ha scritto
| .
| . Il tuo problema sta nel dichiarare un tipo di dato che viene visto SOLO in
| una Sub. Sappi che di
| . solito gli UDT (User-Defined Data Types) vanno dichiarati a livello di
| modulo. Ed anche le variabili
| . globali (Private se vuoi che siano visibili SOLO all'interno del modulo,
| Public se vuoi che siano
| . visibili da altri moduli).
|
| Quindi mi consigli, oltre che a leggermi il manuale (cosa che ho già fatto, ma
| non ho trovato le risposte che cercavo), di dichiararmi il mio array a livello
Strano: ci sono proprio le risposte che cerchi!
| di MDIForm come Public, così lo posso usare dove e quando voglio ?
Esatto! Quello che dichiari a livello di procedura e' visibile solo a livello di procedura, quello
che dichiari a livello di modulo e' invece visibile a tutte le procedure in esso dichiarate. Ma
ancora: ti consiglio di leggere meglio il manuale, soprattutto per approfondire...

 Non è possibile ?
Da qualche parte questo array pero' lo devi dichiarare... se vuoi averlo
solo nel Modulo1 e utilizzarlo in tutto il programma senza ulteriori array
di appoggio puoi fare cosi':
[Modulo1]
'Il type non e' necessario, nota anche che:
'a) myArray(100) conterrebbe 101 elementi...
'b) deve essere dichiarato *fuori* dalla funzione
'   altrimenti perde di visibilita', cosi' come
'   segnalato dal venerabile Jabba :-)
'
'lo dichiariamo privato in modo da renderlo accessibile solo
'attraverso la funzione pubblica qui sotto
Private myArray(0 To 99) As String
Public Function ArrayGlobale(ByVal Index As Long) As String
If Index >= 0 And Index <= 99 Then
    '[caricamento dell'array]
    ArrayGlobale = myArray(Index)
Else
    'e' stato passato un indice non corretto, regolati come credi...
    'un possibile comportamento puo' essere:
    Err.Raise 9
End If
End Function
il resto del codice usera' questa matrice semplicemente con
MsgBox ArrayGlobale(24)
tutto questo funziona ma ha lo stesso difetto dell'esempio proposto da te,
ovvero che ad ogni accesso alla funzione l'array viene ricaricato da capo,
con ovvio rallentamento; per evitare questo devi stabilire un criterio in
base al quale sapere se l'array e' gia' stato inizializzato, per esempio
modificando la funzione cosi':
[...]
If Index >= 0 And Index <= 99 Then
    'Supponiamo che il primo elemento vuoto indichi che l'array non
    'e' ancora stato inizializzato
    If myArray(0) = "" Then
        '[caricamento dell'array]
    End If
    ArrayGlobale = myArray(Index)
[...]
oppure dichiarando una variabile booleana o cose del genere... al termine di
tutto questo potresti valutare se incapsulare il tutto in una bella classe.
Ciao
--
Luca Dormio - 
luca....@tin.it
________________________________
"Marty, non stai ragionando in maniera quadridimensionale"
Dr. Emmett L. Brown

Grazie
PS: probabilmente hai ragione, sul manuale ci dovrebbe essere tutto... 
alcune volte riesco a trovare e capire ciň che cerco, altre volte invece
proprio non ci arrivo...
-- 
Posted from  [212.80.178.35] 


-> 
-> Da qualche parte questo array pero' lo devi dichiarare... se vuoi averlo
-> solo nel Modulo1 e utilizzarlo in tutto il programma senza ulteriori array
-> di appoggio puoi fare cosi':
-> 
-> [Modulo1]
-> 
-> 'Il type non e' necessario, nota anche che:
-> 'a) myArray(100) conterrebbe 101 elementi...
-> 'b) deve essere dichiarato *fuori* dalla funzione
-> '   altrimenti perde di visibilita', cosi' come
-> '   segnalato dal venerabile Jabba :-)
-> '
-> 'lo dichiariamo privato in modo da renderlo accessibile solo
-> 'attraverso la funzione pubblica qui sotto
-> Private myArray(0 To 99) As String
-> 
-> Public Function ArrayGlobale(ByVal Index As Long) As String
-> 
-> If Index >= 0 And Index <= 99 Then
->     '[caricamento dell'array]
->     ArrayGlobale = myArray(Index)
-> Else
->     'e' stato passato un indice non corretto, regolati come credi...
->     'un possibile comportamento puo' essere:
->     Err.Raise 9
-> End If
-> 
-> End Function
-> 
-> il resto del codice usera' questa matrice semplicemente con
-> 
-> MsgBox ArrayGlobale(24)
-> 
-> tutto questo funziona ma ha lo stesso difetto dell'esempio proposto da te,
-> ovvero che ad ogni accesso alla funzione l'array viene ricaricato da capo,
-> con ovvio rallentamento; per evitare questo devi stabilire un criterio in
-> base al quale sapere se l'array e' gia' stato inizializzato, per esempio
-> modificando la funzione cosi':
-> 
-> [...]
-> If Index >= 0 And Index <= 99 Then
->     'Supponiamo che il primo elemento vuoto indichi che l'array non
->     'e' ancora stato inizializzato
->     If myArray(0) = "" Then
->         '[caricamento dell'array]
->     End If
->     ArrayGlobale = myArray(Index)
-> [...]
-> 
-> oppure dichiarando una variabile booleana o cose del genere... al termine di
-> tutto questo potresti valutare se incapsulare il tutto in una bella classe.
-> 
Forse questa si avvicina di piů a quello che avevo in mente... l'unica cosa, 
come giustamente dicevi, devo evitare di ricaricare ogni volta l'array, 
anche perche' io l'ho messa li semplice, ma questo array non č 1, ma sono 6, 
e vengono caricati leggendo dei files, quindi si rallenterebbe tantissimo...
:-)
-- 
Posted from  [212.80.178.36] 



Non capisco bene questo discorso.
Ossia se questo array e' pubblico basta che lo dichiari una volta solo in un
modulo.bas come public, poi puoi usarlo ovunque senza ridichiarlo.
Se invece vuoi passarlo da una sub all'altra (come mi pare intendevi) basta
solo che dichiari una sub cosi':
sub MiaSub (byref MioVet() as string)
In questo modo e' nei parametri della sub la dichiarazione ma questo non
significa che ci siano due vettori in memoria, perche' byref lavora
sull'indirizzo (tipo puntatore) del vettore passato alla sub.
Fra l'altro non hai bisogno di dichiarare il vettore all'interno di un tipo
utente.
Se quel vettore e' l'unico elemento del tipo non ne vedo l'utilita'.
ciao
Paolo B.

In Form1
Private Sub  Command1_Click()
   Dim elementi(100) as Long
   Dim i as long
   For i = 1 to 100
        elementi(i)=i
   Next
   Form2.ProcessArray elementi, 100
End Sub
e in form2:
Public ProcessArray(ar() as Long, nelem as Long)
  ...
End Sub
=========
Se la sub ProcessArray in Form 2 è dichiarata Public ci puoi accedere da
qualsiasi punto del programma, anche se il form2 non è ancora caricato (in
questo caso prima esegue Form_Load e poi ProcessArray)
Ovvio, come è stato detto sopra, se l'array è un tipo di dati definito
dall'utente, non si può fare, e sei costretto a dichiararlo a livello di
modulo bas.
ps* perché non a livello di modulo? di norma array condivise su più form
dovrebbero sempre stare su un modulo.. anche per chiarezza e manutenzione.
--
Fabio Guerrazzi
VB Graphic Developer
http://www.sourcecode4free.com/cgt
fab...@libero.it
ICQ: 64649187

 :-)
... e allora ti conviene senza dubbio un bel flag booleano, sempre
dichiarato private con visibilita' a tutto il modulo; gia' che devi trattare
6 array, quindi immagino 6 funzioni speculari, ribadisco il suggerimento di
piazzare tutto in una classe, cosa che tra l'altro ti costa poco piu' di un
cut&paste
Ovviamente la sintassi di chiamata cambiera leggermente, da:
MsgBox ArrayGlobale(24)
a
MsgBox NomeClasse.ArrayGlobale(24)


"Luca Dormio" <lucaFaV...@tinFaVa.it> ha scritto
| '   altrimenti perde di visibilita', cosi' come
| '   segnalato dal venerabile Jabba :-)
Beh, non esageriamo... :-)))))))))))

 ha scritto nel messaggio
news:q_VK7.4391$4M2.1...@news2.tin.it...

Solo una piccola citazione di C3-PO da Return of the Jedi, potevo usarne
un'altra di Han Solo ma sarebbe stata "lurido ammasso putrescente" che mi
sembrava meno carino :-)
Ciao (da uno che di Star Wars ha pure i Lego...)


 ha scritto nel messaggio
| > "Luca Dormio" <lucaFaV...@tinFaVa.it> ha scritto
| > | '   altrimenti perde di visibilita', cosi' come
| > | '   segnalato dal venerabile Jabba :-)
| >
| > Beh, non esageriamo... :-)))))))))))
|
| Solo una piccola citazione di C3-PO da Return of the Jedi, potevo usarne
| un'altra di Han Solo ma sarebbe stata "lurido ammasso putrescente" che mi
| sembrava meno carino :-)
Ma rifletteva la realtà... ;-PPPPPP
Io sono un ammasso putrescente (ma non dirmi che sono lurido: non lo apprezzerei). ;-))))
| Ciao (da uno che di Star Wars ha pure i Lego...)
Siamo in due... :-)))))
Jabba