SUPPRIMER OU AJOUTER DANS UN ARRAY AVEC FACILITÉ

ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 - 19 juin 2013 à 23:37
mimiZanzan Messages postés 301 Date d'inscription lundi 27 février 2006 Statut Membre Dernière intervention 17 décembre 2017 - 25 juin 2013 à 16:47
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/55232-supprimer-ou-ajouter-dans-un-array-avec-facilite

mimiZanzan Messages postés 301 Date d'inscription lundi 27 février 2006 Statut Membre Dernière intervention 17 décembre 2017
25 juin 2013 à 16:47
Salut UCFOUTU,

Merci de ton commentaire. Je ne pensais pas que les experts de Microsoft étaient aussi légers: ils ont quand même fait de grandes choses, mais en effet il y a des fois où ils ne se foulent pas trop...!
En tout cas, tu as raison: ton code met en avant l'utilisation du caractère chr(0),ce qui est rarement montré. J'ai eu l'occasion de le découvrir dans un de mes programmes.
Bon courage (et inspiration) pour de nouveaux codes.

Cdt
cs_Danette Messages postés 54 Date d'inscription mardi 23 juillet 2002 Statut Membre Dernière intervention 16 septembre 2008
25 juin 2013 à 08:15
Oui mais non, tu as raison.. j'ai confondu. Je parlais plutôt d'une base de données et pas d'un array..
Ta source fonctionne bien et mon commentaire n'a rien a voir avec ta source (Il était tard...)
Salutation et sorry..
Dany
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
25 juin 2013 à 07:15
Bonjour, DANETTE,
Je ne comprends pas ta remarque, surtout la partie concernant l'ajout d'un "champ" supplémentaire. Je vois vraiment mal où tu pourrais l'insérer dans un array.
cs_Danette Messages postés 54 Date d'inscription mardi 23 juillet 2002 Statut Membre Dernière intervention 16 septembre 2008
25 juin 2013 à 02:15
Il est toujours délicat de supprimer un élément soit dans un array soit dans une BD. Délicat dans le sens ou si l'on supprime un record par erreur on ne peux plus le récupérer. C'est pour ça que personnellement je préfère mettre un champ supplémentaire de type boolean yes/no pour mentionner que cet enregistrement est supprimé et plus visible mais par contre il y a toujours la possibilité de le récuperer.
Cette remarque ne concerne pas spécialement ton code (ton application) mais plutôt pour tous les codes dont on manipule les données stockées que ce soit dans un BD ou un array (surtout les suppressions).
MFG; Dany
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
24 juin 2013 à 23:23
Bonjour, MIMIZANZAN,
Je crois que tu as compris (et t'en félicite) le but de cette demo.
Il n'est pas tant d'aboutir à un résultat plus rapide (encore que, dans certains cas ... oui) que de montrer ce qu'est, dans un array, le caractère nul de terminaison et comment l'utiliser.
Et tu as raison : le split et le join sont gourmands. Et pour ne rien te cacher, ils fonts tous deux appels, eux, au boucles que je "n'utilisais pas" ( pas directement, comme tu le vois, mais très surement et insidieusement via VB). Ces deux fonctions (split et Join), sont en fait des "bébelles" que Microsoft a ajoutés à VB5 pour justifier la mise sur le marché de VB6. Sans toutefois vraiment se "fouler"...
Et tu sais quoi ? Cette petite demo a pour but caché (il nous faut être aussi insidieux que Microsoft, de temps à autre) de démontrer que certaines fonctions ne sont que des leurres à bon marché. Cette demo n'est que le premier pas vers un "aboutissement" inattendu. ( comment dit-on ? Ah oui : LOL)
Amitiés.
mimiZanzan Messages postés 301 Date d'inscription lundi 27 février 2006 Statut Membre Dernière intervention 17 décembre 2017
24 juin 2013 à 19:31
Salut UCFOUTU,

En effet, ton code est astucieux.
Cependant, j'ai fait un essai comparatif avec une boucle pour supprimer un élément par exemple, et j'ai constaté avec étonnement que c'était plus rapide qu'avec ta méthode utilisant les fonctions Split & Join...
Avec un tableau de 100000 éléments, la vitesse est environ 3 fois + élevée, en prenant le cas le + défavorable de supprimer l'avant dernier élément: 150ms avec ton code contre 50ms avec le balayage du tableau et son redimensionnement. Évidemment, c'est imperceptible, mais c'est juste une remarque et cela n'enlève rien à l'originalité de ton code.Je pense que les fonctions Split et Join sont peu performantes en vitesse.

Cordialement
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
24 juin 2013 à 18:54
Bonjour, annakhil1,
Je ne comprends pas le sens de ta demande.
Un code est un code. Je vois mal en quoi il serait différent s'il concernait un array traité depuis un bouton de commande placé sur un Form de VB6 ou placé sur une feuille de Excel ou placé sur un UserForm de VBA !
Il serait très rigoureusement identique (en tous points) !
annakhil1 Messages postés 2 Date d'inscription mercredi 24 septembre 2003 Statut Membre Dernière intervention 24 juin 2013
24 juin 2013 à 17:43
bonjour
STP j'aimerai bien voir ce code dans une form je ne suis pas professionnel
et merci
Galactus13 Messages postés 335 Date d'inscription lundi 29 septembre 2008 Statut Membre Dernière intervention 16 août 2023 1
24 juin 2013 à 16:04
plop:
Ok, j'ai vu la nouvelle mouture ! Autant pour moi:
"sans parcourir en boucle les lignes de l'array traité"
C'est vrai que j'ai trop l'habitude d'utiliser les boucles.
J'avoue que j'aurai utiliser dim et redim pour faire sa,
Bien lourd en mémoire ! J'ai zéro sur ce coup !
Cette fonction peut aussi servir à d'autres types de tableaux.
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
24 juin 2013 à 14:55
Je crois, Galactus, que tu n'as pas compris la manoeuvre.
Je ne fais AUCUNE boucle !
Avec mon code (la mouture complétée) :====>>

supprime_index toto, "ciao"
fait l'affaire.
Il se peut que tu ne visualises pas (problème CS connu) la dernière mouture.
Ferme CS et retourne sur mes sources. A un moment ou l'autre, tu tomberas sur la dernière mouture !
Galactus13 Messages postés 335 Date d'inscription lundi 29 septembre 2008 Statut Membre Dernière intervention 16 août 2023 1
24 juin 2013 à 12:06
je veux bien voir comment tu fais, j'ai bien une idée:
Faire la recherche par le contenu de la variable(x)
Puis utiliser ta fonction "supprime_index", par exemple.
en gros:

For I = 0 To UBound(toto)
If toto(I)= MaVariable then
supprime_index toto, I ' Pour supprimer l'index correspondant
exit for
end if
Next
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
21 juin 2013 à 07:59
Je précise un point, en ce qui concerne la suppression :
Si aucun doute n'est permis par la suppression sur la base d'un index, on peut légitimement se demander ce qui se passerait si la suppression était faite sur la base d'un contenu et que ce contenu apparaissait plusieurs fois dans l'array.
Je n'ai pas voulu traiter ce cas (plusieurs contenus identiques), partant du principe selon lequel, par "vocation", un array est construit sans doublons.
C'est donc le seul premier élément répondant à un critère (contenu) qui est supprimé.

Pour ceux qui, étrangement, auraient construit un array dont le critère contenu choisi concernerait plusieurs éléments et qu'ils voudraient supprimer TOUS ces éléments, la solution est simple et elle est dans la manière d'utiliser alors l'outil. Ainsi (exemple où l'on voudrait supprimer tous les éléments "blabla" éventuellement présents ) :

comb = UBound(toto)
Do
supprime_index toto, "blabla"
If UBound(toto) = comb Then Exit Do
comb = UBound(toto)
Loop
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
21 juin 2013 à 00:16
J'ai fait des ajouts (dont celui annoncé)
Je crois que c'est maintenant suffisant, mais si vous avez une idée d'ajout utile, parlons-en.
Thank you verry much
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
19 juin 2013 à 23:37
A ceux qui seraient intéressés : revenez demain, car je suis en train d'améliorer encore ce petit outil qui va permettre (comme on le peut avec une collection) de supprimer un élément tant par son index ( exemple supprime_index toto, 2) que par sa valeur (exemple : supprime_index toto, "voilà"). Toujours sans boucle.