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.NET Discussion :

[VB.NET] Fonctions en argument ?


Sujet :

VB.NET

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 5
    Points : 5
    Points
    5
    Par défaut [VB.NET] Fonctions en argument ?
    Bonjour,
    Je débute en VB .NET et la question que je me pose est la suivante :
    Est-il possible de passer des fonctions en argument (comme en C/C++) ?
    Merci

  2. #2
    Membre averti Avatar de guignol
    Inscrit en
    Mai 2002
    Messages
    309
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 309
    Points : 339
    Points
    339
    Par défaut
    Uniquement si elles ont une valeur de retour (int, collection...)
    - Fais une recherche, c'est un conseil. Si je me mets à t'aider, tu vas pas t'en sortir

    - "Même avec les yeux grands ouverts, je n'y vois rien".

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 5
    Points : 5
    Points
    5
    Par défaut
    Ok mais on fait comment ?
    Disons que j'ai une fonction prenant en argument une fonction renvoyant un integer :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Private Sub metaFonction(ByRef fonctionApplicable As ? )
            Dim iRes As Integer
     
            'Traitements quelconques
     
            iRes = fonctionApplicable()
    End Sub
    Qu'est-ce que je dois mettre après "As" pour dire que c'est une fonction qui est passée en argument ?


    [Balise [Code] ajoutée par freegreg]
    [Pensez-y, vous-même, la prochaine fois. Merci ]
    [Bienvenue ]

  4. #4
    Membre régulier
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2003
    Messages
    197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Juillet 2003
    Messages : 197
    Points : 115
    Points
    115
    Par défaut
    ety bien tu mets le type de donnée de la fonction envoyer

    exemple

    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
     
    function calcadd(val1 as int, val2 as int) as int
    dim result as int
    result = val1+val2
    return result
    end function
     
    function calcmoins(val1 as int, val2 as int) as int
    dim result as int
    result = val1 - val2
    return result
    end function
     
    sub calctot(val1 as int ,val2 as int,val3 as int)
    dim calcul as int = calcmoins(calcadd(val1, val2), val3)
    end sub
    ainsi calcul sera égale a (val1 + val2) - val3

    @+

    Hirochirak
    -- Se lance dans l'asp.net 2.0 --

    Made In Taïwan

  5. #5
    Membre régulier Avatar de chman
    Inscrit en
    Novembre 2002
    Messages
    94
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 94
    Points : 97
    Points
    97
    Par défaut
    salut,

    je ne crois que cela soit de cela qu'il parle,
    dans l'exemple tu passes la valeur de retour et pas la fonction elle-même

    en C/C++, on passe pas un pointeur de fonction ? (je suis pas expert en C/C++ désolé)

    à ma connaissance, il faut utiliser AddressOf et passer un delegate à ta fonction

    ex des msdn

    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
    23
    24
     
    Delegate Sub MySubDelegate(ByVal x As Integer)
    Protected Sub Test()
       Dim c2 As New class2()
       ' Test the delegate.
       c2.DelegateTest()
    End Sub
     
    Class class1
       Sub Sub1(ByVal x As Integer)
          MessageBox.Show("The value of x is: " & CStr(x))
       End Sub
    End Class
     
    Class class2
       Sub DelegateTest()
          Dim c1 As Class1
          Dim msd As MySubDelegate
          c1 = New Class1()
          ' Create an instance of the delegate.
          msd = AddressOf c1.Sub1
          msd.Invoke(10) ' Call the method.
       End Sub
    End Class
    fais des recherches dans ce sens peut-être

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 5
    Points : 5
    Points
    5
    Par défaut
    Mais là tu utilises des fonctions à partir d'une autre, il n'y a rien de spécial.
    Moi ce que je veux, c'est passer directement une fonction (ou procédure) en paramètre à une autre fonction.

    Exemple classique :

    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 Function ajout(ByVal a As Integer, ByVal b As Integer) As Integer
            Return a + b
    End Function
     
    Private Function soustraction(ByVal a As Integer, ByVal b As Integer) As Integer
            Return a - b
    End Function
     
    Private Function produit(ByVal a As Integer, ByVal b As Integer) As Integer
            Return a * b
    End Function
     
    private function traitementsListe(byref iTabListe as Integer(), byref fctOperation as ?, byval iElementNeutre as Integer)
            Dim iRes As Integer = iElementNeutre
     
            For i As Integer = 0 To iTabListe.Length - 1
                iRes = fctOperation(iRes, iTabListe(i))
            Next i
     
            Return iRes
    End Function
    Après je peux faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Dim iSommeListe As Integer = traitementsListe(tableau, ajout, 0)
    Dim iProduitListe As Integer = traitementsListe(tableau, produit, 1)
    Seulement, je ne sais pas quel doit être le prototype de traitementsListe, concernant la partie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    byref fctOperation as ?

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 5
    Points : 5
    Points
    5
    Par défaut
    Désolé chman, les posts se sont croisés.
    Ouais, c'est de ça que je parle et en C/C++ on utilise des pointeurs de fonction. Sauf qu'en VB.NET il n'y a pas de pointeurs, donc je me posais la question.
    Je vais regarder du côté de Adress Of.
    Merci

  8. #8
    Membre régulier Avatar de chman
    Inscrit en
    Novembre 2002
    Messages
    94
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 94
    Points : 97
    Points
    97
    Par défaut
    ouais il faut utiliser les delegates,

    ex :

    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
    23
     
    Delegate Sub MySubDelegate(ByVal x As Integer)
     
        Class class1
            Sub Sub1(ByVal x As Integer)
                MessageBox.Show("The value of x is: " & CStr(x))
            End Sub
        End Class
     
        Class class2
            Sub DelegateTest()
                Dim c1 As class1
                'Dim msd As MySubDelegate
                c1 = New class1
                ' Create an instance of the delegate.
                Me.Test(AddressOf c1.Sub1)
            End Sub
     
            Private Sub Test(ByVal del As MySubDelegate)
                del.Invoke(10)
            End Sub
     
        End Class

  9. #9
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 5
    Points : 5
    Points
    5
    Par défaut
    C'est bon, j'ai trouvé et ça marche impec, quelle classe !
    Il faut créer un délégué qui correspond au type des fonctions qu'on passe en argument. Dans mon exemple précédent, les fonctions passées sont de type int->int->int (2 paramètres int et un int retourné).
    Donc pour créer le délégué, il faut faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Delegate Function delegueIntIntVersInt(ByVal x As Integer, ByVal y As Integer) As Integer
    Le prototype de la fonction traitementsListe devient :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Private Function traitementsListe(ByRef iTabListe As Integer(), ByVal fctOperation As delegueIntIntVersInt, ByVal iElementNeutre As Integer)
    Après, pour utiliser la fonction traitementsListe, on fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Dim adresseAjout As New delegueIntIntVersInt(AddressOf ajout)
    Dim adresseProduit As New delegueIntIntVersInt(AddressOf produit)
     
    Dim iSommeListe As Integer = traitementsListe(iTabListe, adresseAjout, 0)
    Dim iProduitListe As Integer = traitementsListe(iTabListe, adresseProduit, 1)
    J'ai essayé avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Dim iTabListe As Integer() = New Integer() {1, 2, 3, 4}
    et j'ai bien iSommeListe qui vaut 10 et iProduitListe qui vaut 24.

    Le code complet pour ceux qui veulent tester rapidos :
    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
     
    Delegate Function delegueIntIntVersInt(ByVal x As Integer, ByVal y As Integer) As Integer
     
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            Dim iTabListe As Integer() = New Integer() {1, 2, 3, 4}
            Dim adresseAjout As New delegueIntIntVersInt(AddressOf ajout)
            Dim adresseProduit As New delegueIntIntVersInt(AddressOf produit)
     
            Dim iSommeListe As Integer = traitementsListe(iTabListe, adresseAjout, 0)
            Dim iProduitListe As Integer = traitementsListe(iTabListe, adresseProduit, 1)
    End Sub
     
    Private Function ajout(ByVal a As Integer, ByVal b As Integer) As Integer
            Return a + b
    End Function
     
    Private Function soustraction(ByVal a As Integer, ByVal b As Integer) As Integer
            Return a - b
    End Function
     
    Private Function produit(ByVal a As Integer, ByVal b As Integer) As Integer
            Return a * b
    End Function
     
    Private Function traitementsListe(ByRef iTabListe As Integer(), ByVef fctOperation As delegueIntIntVersInt, ByVal iElementNeutre As Integer)
            Dim iRes As Integer = iElementNeutre
     
            For i As Integer = 0 To iTabListe.Length - 1
                iRes = fctOperation(iRes, iTabListe(i))
            Next i
     
            Return iRes
    End Function
    Voilà !

    [Tag [Résolu] ajouté par freegreg]
    [Pensez-y, vous-même, la prochaine fois. Merci ]

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [VB.NET][Application console] Arguments
    Par DotNET74 dans le forum Windows Forms
    Réponses: 4
    Dernier message: 26/05/2005, 19h05
  2. [VB.NET] Fonction sleep
    Par Dnx dans le forum ASP.NET
    Réponses: 4
    Dernier message: 08/02/2005, 15h31
  3. [VB.NET]Fonction IsNumeric -bug- Windows Server 2003
    Par Seb.M dans le forum Windows Forms
    Réponses: 2
    Dernier message: 01/12/2004, 17h30
  4. Passer une fonction comme argument à une fonction
    Par Cocotier974 dans le forum Général Python
    Réponses: 4
    Dernier message: 29/06/2004, 13h41
  5. Fonction divisant argument de type inconnu
    Par Nasky dans le forum C
    Réponses: 9
    Dernier message: 29/07/2003, 00h32

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