Ciao a tutti, conoscete un qualche comando capace di restituire il numero di dimensioni di una matrice?
Grazie.
Ciao a tutti, conoscete un qualche comando capace di restituire il numero di dimensioni di una matrice?
Grazie.
Per conoscere le dimensioni di una matrice, ci sono la LBound (inferiore) e la UBound (superiore).
... e non usare while wend è una sintassi deprecata
Io penso che lui cerchi di sapere le n dimensioni di una matrice e non il numero di elementi inferiore (LBound) e superiore (Ubound) di una dimensione di una matrice
Mi sono messo d'impegno e ho trovato una soluzione al tuo problema
Prova con questa funzione
Se pensi di avere matrici che superano le 50 dimensioni allora nel ciclocodice:Public Function getDimensione(ByRef matrice As Variant) As Long Dim contDim As Long cont = 0 For i = 1 To 50 On Error GoTo matriceErr If UBound(matrice, i) > 0 Then contDim = contDim + 1 End If Next getDimensione = contDim Exit Function matriceErr: getDimensione = contDim End Function
"For i = 1 To 50" modifica il 50 con qualche altro numero
Per farla funzionare ho gestito la generazione di errori...cmq funziona...quando la funzione va' a verificare il
numero di elementi in una dimensione che non esiste genera l'errore e il contatore si blocca al
n° tot di dimensioni
Dim matrice2((3), (2), (1), (1))
MsgBox getDimensione(matrice2)
restituisce 4
Hai ragione, non avevo capito la domanda.Originariamente inviato da TrigunXX
Io penso che lui cerchi di sapere le n dimensioni di una matrice e non il numero di elementi inferiore (LBound) e superiore (Ubound) di una dimensione di una matrice
Il numero massimo di dimensioni è 60, quindi puoi impostare questo valore come termine massimo.Originariamente inviato da TrigunXX
Se pensi di avere matrici che superano le 50 dimensioni allora nel ciclo
"For i = 1 To 50" modifica il 50 con qualche altro numero
Mi sono permesso di fare una modifica alla funzione, che dovrebbe funzionare anche con 1 solo elemento per dimensione:
codice:Public Function getDimensione(ByRef matrice As Variant) As Long On Error GoTo Fine Dim I As Long For I = 1 To 60 If UBound(matrice, I) >= 0 Then getDimensione = getDimensione + 1& End If Next I Fine: End Function Private Sub Command1_Click() Dim matrice(0, 0, 0, 0, 0, 0, 0, 0, 0, 0) MsgBox CStr(getDimensione(matrice)) End Sub
... e non usare while wend è una sintassi deprecata
Grazie infinite TrigunXX mihai risolto un bel problemino.
Grazie anche a Mabi per il ritocco.
Spero di diventare bravo come voi.
Ciao.
sssimone.
Ciao ragazzi sono ancora io.
Dopo aver analizzato più a fondo entrambe le versioni di getdimensione, quella di TrigunXX e la variante di Mabi, posso dire questo:
a prima vista la versione originale di TigunXX mi è sembrata corretta mentre quella di Mabi no, in quanto TrigunXX ha messo l'ON ERROR dentro il ciclo for in modo tale da farlo interrompere quando il contatore i arriva ad una dimensione che non esiste e mantenendo le dimensioni contate fino a quel momento.Invece Mabi ha tolto l'ON ERROR dal ciclo quindi mi aspettavo che la sua versione non funzionasse generando un errore nel momento stesso in cui il contatore i fosse giunto ad una dimensione inesistente.
Invece alla resa dei fatti funzionano perfettamente entrambe le versioni delle due funzioni!!!
Quindi mi sento di poter dire che l'ON ERROR anche se è collocato esternamente al ciclo for (Mabi) è ugualmente in grado di intercettare errori all'interno del for stesso; come cio sia possibile non ne ho idea visto che il Basic in fondo è pur sempre un linguaggio sequenziale.....
Comunque i codici funzionano e questo basta e avanza!!
Ciao.
sssimone.
Ciao, in parole povere, quando viene richiamato On Error è come se viene caricata una procedura in memoria, e allo scatenarsi di un errore, questo viene catturato.. non c'è bisogno di richiamarlo tutte le volte.. basta sono una volta all'interno della funzione!! quandi la versione di Mabi è quella più corretta e ottimizzata!!! una piccola precisazione, il Basic si è un linguaggio interpretato e le istruzioni vengono eseguite sequenzialmente, ma il Visual Basic è un linguaggio ad eventi... le cose cambiano un pochettino..Originariamente inviato da sssimone
Ciao ragazzi sono ancora io.
Dopo aver analizzato più a fondo entrambe le versioni di getdimensione, quella di TrigunXX e la variante di Mabi, posso dire questo:
a prima vista la versione originale di TigunXX mi è sembrata corretta mentre quella di Mabi no, in quanto TrigunXX ha messo l'ON ERROR dentro il ciclo for in modo tale da farlo interrompere quando il contatore i arriva ad una dimensione che non esiste e mantenendo le dimensioni contate fino a quel momento.Invece Mabi ha tolto l'ON ERROR dal ciclo quindi mi aspettavo che la sua versione non funzionasse generando un errore nel momento stesso in cui il contatore i fosse giunto ad una dimensione inesistente.
Invece alla resa dei fatti funzionano perfettamente entrambe le versioni delle due funzioni!!!
Quindi mi sento di poter dire che l'ON ERROR anche se è collocato esternamente al ciclo for (Mabi) è ugualmente in grado di intercettare errori all'interno del for stesso; come cio sia possibile non ne ho idea visto che il Basic in fondo è pur sempre un linguaggio sequenziale.....
Comunque i codici funzionano e questo basta e avanza!!
Ciao.
sssimone.![]()
Jupy
Ciao Jupy64, grazie per la puntualizzazioni.
senza ricorrere a gestioni dell'errore che ha sempre i suoi effetti collaterali
codice:'in un modulo Type SAFEARRAYBOUND cElements As Long lLbound As Long End Type Type SAFEARRAY cDims As Integer fFeatures As Integer cbElements As Long cLocks As Long pvData As Long rgsabound(0 To 255) As SAFEARRAYBOUND End Type Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (dest As _ Any, source As Any, ByVal bytes As Long) Private Const VT_BYREF = &H4000& Function GetArrayInfo(TheArray As Variant) As SAFEARRAY Dim lp As Long 'indirizzo del puntatore principale = **lp Dim VType As Integer 'indirizzo del puntatore temporaneo **VType Dim ArrayInfo As SAFEARRAY If Not IsArray(TheArray) Then Exit Function With ArrayInfo CopyMemory VType, TheArray, 2 CopyMemory lp, ByVal VarPtr(TheArray) + 8, 4 If (VType And VT_BYREF) <> 0 Then CopyMemory lp, ByVal lp, 4 End If CopyMemory ArrayInfo.cDims, ByVal lp, 16 If ArrayInfo.cDims > 0 Then ' metti i risultati di array bound nella safearray CopyMemory .rgsabound(1), ByVal lp + 16, _ ArrayInfo.cDims * Len(.rgsabound(1)) GetArrayInfo = ArrayInfo End If End With End Function
esempio di utilizzo
codice:Private Sub Form_Load() Dim x(1 To 56, 2 To 24, 5 To 89) As Boolean Dim a As SAFEARRAY a = GetArrayInfo(x()) MsgBox a.cDims End Sub
Vascello fantasma dei mentecatti nonchè baronetto della scara corona alcolica, piccolo spuccello di pezza dislessico e ubriaco- Colui che ha modificato l'orribile scritta - Gran Evacuatore Mentecatto - Tristo Mietitore Mentecatto chi usa uTonter danneggia anche te
Grazie xegallo funziona alla grande!!!!