AutoIt Français

Nouveau forum : http://www.autoitscript.fr/
 
AccueilFAQRechercherS'enregistrerMembresGroupesConnexionhttp://www.autoitscript.fr

Partagez | 
 

 tableau dynamique a partir d'un tableau statique

Voir le sujet précédent Voir le sujet suivant Aller en bas 
AuteurMessage
ClemTB
Débutant
Débutant


Nombre de messages : 11
Date d'inscription : 03/07/2007

MessageSujet: tableau dynamique a partir d'un tableau statique   2007-07-04, 20:08

Bon l'interet est tres théorique mais ce script peut se reveler utile dans l'implémentation d'une pile ou d'un tas.

Je vais mettre la version améliorée pour l'insertion ici. Il utilise la librairie math include dans la version de base de AutoIt donc devrai pas y avoir de probleme (au pire suffit de re ecrire la fonction _Min($n1,$n2) ...
Par contre pour la librairie array ... si vous lavez pas tant pis :p

J'ai des temp assez correctes (90ms pour inserer 1000 elements, temps d'acces maximum vu 0,06ms et temps pour vider min pour vider le tableau 47ms) vu grace à la fonction de test



#include-once
#include
#include
;************************************************************************
;* Auteur: ClemTB
;* Date: 04/07/2007
;* Pays:France
;*
;* Description:
;* Script contenant le minimum vital pour implémenter
;* un tableau dynamique a partir d'un tableau statique.
;*
;* Fonctions diponibles:
;* getListe($position) :retrouve un element O(n)
;* addElement($element) :ajoute un elementen debut de chaine O(1)
;* deleteElement($position) :supprime un element dans la liste O(n)
;*
;* Commentaire:
;* Je l'ai commenté du mieu que je pouvait.
;*
;*************************************************************************
;tableau de contenu 10000 enregistrements ca devrai suffire non?
Global $__Listechainee_maxEnregistrements = 1000
Global $__Listechainee_tableContenu[$__Listechainee_maxEnregistrements]
;tableau de pointeurs
Global $__Listechainee_tablePointeurs[$__Listechainee_maxEnregistrements]
Global $__Listechainee_nbEnregistrement = 0
Global $__Listechainee_debut = 0
Global $__Listechainee_minInsertion = 0

;test
test()
func test()
$begin = TimerInit()
getListe(0) ;retourne une erreur dans la Console
ConsoleWrite("temp:"&TimerDiff($begin)&@CRLF)
getListe(1) ;retourne une erreur dans la Console
$begin = TimerInit()
deleteElement(0) ;retourne une erreur dans la Console
ConsoleWrite("temp:"&TimerDiff($begin)&@CRLF)
deleteElement(1) ;retourne une erreur dans la Console
deleteElement(2) ;retourne une erreur dans la Console

$begin = TimerInit()
addElement("premier element inseré") ;insere un premier element
ConsoleWrite("temp insertion du premier element:"&TimerDiff($begin)&@CRLF)
ConsoleWrite("premier element:"&getListe(0)&chr(13)) ;devrai afficher la premiere valeur
$begin = TimerInit()
deleteElement(0) ;suprime le premier element
ConsoleWrite("temp suppression du premier element:"&TimerDiff($begin)&@CRLF)
ConsoleWrite("null ? -> "&getListe(0)&chr(13)) ;retourne une erreur dans la Console et affiche 0(=NON)
;la boucle insere des elements dans tout le tableau et devrai generer une erreur pour le dernier element
$begin = TimerInit()
for $i=0 to $__Listechainee_maxEnregistrements
if mod($i,100) = 0 then ConsoleWrite("insertion n°"&$i&chr(13))
addElement("element inseré N°"&$i)
Next
ConsoleWrite("temp insertion de tous les elements:"&TimerDiff($begin)&@CRLF)
;lit tous les element (devrai les afficher dans l'ordre décroissant)
for $i=0 to $__Listechainee_maxEnregistrements-1
if mod($i,100) = 0 then ConsoleWrite("lecture n°"&$i&" -> "&getListe($i)&chr(13))
Next

$begin = TimerInit()
deleteElement(0) ;supprime le premier element
ConsoleWrite("temp suppression tableau plein:"&TimerDiff($begin)&@CRLF)

;devrai afficher $__Listechainee_maxEnregistrements-2
$begin = TimerInit()
ConsoleWrite("lecture n°0 -> "&getListe(0)&chr(13))
ConsoleWrite("temp access premier element tableau plein:"&TimerDiff($begin)&@CRLF)

;ajoute un element en debut
$begin = TimerInit()
addElement("Re ajout")
ConsoleWrite("temp insertion tableau plein:"&TimerDiff($begin)&@CRLF)

;devrai afficher "Re ajout"
ConsoleWrite("lecture n°0 -> "&getListe(0)&chr(13))

;devrai afficher "element inseré N°0"
$begin = TimerInit()
ConsoleWrite("lecture n°0 -> "&getListe($__Listechainee_maxEnregistrements-1)&chr(13))
ConsoleWrite("temp lecture dernier element avec tableau plein:"&TimerDiff($begin)&@CRLF)

;supprime le dernier element
$begin = TimerInit()
deleteElement($__Listechainee_maxEnregistrements-1)
ConsoleWrite("temp suppression dernier element avec tableau plein:"&TimerDiff($begin)&@CRLF)

;vidage du tableau par le premier element, genere une erreur pour le dernier element
$begin = TimerInit()
for $i=0 to $__Listechainee_maxEnregistrements-1
if mod($i,100) = 0 then ConsoleWrite("suppression n°"&$i&chr(13))
deleteElement(0)
Next
ConsoleWrite("temp vidage tableau:"&TimerDiff($begin)&@CRLF)

endfunc

;fonction d'acces
func getListe($position)
;position en dehors du tableau = erreur
if $position >= $__Listechainee_nbEnregistrement or $position < 0 Then
return __ListeChaineeErreur(1,"Position en dehors du tableau")
EndIf
;init du parcours
$parcoursPointeur = $__Listechainee_debut
$parcoursPosition = 0
;parcours du tableau jsuqu'a la valeur qu'on cherche
while $parcoursPosition < $position
$parcoursPointeur = $__Listechainee_tablePointeurs[$parcoursPointeur]
$parcoursPosition += 1
wend
return $__Listechainee_tableContenu[$parcoursPointeur]
EndFunc
;fonction d'ecriture
func addElement($element)
;si le tableau est plein on plante
if $__Listechainee_maxEnregistrements < $__Listechainee_nbEnregistrement Then
return __ListeChaineeErreur(2,"Tableau plein")
EndIf

if $element = "" Then
return __ListeChaineeErreur(2,"Ajout d'un element interdit")
EndIf

;init du parcours
$parcoursPosition = $__Listechainee_minInsertion
;parcours du tableau jusqu'a la fin ou jusqu'a ce qu'on tombe sur un element vide
while $parcoursPosition < $__Listechainee_maxEnregistrements and (not $__Listechainee_tableContenu[$parcoursPosition] = "")
$parcoursPosition += 1
wend
;si on est arrivés a la fin du tableau ... ben erreur.. mais ca devrai pas arriver normalement
if $parcoursPosition >= $__Listechainee_maxEnregistrements Then
return __ListeChaineeErreur(2,"Tableau plein")
EndIf
;sinon on est tombé sur un element vide !! super on insert notre maillon 1
;enregistrement de l'element
$__Listechainee_tableContenu[$parcoursPosition] = $element
;mise en place du chainage
$__Listechainee_tablePointeurs[$parcoursPosition] = $__Listechainee_debut
;initialisation du debut
$__Listechainee_debut = $parcoursPosition
;positionnement de l'element le plus loin (non fragmenté)
$__Listechainee_minInsertion = $parcoursPosition
;incrément du décompte
$__Listechainee_nbEnregistrement += 1
return 1
Endfunc

;suppression d'un element
func deleteElement($position)
;position en dehors du tableau = erreur
if $position > $__Listechainee_nbEnregistrement or $position < 0 or $__Listechainee_nbEnregistrement = 0 Then
return __ListeChaineeErreur(3,"Position en dehors du tableau")
EndIf

IF $position = 0 then
$__Listechainee_tableContenu[$__Listechainee_debut] = ""
$__Listechainee_debut = $__Listechainee_tablePointeurs[$__Listechainee_debut]
$__Listechainee_nbEnregistrement -= 1
$__Listechainee_minInsertion = 0
return 1
EndIf

;init du parcours
$parcoursPointeur = $__Listechainee_debut
$parcoursPosition = 0
;parcours du tableau jsuqu'a la valeur qu'on cherche
while $parcoursPosition+1 < $position
$parcoursPointeur = $__Listechainee_tablePointeurs[$parcoursPointeur]
$parcoursPosition += 1
wend

;decalage
$__Listechainee_tableContenu[$parcoursPointeur] = ""
$__Listechainee_tablePointeurs[$parcoursPointeur] = $__Listechainee_tablePointeurs[$__Listechainee_tablePointeurs[$parcoursPointeur]]
$__Listechainee_nbEnregistrement -= 1
$__Listechainee_minInsertion = _Min($parcoursPointeur,$__Listechainee_minInsertion)
return 1
Endfunc

;centralisation des erreurs
func __ListeChaineeErreur($IDFuncError,$message)
;aucun traitement pour l'instant
ConsoleWrite($message&chr(10)&chr(13))
return 0
EndFunc
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
ani
Modérateur
Modérateur


Nombre de messages : 563
Date d'inscription : 23/01/2007

MessageSujet: Re: tableau dynamique a partir d'un tableau statique   2007-07-05, 15:40

Excellent ClemTB , j'adore ,, super rapide

grand merci

et pour ceux qui voudrait y mettre de la couleur dans la petite console voici quelque une d'entre elle si vous en avez d'autre merci de me faire parvenir un petit message pour editer celui-ci , merci d'avance à tout participant.

consolewrite(">Bleu"& @CR&"-Orange"& @CR&"+Vert"& @CR & "!Rouge" & @CR )
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
 
tableau dynamique a partir d'un tableau statique
Voir le sujet précédent Voir le sujet suivant Revenir en haut 
Page 1 sur 1
 Sujets similaires
-
» Mon tableau à onglet dépasse du tableau de la page d'acceuil
» Afficher le tableau avec les codes couleurs etc dans le message d'acceuil
» [Annulée] Une sorte de "tableau" dans un Message
» Arret d'un tableau horaire..
» [Phanta] Commande d'un tableau d'accueil pour mettre dans un widget du portail

Permission de ce forum:Vous ne pouvez pas répondre aux sujets dans ce forum
AutoIt Français :: AutoIt v3 :: Scripts-
Sauter vers: