Comportement de dictionary

mapomme

XLDnaute Barbatruc
Supporter XLD
Bonsoir à tous :),

Quelqu'un a-t-il déjà était confronté à ce comportement de l'objet dictionary quand on y réfère avec une instruction du type dico(clef) = "x" alors que le dico est vide ? (comportement que je n'arrive pas à m'expliquer).
Ou bien je fais une grosse bêtise que je ne vois pas :oops:

Voici le code :
VB:
Sub test()
Dim dicoA As New Dictionary, dicoB As New Dictionary, x

   MsgBox "dicoA.count = " & dicoA.Count
   If dicoA("a") = 1 Then x = x
   MsgBox "dicoA.count = " & dicoA.Count

   MsgBox "dicoB.count = " & dicoB.Count
   If dicoB.Exists("b") Then x = x
   MsgBox "dicoB.count = " & dicoB.Count

End Sub

Dans le cas a, le dico n'est pas vide alors qu'on y a rien explicitement déposé.
Dans le cas b, le dico est bien vide.
 

Pièces jointes

  • mapomme- dictionary- v1.xlsm
    14.3 KB · Affichages: 30
Dernière édition:

Staple1600

XLDnaute Barbatruc
Bonsoir le fil, le forum

@mapomme
Pourquoi les lignes de codes différent?
Ecrit comme ceci, les résultats sont identiques

VB:
Sub testIII()
Dim dicoA As New Dictionary, dicoB As New Dictionary, x
MsgBox "A: " & dicoA.Count & "|" & IsNull(dicoA("a"))
MsgBox "B: " & dicoB.Count & "|" & IsNull(dicoB("b"))
If dicoA("a") = 1 Then x = x
MsgBox "A: " & dicoA.Count & "|" & IsNull(dicoA("a"))
If dicoB.Exists("b") Then x = x
MsgBox "B: " & dicoB.Count & "|" & IsNull(dicoB("b"))
End Sub

NB: Je crois que je suis dans le même baignoire que toi ;)
Ou bien je fais une grosse bêtise que je ne vois pas :oops:
Sauf que je ne la fais mais je l'écris sur XLD ;)
 
Dernière édition:

mapomme

XLDnaute Barbatruc
Supporter XLD
Bonsoir Staple1660,

Pourquoi les lignes de codes différent?
Ecrit comme ceci, les résultats sont identiques


Je me suis mal expliqué. Heureusement que les deux codes sont différents car, s'ils ne l'étaient pas, ils produiraient le même résultat :p

Dans le code concernant A, à aucun moment le dico est explicitement rempli de quoi que ce soit.
dicoA("a") = 1 n'est pas une affectation mais une comparaison devant produire True ou False.
Le dicoA est vide; je compare dicoA("a") avec 1 et cela suffit pour que dicoA contienne l'élément de clef "a".

Dans le second cas, je cherche l'existence de "b" dans dicoB, il 'est pas trouvé et dicoB reste vide.

Autrement dit, dans la cas a, une simple référence à dicoA("a") (qui n'existe pas) suffit à le créer alors qu'aucune affectation n'a été faite.
 
Dernière édition:

mapomme

XLDnaute Barbatruc
Supporter XLD
Bonjour Dranreb ;),

Merci de ta réponse. C'est un phénomène qui m'avait un jour perturbé dans un code mais que je n'avais pas creusé. J'en ai profité aujourd'hui pour publier.

Non, mais implicitement, si. Consulter un item d'après une clé sans vérifier son existence lui fait assumer cette dernière.

C'est ce qui arrive à ceux, qui comme moi, utilisent des objets sans avoir la documentation de cet objet.
Néanmoins, ce n'est pas un comportement logique (selon moi) ; une levée d'erreur me semblerait plus logique (tentative de référence à un élément de dictionary via une clef inexistante)
 

Dranreb

XLDnaute Barbatruc
Je crois que comme c'est on gagne en souplesse et facilité, sans avoir d'erreur à gérer. Un Dictionary c'est comme une sorte de tableau à 1 dimension qui accepte d'autres types de données que des entiers en tant qu'indices, qu'on appelle alors des clés.
Si on ne veut pas le polluer par des clés inexistantes on peut: on vérifie leur existence avant de consulter.
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Re,

Un Dictionary c'est comme une sorte de tableau à 1 dimension qui accepte d'autres types de données que des entiers en tant qu'indices, qu'on appelle alors des clés.

Ce côté là, je m'en débrouille pas mal. Le plus que j'ai fait pour résoudre un problème, c'est un dico de dico de dico. C'était amusant à coder. Mais je suis à mille lieux de maitriser les structures de données comme tu le fais si brillamment :)
 

Dranreb

XLDnaute Barbatruc
Un Dictionary c'est comme une sorte de tableau
Ce que je voulais dire par là c'est que cette création implicite aurait été voulue justement pour que le Dictionary ressemble d'avantage à un tableau. Du moment qu'on n'a pas un indice en dehors des limites, un élément de tableau existe toujours et possède une valeur. Ben c'est pareil pour un item de Dictionary, dont la clé ne peut être en dehors de limites. Un peu comme si toutes les clés potentiellement possibles y figuraient toujours. Bon, on sait que ce n'est pas vrai tant qu'on n'a pas cherché à y accéder, mais après tout, jusqu'à ce moment là, personne ne le sait ;)
Edit: Et après cela, personne ne sait plus non plus qu'il n'existait pas avant cela, un peu donc comme s'il avait toujours existé.
En somme: il s'en suit qu'il existe dès lors qu'on en parle, mais ce n'est pas en parler que de simplement vouloir savoir si on en a déjà parlé (je veux dire: vérifier s'il existe)
Mais toute ces considérations obscures n'étaient qu'un essai sur la philosophie du Dictionary, ne remettant pas en cause la maitrise pratique que tu en as.
 
Dernière édition:

Si...

XLDnaute Barbatruc
Bon_jour

Dranreb, il y a pleins de choses qui se passent sans qu'on ne le voit quand on utilise Excel, non o_O ?

mapomme, un comportement logique dans un système peut ne pas l'être dans un autre, non o_O ?

Un autre éclairage avec le fichier joint …

L'instructions Dim permet de créer l'objet mais sans le dimensionner quand c'est nécessaire.

Dim T() permet de créer un Array nomné T sans le dimensionner.

Dim dicoA As New Dictionary permet de créer un Array de 2 dimensions (la première étant la clé et la seconde, l'item) sans le dimensionner. Elles seront initialisées à vide dès que le dico sera sollicité puis …

Merci de me signaler un éclairage défectueux :confused:.
 

Pièces jointes

  • Dim.xlsm
    37.3 KB · Affichages: 27

Dranreb

XLDnaute Barbatruc
Merci de me signaler un éclairage défectueux
Dangereux me semble-t-il de considérer un Dictionary comme un tableau à deux dimensions. Car si les méthodes Keys et Items en renvoient chacune un à une, qui sont à eux deux comme un à deux, ces structures ne sont pas présentes en lui sous cette forme: les items sont en réalité disposés très dispersés dans une vaste zone de mémoire. L'objet sait seulement les reconstituer sur demande et l'opération est trop longue à effectuer pour avoir le droit d'utiliser souvent Keys(N) ou Items(N) comme s'il s'agissait de tableaux.
 
Dernière édition:

Si...

XLDnaute Barbatruc
Re

Merci pour ta remarque. J'ai procédé par analogie mais ce qui semble vrai pour l'un peut ne pas l'être pour l'autre.
C'est le problème du Dim qui m'a le plus interpellé !

Ne sachant pas comment sont disséminés les clés et les items, j'ai hésité entre un Tableau à 2 dimensions et 2 Tableaux à une dimension ; ne sachant toujours pas où sont placés en mémoire les items, le second cas serait donc aussi dangereux ?
 

Dranreb

XLDnaute Barbatruc
Pareil. Keys ou Items reconstitue chaque fois tout le tableau, lequel ne préexiste pas dans l'objet. Les Items sont disséminés dans le plus vaste espace de mémoire disponible de telle sorte qu'il y ait le plus de chances possible pour qu'un calcul pseudo aléatoire partant de la valeur de la clé aboutisse directement à l'adresse de l'Item (enfin un pointeur vers lui plutôt).
S'il aboutit à une autre clé dont le calcul déduit la même position, une recherche séquentielle est effectuée à partir de la position trouvée.
Les clé sont probablement référencées par un autre pointeur à coté de celui de l'item.
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Bonsoir à tous,
En somme: il s'en suit qu'il existe dès lors qu'on en parle

Mais dites donc, est ce que le dictionary ne se prendrait-il pas un peu pour Dieu ? Car pomme disait un certain Saint Jean : :):D
Au commencement était le Verbe, et le Verbe était en Dieu, et le Verbe était Dieu.
Il était au commencement en Dieu.
Tout par lui a été fait, et sans lui n'a été fait rien de ce qui existe.

En fait, je ne pense pas que comparer un dictionary à quelque chose qu'il n'est pas puisse faire avancer la compréhension. Sa définition d'être un ensemble de clefs (uniques) avec pour chaque clef un item associé suffit à l'utiliser. Tout comme les tableaux qui à une ou deux voire trois dimensions sont visualisables mentalement. Mais quand on attaque des tableaux à quatre, cinq dimensions ou plus, on ne visualise plus. On peut alors simplement considérer le tableau comme une structure manipulable à l'aide d'indices.

edit : en parlant de Dieu et de création, mon disque de données vient de rendre l'âme. J'ai tenté tous les gestes de premiers secours que je connaissais mais hélas il a trépassé et sans espoir de résurrection. Sans doute la foudre de Dieu qui m'a frappé et punit de l'avoir associé au séculier dictionary de chez Krosoft :confused: ;) (heureusement que la veille, j'avais fais une sauvegarde presque totale de ce disque)
 
Dernière édition:

Staple1600

XLDnaute Barbatruc
Bonsoir le fil, le forum

Bonsoir à tous,
edit : en parlant de Dieu et de création, mon disque de données vient de rendre l'âme. J'ai tenté tous *les gestes de premiers secours que je connaissais mais hélas il a trépassé et sans espoir de résurrection. Sans doute la foudre de Dieu qui m'a frappé et punit de l'avoir associé au séculier dictionary de chez Krosoft :confused: ;) (heureusement que la veille, j'avais fais une sauvegarde presque totale de ce disque)
*:As-tu essayé de le mettre une nuit dans ton congélateur?
(je suis sérieux)
 

Discussions similaires

Réponses
47
Affichages
2 K

Membres actuellement en ligne

Statistiques des forums

Discussions
312 611
Messages
2 090 226
Membres
104 453
dernier inscrit
benjiii88