Stocker un tableau 'par valeur' (ByVal) et non pas 'par référence' (ByRef)

Résolu
DavidWhitewater Messages postés 81 Date d'inscription lundi 10 avril 2006 Statut Membre Dernière intervention 1 janvier 2010 - 15 oct. 2006 à 18:57
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 - 15 oct. 2006 à 23:20
Bonjour, prenons un tableau, et une collection tout simple :

Dim Tableau(50) as integer
Dim Col as new collection

à chaque modification des valeurs de mon tableau je le mémorise dans la collection :

Col.add(tableau)

et là je me dit : Chaque Item de la collection garde une photographie du tableau, et j'ai ainsi un historique des modifications du tableau.

Et bien non ! VB stock le tableau par référence (ByRef), donc à chaque modification du tableau, tous les Item de la collection reflettent la modification. Pas d'historique puisque chaque Item représente le même tableau.

Alors comment stocker dans une collection, un tableau par valeur (ByVal) ?

Merci de votre aide.

5 réponses

DavidWhitewater Messages postés 81 Date d'inscription lundi 10 avril 2006 Statut Membre Dernière intervention 1 janvier 2010
15 oct. 2006 à 19:23
Merci Casy pour ta réponse. J'avais bien pensé faire une copie du tableau, mais ca ferais autant de copie de tableau que d'Item dans la collection, et à ce moment là pourquoi retenir mon tableau dans une collection si je l'est déjà dans un second tableau ?

De plus, comme tu dis ' Attention à la mémoire' !

Mais une fois de plus j'ai posté trop tôt. Quelques minutes après avoir posté, en cherchant à contouner le problème, j'ai une l'idée d'éssayer ceci :

Col.add(tableau.clone)

Ca balance une copie du tableau ByVal dans la collection, et je n'est pas de tableau exédentaire à la traine. Je peux modifier le tableau d'origine sans toucher aux instance qui sont dans la collection.

Merci, a plus.
3
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
15 oct. 2006 à 19:10
Seule solution à mon avis, créer un second tableau qui sera une copie du premier tableau, et ajouter le second tableau à la collection.
Et faire en sorte de ne pas modifier ce second tableau.

A voir s'il existe une methode pour dupliquer un tableau, ou s'il faut faire la copie à la main.

Par contre attention à la mémoire, si tu fais trop de copie ça va déborder

---- Sevyc64  (alias Casy) ---- # LE PARTAGE EST NOTRE FORCE #
0
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
15 oct. 2006 à 19:33
Attention, comme son nom l'indique, ça fait exactement ce que je te disais de faire, mais de façon automatique et masqué.

avec tableau.clone tu duplique ton tableau (il existe donc une fonction pour le faire), avec Col.add, tu stocke dans la collection, le lien vers le nouveau tableau. La seule différence est que tu n'as pas de référence pour acceder directement à ton second tableau, mais il existe bel et bien.

Il faut bien avoir à l'esprit qu'une collection qu'elle quel soit, ne stockera jamais de variable ou d'objet en tant que tel. Elle ne fait que stocker un lien (un pointeur) vers un objet existant ailleurs.

secTab = tableau.clone
Col.add(secTab)
reviens exactement à la même chose, sauf qu'ici tu as la référence secTab pour accèder à ton second tableau

---- Sevyc64  (alias Casy) ---- # LE PARTAGE EST NOTRE FORCE #
0
DavidWhitewater Messages postés 81 Date d'inscription lundi 10 avril 2006 Statut Membre Dernière intervention 1 janvier 2010
15 oct. 2006 à 23:04
Hum, t'est sûr de ca ? Ca m'embête un peu.

D'un autre coté :
1- Je suis bien obligé de stocké l'historique quelque pars.
2- Si la collection ne fait que garder des liens vers les tableaux clonés, ca ne vas pas prendre de place.
3- La solution que j'utilisais avant prenais certainement grosso modo la même place, mais était beaucoup moins pratique.

Au final, la collection me semble être la meilleur solution.

A plus.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
15 oct. 2006 à 23:20
La collection ne prendra pas de place, certainement quelques dizaines d'octets par item je pense.
Par contre, pour chaque item dans ta collection, tu auras un tableau écrit quelque part en mémoire + ton tableau de base. 10 items 11 tableaux, 100 items 101 tableaux, .... Il faut bien que les données soient stockées quelque part puisque c'est le but de la manoeuvre.
Sinon comme solution alternative, tu as les fichiers. Textes, binaires, xml, ... à toi de voir, il y a le choix.

PS : Lorsque tu ajoutes des objets existants à une collection, si ensuite tu détruis un de ces objet, il faut penser à aller supprimer l'item correspondant dans la collection. Ce n'est pas automatique, si tu ne le fait pas, l'item va continuer de pointer sur quelque chose qui n'existe plus.

---- Sevyc64  (alias Casy) ---- # LE PARTAGE EST NOTRE FORCE #
0
Rejoignez-nous