Page 1 sur 2
[RESOLU]Entre Structrure et DIM
Publié : mer. 20/mars/2013 13:53
par omega
Bonjour
Pour la 1ère fois, je viens d'utiliser la méthode Structure/EndStructure grâce à Falsam qui m'a aidé pour trier le contenu de mon ListIconGadget. C'est une bonne chose. Mais ce que je voudrais savoir, quelle est la différence entre cette méthode et l'utilisation d'un tableau.
Exemple: je veux afficher une liste de noms avec leur âges
1) 1ère méthode:
Code : Tout sélectionner
global DIM MaListe_Nom.s(100), Dim MaListeAge(100)
;Une fois remplie, je peux lister mes données de cette manière:
for i=1 to 100
debug MaListe_Nom(i) + " "+ MaListe_Age(i)
next i
2) 2ème méthode:
Code : Tout sélectionner
Structure Personne
Nom.s
Age.s
EndStructure
NewList MaListe.Personne()
;Une fois remplie, je peux lister mes données de cette manière:
ForEach(MaListe())
Debug MaListe()\Nom + " " + MaListe()\Age
Next
A part la possibilité de faire un tri (quand il s'agit d'une liste), quand faut-il utiliser l'une ou l'autre de ces 2 méthodes? et quelle est la différence entre les deux??
Merci
Re: Entre Structrure et DIM
Publié : mer. 20/mars/2013 13:58
par Ar-S
Je dirait qu'on s'en fou.
L'intérêt de ForEach est qu'on a pas à savoir le nombre d'élément dans la list. Il liste tout.
Ton For Next te permet de parcourir la list d'un élément x à un élément y.
Re: Entre Structrure et DIM
Publié : mer. 20/mars/2013 14:05
par falsam
Dans ton exemple le résultat est équivalent. Par contre la structure reste plus explicite dans sa définition même et plus agréable à exploiter.
Tu peux aussi combiner structure et tableau
Code : Tout sélectionner
;Tri / Sort structure
Structure Potager
Cle.s
Nom.s
Famille.s
EndStructure
Dim MonPanier.Potager(4)
MonPanier(0)\Cle="010910"
MonPanier(0)\Nom="Pomme"
MonPanier(0)\Famille="Fruit"
MonPanier(1)\Cle="090801"
MonPanier(1)\Nom="Concombre"
MonPanier(1)\Famille="Legume"
MonPanier(2)\Cle="010909"
MonPanier(2)\Nom="Peche"
MonPanier(2)\Famille="Fruit"
MonPanier(3)\Cle="021010"
MonPanier(3)\Nom="Tomate"
MonPanier(3)\Famille="Legume"
MonPanier(4)\Cle="010710"
MonPanier(4)\Nom="Abricot"
MonPanier(4)\Famille="Fuit"
;Tri / Sort Structure
SortStructuredArray(MonPanier(), #PB_Sort_Ascending|#PB_Sort_NoCase, OffsetOf(Potager\Nom), #PB_Sort_String)
;Test
For i=0 To 4
Debug Monpanier(i)\Nom
Next
Re: Entre Structrure et DIM
Publié : mer. 20/mars/2013 14:15
par omega
Salut Falsam (c'est un bonheur de te retrouver toujours présent comme d'habitude)
Salut à toi aussi Ar-s
Bon, j'ai compris, mais il reste un point à préciser:
Existe t-il une limite d'éléments dans les structures et les listes?
Je m'explique: Quand on fait
Structure MaStructure
nom.s
age.s
...
...(combien peut on ajouter ici de champs au maximum?)
...
EndStructure
Et la aussi:
NewList MaList.MaStructure
Quel est le nombre maximum d'éléments qu'on peut ajouter ? (C'es le nbre de AddElement())
Merci
Re: Entre Structrure et DIM
Publié : mer. 20/mars/2013 14:18
par falsam
omega a écrit :Existe t-il une limite d'éléments dans les structures et les listes?
je pense que la seule limite est la taille de ta mémoire vive.
Re: Entre Structrure et DIM
Publié : mer. 20/mars/2013 14:20
par falsam
Encore un exemple pour te montrer pourquoi j'aime les structures.
L'exemple a pour objectif de créer un Annuaire de nom.
Pour chaque nom on veut ajouter un ou plusieurs numéro de téléphone.
Code : Tout sélectionner
Structure Contact
Nom.s
List Telephone.s()
EndStructure
;Création d'un annuaire ayant comme modéle la structure contact
NewList Annuaire.Contact()
;Ajout de Pierre jean et de ces deux numéro de téléphone
AddElement(Annuaire()) ;Ajout d'un emplacement vide
Annuaire()\Nom = "Pierre jean"
AddElement(Annuaire()\Telephone())
Annuaire()\Telephone() ="0632256565"
AddElement(Annuaire()\Telephone())
Annuaire()\Telephone() ="0145869696"
;Ajout de Jean Delab et de ces deux numéro de téléphone
AddElement(Annuaire()) ;Ajout d'un emplacement vide
Annuaire()\Nom = "Jan Delab"
AddElement(Annuaire()\Telephone())
Annuaire()\Telephone() ="0265859898"
;Résultat
ForEach Annuaire()
Debug Annuaire()\Nom
ForEach Annuaire()\Telephone()
Debug " -Tél : " + Annuaire()\Telephone()
Next
Next
Re: Entre Structrure et DIM
Publié : mer. 20/mars/2013 14:28
par Backup
je voudrai juste ajouter 2 choses
1- il n'est point besoin de donner 2 noms différents au moment de la declaration
ex :
Code : Tout sélectionner
Structure Personne
Nom.s
Age.s
EndStructure
NewList Personne.Personne() ; << plus simple a retenir ;)
2- une structure peut servir pour une seule variable !!
on est pas obligé de passer par un tableau ou une liste chainée
exemple
Code : Tout sélectionner
Structure Personne
Nom.s
Age.i
EndStructure
Personne.Personne
; Affectation de ma variable structuré
Personne\Nom.s="Trucmuch"
Personne\Age.i=25
; voila on a donc une variable ayant plusieurs Champs :)
; lorsqu'on veut conaitre le champ "age"
; il suffit de faire
debug "il a "+ str(Personne\Age.i)+" ans"
ça permet d'utiliser une variable mais avec des champs

.. tres pratique
Re: Entre Structrure et DIM
Publié : mer. 20/mars/2013 15:01
par Ar-S
Dobro a écrit :
Code : Tout sélectionner
Structure Personne
Nom.s
Age.s
EndStructure
NewList Personne.Personne() ; << plus simple a retenir ;)
Carrément d'accord. D'ailleurs je finis par m'embrouiller systématiquement si je mets 2 noms différents.
Re: Entre Structrure et DIM
Publié : mer. 20/mars/2013 15:06
par falsam
@Drobro & Ar-s je suis d'accord avec vous. C'est juste une question de gout dans la manière de coder.
Un exemple simple quand on veut créer une liste
Clients et
Fournisseurs ayant la meme structure
Contact
Code : Tout sélectionner
Structure Contact
Nom.s
Adresse.s
Telephone.s
EndStructure
NewList Clients.Contact()
NewList Fournisseurs.Contact()
Re: Entre Structrure et DIM
Publié : mer. 20/mars/2013 16:16
par falsam
Un dernier exemple pour le plaisir (Au moins le mien

)
j'ai repris l'exemple de l'annuaire d'amis qui ne permettait d'enregistrer que des numéro de téléphones avec les spécifications suivantes :.
-Création d'une
structure Contact
Un
contact possède
0 à
N moyens de contact
-Création de la structure
Moyen de contact .
Un moyen de contact est composé de
-Un moyen ((
Téléphone fixe, Cellulaire, Mail, Facebook, Twitter, etc ...))
-Une valeur (
Un numéro de téléphone, un email, etc ...)
Une liste des moyens de contact sera imbriquée pour chaque contact.
Pour plus de clarté dans le code, on utilisera les blocs
With : EndWith mais ATTENTION : Les blocs With : EndWith ne peuvent pas être imbriqués.
Code : Tout sélectionner
;Chaque moyen de contact aura la structure suivante
Structure UnMoyenDeContact
Moyen.s ;Cellulaire, Fixe, Email, Etc ....
Valeur.s ;Numéro de telephone ou n'importe quel libéllé
EndStructure
;Chaque contact aura la structure suivante
Structure UnContact
Nom.s
List MoyenDeContact.UnMoyenDeContact()
EndStructure
;Création d'un annuaire
;Chaque élément de cet annuaire aura pour structure UnContact
NewList Annuaire.UnContact()
;Ajout de Pierre jean et de ces trois moyen de le contacter
AddElement(Annuaire())
With Annuaire()
\Nom = "Pierre Jean"
AddElement(\MoyenDeContact())
\MoyenDeContact()\Moyen = "Cellulaire"
\MoyenDeContact()\Valeur = "0632235656"
AddElement(\MoyenDeContact())
\MoyenDeContact()\Moyen = "Fixe"
\MoyenDeContact()\Valeur = "0532255655"
AddElement(\MoyenDeContact())
\MoyenDeContact()\Moyen = "E-Mail"
\MoyenDeContact()\Valeur = "pierre.jean@gmail.com"
EndWith
;Ajout de Jean Delab et de son numéro de téléphone
AddElement(Annuaire())
With Annuaire()
\Nom = "Jean Delab"
AddElement(\MoyenDeContact())
\MoyenDeContact()\Moyen = "Fixe"
\MoyenDeContact()\Valeur = "0456868686"
EndWith
;Résultat
ForEach Annuaire()
Debug Annuaire()\Nom
ForEach Annuaire()\MoyenDeContact()
Debug " - " + Annuaire()\MoyenDeContact()\Moyen + " = " + Annuaire()\MoyenDeContact()\Valeur
Next
Next
Re: Entre Structrure et DIM
Publié : jeu. 21/mars/2013 8:12
par omega
C'est bien beau tout ça, merci beaucoup...ça me rassure et ça commence à m'intéresser de plus en plus cette histoire de liste chaînée.. c'est amusant...
mais... personne n'a répondu à ma 2ème question (qui est d'ailleurs très importante pour moi)
Y a t-il une limite dans AddElement()?
Cela dépend aussi de ma mémoire vive?
Merci
Re: Entre Structrure et DIM
Publié : jeu. 21/mars/2013 11:46
par Backup
omega a écrit :
Y a t-il une limite dans AddElement()?
Cela dépend aussi de ma mémoire vive?
Merci
ben oui
Re: Entre Structrure et DIM
Publié : jeu. 21/mars/2013 11:55
par falsam
Pour compléter la réponse de Dobro, une petite procédure pour tester la mémoire encore disponible
Code : Tout sélectionner
EnableExplicit
Procedure.q GetFreeMemory()
Protected Library = OpenLibrary(#PB_Any, "kernel32.dll")
Protected mem.MEMORYSTATUS, memex.MEMORYSTATUSEX
Protected *Function, Result.q
If Library
If OSVersion() >= #PB_OS_Windows_2000
memex\dwLength = SizeOf(MEMORYSTATUSEX)
*Function = GetFunction(Library, "GlobalMemoryStatusEx")
If *Function And CallFunctionFast(*Function, @memex)
Result = memex\ullAvailPhys
EndIf
Else
mem\dwLength = SizeOf(MEMORYSTATUS)
*Function = GetFunction(Library, "GlobalMemoryStatus")
If *Function And CallFunctionFast(*Function, @mem)
Result = mem\dwAvailPhys
EndIf
EndIf
CloseLibrary(Library)
EndIf
ProcedureReturn Result
EndProcedure
Debug StrD(GetFreeMemory() / 1048576, 1)+" MB"
Re: Entre Structrure et DIM
Publié : jeu. 21/mars/2013 12:33
par omega
Ta procédure est-elle différente de celle-ci?
Code : Tout sélectionner
Procedure GetMemorySize()
GlobalMemoryStatus_(Memory.MEMORYSTATUS)
wRam$=Str(1+Memory\dwTotalPhys/1024/1024) + " Mo"
Debug wRam$
EndProcedure
;Test
GetMemorySize()
;Résulalt =959 Mo
Ta procédure me donne:648 Mo
Je suppose que 648Mo est la mémoire disponible??(comme indiqué au début de ton code?)
De toute façon, je ne sais pas encore quelle est la relation (ou la formule)
pour deviner le maximum d'éléments d'une liste chaînée (en sachant la valeur de la mémoire)
Merci
Re: Entre Structrure et DIM
Publié : jeu. 21/mars/2013 13:24
par falsam
Ta procédure ne me fourni du tout le même résultat que le gestionnaire de tache.
omega a écrit :Je ne sais pas encore quelle est la relation (ou la formule)
pour deviner le maximum d'éléments d'une liste chaînée (en sachant la valeur de la mémoire)
Un indice peut être
Code : Tout sélectionner
Structure Test
field1.s
field2.s
field3.s
EndStructure
Debug Str(SizeOf(Test)) + " Octets"