Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
886 connectés 

  FORUM HardWare.fr
  Programmation
  VB/VBA/VBS

  [VBA] [Résolu] Appel foireux d'une classe d'arbre binaire

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[VBA] [Résolu] Appel foireux d'une classe d'arbre binaire

n°1429718
Gentil_pou​ssin
Posté le 23-08-2006 à 00:36:01  profilanswer
 

Bonjour à tous (ou bonsoir c'est selon)
 
J'ai créé une classe Tree qui correspond à un objet de type arbre binaire (un élément data et deux pointeurs Up et down vers des arbres)
 
JE poste le code de la classe

Code :
  1. Private varData As Double
  2. Private varUp As tree
  3. Private varDown As tree
  4. Public Property Let data(ByVal vdata As Double)
  5. varData = vdata
  6. End Property
  7. Public Property Get data() As Double
  8. data = varData
  9. End Property
  10. Public Property Set up(ByVal vUp As tree)
  11. Set varUp = vUp
  12. End Property
  13. Public Property Get up() As tree
  14. Set up = varUp
  15. End Property
  16. Public Property Set down(ByVal vdown As tree)
  17. Set varDown = vdown
  18. End Property
  19. Public Property Get down() As tree
  20. Set down = varDown
  21. End Property
  22. Public Function isempty(tree As tree) As Boolean
  23. If tree Is Nothing Then
  24.     isempty = True
  25. Else
  26.     isempty = False
  27. End If
  28. End Function
  29. Public Function upchild(tree As tree) As tree
  30. If isempty(tree) Then
  31.     Set upchild = Nothing
  32. Else
  33.     Set upchild = tree.up
  34. End If
  35. End Function
  36. Public Function downchild(tree As tree) As tree
  37. If isempty(tree) Then
  38.     Set downchild = Nothing
  39. Else
  40.     Set downchild = tree.down
  41. End If
  42. End Function
  43. Public Function isLeave(tree As tree) As Boolean
  44. If isempty(tree) Then
  45.     isLeave = False
  46. ElseIf isempty(upchild(tree)) And isempty(downchild(tree)) Then
  47.     isLeave = True
  48. Else
  49.     isLeave = False
  50. End If
  51. End Function
  52. Public Function isInternalNode(tree As tree) As Boolean
  53. isInternalNode = Not (isLeave(tree))
  54. End Function
  55. Public Function height(tree As tree) As Integer
  56. If isempty(tree) Then
  57.     height = 0
  58. Else
  59.     height = 1 + Max(height(upchild(tree)), height(downchild(tree)))
  60. End
  61. End Function
  62. Public Function NumberNode(tree As tree) As Integer
  63. If isempty(tree) Then
  64.     NumberNode = 0
  65. Else
  66.     NumberNode = 1 + NumberNode(upchild(tree)) + NumberNode(downchild(tree))
  67. End If
  68. End Function
  69. Public Function NumberLeave(tree As tree) As Integer
  70. If isempty(tree) Then
  71.     NumberLeave = 0
  72. ElseIf (isLeave(tree)) Then
  73.     NumberLeave = 1
  74. Else
  75.     NumberLeave = NumberLeave(upchild(tree)) + NumberLeave(downchild(tree))
  76. End If
  77. End Function
  78. Public Function NumberInternalNode(tree As tree) As Integer
  79. If isempty(tree) Then
  80.     NumberInternalNode = 0
  81. ElseIf (isLeave(tree)) Then
  82.     NumberInternalNode = 0
  83. Else
  84.     NumberInternalNode = 1 + NumberInternalNode(upchild(tree)) + NumberInternalNode(downchild(tree))
  85. End If
  86. End Function
  87. Public Sub TraiterRacine(tree As tree)
  88. End Sub
  89. Public Sub DFS(tree As tree, Type_Exploration As Integer)
  90. If Not isempty(tree) Then
  91.     If Type_Exploration = 1 Then tree.TraiterRacine
  92.     tree.DFS upchild(tree), Type_Exploration
  93.     If Type_Exploration = 2 Then tree.TraiterRacine
  94.     tree.DFS downchild(tree), Type_Exploration
  95.     If Type_Exploration = 3 Then tree.TraiterRacine
  96. End If
  97.        
  98. Public Sub DFS_prefix(tree As tree)
  99. tree.DFS tree, 1
  100. End Sub
  101. Public Sub DFS_infix(tree As tree)
  102. tree.DFS tree, 2
  103. End Sub
  104. Public Sub DFS_postfix(tree As tree)
  105. tree.DFS tree, 3
  106. End Sub
  107. Public Function create(data As Double, upchild As tree, downchild As tree) As tree
  108. create.data = data
  109. Set create.up = upchild
  110. Set create.down = downchild
  111. End Function
  112. Public Sub AddNode(src As tree, data As Double)
  113. If src Is Nothing Then
  114.     Set src = create(data, Nothing, Nothing)
  115. ElseIf isempty(src.up) Then
  116.     Set src.up = create(data, Nothing, Nothing)
  117. ElseIf isempty(src.down) Then
  118.     Set src.down = create(data, Nothing, Nothing)
  119. Else
  120.     src.AddNode src.up, data
  121. End If
  122. End Sub
  123. Public Sub InsertSearchTree(src As tree, data As Double)
  124. If isempty(src) Then
  125.     Set src = create(data, Nothing, Nothing)
  126. Else
  127.     If data < src.data Then
  128.         InsertSearchTree src.up, data
  129.     Else
  130.         InsertSearchTree src.down, data
  131.     End If
  132. End If
  133. End Sub


 
1/ Si vous voyez une erreur qqpart ou des améliorations notoires, n'hésitez pas à me le dire  ... ;-)
2/ LE problème est le suivant:
Dans mon module je fais un test pour voir si tout fonctionne bien et en particulier la procédure addnode
=>

Code :
  1. Sub test()
  2. Set temp = New tree
  3. Dim data As Double
  4. data = 3
  5. temp.AddNode temp, data
  6. End Sub


 
A la ligne temp.addnode.... je recois lors du débug un msg box run time error 13: type mismatch....
 
 
La question...: quel saint dois je prier pour trouver la solution...?????
 
Merci d'avance et a +
GP


Message édité par Gentil_poussin le 29-08-2006 à 14:27:53
mood
Publicité
Posté le 23-08-2006 à 00:36:01  profilanswer
 

n°1429745
seniorpapo​u
Posté le 23-08-2006 à 07:32:30  profilanswer
 

Bonjour,
pour mon information:
1) quelle référence pour traiter les tree?
2) pourquoi temp.adnode pour apppeler un sub ?
Cordialement

n°1430012
Gentil_pou​ssin
Posté le 23-08-2006 à 15:37:17  profilanswer
 

Salut
 
1/ Aucune référence
2/ euh pcq je crois que pour appeller une procédure d'une classe il faut utiliser dans le module principal le format objet.procédure paramètres
Mais vu que j'utilise royalement les classes depuis 2 jours et demi, je peux (certainement) me tromper...  :pt1cable:  

n°1430114
galopin01
Posté le 23-08-2006 à 17:54:29  profilanswer
 

bonsoir,
Je ne suis moi-même qu'un béotien dans ce sport, mais :

Citation :

pour appeller une procédure d'une classe il faut utiliser dans le module principal le format objet.procédure paramètres  


: il faut Non.  
On peut : sans doute.
 
Mais il m'étonnerait que ce paramètre puisse être un objet de la classe.
Conceptuellement je ne vois d'ailleurs pas l'interet. Tout mes essais butent sur cet appel de src = tree.
 
Euh... Pour tes débuts tu pourrais peut-être commencer avec des classes concrètes :
Crée des classes voitures avec des propriétés évidentes couleur = rouge, radio, clim jantes... et des méthodes aussi évidentes : repeindre en bleu, ajouter la clim...
 
A+

n°1430187
Gentil_pou​ssin
Posté le 23-08-2006 à 19:15:56  profilanswer
 

galopin01 a écrit :

bonsoir,
Conceptuellement je ne vois d'ailleurs pas l'interet. Tout mes essais butent sur cet appel de src = tree.


Ben en fait dans ce cas là c'est justement ca que je dois faire, puisque je dois faire une procédure récursive qui doit  
* si pas de noeud existant en créer un
* sinon rajouter à un noeud à l'arbre existant (et donc appeller en paramètre le susdit arbre..
 
Bon maintenant la manière de procéder n'est peut etre pas exacte... => la question
 
 

galopin01 a écrit :


Euh... Pour tes débuts tu pourrais peut-être commencer avec des classes concrètes :
Crée des classes voitures avec des propriétés évidentes couleur = rouge, radio, clim jantes... et des méthodes aussi évidentes : repeindre en bleu, ajouter la clim...
A+


C'est une classe concrète non...?  :bounce:  
Et puis pourquoi faire simple quand on peut faire compliqué..
 
Non en fait j'en en besoin pour le boulot  et j'ai déjà testé avec des classes plus faciles mais pour lesquelles je n'avais (forcément) pas de problème..
 
Tks
GP

n°1430212
galopin01
Posté le 23-08-2006 à 20:04:07  profilanswer
 

Bonsoir,
Je ne sais pas, c'est un peu trop abstrait pour moi. J'ai bien compris ton problème mais je n'ai jamais vu de telles pratiques même dans des modules de classe un peu chiadés.
Bon courage.
A+

n°1430216
Gentil_pou​ssin
Posté le 23-08-2006 à 20:13:46  profilanswer
 

En fait je me rends compte que la lecture est un peu longue du code et que tout n'est pas nécessaire à la compréhension du probleme...
Je reposte uniquement le code essentiel
 
 
* Concernant la classe Tree
 

Code :
  1. Private varData As Double
  2. Private varUp As tree
  3. Private varDown As tree
  4. Public Function create(data As Double, upchild As tree, downchild As tree) As tree
  5. create.data = data
  6. Set create.up = upchild
  7. Set create.down = downchild
  8. End Function
  9. Public Sub AddNode(src As tree, data As Double)
  10. If src Is Nothing Then   
  11. Set src = create(data, Nothing, Nothing)
  12. ElseIf isempty(src.up) Then   
  13. Set src.up = create(data, Nothing, Nothing)
  14. ElseIf isempty(src.down) Then   
  15. Set src.down = create(data, Nothing, Nothing)
  16. Else   
  17. src.AddNode src.up, data
  18. End If
  19. End Sub


 
*concernant l'appel à la procédure AddNode dans un module classique et donc le problème :fou:  

Code :
  1. Sub test()
  2. Set temp = New tree
  3. Dim data As Double
  4. data = 3
  5. temp.AddNode temp, data
  6. End Sub


 
Par ailleurs, j'ai vu qqpart l'utilisation de "ME" mais je ne sais pas très bien comment ca fonctionne..Si qqun sait m'expliquer..
Tks GP


Message édité par Gentil_poussin le 23-08-2006 à 20:17:18
n°1430437
Gentil_pou​ssin
Posté le 24-08-2006 à 11:01:07  profilanswer
 

Up? :bounce:

n°1431200
seniorpapo​u
Posté le 25-08-2006 à 09:58:20  profilanswer
 

Bonjour,
tout d'abord MERCI, car ton post m'a amenè à découvrir l'usage des modules de classe et à découvrir les arbres binaires.
 
Avant le set temp = New tree
 
tu places :
 
Dim temp As tree
 
 
Chez moi cela fonctionne
 
Par contre, comme j'ai testé sous excel, j'ai transformé le Max en Dmax, où se trouve Max (Access?)
 
Cordialement

n°1433067
Gentil_pou​ssin
Posté le 29-08-2006 à 14:27:27  profilanswer
 

Et il faut aussi rajouter  
Set create = New tree
au début de la fonction Create
 
 
Merci Beuacoup ca marche aussi pour moi


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  VB/VBA/VBS

  [VBA] [Résolu] Appel foireux d'une classe d'arbre binaire

 

Sujets relatifs
[RESOLU] Tableau php, multi colonne?[RESOLU]Condition de variable
Récupérer morceau par morceau le contenu binaire d'un fichierselection sur critères avec VBA
[résolu] L'ID de session change de page en pageOptimiser une fonction [RESOLU]
[RESOLU] recherche sql, tableau phpVBA EXCEL : détecter mise en forme texte (gras, italique)
[resolu]comment couper une ligne de requete proprement?[résolu] pb ticket a gratter
Plus de sujets relatifs à : [VBA] [Résolu] Appel foireux d'une classe d'arbre binaire


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR