IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB 6 et antérieur Discussion :

Fonction qui retourne un tableau ou 2 variables ? possible ou non


Sujet :

VB 6 et antérieur

  1. #21
    Expert éminent sénior


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Points : 20 040
    Points
    20 040
    Par défaut
    Citation Envoyé par ouskel'n'or
    Oui, avec vba 97...

    A+

    Je n'ai pas écrit ce code pour ne pas le tester
    bien je viens de tester sous excel 97 SR1... et la fonction retourne bien un tableau ... ( seule la ligne MonTableau = Array(1, 2, 3, 4, 5) provoque une erreur..)

  2. #22
    Membre éclairé
    Avatar de Catbull
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    542
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 542
    Points : 854
    Points
    854
    Par défaut
    Citation Envoyé par jmfmarques

    On ne peut par contre définitivement pas modifier les valeurs du tableau dans la fonction ou la procédure et retrouver ces modifications au retour de la fonction ou de la procédure
    Tu ne confonds pas la notion de tableau et variant? Voici un contre exemple à ton affirmation :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    Private tableau() As String
     
    Private Sub Main()
        ReDim tableau(3)
     
        For i = 0 To 2
          tableau(i) = i
        Next
     
        voila tableau
     
        For i = 0 To 2
          MsgBox tableau(i) ' et l'on voit que le modif sans voila n'a rien fait finalement
        Next
    End Sub
     
    Private Function voila(ByRef t() As String)
       For i = 0 To 2
         t(i) = t(i) & "a" ' expres pour que l'on voie que tableau est bien considéré ici
         MsgBox t(i)
        Next i
    End Function
    1. On peut modifier les valeurs d'un tableau en le passant par référence.
    2. On peut renvoyer un tableau en résultat de fonction. Exemple fonction Split!

  3. #23
    Membre éclairé
    Avatar de Catbull
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    542
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 542
    Points : 854
    Points
    854
    Par défaut
    Voilà un exmple de fonction qui renvoie un tableau :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    Private Sub Main()
        Dim tableau() As String
     
        tableau = voila
     
        For i = 0 To 2
          MsgBox tableau(i)
        Next
    End Sub
     
    Private Function voila() As String()
        Dim tmp(3) As String
     
        For i = 0 To 2
          tmp(i) = i
        Next i
     
        voila = tmp
    End Function
    A mon avis, le plus propre est de passer le tableau en paramètre d'une fonction (ou procédure) plutot que de le renvoyer en résultat de fonction. Cela utilise moins de ressource.

    Je préfère d'ailleurs garder le résultat de la fonction pour dire si le tableau s'est créé ou préciser la taille du tableau (par exemple).

  4. #24
    Inactif  
    Avatar de jmfmarques
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    3 784
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 3 784
    Points : 4 674
    Points
    4 674
    Par défaut
    je ne confonds rien du tout et surtout pas une fonction et une procédure.

    Dans cet exemple, "voila" n'a de "fonction" que le nom. Ce n'en est certes pas une, mais une simple procédure...

    Une fonction retourne SA valeur. Une procédure restitue ses paramètres... et c'est loin d'être la même chose !

    L'enlèvement des parenthèses est suffisant pour que l'on voie qu'il ne s'agissait alors plus d'une fonction

    Voilà donc, comment fonctionne une fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Private Sub Command1_Click()
      b = 2
      MsgBox toto(b)
    End Sub
     
    Private Function toto(titi) As Integer
      If titi = 2 Then toto = 3
    End Function
    Et c'est loin d'être pareil.

    Question donc (car la question est là) :
    Une fonction peut-elle RENVOYER un tableau qui lui a été passé en argument (autrement dit : peut-elle devenir elle-même un tableau ?)

    Cà y est ?

  5. #25
    Membre éclairé
    Avatar de Catbull
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    542
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 542
    Points : 854
    Points
    854
    Par défaut
    jmf,

    j'ai réagi a deux choses :

    1 ta remarque :
    On ne peut par contre définitivement pas modifier les valeurs du tableau dans la fonction ou la procédure et retrouver ces modifications au retour de la fonction ou de la procédure
    Ce qui est faux. Cf. le code que j'ai précédement fournis

    2. A la question posée intialement dans le titre du message. Peut-on renvoyer un tableau en résultat de fonction. Réponse oui. Cf. le code précédement donné.

  6. #26
    Expert éminent sénior


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Points : 20 040
    Points
    20 040
    Par défaut
    jmf..:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    Private Sub Command1_Click()
      Dim b(0 To 1) As Integer
      b(0) = 2
      MsgBox toto(b)(0)
      End Sub
     
    Private Function toto(titi() As Integer)
      Dim D(0 To 1) As Integer
      If titi(0) = 2 Then D(0) = 3
      toto = D
    End Function

    PS : merci catbull pour ton aide...

  7. #27
    Inactif  
    Avatar de jmfmarques
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    3 784
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 3 784
    Points : 4 674
    Points
    4 674
    Par défaut
    Très intéressant.
    Maintenant : une fonction étant destinée à plusieurs utilisations, comment passes-tu la dimension (pas connue au départ par la fonction) à la fonction ?
    Crois tu que dim va accepter autre chose qu'un chiffre ou une constante ?
    Ton truc est bon mais il faut utiliser Redim au lieu de dim et passer la dimension du tableau pour l'utiliser avec redim.


    Catbull : ton code n'est pas celui d'une fonction... il ne le serait que s'il retournait la valeur de voila ...

  8. #28
    Membre éclairé
    Avatar de Catbull
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    542
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 542
    Points : 854
    Points
    854
    Par défaut
    Plusieurs solutions, utiliser un autre paramètre pour préciser la dimension, ou initialiser le tableau avant l'appel de la fonction. Cette initialisation a pour but de définir la taille du tableau.

    Enfin, il ne faut pas utiliser un dim, mais un Redim.

  9. #29
    Expert éminent sénior


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Points : 20 040
    Points
    20 040
    Par défaut
    Citation Envoyé par jmfmarques
    Très intéressant.
    Maintenant : une fonction étant destinée à plusieurs utilisations, comment passes-tu la dimension ... ...
    ? ben tu met redim ..? ou est le probléme ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     Dim D() As Integer
      ReDim D(UBound(titi))

  10. #30
    Membre éclairé
    Avatar de Catbull
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    542
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 542
    Points : 854
    Points
    854
    Par défaut
    Citation Envoyé par jmfmarques
    Catbull : ton code n'est pas celui d'une fonction...
    On peut discuter longtemps de la différence entre fonction et procédure. Pour ma part il y en a aucune à part le fait que la procédure ne peut pas renvoyer un résultat. Personnellement j'utilise à 90% du temps des fonctions. Renvoyer un résultat est toujours utile.

    D'un point de vue exécution fonction et procédure c'est la même chose à la différence près que la fonction va empiler une adresse supplémentaire qui est celui du résultat de fonction. Donc la différence comportementale est petite.

    Je réserve les procédures aux modules de classes. Et je préfère alors employer le terme de méthode que de procédure. Une méthode va agir sur une instance de classe. A la différence d'une fonction qui va renvoyer un résultat. Exemple triviale de la simution d'une course de voiture. On va avoir une méthode avancer qui avance une voiture (classe Voiture) et une fonction qui donne la position de la voiture à l'instant t. Dans le premier j'utilise une procédure dans le deuxième une fonction. Mais j'aurais tout aussi bien pu utiliser une fonction dans les deux cas.

    Ceci vient sans doute du fait que j'ai appris la programmation sur les langages oriréntés objects comme l'Eiffel ou Java.

  11. #31
    Inactif  
    Avatar de jmfmarques
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    3 784
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 3 784
    Points : 4 674
    Points
    4 674
    Par défaut
    Si si, on va en discuter, car c'est important...

    Dans l'exemple du demandeur, il n'était en effet pas utile d'utiliser une fonction.
    Une procédure suffisait.
    Il en va différemment d'en d'autres (cas) où il est absolument indispensable d'envoyer (celà se fait toujours facilement... voir mon 1er code) un tableau de valeurs que l'on va modifier pour faire, par exemple, des calculs en recherche, sans pour autant modifier le tableau envoyé à la fonction, dont le rôle sera de retourner une valeur (celle du résultat)
    On l'appelle alors en lui passant le tableau entre parenthèses.
    Si on enlevait ces parenthèses, la fonction se comporterait comme une procédure et le tableau de départ se trouverait indûment modifié.
    J'utilise très fréquemment ce principe et cette énorme différence de comportement.

  12. #32
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    Citation Envoyé par ousk'
    le 4 à 18h22 "Par contre tu peux peut-être concaténer les résultats à retourner avec un séparateur de ton choix et recréer le tableau avec Split"
    Quant aux fonctions qui retournent un tableau, trois fois honte à moi. En déclarant le tableau dans la fonction, celle-ci retourne bien un tableau
    Je n'ai pas utilisé ton code, bbil, afin de passer par la variable CopieDuTableau qui ne laisse aucun doute quant au retour d'un tableau par une fonction.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    Sub AppelFonction()
    Dim CopieDuTableau, LeTableau,i
        LeTableau = LaFonction(5)
        CopieDuTableau = LeTableau
     
        For i = 0 To UBound(CopieDuTableau)
            MsgBox CopieDuTableau(i)
        Next
     
    End Sub
     
    Function LaFonction(nb)
    Dim MonTableau
        MonTableau = Array(5, 4, 3, 2, 1)
        LaFonction = MonTableau
    End Function
    Mon excuse ? J'en ai pas
    La raison : J'avais un Option Explicit que j'ai ignoré dans la rédaction du code et qui bien sûr plantait la fonction.

    Maintenant que je sais ça, je me sens plus riche d'une expérience et je vais tâcher de voir comment répondre à jemefe...

    Mes excuses à bbil

  13. #33
    Inactif  
    Avatar de jmfmarques
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    3 784
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 3 784
    Points : 4 674
    Points
    4 674
    Par défaut
    T'as rien perdu ousk !
    Car analyse bien tout et tu vas découvrir .... que....

    Au bout du compte, le code fort astucieux au demeurant de Bbil pouvait largement etre remplacé par une duplication B du tableau original A et l'utilisation d'une procédure traitant non le A mais le B ...

    Il se retrouve en effet in fine avec 2 tableaux différents: le A et la fonction
    On aurait eu également 2 tableaux différents : le A et le B

    Le tout avec la même occupation de mémoire !

  14. #34
    Membre éclairé
    Avatar de Catbull
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    542
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 542
    Points : 854
    Points
    854
    Par défaut
    Citation Envoyé par jmfmarques
    Si on enlevait ces parenthèses, la fonction se comporterait comme une procédure et le tableau de départ se trouverait indûment modifié.
    Cela n'a rien à voir. Les parenthèse ne sont qu'un artifice servant à l'analyse syntaxique du compilateur.

    La déclaration d'un tableau en VB correspond à un pointeur. Le passage d'un tableau en paramètre de fonction ou de procédure est forcément un passage par référence.

    Donc procédure ou fonction tu modifies obligatoire un tableau passé par en paramètre.

  15. #35
    Inactif  
    Avatar de jmfmarques
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    3 784
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 3 784
    Points : 4 674
    Points
    4 674
    Par défaut
    Non !
    je ne modifie pas le tableau original si je passe le paramètre entre parenthèses à la fonction. Je le modifie si je n'utilise pas les parenthèses (voir codes plus haut)

  16. #36
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    Citation Envoyé par jmf
    Maintenant : une fonction étant destinée à plusieurs utilisations, comment passes-tu la dimension (pas connue au départ par la fonction) à la fonction ?
    Crois tu que dim va accepter autre chose qu'un chiffre ou une constante ?
    Ne pose pas de problème. Tu peux passer un paramètre ou non, si tu en as besoin, tu l'utiises, sinon, la fonction retourne le tableau
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    Sub AppelFonction()
    Dim CopieDuTableau, LeTableau
        LeTableau = LaFonction(256)
        CopieDuTableau = LeTableau
        For i = 0 To UBound(CopieDuTableau)
            MsgBox CopieDuTableau(i)
        Next
    End Sub
     
    Function LaFonction(nb)
    Dim MonTableau,i
    ReDim MonTableau(nb)
        For i = 0 To nb
            MonTableau(i) = i   
        Next
        LaFonction = MonTableau
    End Function
    Etait-ce là ta question, jemefe ?

    A+

  17. #37
    Membre éclairé
    Avatar de Catbull
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    542
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 542
    Points : 854
    Points
    854
    Par défaut
    jmf,

    encore une fois tu confonds variant et tableau. Un variant n'est pas un tableau. Dans le code proposé tu ne passes pas en paramètre un tableau mais un variant!

  18. #38
    Inactif  
    Avatar de jmfmarques
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    3 784
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 3 784
    Points : 4 674
    Points
    4 674
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    Private tableau, t  'pour que l'on voie bien que globale ou non, celà n'a rien à voir dans le résultat
    Private Sub Command1_Click()
      Dim tableau(3)
      For i = 0 To 2
        tableau(i) = i
      Next
    voila (tableau)
    For i = 0 To 2
      MsgBox tableau(i) ' et l'on voit que le modif sans voila n'a rien fait finalement
    Next
    End Sub
     
    Private Function voila(t)
       For i = 0 To 2
         t(i) = t(i) & "a" ' expres pour que l'on voie que tableau est bien considéré ici
         MsgBox t(i)
        Next i
    End Function
    essaye en mettant "voila (tableau)" avec et sans parenthèses ...

  19. #39
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    60
    Détails du profil
    Informations personnelles :
    Âge : 57
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 60
    Points : 33
    Points
    33
    Par défaut
    merci beaucoup ! vraiment bizar j'avais déjà essayé de retourner mon tableau en faisant : CalculStats = TabStats et il m'avait fait une erreur ! et là ça fonctionne...mais j'ai déclaré le tableau en public...ça vient de là vous pensez ?

  20. #40
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    60
    Détails du profil
    Informations personnelles :
    Âge : 57
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 60
    Points : 33
    Points
    33
    Par défaut
    en fait je retourne mon tableau mais le truc que je pige pas c'est qu'on donne pas un type qu'on retourne

    Public function Calculstats ()
    blabla

    calculstats = tableau
    End function

Discussions similaires

  1. [Tableaux] Fonction qui retourne un tableau
    Par benooiit dans le forum Langage
    Réponses: 2
    Dernier message: 05/01/2007, 01h50
  2. Réponses: 8
    Dernier message: 24/10/2006, 16h50
  3. Réponses: 6
    Dernier message: 22/09/2006, 18h17
  4. [VB] Fonction qui retourne un tableau
    Par ptitsoleil87 dans le forum VB 6 et antérieur
    Réponses: 11
    Dernier message: 24/12/2005, 10h52
  5. Fonction qui retourne un tableau
    Par _lara_ dans le forum ASP
    Réponses: 6
    Dernier message: 24/05/2004, 15h06

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo