Visualizzazione dei risultati da 1 a 10 su 10
  1. #1
    Utente di HTML.it
    Registrato dal
    Nov 2004
    Messaggi
    28

    VB6 - Numero dimensioni matrice



    Ciao a tutti, conoscete un qualche comando capace di restituire il numero di dimensioni di una matrice?
    Grazie.

  2. #2
    Utente di HTML.it L'avatar di Mabi
    Registrato dal
    May 2002
    Messaggi
    1,245
    Per conoscere le dimensioni di una matrice, ci sono la LBound (inferiore) e la UBound (superiore).
    ... e non usare while wend è una sintassi deprecata

  3. #3
    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

    codice:
    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
    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

    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

  4. #4
    Utente di HTML.it L'avatar di Mabi
    Registrato dal
    May 2002
    Messaggi
    1,245
    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
    Hai ragione, non avevo capito la domanda.
    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
    Il numero massimo di dimensioni è 60, quindi puoi impostare questo valore come termine massimo.

    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

  5. #5
    Utente di HTML.it
    Registrato dal
    Nov 2004
    Messaggi
    28
    Grazie infinite TrigunXX mihai risolto un bel problemino.
    Grazie anche a Mabi per il ritocco.
    Spero di diventare bravo come voi.
    Ciao.
    sssimone.

  6. #6
    Utente di HTML.it
    Registrato dal
    Nov 2004
    Messaggi
    28
    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.

  7. #7
    Utente di HTML.it L'avatar di Jupy64
    Registrato dal
    Sep 2004
    Messaggi
    1,151
    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.
    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..
    Jupy

  8. #8
    Utente di HTML.it
    Registrato dal
    Nov 2004
    Messaggi
    28
    Ciao Jupy64, grazie per la puntualizzazioni.

  9. #9
    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

  10. #10
    Utente di HTML.it
    Registrato dal
    Nov 2004
    Messaggi
    28
    Grazie xegallo funziona alla grande!!!!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.