Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

généricité de tri et surcharge

9 réponses
Avatar
Zeg
salut à tous,
Je souhaiterai avec un algo de tri générique qui prennent en parametre
Element (generique) et la fonction de comparaison propre à l'element sur
lequel mon tri ca fonctionner.
Suis je clair?
C'est à dire que je souhaiterai que ma function de tri dichotomique marche
sur des tableaux contenant n'importe quel type de donnée.

genre:

Public Function RechercheDicho(Inf As Integer, Sup As Integer, tableau() As
Variant, Elément As Generique) As Integer
Rem A chaque appel on divise le tableau restant en 2 pour ne
s'occuper apres comparaison que d'une partie
Rem Déclaration du milieu qui va servir d'élément de comparaison
Dim milieu As Integer
milieu = Int((Inf + Sup) / 2)

If Inf = Sup Then
RechercheDicho = Inf
ElseIf Elément <= tableau(milieu) Then
RechercheDicho = RechercheDicho(Inf, milieu, tableau(),
Elément)
Else
RechercheDicho = RechercheDicho(milieu + 1, Sup, tableau(),
Elément)
End If
End Function

Public Type coordonnees
Rem N° rue
num_rue As String * 4
Rem libellé Voie :
libVoie As String * 32
Rem CP
codePostal As String * 5
Rem Localité
localité As String * 32
End Type


Utilisation

function ">" (c1 as coordonnees, c2 as coordonnees) as Boolean
if c1.codepostal > c2.codepostal
> = True
else
> = False
end if
end function

C'est pas sûr que le code soit tres correct mais ça vous donne idée de ce
que je cherche à faire.
Je crois savoir qu'on ne peut pas faire cela tel quel en VB6 mais on peut
surement le faire d'une façon détourné.
Qu'en est il de l'utilisation de CallByName, cela peut il m'aider?

TIA

9 réponses

Avatar
François Picalausa
Hello,

Je crois savoir qu'on ne peut pas faire cela tel quel en VB6 mais on
peut surement le faire d'une façon détourné.
Qu'en est il de l'utilisation de CallByName, cela peut il m'aider?



Effectivement, CallByName pourrait t'être utile.
Il te faut commencer par nommer entrèrement des fonctions
Function GreatherThan(...) As Boolean
...
End Function
Function LowerThan(...) As Boolean
...
End Function

Ces fonctions doivent être forcément déclarées dans un objet (un module
standard, ça ne va pas)
Ensuite, au lieu de
If élément1 < élément2 Then :
If CallByName(ObjetContenantLesFonctions, "LowerThan", vbMethod, Element1,
Element2)

Il y a une autre méthode peut-être préférable, c'est de demander une classe
qui implémente un interface spécifique.
Exemple:
Dans un module de classe IComparaison:
Public Function LowerThan(...) As Boolean
End Function
Public Function GreatherThan(...) As Boolean
End Function

Dans une autre classe qui servira à un "groupe" d'éléments (dans cette
exemple on la nommera ComparaisonA):
Implements IComparaison

Public Function IComparaison_LowerThan(...) As Boolean
=> implémentation spécifique
End Function

'Idem pour GreatherThan

Enfin, dans ta procdure de tri:
Dim Comparaison As IComparaison
Set Comparaison = MonObjetDeTypeComparaisonA

(réalisé sans test, sujet à erreurs)

J'espères que ça pourra t'aider...
--
François Picalausa (MVP VB)
http://faq.vb.free.fr --- http://msdn.microsoft.com
http://apisvb.europe.webmatrixhosting.net

"Zeg" a écrit dans le message de
news:40828395$0$19506$
salut à tous,
Je souhaiterai avec un algo de tri générique qui prennent en parametre
Element (generique) et la fonction de comparaison propre à l'element
sur lequel mon tri ca fonctionner.
Suis je clair?
C'est à dire que je souhaiterai que ma function de tri dichotomique
marche sur des tableaux contenant n'importe quel type de donnée.

genre:

Public Function RechercheDicho(Inf As Integer, Sup As Integer,
tableau() As Variant, Elément As Generique) As Integer
Rem A chaque appel on divise le tableau restant en 2 pour ne
s'occuper apres comparaison que d'une partie
Rem Déclaration du milieu qui va servir d'élément de
comparaison Dim milieu As Integer
milieu = Int((Inf + Sup) / 2)

If Inf = Sup Then
RechercheDicho = Inf
ElseIf Elément <= tableau(milieu) Then
RechercheDicho = RechercheDicho(Inf, milieu, tableau(),
Elément)
Else
RechercheDicho = RechercheDicho(milieu + 1, Sup,
tableau(), Elément)
End If
End Function

Public Type coordonnees
Rem N° rue
num_rue As String * 4
Rem libellé Voie :
libVoie As String * 32
Rem CP
codePostal As String * 5
Rem Localité
localité As String * 32
End Type


Utilisation

function ">" (c1 as coordonnees, c2 as coordonnees) as Boolean
if c1.codepostal > c2.codepostal
> = True
else
> = False
end if
end function

C'est pas sûr que le code soit tres correct mais ça vous donne idée
de ce que je cherche à faire.
Je crois savoir qu'on ne peut pas faire cela tel quel en VB6 mais on
peut surement le faire d'une façon détourné.
Qu'en est il de l'utilisation de CallByName, cela peut il m'aider?

TIA


Avatar
Patrice Henrio
Il faut bien sûr préciser que le tableau est déjà trié et que l'on cherche
l'index tel que l'élément correspondant est égal ou inférieur à générique
(le plus près par valeur inférieure)
Pour moi la façon détournée la plus correcte est de créer une classe
correspondant au type utilisateur et de créer une function supérieur cette
fonction va tester le type de a et b et utiliser la fonction correspondant.

'---------------------------------------------------------------------
Classe essai
Rem N° rue
Public num_rue As String '* 4

Rem libellé Voie :
Public libVoie As String '* 32

Rem CP
Public codePostal As String '* 5

Rem Localité
Public localité As String '* 32

Public Function Supérieur(B As Essai) As Boolean
Supérieur = (Me.codePostal > B.codePostal)
End Function
L'appel de la fonction supérieur se fait de la façon suivante
A.supérieur(B), où A et B sont des instances de la classe essai.

'---------------------------------------------------------------------------
-----
Classe Nombre
Public X As Integer
Public Y As Integer

Public Function supérieur(B)
supérieur = (Me.X * B.Y - Me.Y * B.X > 0)
End Function

'---------------------------------------------------------------------------
----
Dans une forme
Private Sub Form_Load()
Dim A As New Essai, B As New Essai, C As New Nombre, D As New Nombre
A.codePostal = 72500
C.X = 3
C.Y = 4
D.X = 2
D.Y = 5
B.codePostal = 72000
Debug.Print supérieur(A, B)
Debug.Print supérieur(C, D)
End Sub



Function supérieur(X As Object, Y As Object) As Boolean
If (TypeOf X Is Essai) And (TypeOf Y Is Essai) Then
supérieur = X.supérieur(Y)
Exit Function
End If
If (TypeOf X Is Nombre) And (TypeOf Y Is Nombre) Then
supérieur = X.supérieur(Y)
Exit Function
End If
End Function

On pourrait aussi, si on est sûr de n'appeler supérieur qu'avec des objets
bénéficiant d'une définition personnelle de la fonction supérieur, se passer
du test et écrire simplement

Function Supérieur(X As Object, Y As Object) As Boolean
Supérieur=X.Supérieur(Y)
End Function

Bien sûr tout cela sera mieux avec des propriétés plutôt que des variables
publiques, mais c'était pour faire vite.


"François Picalausa" a écrit dans le message de
news:
Hello,

> Je crois savoir qu'on ne peut pas faire cela tel quel en VB6 mais on
> peut surement le faire d'une façon détourné.
> Qu'en est il de l'utilisation de CallByName, cela peut il m'aider?

Effectivement, CallByName pourrait t'être utile.
Il te faut commencer par nommer entrèrement des fonctions
Function GreatherThan(...) As Boolean
...
End Function
Function LowerThan(...) As Boolean
...
End Function

Ces fonctions doivent être forcément déclarées dans un objet (un module
standard, ça ne va pas)
Ensuite, au lieu de
If élément1 < élément2 Then :
If CallByName(ObjetContenantLesFonctions, "LowerThan", vbMethod, Element1,
Element2)

Il y a une autre méthode peut-être préférable, c'est de demander une


classe
qui implémente un interface spécifique.
Exemple:
Dans un module de classe IComparaison:
Public Function LowerThan(...) As Boolean
End Function
Public Function GreatherThan(...) As Boolean
End Function

Dans une autre classe qui servira à un "groupe" d'éléments (dans cette
exemple on la nommera ComparaisonA):
Implements IComparaison

Public Function IComparaison_LowerThan(...) As Boolean
=> implémentation spécifique
End Function

'Idem pour GreatherThan

Enfin, dans ta procdure de tri:
Dim Comparaison As IComparaison
Set Comparaison = MonObjetDeTypeComparaisonA

(réalisé sans test, sujet à erreurs)

J'espères que ça pourra t'aider...
--
François Picalausa (MVP VB)
http://faq.vb.free.fr --- http://msdn.microsoft.com
http://apisvb.europe.webmatrixhosting.net

"Zeg" a écrit dans le message de
news:40828395$0$19506$
> salut à tous,
> Je souhaiterai avec un algo de tri générique qui prennent en parametre
> Element (generique) et la fonction de comparaison propre à l'element
> sur lequel mon tri ca fonctionner.
> Suis je clair?
> C'est à dire que je souhaiterai que ma function de tri dichotomique
> marche sur des tableaux contenant n'importe quel type de donnée.
>
> genre:
>
> Public Function RechercheDicho(Inf As Integer, Sup As Integer,
> tableau() As Variant, Elément As Generique) As Integer
> Rem A chaque appel on divise le tableau restant en 2 pour ne
> s'occuper apres comparaison que d'une partie
> Rem Déclaration du milieu qui va servir d'élément de
> comparaison Dim milieu As Integer
> milieu = Int((Inf + Sup) / 2)
>
> If Inf = Sup Then
> RechercheDicho = Inf
> ElseIf Elément <= tableau(milieu) Then
> RechercheDicho = RechercheDicho(Inf, milieu, tableau(),
> Elément)
> Else
> RechercheDicho = RechercheDicho(milieu + 1, Sup,
> tableau(), Elément)
> End If
> End Function
>
> Public Type coordonnees
> Rem N° rue
> num_rue As String * 4
> Rem libellé Voie :
> libVoie As String * 32
> Rem CP
> codePostal As String * 5
> Rem Localité
> localité As String * 32
> End Type
>
>
> Utilisation
>
> function ">" (c1 as coordonnees, c2 as coordonnees) as Boolean
> if c1.codepostal > c2.codepostal
> > = True
> else
> > = False
> end if
> end function
>
> C'est pas sûr que le code soit tres correct mais ça vous donne idée
> de ce que je cherche à faire.
> Je crois savoir qu'on ne peut pas faire cela tel quel en VB6 mais on
> peut surement le faire d'une façon détourné.
> Qu'en est il de l'utilisation de CallByName, cela peut il m'aider?
>
> TIA




Avatar
Zeg
C'est exactement ça qui m'interesse.
J'aimerai avoir des éclaircissement sur les 2 méthodes,
La 1ere:
Qu'est que tu entends par objet (j'ai du mal ;) ),
c'est une classe qui aura des propriété et des methodes en utilisant GET et
SET ?
Dans cet objet je met :
Function GreatherThan(...) As Boolean
...implementation spécifique à l'objet
End Function
Function LowerThan(...) As Boolean
......implementation spécifique à l'objet
End Function

Ma fonction de tri generique peut se trouver dans un module de classe?
Elle aura cette tête là (en gros) ?:

Public Function RechercheDicho(Inf As Integer, Sup As Integer, tableau() As
Variant, Elément As Generique, ObjetContenantLesFonctions as object) As
Integer
Dim milieu As Integer
milieu = Int((Inf + Sup) / 2)
If Inf = Sup Then
RechercheDicho = Inf
ElseIf If CallByName(ObjetContenantLesFonctions, "LowerThan",
vbMethod, Element1, tableau(milieu)) Then
RechercheDicho = RechercheDicho(Inf, milieu,
tableau(), Elément, ObjetContenantLesFonctions as object)
Else
RechercheDicho = RechercheDicho(milieu + 1, Sup, tableau(),
Elément, ObjetContenantLesFonctions as object)
End If
End Function

Merci de m'expliquer les references entre les modules car je ne les
comprends pas bien.


2è Methode:

Je fais une classe parent (IComparaison) contenant juste les noms des
functions sans code:

Public Function LowerThan(...) As Boolean
End Function
Public Function GreatherThan(...) As Boolean
End Function

Puis je fais une nouvelle classe (ComparaisonA) qui implementera les
fonctions précédentes mais de façon spécifique et qui heritera de la classe
IComparaison:

Implements IComparaison

Public Function IComparaison_LowerThan(...) As Boolean
=> implémentation spécifique
End Function

'Idem pour GreatherThan

Enfin, dans ta procdure de tri:
Dim Comparaison As IComparaison
Set Comparaison = MonObjetDeTypeComparaisonA



Je vois pas bien à quoi elle ressemble et où elle se trouve cette funtion de
Tri.


Quelles st les criteres de choix entre ces 2 methodes?
Merci d'avance pour tout aide ou lien ;)
Avatar
François Picalausa
Hello,

"Zeg" a écrit dans le message de
news:40829649$0$19488$
C'est exactement ça qui m'interesse.
J'aimerai avoir des éclaircissement sur les 2 méthodes,
La 1ere:
Qu'est que tu entends par objet (j'ai du mal ;) ),
c'est une classe qui aura des propriété et des methodes en utilisant
GET et SET ?



une classe, un contôle utilisateur, une form.. enfin pas un module standard
:-)
C'est parce que pour CallByName, il faut un objet en premier paramètre pour
pouvoir appeler la fonction.

Ma fonction de tri generique peut se trouver dans un module de classe?
Elle aura cette tête là (en gros) ?:



ouep

Merci de m'expliquer les references entre les modules car je ne les
comprends pas bien.



Il faut juste passer à ta fonction RechercheDicho l'objet contiendra les
fonctions LowerThan et GreatherThan.
Mais il se pourrait aussi que les fonctions LowerThan et GreatherThan soient
dans la même classe que la fonction RechercheDicho, auquel cas, le premier
argument de CallByName serait Me.
La seule raison pour laquelle j'ai évoqué qu'il fallait un objet est que
CallByName en requiert un.
Voici un exemple complet utilisant CallByName:

''Dans un module de Classe Specific
Public Sub Toto()
MsgBox "Specific"
End Sub

''Dans un module de Classe Specific2
Public Sub Toto()
MsgBox "Specific2"
End Sub

'Dans une Form avec un CommandButton, Command1:
Private Sub Command1_Click()
Dim ClsSpecific As Specific
Set ClsSpecific = New Specific

Dim ClsSpecific2 As Specific2
Set ClsSpecific2 = New Specific2

Test ClsSpecific
Test ClsSpecific2

Set ClsSpecific = Nothing
Set ClsSpecific2 = Nothing
End Sub

Private Function Test(objInterf As Object)
CallByName objInterf, "Toto", VbMethod
End Function

'----------------------------------------------------------------

2è Methode:

Je fais une classe parent (IComparaison) contenant juste les noms des
functions sans code



en fait, ce n'est pas une classe mais une interface.. que des prototypes,
pas de code :-)

Puis je fais une nouvelle classe (ComparaisonA) qui implementera les
fonctions précédentes mais de façon spécifique et qui heritera de la
classe IComparaison:



ComparaisonA implémentera IComparaison de manière plus spécifique.
On a l'interface "de base" IComparaison qui définit ce qu'il faut respecter
au minimum pour être "compatible" avec IComparaison.

Enfin, dans ta procdure de tri:
Dim Comparaison As IComparaison
Set Comparaison = MonObjetDeTypeComparaisonA



Je vois pas bien à quoi elle ressemble et où elle se trouve cette
funtion de Tri.



je voulais parler de la fonction RechercheDicho :-)
Mais dans ce cas, il s'agit d'un paramètre, comme dans le cas de CallByName.

Voici un exemple complètement construit pour illustrer cette méthode:
'Dans un module de Classe IMyInterface:
Option Explicit

Public Sub Toto()
End Sub

Option Explicit

''Dans un module de Classe MaClasseSpécifique
Implements IMyInterface

Private Sub IMyInterface_Toto()
MsgBox "MaClasseSpécifique!"
End Sub

Public Sub Tata()
MsgBox "Tata"
End Sub

''Dans un module de Classe MaClasseSpécifique2
Implements IMyInterface

Private Sub IMyInterface_Toto()
MsgBox "MaClasseSpécifique2 !"
End Sub

Public Sub Titi()
MsgBox "Titi"
End Sub

'Dans une Form avec un CommandButton, Command1:

Private Sub Command1_Click()
Dim ClsSpecific As MaClasseSpécifique
Set ClsSpecific = New MaClasseSpécifique

Dim ClsSpecific2 As MaClasseSpécifique2
Set ClsSpecific2 = New MaClasseSpécifique2

Test ClsSpecific
Test ClsSpecific2

Set ClsSpecific = Nothing
Set ClsSpecific2 = Nothing
End Sub

Private Function Test(objInterf As IMyInterface)
objInterf.Toto
End Function

'----------------------------------------------------------------


Quelles st les criteres de choix entre ces 2 methodes?


CallByName est plus lente mais moins spécifique qu'une interface, il me
semble.

--
François Picalausa (MVP VB)
http://faq.vb.free.fr --- http://msdn.microsoft.com
http://apisvb.europe.webmatrixhosting.net
Avatar
Zeg
Merci beaucoup pour les précisions.
Je suis en train d'essayer la premiere methode (CallByName) en faisant un
appel de ma feuille sur un tableau d'entier Tab1 et 65:
Form:
Function LowerOrEqualThan(c1 As Integer, c2 As Integer) As Boolean
If c1 <= c2 Then
LowerOrEqualThan = True
Else
LowerOrEqualThan = False
End If
End Function

Place = RechercheDicho(LBound(Tab1), 12, Tab1, 65, Me)

J'ai une dll/activeX qui contient ma function de RechercheDichotomique dans
un module de classe et qui est defini comme suit:

Public Function RechercheDicho(Inf As Integer, Sup As Integer, tableau() As
Variant, Elément As Variant, Objet As Object) As Integer
Dim milieu As Integer
milieu = Int((Inf + Sup) / 2)

If Inf = Sup Then
RechercheDicho = Inf
ElseIf CallByName(Objet, "LowerOrEqualThan", VbMethod, Elément,
tableau(milieu)) Then
RechercheDicho = RechercheDicho(Inf, milieu, tableau(),
Elément, Objet)
Else
RechercheDicho = RechercheDicho(milieu + 1, Sup, tableau(),
Elément, Objet)
End If
End Function

Et je me retrouve avec une erreur :"Type Incompatible" sur la ligne ElseIf
CallByName..... dans la function RechercheDichotomique.
Ma question est la suivante:
Comment passer le type de Elément (c Elément qui est recherché ds la
function RechDicho et qui est comparé avec une Clé du tableau) pour qu'il
soit du type correspondant à ce que contient le Tableau.

Je sais pas si je suis clair mais en gros je suis dans le floue sur les 2
derniers parametres de l'appel CallByName(Objet, "LowerOrEqualThan",
VbMethod, Elément, tableau(milieu))

Pouvez vous m'eclairer de votre lumiere...

Rmq:
J'ai fait l'appel de la feuille pour faire un test avec un tableau d'entier
(de maniere la + simple) mais bon but est de faire l'appel d'un module de
classe d'une dll/ActiveX.

"François Picalausa" a écrit dans le message de news:

Hello,

"Zeg" a écrit dans le message de
news:40829649$0$19488$
> C'est exactement ça qui m'interesse.
> J'aimerai avoir des éclaircissement sur les 2 méthodes,
> La 1ere:
> Qu'est que tu entends par objet (j'ai du mal ;) ),
> c'est une classe qui aura des propriété et des methodes en utilisant
> GET et SET ?

une classe, un contôle utilisateur, une form.. enfin pas un module


standard
:-)
C'est parce que pour CallByName, il faut un objet en premier paramètre


pour
pouvoir appeler la fonction.

> Ma fonction de tri generique peut se trouver dans un module de classe?
> Elle aura cette tête là (en gros) ?:

ouep

> Merci de m'expliquer les references entre les modules car je ne les
> comprends pas bien.

Il faut juste passer à ta fonction RechercheDicho l'objet contiendra les
fonctions LowerThan et GreatherThan.
Mais il se pourrait aussi que les fonctions LowerThan et GreatherThan


soient
dans la même classe que la fonction RechercheDicho, auquel cas, le premier
argument de CallByName serait Me.
La seule raison pour laquelle j'ai évoqué qu'il fallait un objet est que
CallByName en requiert un.
Voici un exemple complet utilisant CallByName:

''Dans un module de Classe Specific
Public Sub Toto()
MsgBox "Specific"
End Sub

''Dans un module de Classe Specific2
Public Sub Toto()
MsgBox "Specific2"
End Sub

'Dans une Form avec un CommandButton, Command1:
Private Sub Command1_Click()
Dim ClsSpecific As Specific
Set ClsSpecific = New Specific

Dim ClsSpecific2 As Specific2
Set ClsSpecific2 = New Specific2

Test ClsSpecific
Test ClsSpecific2

Set ClsSpecific = Nothing
Set ClsSpecific2 = Nothing
End Sub

Private Function Test(objInterf As Object)
CallByName objInterf, "Toto", VbMethod
End Function

'----------------------------------------------------------------

> 2è Methode:
>
> Je fais une classe parent (IComparaison) contenant juste les noms des
> functions sans code

en fait, ce n'est pas une classe mais une interface.. que des prototypes,
pas de code :-)

> Puis je fais une nouvelle classe (ComparaisonA) qui implementera les
> fonctions précédentes mais de façon spécifique et qui heritera de la
> classe IComparaison:

ComparaisonA implémentera IComparaison de manière plus spécifique.
On a l'interface "de base" IComparaison qui définit ce qu'il faut


respecter
au minimum pour être "compatible" avec IComparaison.

>> Enfin, dans ta procdure de tri:
>> Dim Comparaison As IComparaison
>> Set Comparaison = MonObjetDeTypeComparaisonA
>
> Je vois pas bien à quoi elle ressemble et où elle se trouve cette
> funtion de Tri.

je voulais parler de la fonction RechercheDicho :-)
Mais dans ce cas, il s'agit d'un paramètre, comme dans le cas de


CallByName.

Voici un exemple complètement construit pour illustrer cette méthode:
'Dans un module de Classe IMyInterface:
Option Explicit

Public Sub Toto()
End Sub

Option Explicit

''Dans un module de Classe MaClasseSpécifique
Implements IMyInterface

Private Sub IMyInterface_Toto()
MsgBox "MaClasseSpécifique!"
End Sub

Public Sub Tata()
MsgBox "Tata"
End Sub

''Dans un module de Classe MaClasseSpécifique2
Implements IMyInterface

Private Sub IMyInterface_Toto()
MsgBox "MaClasseSpécifique2 !"
End Sub

Public Sub Titi()
MsgBox "Titi"
End Sub

'Dans une Form avec un CommandButton, Command1:

Private Sub Command1_Click()
Dim ClsSpecific As MaClasseSpécifique
Set ClsSpecific = New MaClasseSpécifique

Dim ClsSpecific2 As MaClasseSpécifique2
Set ClsSpecific2 = New MaClasseSpécifique2

Test ClsSpecific
Test ClsSpecific2

Set ClsSpecific = Nothing
Set ClsSpecific2 = Nothing
End Sub

Private Function Test(objInterf As IMyInterface)
objInterf.Toto
End Function

'----------------------------------------------------------------


> Quelles st les criteres de choix entre ces 2 methodes?
CallByName est plus lente mais moins spécifique qu'une interface, il me
semble.

--
François Picalausa (MVP VB)
http://faq.vb.free.fr --- http://msdn.microsoft.com
http://apisvb.europe.webmatrixhosting.net




Avatar
François Picalausa
Hello,

tu as un type incompatible parce que tu passe du variant (Elément,
tableau(milieu)) à de l'integer (c1, c2).
Il suffit donc de modifier ta fonction de comparaison comme ceci:

Function LowerOrEqualThan(c1 As Variant, c2 As Variant) As Boolean
If VarType(c1) = vbInteger And VarType(c2) = vbInteger Then
If c1 <= c2 Then
LowerOrEqualThan = True
Else
LowerOrEqualThan = False
End If
Else
Err.Raise 13 'type incompatible
End If
End Function

--
François Picalausa (MVP VB)
http://faq.vb.free.fr --- http://msdn.microsoft.com
http://apisvb.europe.webmatrixhosting.net

"Zeg" a écrit dans le message de
news:4082cdf6$0$19480$
Merci beaucoup pour les précisions.
Je suis en train d'essayer la premiere methode (CallByName) en
faisant un appel de ma feuille sur un tableau d'entier Tab1 et 65:
Form:
Function LowerOrEqualThan(c1 As Integer, c2 As Integer) As Boolean
If c1 <= c2 Then
LowerOrEqualThan = True
Else
LowerOrEqualThan = False
End If
End Function

Place = RechercheDicho(LBound(Tab1), 12, Tab1, 65, Me)

J'ai une dll/activeX qui contient ma function de
RechercheDichotomique dans un module de classe et qui est defini
comme suit:

Public Function RechercheDicho(Inf As Integer, Sup As Integer,
tableau() As Variant, Elément As Variant, Objet As Object) As Integer
Dim milieu As Integer
milieu = Int((Inf + Sup) / 2)

If Inf = Sup Then
RechercheDicho = Inf
ElseIf CallByName(Objet, "LowerOrEqualThan", VbMethod, Elément,
tableau(milieu)) Then
RechercheDicho = RechercheDicho(Inf, milieu, tableau(),
Elément, Objet)
Else
RechercheDicho = RechercheDicho(milieu + 1, Sup,
tableau(), Elément, Objet)
End If
End Function

Et je me retrouve avec une erreur :"Type Incompatible" sur la ligne
ElseIf CallByName..... dans la function RechercheDichotomique.


Avatar
Zeg
Oui en effet cela marche mieux;)
Seulement, le fait de définir la fontion LowerOrEqualThan permet de définir
une comparaison sur n'importe quel type,
mais lors de l'appel de RechercheDicho(Inf As Integer, Sup As Integer,
tableau() As Variant, Elément As Variant, Objet As Object) As Integer
comment passer un argument un Elément de n'importe quel type à rechercher
dans un tableau contenant des elements de ce même type : des integer, des
type predefinis etc.
Finalement je suis bloqué avec tableau() As Variant, Elément As Variant ma
fonction n'est plus generique.
Je suis obligé de lui passer un type Variant :(


"François Picalausa" a écrit dans le message de news:

Hello,

tu as un type incompatible parce que tu passe du variant (Elément,
tableau(milieu)) à de l'integer (c1, c2).
Il suffit donc de modifier ta fonction de comparaison comme ceci:

Function LowerOrEqualThan(c1 As Variant, c2 As Variant) As Boolean
If VarType(c1) = vbInteger And VarType(c2) = vbInteger Then
If c1 <= c2 Then
LowerOrEqualThan = True
Else
LowerOrEqualThan = False
End If
Else
Err.Raise 13 'type incompatible
End If
End Function

--
François Picalausa (MVP VB)
http://faq.vb.free.fr --- http://msdn.microsoft.com
http://apisvb.europe.webmatrixhosting.net

"Zeg" a écrit dans le message de
news:4082cdf6$0$19480$
> Merci beaucoup pour les précisions.
> Je suis en train d'essayer la premiere methode (CallByName) en
> faisant un appel de ma feuille sur un tableau d'entier Tab1 et 65:
> Form:
> Function LowerOrEqualThan(c1 As Integer, c2 As Integer) As Boolean
> If c1 <= c2 Then
> LowerOrEqualThan = True
> Else
> LowerOrEqualThan = False
> End If
> End Function
>
> Place = RechercheDicho(LBound(Tab1), 12, Tab1, 65, Me)
>
> J'ai une dll/activeX qui contient ma function de
> RechercheDichotomique dans un module de classe et qui est defini
> comme suit:
>
> Public Function RechercheDicho(Inf As Integer, Sup As Integer,
> tableau() As Variant, Elément As Variant, Objet As Object) As Integer
> Dim milieu As Integer
> milieu = Int((Inf + Sup) / 2)
>
> If Inf = Sup Then
> RechercheDicho = Inf
> ElseIf CallByName(Objet, "LowerOrEqualThan", VbMethod, Elément,
> tableau(milieu)) Then
> RechercheDicho = RechercheDicho(Inf, milieu, tableau(),
> Elément, Objet)
> Else
> RechercheDicho = RechercheDicho(milieu + 1, Sup,
> tableau(), Elément, Objet)
> End If
> End Function
>
> Et je me retrouve avec une erreur :"Type Incompatible" sur la ligne
> ElseIf CallByName..... dans la function RechercheDichotomique.




Avatar
François Picalausa
Hello,

Le variant est malheureusement ce qu'il y a de plus générique...
Un variant peut contenir un objet, une chaine de caractères, un nombre ...
Mais effectivement, il faut que ton tableau passé as Variant.
Si tu es sûr de ne travailler que sur des objets, tu pourrais redéfinir ton
tableau As Object et ton Element As Object, je pense que ça se rapprocherait
plus de ce que tu veux.

--
François Picalausa (MVP VB)
http://faq.vb.free.fr --- http://msdn.microsoft.com
http://apisvb.europe.webmatrixhosting.net

"Zeg" a écrit dans le message de
news:4082da09$0$19480$
Oui en effet cela marche mieux;)
Seulement, le fait de définir la fontion LowerOrEqualThan permet de
définir une comparaison sur n'importe quel type,
mais lors de l'appel de RechercheDicho(Inf As Integer, Sup As Integer,
tableau() As Variant, Elément As Variant, Objet As Object) As Integer
comment passer un argument un Elément de n'importe quel type à
rechercher dans un tableau contenant des elements de ce même type :
des integer, des type predefinis etc.
Finalement je suis bloqué avec tableau() As Variant, Elément As
Variant ma fonction n'est plus generique.
Je suis obligé de lui passer un type Variant :(


"François Picalausa" a écrit dans le message de
news:
Hello,

tu as un type incompatible parce que tu passe du variant (Elément,
tableau(milieu)) à de l'integer (c1, c2).
Il suffit donc de modifier ta fonction de comparaison comme ceci:

Function LowerOrEqualThan(c1 As Variant, c2 As Variant) As Boolean
If VarType(c1) = vbInteger And VarType(c2) = vbInteger Then
If c1 <= c2 Then
LowerOrEqualThan = True
Else
LowerOrEqualThan = False
End If
Else
Err.Raise 13 'type incompatible
End If
End Function

--
François Picalausa (MVP VB)
http://faq.vb.free.fr --- http://msdn.microsoft.com
http://apisvb.europe.webmatrixhosting.net

"Zeg" a écrit dans le message de
news:4082cdf6$0$19480$
Merci beaucoup pour les précisions.
Je suis en train d'essayer la premiere methode (CallByName) en
faisant un appel de ma feuille sur un tableau d'entier Tab1 et 65:
Form:
Function LowerOrEqualThan(c1 As Integer, c2 As Integer) As Boolean
If c1 <= c2 Then
LowerOrEqualThan = True
Else
LowerOrEqualThan = False
End If
End Function

Place = RechercheDicho(LBound(Tab1), 12, Tab1, 65, Me)

J'ai une dll/activeX qui contient ma function de
RechercheDichotomique dans un module de classe et qui est defini
comme suit:

Public Function RechercheDicho(Inf As Integer, Sup As Integer,
tableau() As Variant, Elément As Variant, Objet As Object) As
Integer Dim milieu As Integer
milieu = Int((Inf + Sup) / 2)

If Inf = Sup Then
RechercheDicho = Inf
ElseIf CallByName(Objet, "LowerOrEqualThan", VbMethod,
Elément, tableau(milieu)) Then
RechercheDicho = RechercheDicho(Inf, milieu,
tableau(), Elément, Objet)
Else
RechercheDicho = RechercheDicho(milieu + 1, Sup,
tableau(), Elément, Objet)
End If
End Function

Et je me retrouve avec une erreur :"Type Incompatible" sur la ligne
ElseIf CallByName..... dans la function RechercheDichotomique.






Avatar
Zeg
En fait je comptais surtout passer en argument des enregistrements, des
chaines et des entiers.
Et pour pouvoir convertir un type défini par l'utilisateur en Variant, il
faut qu'il soit defini dans un module d'objet Public (cf message d'erreur).
Peut être que la deuxième methode est plus approprié.

"François Picalausa" a écrit dans le message de news:

Hello,

Le variant est malheureusement ce qu'il y a de plus générique...
Un variant peut contenir un objet, une chaine de caractères, un nombre ...
Mais effectivement, il faut que ton tableau passé as Variant.
Si tu es sûr de ne travailler que sur des objets, tu pourrais redéfinir


ton
tableau As Object et ton Element As Object, je pense que ça se


rapprocherait
plus de ce que tu veux.

--
François Picalausa (MVP VB)
http://faq.vb.free.fr --- http://msdn.microsoft.com
http://apisvb.europe.webmatrixhosting.net

"Zeg" a écrit dans le message de
news:4082da09$0$19480$
> Oui en effet cela marche mieux;)
> Seulement, le fait de définir la fontion LowerOrEqualThan permet de
> définir une comparaison sur n'importe quel type,
> mais lors de l'appel de RechercheDicho(Inf As Integer, Sup As Integer,
> tableau() As Variant, Elément As Variant, Objet As Object) As Integer
> comment passer un argument un Elément de n'importe quel type à
> rechercher dans un tableau contenant des elements de ce même type :
> des integer, des type predefinis etc.
> Finalement je suis bloqué avec tableau() As Variant, Elément As
> Variant ma fonction n'est plus generique.
> Je suis obligé de lui passer un type Variant :(
>
>
> "François Picalausa" a écrit dans le message de
> news:
>> Hello,
>>
>> tu as un type incompatible parce que tu passe du variant (Elément,
>> tableau(milieu)) à de l'integer (c1, c2).
>> Il suffit donc de modifier ta fonction de comparaison comme ceci:
>>
>> Function LowerOrEqualThan(c1 As Variant, c2 As Variant) As Boolean
>> If VarType(c1) = vbInteger And VarType(c2) = vbInteger Then
>> If c1 <= c2 Then
>> LowerOrEqualThan = True
>> Else
>> LowerOrEqualThan = False
>> End If
>> Else
>> Err.Raise 13 'type incompatible
>> End If
>> End Function
>>
>> --
>> François Picalausa (MVP VB)
>> http://faq.vb.free.fr --- http://msdn.microsoft.com
>> http://apisvb.europe.webmatrixhosting.net
>>
>> "Zeg" a écrit dans le message de
>> news:4082cdf6$0$19480$
>>> Merci beaucoup pour les précisions.
>>> Je suis en train d'essayer la premiere methode (CallByName) en
>>> faisant un appel de ma feuille sur un tableau d'entier Tab1 et 65:
>>> Form:
>>> Function LowerOrEqualThan(c1 As Integer, c2 As Integer) As Boolean
>>> If c1 <= c2 Then
>>> LowerOrEqualThan = True
>>> Else
>>> LowerOrEqualThan = False
>>> End If
>>> End Function
>>>
>>> Place = RechercheDicho(LBound(Tab1), 12, Tab1, 65, Me)
>>>
>>> J'ai une dll/activeX qui contient ma function de
>>> RechercheDichotomique dans un module de classe et qui est defini
>>> comme suit:
>>>
>>> Public Function RechercheDicho(Inf As Integer, Sup As Integer,
>>> tableau() As Variant, Elément As Variant, Objet As Object) As
>>> Integer Dim milieu As Integer
>>> milieu = Int((Inf + Sup) / 2)
>>>
>>> If Inf = Sup Then
>>> RechercheDicho = Inf
>>> ElseIf CallByName(Objet, "LowerOrEqualThan", VbMethod,
>>> Elément, tableau(milieu)) Then
>>> RechercheDicho = RechercheDicho(Inf, milieu,
>>> tableau(), Elément, Objet)
>>> Else
>>> RechercheDicho = RechercheDicho(milieu + 1, Sup,
>>> tableau(), Elément, Objet)
>>> End If
>>> End Function
>>>
>>> Et je me retrouve avec une erreur :"Type Incompatible" sur la ligne
>>> ElseIf CallByName..... dans la function RechercheDichotomique.