none
Utilisation des tableaux comme paramètres pour les procédures RRS feed

  • Question

  •  

    bonjour


    Le code suivant ==-->marche bien mais je voulais vous demander quelque chose;
    j'utilise dans mon programme des tableaux de dimension fixe (999), j'ai cherché dans msdn comment utiliser les tableaux comme arguments de fonction, mais j'ai trouvé seulement un exemple avec les tableaux dynamiques. j'ai essayé alors la syntaxe suivante qui n'a pas marché

    Private Function virg_to_point(tbl(999) As Single) As String(999)

    sauver y,nom_y

     


    j'ai donc utilisé le tableau dynamique tstr() (l'appel de la fonction sauver est comme suit (y est de dimension fixe)


    bon, brièvement je voulais savoir l'utilisation des tableaux comme paramètres pour les procédures
    ==-->

    Private Function virg_to_point(tbl() As Single) As String()
      Dim tble(999) As String
      Dim inte As Integer
     
      For inte = 0 To h
      tble(inte) = Str(tbl(inte))
     ' tble(inte) = Replace(tble(inte), ",", ".")
      Next inte
      
      virg_to_point = tble
      
    End Function
     
    Private Sub sauver(itbl() As Single, nmfish As String)
    Dim jt As Integer
    Dim tstr() As String
    h = k
    Form6.Caption = h
    dos1 = chemin & nmfish & ext
    If Not (DirExists(chemin)) Then
    MkDir chemin
    End If
    newfich (dos1)
     
    '!!!!!!!!!!!!!!!!!!!!!**************************************
    numfich = FreeFile
    Open dos1 For Output As #numfich
    'Print #numfich, Timer1.Interval
    tstr = virg_to_point(itbl)
    For jt = 0 To h
    Print #numfich, tstr(jt)
    Next jt
    Close #numfich
    If FileExists(chemin & nmfish & ".mat") Then
    Kill chemin & nmfish & ".mat"
    End If
    Name dos1 As chemin & nmfish & ".mat"
    ''
    '''''''''''''''''''''''
    End Sub
    

    merci d'avance

    mercredi 6 octobre 2010 16:51

Réponses

  • Hello,

    Les procédures comme les fonctions acceptent toutes deux des tableaux en paramètre.

    Par exemple:


    Sub MaProcedure(t() As String)
    Dim i As Long

        For i = 1 To UBound(t())
            Debug.Print "t(" & i & ")=" & t(i)
        Next i
    End Sub

    Private Sub Form_Load()
    Dim t(4) As String

        t(1) = "hello": t(2) = "les": t(3) = "amis": t(4) = " ! "
        
        Call MaProcedure(t())

    End Sub


    Les fonctions obéissent aux mêmes règles et utilisent la même syntaxe:

    Function MaFunction1(t() As String) As Integer
    Dim i As Long

        For i = 1 To UBound(t())
            Debug.Print "t(" & i & ")=" & t(i)
        Next i
        
        MaFunction1 = 42
        
    End Function


    Dim ret     As Integer

        ret = MaFunction1(t)
        Debug.Print "ret=" & ret


    Tu peux faire encore mieux si tu veux une fonction qui retourne un tableau.
    Voici une fonction qui prend en paramètre un tableau de taille quelconque et qui te retourne un autre tableau (ici, de même taille mais ça pourrait etre une autre taille, tout est dynamique):

    Function MaFunction2(t() As String) As String()
    Dim SizeT   As Long
    Dim T_Out() As String
    Dim i       As Long

        SizeT = UBound(t())
        ReDim T_Out(SizeT)
        
        For i = 1 To SizeT
            T_Out(i) = t(i) & "_TRANSFO"
        Next i
        
        MaFunction2 = T_Out
        
    End Function

    Et l'utilisation, toute simple :

    Private Sub Form_Load()
    Dim t(4)    As String
    Dim t2()    As String
    Dim i       As Long

        t(1) = "hello": t(2) = "les": t(3) = "amis": t(4) = " ! "
        
        t2() = MaFunction2(t())
        
        For i = 1 To UBound(t2)
            Debug.Print "t2(" & i & ")=" & t2(i)
        Next i
        
    End Sub

    On peut tout faire, très simplement.

    J'ai écrit en son temps quelques articles sur le sujet:
    http://faq.vb.free.fr/index.php?question=173
    (voir l'utilisation du filtre en exemple)

    Cordialement,

    Jean-MArc


    Jean-marc
    • Marqué comme réponse Alex Petrescu vendredi 8 octobre 2010 14:09
    mercredi 6 octobre 2010 19:04

Toutes les réponses

  • bon, brièvement je voulais savoir l'utilisation des tableaux comme paramètres pour les procédures

    Bonsoir:

    dim t(999) as single
    dim x as single
    dim y as single
    
    sub un()
     t(x) = y
     call deux
     msgbox t(x) & vblf & t(y)
    end sub
    
    sub deux()
     t(y) = t(x) + 1
    end sub
    
    

    On peut aussi faire ça avec les PROCEDURES mais je ne crois pas qu'elle acceptent les tableaux :

    Sub Command1_Click()
     Call un
    End Sub
    
    Sub un()
     Dim t As Single
     t = 2
     Call deux(t)
     MsgBox t ' = 6
    End Sub
    
    Sub deux(t As Single)
     t = t * 3 ' = 6
    End Sub
    

    Cordialement


    Joseph Attila PUSZTAY
    EhJoe       Logiciels       Romans       Ecrire
    • Modifié EhJoe mercredi 6 octobre 2010 18:19 rajout
    mercredi 6 octobre 2010 18:10
  • Hello,

    Les procédures comme les fonctions acceptent toutes deux des tableaux en paramètre.

    Par exemple:


    Sub MaProcedure(t() As String)
    Dim i As Long

        For i = 1 To UBound(t())
            Debug.Print "t(" & i & ")=" & t(i)
        Next i
    End Sub

    Private Sub Form_Load()
    Dim t(4) As String

        t(1) = "hello": t(2) = "les": t(3) = "amis": t(4) = " ! "
        
        Call MaProcedure(t())

    End Sub


    Les fonctions obéissent aux mêmes règles et utilisent la même syntaxe:

    Function MaFunction1(t() As String) As Integer
    Dim i As Long

        For i = 1 To UBound(t())
            Debug.Print "t(" & i & ")=" & t(i)
        Next i
        
        MaFunction1 = 42
        
    End Function


    Dim ret     As Integer

        ret = MaFunction1(t)
        Debug.Print "ret=" & ret


    Tu peux faire encore mieux si tu veux une fonction qui retourne un tableau.
    Voici une fonction qui prend en paramètre un tableau de taille quelconque et qui te retourne un autre tableau (ici, de même taille mais ça pourrait etre une autre taille, tout est dynamique):

    Function MaFunction2(t() As String) As String()
    Dim SizeT   As Long
    Dim T_Out() As String
    Dim i       As Long

        SizeT = UBound(t())
        ReDim T_Out(SizeT)
        
        For i = 1 To SizeT
            T_Out(i) = t(i) & "_TRANSFO"
        Next i
        
        MaFunction2 = T_Out
        
    End Function

    Et l'utilisation, toute simple :

    Private Sub Form_Load()
    Dim t(4)    As String
    Dim t2()    As String
    Dim i       As Long

        t(1) = "hello": t(2) = "les": t(3) = "amis": t(4) = " ! "
        
        t2() = MaFunction2(t())
        
        For i = 1 To UBound(t2)
            Debug.Print "t2(" & i & ")=" & t2(i)
        Next i
        
    End Sub

    On peut tout faire, très simplement.

    J'ai écrit en son temps quelques articles sur le sujet:
    http://faq.vb.free.fr/index.php?question=173
    (voir l'utilisation du filtre en exemple)

    Cordialement,

    Jean-MArc


    Jean-marc
    • Marqué comme réponse Alex Petrescu vendredi 8 octobre 2010 14:09
    mercredi 6 octobre 2010 19:04
  • Bonjour Jean-Marc

    Oui, ça accepte, mais seulement des tableaux vide (), sinon c'est refusé :

    Sub MaProcedure(t(999) As String)
    Sub MaProcedure (t() As String)

    ???

    Cordialement.

     


    Joseph Attila PUSZTAY
    EhJoe       Logiciels       Romans       Ecrire
    mercredi 6 octobre 2010 20:39
  • Hello,

    Oui, bien sur. C'est lié au mode de passage des tableaux d'une part et c'est aussi la façon propre de faire.

    Mais tu ne passes pas un tableau "vide". Tu dis juste à la fonction : "tu vas recevoir un tableau". Il n'y a pas de raison valable de devoir déclarer en sus le nombre d'éléments, au countraire: si VB obligeait cela, ce serait une horrible faute de Design ! (tu imagines comme ce serait immonde de devoir écrire une fonction (donc par définition un truc générique) qui ne pourrait prendre en arguments qu'un tableau d'une taille donnée, fixée en dur à la compilation! Rien que d'y penser, ça me hérisse les poils!

     

    Donc tu es libre de créer un tableau de taille fixe, mais tu définis ta fonction en indiquant un tableau de taille quelconque. Ainsi, si la taille de ton tableau change, la fonction elle (heureusement!) ne change pas.

     

    Tu as 2 façons de faire ensuite ta fonction pour connaitre la taille:

    - soit tu passes explicitement le nombre d'éléments, dans une variable supplémentaire:

    Sub Toto( t() as string, size as Long)

    Dim i as long

    For i=1 to size

    t(i) ' etc.

    next i

    End Sub

    et tu invoques comme ceci :

    Dim t(999) as String

    Call Toto(t(), 999)

    - Soit tu utilises UBound, de loin la meilleure des solutions, pour d'évidentes raisons :

    Sub Toto( t() as string)

    Dim i as long

    For i=1 to UBound(t())

    t(i) ' etc.

    next i

    End Sub

    et tu invoques comme ceci :

    Dim t(999) as String

    Call Toto( t() )

     

    Il faut toujours garder à l'esprit que l'utilité des procédures et fonctions, c'est (entre autre):

    - La réutilisabilité (une même fonction pour plusieurs appels)

    - La généricité (une même fonction pour des paramètres différents en taille, par exemple)

    - Le moyen par excellence d'éviter ou de limiter l'utilisation des variables globales

     

    Une bonne (tm) fonction doit donc pouvoir se prévaloir des attributs sus-nommés. La possibilité offerte par VB de passer en arguments des tableaux adimensionnels est ici le moyen offert au programmeur d'implémenter la généricité de manière transparente.

    A noter que lorsqu'on passe un tableau à une sub ou function, le passage se fait obligatoirement par reference (ByRef). les modifications faites sur le paramètre entrainent donc une modification effective de l'argument. Si on ne souhaite pas modifier l'argument, on peut s'en prémunir en créant une copie locale sur laquelle on fera les modifications éventuelles, de façon locale et donc SANS changer effectivement la variable passée en paramètre.

    Par exemple:

    Sub Transforme(t() As String)

    Dim v() As String

     

        v = t   ' créé une copie locale

     

        v(1) = "HAHAHA" ' t() n'est pas modifié.

     

    End Sub

     

    Moralité : tout va bien! VB permet une utilisation souple et rationnelle des tableaux, y compris comme argument des procédures et fonctions.

     


    Jean-marc
    • Proposé comme réponse EhJoe jeudi 7 octobre 2010 15:02
    mercredi 6 octobre 2010 21:16
  • Hello Jean-Marc,

    MS a même rajoué en vbNet deux possibilités:

    - Donner une valeur lors de la déclaration d'une variable

    dim x as mong = 10

    - Les "variables de blocs", valable dans un bloc (début à fin), type boucle, if, while ...

    sub un()
     if x = ok then
     dim monFichier as string = "open"
     end if
     if x <> ok then
     monFichier = "pas open" ' REFUSE !!!
     end if
    end sub
    

    En contrepartie on ne peut plus déclarer un objet en tableau une dimension :

    o(x)

    Il faut passer par les collection ou les containers ...

    Ça avance et ça recule ...

    Cordialement.

     

     


    Joseph Attila PUSZTAY
    EhJoe       Logiciels       Romans       Ecrire
    • Modifié EhJoe jeudi 7 octobre 2010 05:51 correction
    • Proposé comme réponse EhJoe jeudi 7 octobre 2010 10:08
    jeudi 7 octobre 2010 05:50