[R] Vider un array

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
Avatar du membre
DimVar
Niveau 10
Niveau 10
Messages : 870
Enregistré le : ven. 30 mai 2008 15:08
Status : Hors ligne

[R] Vider un array

#1

Message par DimVar »

Bonjour messieurs,


Je cherche un moyen rapide pour vider un tableau...
J'ai opté pour ça, mais ca me renvoi tjs cette !?$%!$$*!!? d'erreur !!!

Code : Tout sélectionner

Func _ArrayClean ()

    Local $x = 0

    $Arraycount = ""

    For $x = 0 To 90
        _ArrayDelete ($InstanceArray,$x)
    Next

    _ArrayDisplay ($InstanceArray)

    $x = 0

    For $x = 0 To 4
        _ArrayDelete ($ArrayLog,$x)
    Next

    _ArrayDisplay ($ArrayLog)

EndFunc
 
Et l'erreur : (voir PJ)


Merci à vous.
Fichiers joints
Screenshot_1.jpg
Screenshot_1.jpg (13.04 Kio) Vu 3211 fois
Modifié en dernier par DimVar le mar. 12 avr. 2011 16:12, modifié 1 fois.
N'évoquons pas la pierre, les jeunes risqueraient d'en poire !
Avatar du membre
ZDS
Membre émérite
Membre émérite
Messages : 554
Enregistré le : jeu. 10 juin 2010 10:35
Localisation : 22300 Cul-d'chouette Langue-de-vache
Status : Hors ligne

Re: [..] Vider un array

#2

Message par ZDS »

Salut,

J'aimerai bien t'aider, mais je ne comprends pas ce que tu veux faire : Tu as deux tableaux $InstanceArray et $ArrayLog, et tu veux enlever les 91 (oui de 0 à 90) premiers éléments de $InstanceArray et les 5 (idem, de 0 à 4) premiers de $ArrayLog, c'est ça? Dans ce cas, tu les as bien mis en variables globales? ou sinon, passe les au moins en parametres (!par référence!) à ta fonction : Func _ArrayClean (ByRef $InstanceArray, ByRef $ArrayLog)

Dans ce cas, déjà je vois plusieurs erreurs de conception :

1) Le tableau vide n'existe pas en AutoIt. si tu retires 5 éléments d'un tableau à 5 éléments, le dernier retrait te renverra une erreur (pas une véritable erreur, mais le tableau n'en sera plus un, il deviendra une chaine vide, et bonjour le respect de la structure et de l'invariant... l'une des bizarreries détestables des fonctions de base d'AutoIt ^^).

2) Il ne faut pas diminuer un tableau dans le sens croissant ! Je m'explique :
Quand tu fais un for i = 0 To 4, ton i va s'incrémenter de 0 à 4 dans l'ordre.
Imagine que tu as un tableau de 6 éléments {"zero", "un", "deux", "trois", "quatre", "cinq"}, je suppose que tu voudras garder uniquement le dernier et donc avoir un tableau à un élément {"cinq"}. OR :
- Tu fais ton premier tour de boucle for, donc i = 0, tu retires l'élement [0] = "zero" et te retrouves avec un tableau à 5 éléments {"un", "deux", "trois", "quatre", "cinq"}.
- i = 1, tu retires l'élement [1] du nouveau tableau, donc la valeur "deux" (bah oui tu modifies ton tableau à la volée ^^). Résultat : {"un", "trois", "quatre", "cinq"}
- i = 2, tu retires l'élement [2] du nouveau tableau, donc la valeur "quatre" (idem, tu as modifié deux fois ton tableau). Résultat : {"un", "trois", "cinq"}
- i = 3, et là c'est le drame, tu veux retirer l'élément [3], or ton tableau ne contient plus cet élément (bah oui, il est de taille 3, donc tu peux faire que [0], [1] ou [2]) => Soit ça plante, soit ça retirera le dernier élément, donc "cinq". => Résultat : {"un", "trois"}
- i = 4, idem, dans le cas où ça ne plante pas, tu as retiré le dernier, "trois" => Résultat : {"un"}
Tu te retrouves avec un tableau qui contient un seul élément, ok, mais c'est pas celui qu'on en attendait, {"cinq"}! (Correction possible : For i = 4 To 0 Step -1 , pour faire une boucle en sens inverse pour ton incrément)

Au final, donc, tu veux faire quoi? vider entièrement tes deux tableaux? retirer un nombre fixe d'éléments? retirer seulement quelques éléments précis (genre ceux qui contiennent un mot particulier)? Si possible, donne nous plus d'informations sur ton besoin, et n'oublie pas de poster la totalité de ton code, ce n'est pas facile d'imaginer ce qu'il manque ^^

A bientôt !

PS: Si possible, une fois le code entièrement posté, mets une capture du message d'erreur provenant de l'IDE SciTE, pas une erreur lancé par la version compilée de ton script, sinon le numéro de ligne ne sert à rien pour débugguer ^^

PS2: Comme je le disais juste avant, quand tu vide entièrement un tableau, tu te retrouves non pas avec un tableau vide (puisque AutoIt ne conçoit pas qu'un tableau vide puisse exister), mais avec la chaine de caractères vide "", donc si tu tentes un _arrayDisplay dessus, il t'ejectera avec un @error.
ZDS : Chef de projet du nAiO (logiciel AutoIt gratuit sous licence CC 4.0 BY-NC-SA)
Tout problème a une solution, donc si il y a pas d'solution, c'est qu'il y a pas d'problème !
Avatar du membre
DimVar
Niveau 10
Niveau 10
Messages : 870
Enregistré le : ven. 30 mai 2008 15:08
Status : Hors ligne

Re: [..] Vider un array

#3

Message par DimVar »

Merci ZDS !

Alors en fait j'ai donc 2 tableaux.
Au cours du script, j'appelle une fonction qui rempli les cases du tableau, ensuite je souhaite les "vider". Vider les cases de leur contenu, car la fonction qui fait appel au tableau, écrit les cases du tableau. donc à l'appel de la 2e fonction, j'ai besoin de re-remplir le tableau avec de nouvelles valeurs.

Concernant la possibilité de poster le code entier, impossible. Va me falloir effacer toutes les ip, mot de passe, chemin, nom de serveur et j'en passe (environnement d'entreprise et discrétion oblige).
Et pour en rajouter une couche, je compile le script à partir d'un partage réseau, je ne peut donc le lancer depuis l'IDE (scite) car il s’exécuterait dans l'environnement locale et non distant.

Pas facile j'en conviens à dépatouiller. Mais tes explications m'ont deja mis sur une piste. Je vais tenter de déclarer le tableau après chaque appel de la dite fonction.
N'évoquons pas la pierre, les jeunes risqueraient d'en poire !
Avatar du membre
ZDS
Membre émérite
Membre émérite
Messages : 554
Enregistré le : jeu. 10 juin 2010 10:35
Localisation : 22300 Cul-d'chouette Langue-de-vache
Status : Hors ligne

Re: [..] Vider un array

#4

Message par ZDS »

Re,

Pas de souci pour la discrétion, c'est compréhensible, mais ce genre de données devrait se trouver hors du code ^^ (j'adore les fichiers INI et les sdds de mon cru avec de l'AES, soit dit en passant ^^)

Mais bref, dans ton cas, pourquoi ne pas créer un nouveau tableau $InstanceArray2, et détruire l'ancien en faisant un simple $InstanceArray = "" ? En fait, vider le tableau un par un juste pour le plaisir de le vider entièrement, ne sert pas à grand chose, autant le détruire complètement en l'instanciant avec la chaine vide ^^
ZDS : Chef de projet du nAiO (logiciel AutoIt gratuit sous licence CC 4.0 BY-NC-SA)
Tout problème a une solution, donc si il y a pas d'solution, c'est qu'il y a pas d'problème !
Avatar du membre
DimVar
Niveau 10
Niveau 10
Messages : 870
Enregistré le : ven. 30 mai 2008 15:08
Status : Hors ligne

Re: [..] Vider un array

#5

Message par DimVar »

J'ai pas tout compris au vocabulaire employé dans tes reponses... :oops:
La je quitte le taff, mais je me permettrai de reposer qq questions ce soir.
@ tte & merci. :)
N'évoquons pas la pierre, les jeunes risqueraient d'en poire !
Avatar du membre
zeshrek
Niveau 10
Niveau 10
Messages : 984
Enregistré le : mer. 17 nov. 2010 09:31
Localisation : Sur ma chaise
Status : Hors ligne

Re: [..] Vider un array

#6

Message par zeshrek »

Mais qu'est ce que vous vous prenez la tete pour rien ?
Le but c'est de vider le tableau, tout en le conservant en tant que tableau ? c'est bien ca ?
► Afficher le texte
Et voilà, 2 lignes c'est plié.

De rien :D
Si vis pacem para bellum
Avatar du membre
DimVar
Niveau 10
Niveau 10
Messages : 870
Enregistré le : ven. 30 mai 2008 15:08
Status : Hors ligne

Re: [..] Vider un array

#7

Message par DimVar »

@Zeshrek : Merci, effectivement c'est bien plus simple comme ca :lol:

@ZDS : C'est quoi sdds et aes ? Et comment aurais tu exploité un *.ini dans le cas qui me concerne ?
N'évoquons pas la pierre, les jeunes risqueraient d'en poire !
Avatar du membre
ZDS
Membre émérite
Membre émérite
Messages : 554
Enregistré le : jeu. 10 juin 2010 10:35
Localisation : 22300 Cul-d'chouette Langue-de-vache
Status : Hors ligne

Re: [..] Vider un array

#8

Message par ZDS »

Bonjour,

Zeshrek a raison, c'est sans doute plus simple pour toi de faire ainsi.

Juste pour complément :

SDD : structure de données, AES : algo de chiffrement plutôt performant.

Pour le coup de réinitialiser à un tableau type Dim $array[1], ça donne un tableau de taille 1 dont la première et seule valeur peut être tout et n'importe quoi; je suis sans doute psycho rigide là dessus, mais je n'aime pas faire ça ^^ (la programmation "à la volée" ne me plait pas, j'aime savoir que le code que j'écris est bon avant même de le lancer : http://fr.wikipedia.org/wiki/Programmation_par_contrat)

Ca demande sans doute plus de boulot, mais je tiens un invariant pour ma sdd quand je modélise un tableau :
Le premier élément est la taille du tableau, les suivants en sont les valeurs.
Ca implique de maintenir la valeur en tête de tableau à chaque ajout ou suppression, mais au moins :
- La recherche de la taille se fait en une seule opération $array[0], boucler sur les éléments se fait avec un for i = 1 To $array[0] au lieu de for i = 0 To UBound($array) - 1 (l'accès $array[0] est une opération unique (complexité O(1), alors qu'un UBound /* à mon avis */ se fait en comptant tous les éléments du tableau, donc O(n)).
- C'est une bonne façon de faire pour modéliser un tableau vide comme une sdd de tableau : Local $array[1] = [0], un tableau à un élément qui contient la valeur 0, zéro éléments significatifs.
- Et puis bizarrement c'est aussi la façon native de faire pour beaucoup de fonctions, genre les StringSplit, WinList et autres : c'est sans doute pas pour rien ^^

Je me doute que ce message ne servira pas à grand chose, mais si besoin, n'hésite(z) pas à me mp :)

A bientôt !

PS: Pour les fichiers INI, c'est dans ce genre de fichiers que j'aurai mis les informations confidentielles de ton programme, au lieu de les mettre dans le code source, exemple pour les identifiants de connexion à une base de données quelconque :
► Afficher le texte
Quand tu as besoin de les lire, tu fais un IniRead($fichierINI, "BDD", "Adresse", ""), et comme ça rien de personnel n'apparait dans ton code source. J'utilise les INI pour beaucoup de choses, l'internationalisation notamment. Je compte mettre sur le site une UDF de gestion de l'internationalisation, ça aide pour faire plus sérieux et taper sur un public étranger ^^

EDIT : Je préfère modérer mon propos sur la complexité du UBound, Jchd et son bleu de travail m'ont fait peur ^^
Mais si le calcul de la taille n'est pas sensible à la taille elle même pourquoi un Ubound met-il plus longtemps sur un tableau de taille 10.000.000 (précédé d'affectations en tout genre) que sur un array de taille 10 (0.022453 ms dans le premier cas, 0.011453 ms dans le second) ? Je suis d'accord un seul exemple n'est pas significatif et que la différence en microsecondes on s'en fiche, mais bon, c'est une moyenne sur 20 tests chacuns.
EDIT2: Faire un test ne sert à rien si ce n'est pas un test correctement pensé ^^ Donc j'ai vérifié : l'accès à $array[0] se fait en sensiblement le même temps dans les deux cas (0.007263 ms dans le premier cas, et 0.007265 ms dans le second). Même si ça n'est pas une preuve, ça aide à penser dans mon idée.
EDIT3@Zeshrek: Donc un Dim $tableau[1] redimensionnera le tableau a 1 valeur, qui elle même sera systématiquement égale a zero
Faux, testé et initialisée à la chaine vide "". Mais je n'ai pas la main sur ce genre de fonction de base, est-ce-que c'est une vraie chaine vide? Donc pas tout à fait tout et n'importe quoi, puisqu'on sait que ça s'affiche comme une chaine vide (Mode parano: j'espère juste que c'est pas comme dans certains langages tels que le C++ où la référence peut taper n'importe où ou dépasser si on fait mal les choses, on voit ce que ça donne avec la Wii et ses failles à la Zelda ^^)

PS: Désolé de toutes ses éditions, j'aime pas laisser de fautes d'orthographe trop voyantes ^^
Modifié en dernier par ZDS le mar. 12 avr. 2011 21:06, modifié 10 fois.
ZDS : Chef de projet du nAiO (logiciel AutoIt gratuit sous licence CC 4.0 BY-NC-SA)
Tout problème a une solution, donc si il y a pas d'solution, c'est qu'il y a pas d'problème !
Avatar du membre
zeshrek
Niveau 10
Niveau 10
Messages : 984
Enregistré le : mer. 17 nov. 2010 09:31
Localisation : Sur ma chaise
Status : Hors ligne

Re: [..] Vider un array

#9

Message par zeshrek »

ZDS a écrit :Zeshrek a raison, c'est sans doute plus simple pour toi de faire ainsi.
Ca commencait pourtant bien, car effectivement j'ai raison. :D
Par contre tu dis une grosse bêtise :
ZDS a écrit :Pour le coup de réinitialiser à un tableau type Dim $array[1], ça donne un tableau de taille 1 dont la première et seule valeur peut être tout et n'importe quoi;
Voici ce que dit la doc a propos de reDim :
The ReDim keyword is similar to Dim, except that ReDim preserves the values in the array instead of removing the values while resizing an array
Ce qui se traduit par :
ReDim est similaire a Dim, mis a part qu'il préserve les données dans le tableau au lieu de les éffacer lors du redimensionnement.
Donc Dim Efface les données.
Donc un Dim $tableau[1] redimensionnera le tableau a 1 valeur, qui elle même sera systématiquement égale a zero.
Bref, c'est pas tout a fait tout et n'importe quoi.
(Je suis pas forcément psychorigide, mais j'éssaye aussi de donner des codes qui soient justes... ;))
Si vis pacem para bellum
Avatar du membre
DimVar
Niveau 10
Niveau 10
Messages : 870
Enregistré le : ven. 30 mai 2008 15:08
Status : Hors ligne

Re: [..] Vider un array

#10

Message par DimVar »

@ZDS : Merci pour les explications, mais ca reste toujours flou. Je me pencherai la-dessus (SDDS et AES) quand j'aurais un bon niveau (quand je saurais vider un array tout seul par exemple). :)

Par contre, pour les fichiers ini et la fonction qui va avec...... TOP TOP TOP ! quand je pense à tout ces scripts dans lesquels je me suis fait **** à ecrire avec filewrite, faire des boucles et des filereadline pour retrouver mes lignes... Que de temps perdu ! (pleonasme en programmation, gagne t'on du temps ?)

Encore merci à vous 2.

Bonne fin de semaine. Je clos.
N'évoquons pas la pierre, les jeunes risqueraient d'en poire !
Avatar du membre
jchd
AutoIt MVPs (MVP)
AutoIt MVPs (MVP)
Messages : 2284
Enregistré le : lun. 30 mars 2009 22:57
Localisation : Sud-Ouest de la France (43.622788,-1.260864)
Status : Hors ligne

Re: [R] Vider un array

#11

Message par jchd »

@ZDS,
l'accès $array[0] est une opération unique (complexité O(1), alors qu'un UBound se fait en comptant tous les éléments du tableau, donc O(n)
Allons, le chuchen te grimperait-il au cervelas :shock:
Mission : faire un modèle B pour prouver ce que tu dis... :P
La cryptographie d'aujourd'hui c'est le taquin plus l'électricité.
Répondre