[RESOLU]Entre Structrure et DIM

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
omega
Messages : 636
Inscription : sam. 26/nov./2011 13:04
Localisation : Alger

[RESOLU]Entre Structrure et DIM

Message 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
Dernière modification par omega le dim. 24/mars/2013 12:23, modifié 1 fois.
Win7 (x64)
Pb 6.03 LTS
Avatar de l’utilisateur
Ar-S
Messages : 9546
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Entre Structrure et DIM

Message 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.
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
falsam
Messages : 7334
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Entre Structrure et DIM

Message 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  
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
omega
Messages : 636
Inscription : sam. 26/nov./2011 13:04
Localisation : Alger

Re: Entre Structrure et DIM

Message 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
Win7 (x64)
Pb 6.03 LTS
Avatar de l’utilisateur
falsam
Messages : 7334
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Entre Structrure et DIM

Message 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.
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
falsam
Messages : 7334
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Entre Structrure et DIM

Message 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
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Entre Structrure et DIM

Message 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
Avatar de l’utilisateur
Ar-S
Messages : 9546
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Entre Structrure et DIM

Message 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.
Dernière modification par Ar-S le mer. 20/mars/2013 15:14, modifié 1 fois.
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
falsam
Messages : 7334
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Entre Structrure et DIM

Message 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()
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
falsam
Messages : 7334
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Entre Structrure et DIM

Message par falsam »

Un dernier exemple pour le plaisir (Au moins le mien :mrgreen: )

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
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
omega
Messages : 636
Inscription : sam. 26/nov./2011 13:04
Localisation : Alger

Re: Entre Structrure et DIM

Message 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
Win7 (x64)
Pb 6.03 LTS
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Entre Structrure et DIM

Message 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
Avatar de l’utilisateur
falsam
Messages : 7334
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Entre Structrure et DIM

Message par falsam »

Pour compléter la réponse de Dobro, une petite procédure pour tester la mémoire encore disponible :mrgreen:

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"
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
omega
Messages : 636
Inscription : sam. 26/nov./2011 13:04
Localisation : Alger

Re: Entre Structrure et DIM

Message 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
Win7 (x64)
Pb 6.03 LTS
Avatar de l’utilisateur
falsam
Messages : 7334
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Entre Structrure et DIM

Message 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"
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Répondre