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

Hastable et mauvaise suppression ..

5 réponses
Avatar
AlexC
Bonjour à tous,

J'utilise une hastable comme liste d'attente.
Je rajouter mon éléments grâce à la méthode ".add"
et quand j'ai traité mon élément je l'enlève avec la méthode ".remove"

mon problème se situe au moment au je supprime un élément de la liste,
l'élément a l'air bien supprimé sauf qu'il est remplacé par un arraylist
vide !, de plus un autre élément est supprimé sans raisons ....

Une idée sur l'origine de ce comportement bizarre ?

5 réponses

Avatar
Patrick Philippot
Bonjour,

J'utilise une hastable comme liste d'attente.



Pourquoi pas une System.Collections.Queue? Une hashtable, c'est cher
payé pour une file d'attente.

Je rajouter mon éléments grâce à la méthode ".add"
et quand j'ai traité mon élément je l'enlève avec la méthode ".remove"

mon problème se situe au moment au je supprime un élément de la liste,
l'élément a l'air bien supprimé sauf qu'il est remplacé par un
arraylist vide !, de plus un autre élément est supprimé sans raisons



Pour l'expérience que j'en ai, la hashtable se comporte correctement.
Pourrions nous avoir un peu plus de détails sur votre code et les objets
stockés dans la hashtable?

--
Patrick Philippot - Microsoft MVP
MainSoft Consulting Services
www.mainsoft.fr
Avatar
AlexC
Je n'utilise pas une queue pour la simple raison qu'avec une queuelist je ne
peux pas récupérer l'élément qui m'interresse, on ne récupère que celui tout
en bas de la liste. ( les éléments sont traités dans le désordre ).
Mais j'ai trouvé l'origine de mon problème mais je ne l'explique pas ....

En fait cette hastable est passée en paramètre byref à une fonction, qui
possède évidemment d'autres paramètre.
Elle était déclarée comme il suit :

Public Function XXX(Byval X as integer, Byval Y as string, Byref MyHashtable
as Hastable,ByVal Z as Double) as boolean
End Function

On peux noter que les Byval et Byref sont "mélangés", j'ai donc remis en
place tout ce petit monde pour commencer par déclarer les arguments Byval
puis ensuite tous les arguments Byref. Et là ca c'est mis à fonctionner !
Mais pourquoi ??


"Patrick Philippot" a écrit dans le
message de news:
Bonjour,

J'utilise une hastable comme liste d'attente.



Pourquoi pas une System.Collections.Queue? Une hashtable, c'est cher payé
pour une file d'attente.

Je rajouter mon éléments grâce à la méthode ".add"
et quand j'ai traité mon élément je l'enlève avec la méthode ".remove"

mon problème se situe au moment au je supprime un élément de la liste,
l'élément a l'air bien supprimé sauf qu'il est remplacé par un
arraylist vide !, de plus un autre élément est supprimé sans raisons



Pour l'expérience que j'en ai, la hashtable se comporte correctement.
Pourrions nous avoir un peu plus de détails sur votre code et les objets
stockés dans la hashtable?

--
Patrick Philippot - Microsoft MVP
MainSoft Consulting Services
www.mainsoft.fr



Avatar
Patrick Philippot
AlexC wrote:
On peux noter que les Byval et Byref sont "mélangés", j'ai donc remis
en place tout ce petit monde pour commencer par déclarer les
arguments Byval puis ensuite tous les arguments Byref. Et là ca c'est
mis à fonctionner ! Mais pourquoi ??



Bonjour,

Là, ça relève un peu de la magie noire. Si l'ordre des arguments a une
importance, où va-t-on (sauf bug inconnu à ce jour ou plus probablement,
un problème de corruption de la pile)? Vous êtes bien sûr que rien
d'autre n'a été modifié?

De plus, passer ByRef un argument de type référence comme une HashTable
n'a qu'un intérêt limité. Un argument de ce type est de toutes façons
passé par référence. Le fait de le passer ByRef donne simplement la
possibilité de changer l'instance pointée par la référence ou de la
mettre à Null. Sinon, ByVal ou ByRef, c'est un passage par référence
puisque *c'est* un type référence.

--
Patrick Philippot - Microsoft MVP
MainSoft Consulting Services
www.mainsoft.fr
Avatar
AlexC
"Patrick Philippot" a écrit dans le
message de news: %
AlexC wrote:
On peux noter que les Byval et Byref sont "mélangés", j'ai donc remis
en place tout ce petit monde pour commencer par déclarer les
arguments Byval puis ensuite tous les arguments Byref. Et là ca c'est
mis à fonctionner ! Mais pourquoi ??



Bonjour,

Là, ça relève un peu de la magie noire. Si l'ordre des arguments a une
importance, où va-t-on (sauf bug inconnu à ce jour ou plus probablement,
un problème de corruption de la pile)? Vous êtes bien sûr que rien d'autre
n'a été modifié?




Non j'en suis persuadé ! Vous faites bien de souligner que c'est de la magie
noire ..
, je sais bien que l'ordre des argument n'a rien à voir ... d'ou ma
question ^^
Pour ce qui est de la pile je n'y touche pas .. donc pourquoi serait elle
modifiée ?

En tout cas si quelqu'un a une explication elle est la bienvenue.

De plus, passer ByRef un argument de type référence comme une HashTable
n'a qu'un intérêt limité. Un argument de ce type est de toutes façons
passé par référence. Le fait de le passer ByRef donne simplement la
possibilité de changer l'instance pointée par la référence ou de la mettre
à Null. Sinon, ByVal ou ByRef, c'est un passage par référence puisque
*c'est* un type référence.




En effet c'est mon cas je change l'instance

--
Patrick Philippot - Microsoft MVP
MainSoft Consulting Services
www.mainsoft.fr



Avatar
Patrick Philippot
AlexC wrote:
Non j'en suis persuadé ! Vous faites bien de souligner que c'est de
la magie noire ..
, je sais bien que l'ordre des argument n'a rien à voir ... d'ou ma
question ^^



Dans ce cas, il nous faudrait, comme je l'ai mentionné plus haut, un
code exemple reproduisant le problème ou à tout le moins plus de détails
sur ce que vous faites dans cette méthode.

--
Patrick Philippot - Microsoft MVP
MainSoft Consulting Services
www.mainsoft.fr