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...)
- 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".
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
-- Se lance dans l'asp.net 2.0 --
Made In Taïwan
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
Méfie-te, Méfie-te des 62:::a perfect circle::: , AqME , ....:::iDieR SuPeR::::....The Mad Capsule Markets (site en jap)
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
Méfie-te, Méfie-te des 62:::a perfect circle::: , AqME , ....:::iDieR SuPeR::::....The Mad Capsule Markets (site en jap)
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 ]
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager