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
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
Uniquement si elles ont une valeur de retour (int, collection...)
Ok mais on fait comment ?
Disons que j'ai une fonction prenant en argument une fonction renvoyant un integer :
Qu'est-ce que je dois mettre après "As" pour dire que c'est une fonction qui est passée en argument ?
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
[Balise [Code] ajoutée par freegreg]
[Pensez-y, vous-même, la prochaine fois. Merci]
[Bienvenue]
ety bien tu mets le type de donnée de la fonction envoyer
exemple
ainsi calcul sera égale a (val1 + val2) - val3
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
@+
Hirochirak
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
fais des recherches dans ce sens peut-être
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
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 :
Après je peux faire :
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
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
3 Dim iSommeListe As Integer = traitementsListe(tableau, ajout, 0) Dim iProduitListe As Integer = traitementsListe(tableau, produit, 1)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 byref fctOperation as ?
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![]()
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
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 :
Le prototype de la fonction traitementsListe devient :
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
Après, pour utiliser la fonction traitementsListe, on fait :
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)
J'ai essayé avec
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)
et j'ai bien iSommeListe qui vaut 10 et iProduitListe qui vaut 24.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 Dim iTabListe As Integer() = New Integer() {1, 2, 3, 4}
Le code complet pour ceux qui veulent tester rapidos :
Voilà !
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
[Tag [Résolu] ajouté par freegreg]
[Pensez-y, vous-même, la prochaine fois. Merci]
Partager