Page 1 sur 1

Lire contenu d'une liste

Publié : ven. 24/juin/2022 23:55
par Stephane
Bonjour
Je m'initie à PureBasic
Dans le code suivant je créé une liste dont chaque élément contient une structure dont un element est une liste structurée (Je découvre la terminologie PB mais reprenez moi si c est incorrect merci)

Code : Tout sélectionner

Structure Indicateurs 
    EUR.d
    USD.d
    GBP.d
EndStructure
  
Structure Barre
  Ladate.i
  List Indics.Indicateurs()
EndStructure


NewList Barres.Barre()

;---La première BARRE
AddElement(Barres())
Barres()\Ladate = 123456
AddElement(Barres()\Indics())
Barres()\Indics()\EUR=123
Barres()\Indics()\USD=456
Barres()\Indics()\GBP=789

;---Pour toutes les barres suivantes
AddElement(Barres())
Barres()\Ladate = 456789
ClearList(Barres()\Indics())
AddElement(Barres()\Indics())
Barres()\Indics()\EUR=987
Barres()\Indics()\USD=654
Barres()\Indics()\GBP=321

Debug("Taille de la liste "+Barres()\Ladate)
Debug("Taille de la liste "+Barres()\Indics()\EUR)
Je remplis correctement la liste (enfin comme je le souhaite mais si autre façon de procéder, je suis ouvert à tout)
Je lis correctement le dernier enregistrement

Mon pb est que si je veux lire par exemple l enregistrement 0, j ai une erreur ici Barres(0)\Ladate
Donc, comment pouvoir accéder à n importe quelle ligne de ma liste structurée ainsi.

J ai privilégié cette structure car je souhaite trier par ordre croissant la liste Indics pour la barre que j aurai sélectionné. Avec l'aide ici https://www.purebasic.com/french/docume ... dlist.html je devrais y arriver mais je souhaite récupérer le nom EUR, USD ou GBP et la valeur qui lui est associée pour la première position de la liste triée.

Pouvez vous m indiquer comment faire s il vous plait car je ne vois absolument pas. Ma structure est elle la bonne pour ce que je souhaite réaliser ?

Merci pour votre aide


J ai cherché dans les raccourcis de l IDE sans trouver. Existe t il u n raccourci pour reformater le code (tabulations, espaces etc) ou la possibilité de le faire automatiquement à la sauvegarde ? Merci pour ça aussi ;-)

Re: Lire contenu d'une liste

Publié : sam. 25/juin/2022 9:35
par Mesa
Pour la sélection d'un élément d'une liste, on dirait que tu veux utiliser une liste comme un tableau, avec un indice directement dans les parenthèses.

Mais les listes ne fonctionnent pas comme ça en PB, il faut utiliser des fonctions dédiées, comme SelectElement(), ChangeCurrentElement(), etc..

Le code ci-dessous devrait t'éclairer.

Code : Tout sélectionner


Structure Indicateurs 
    EUR.d
    USD.d
    GBP.d
EndStructure
  
Structure Barre
  Ladate.i
  List Indics.Indicateurs()
EndStructure


NewList Barres.Barre()

;---La première BARRE
AddElement(Barres())
Barres()\Ladate = 123456
AddElement(Barres()\Indics())
Barres()\Indics()\EUR=123
Barres()\Indics()\USD=456
Barres()\Indics()\GBP=789

;---Pour toutes les barres suivantes
AddElement(Barres())
Barres()\Ladate = 456789
; ClearList(Barres()\Indics()); nom car c'est une nouvelle liste
AddElement(Barres()\Indics())
Barres()\Indics()\EUR=987
Barres()\Indics()\USD=654
Barres()\Indics()\GBP=321

;Selection de l'élément 0
;------------------------
SelectElement(Barres(),0)
Debug(" "+Barres()\Ladate)

;Selection de l'élément 1
;------------------------
SelectElement(Barres(),1)
Debug(" "+Barres()\Ladate)

;Selection de l'élément précédent
;--------------------------------
PreviousElement(Barres())
Debug(" "+Barres()\Ladate)

;Cas particuliers...

;Selection de l'élément suivant
;--------------------------------
NextElement(Barres())
Debug(" "+Barres()\Ladate)

;Selection du premier élément
;--------------------------------
FirstElement(Barres())
Debug(" "+Barres()\Ladate)

;Selection du dernier élément
;--------------------------------
LastElement(Barres())
Debug(" "+Barres()\Ladate)

M.

Re: Lire contenu d'une liste

Publié : sam. 25/juin/2022 9:39
par Mesa
Pour le tri, les listes sont triées de façon stable, voir ici:
https://www.purebasic.com/french/docume ... index.html
Les listes structurées sont triées avec la méthode Mergesort qui est de type stable, ce qui veut dire que si vous triez suivant un champs, les autres champs ne sont pas touchés, ainsi si vous commencez par trier une liste structurée par un champs "titre" et ensuite par un champs "album", vous obtiendrez une liste qui est triée par album et chaque album est trié par titres.
Par contre le tri des tableaux structurés ou non, utilise la méthode Quicksort qui est instable, c'est-à-dire que le tri sur la clé secondaire est perdu.

Code : Tout sélectionner

Structure Indicateurs 
    Nom.s
    Valeur.d
EndStructure
  
Structure Barre
	Ladate.i
	List Indics.Indicateurs()
EndStructure


NewList Barres.Barre()

;---La première BARRE
AddElement(Barres())
Barres()\Ladate = 123456
AddElement(Barres()\Indics())
Barres()\Indics()\Nom ="EUR" 
Barres()\Indics()\Valeur=123
AddElement(Barres()\Indics())
Barres()\Indics()\Nom ="USD"
Barres()\Indics()\Valeur=456
AddElement(Barres()\Indics())
Barres()\Indics()\Nom ="GBP"
Barres()\Indics()\Valeur=789

;---Pour toutes les barres suivantes
AddElement(Barres())
Barres()\Ladate = 456789
AddElement(Barres()\Indics())
Barres()\Indics()\Nom ="EUR" 
Barres()\Indics()\Valeur=111
AddElement(Barres()\Indics())
Barres()\Indics()\Nom ="USD"
Barres()\Indics()\Valeur=222
AddElement(Barres()\Indics())
Barres()\Indics()\Nom ="GBP"
Barres()\Indics()\Valeur=333

;Selection de l'élément 0
;------------------------
SelectElement(Barres(),0)

;tri des indics
SortStructuredList(Barres()\Indics(),#PB_Sort_Ascending,OffsetOf(Indicateurs\Nom),TypeOf(Indicateurs\Nom))
Debug("date "+Barres()\Ladate)
ForEach Barres()\Indics()
	Debug Barres()\Indics()\Nom + " = " +Barres()\Indics()\Valeur
Next
Debug "---------------"


;LE TRI EST STABLE = on peut faire des "sous-tris"
;Par exemple, 1er tri des dates de la plus grande à la plus petite
SortStructuredList(Barres(),#PB_Sort_Descending,OffsetOf(Barre\Ladate),TypeOf(Barre\Ladate))
;puis 2ieme tri alphabétique sur le nom des monnaies
SortStructuredList(Barres()\Indics(),#PB_Sort_Ascending,OffsetOf(Indicateurs\Nom),TypeOf(Indicateurs\Nom))
ForEach Barres()
	Debug("date "+Barres()\Ladate)
	ForEach Barres()\Indics()
	Debug Barres()\Indics()\Nom + " = " +Barres()\Indics()\Valeur
Next
Next
M.

Re: Lire contenu d'une liste

Publié : sam. 25/juin/2022 13:29
par Stephane
Merci pour toutes ces précisions.
Effectivement je tentais une approche PASCAL sur une liste PUREBASIC...
Tout est clair.

Dernière question mais existe t il une combinaison de touches (j ai pas trouvé dans les raccourcis) pour formater le code dans l IDE ?

Merci encore

Stéphane

Re: Lire contenu d'une liste

Publié : sam. 25/juin/2022 16:38
par Ollivier
[Ctrl]+[A] : selectionne tout
[Ctrl]+[ I] : remet le pâté dans l'assiette