MergeList.. Une option supplémentaire

Vous avez une idée pour améliorer ou modifier PureBasic ? N'hésitez pas à la proposer.
Avatar de l’utilisateur
Ar-S
Messages : 9472
Inscription : dim. 09/oct./2005 16:51
Contact :

MergeList.. Une option supplémentaire

Message par Ar-S »

Yop.
Si ça ne demande pas trop de boulots, ajouter une option pour lorsque qu'on merge un ou les élément d'une liste vers une autre, ceux-ci restent tout de même dans la 1er liste..
Exemple

Dans le code ci dessous je merge les éléments de B() vers A()...
J'aimerai cependant que les éléments ne disparaissent pas de A().
Un petit flag #PB_List_NoErase par exemple

Code : Tout sélectionner


Macro Sort(Liste,strucname)
SortStructuredList ( Liste, #PB_Sort_Ascending|#PB_Sort_NoCase, OffsetOf(strucname), TypeOf(strucname) )  
EndMacro




Structure Info
  CC.i
EndStructure

Global NewList A.Info() 
Global NewList B.Info() 

; Creation de la liste A
For i = 1 To 5
  AddElement(A())
  A()\CC = Random(5)
Next

; Création de la liste B
For i = 1 To 5
  AddElement(B())
  B()\CC = Random(10,6)
Next

; Trie des 2 listes par ordre croissant
Sort(A(),Info\CC)
Sort(B(),Info\CC)

; On vérifie
Debug "// Liste A() //"
ForEach A()
  Debug A()\CC
Next

Debug "// Liste B() //"
ForEach B()
  Debug B()\CC
Next


; On Merge les éléments de B vers A
ForEach A()
  MergeLists(B(), A(), #PB_List_After)
Next

;Re-Trie
 Sort(A(),Info\CC)

Debug ""
Debug "Après merge des listes"
Debug "// Liste A() //"
ForEach  A()
  Debug a()\CC
Next

Debug "Tout va bien..."
Debug "Mon soucis c'est d'afficher B() à nouveau"
Debug "// Liste B() //"

ForEach B()
  Debug B()\CC
Next

Debug "A puuuu Rien"
Debug "Oui du coup ce code marche comme c'est précisé dans la doc.. C'est là mon soucis :D "
~~~~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
boby
Messages : 261
Inscription : jeu. 07/juin/2007 22:54

Re: MergeList.. Une option supplémentaire

Message par boby »

Code : Tout sélectionner

NewList a()
For a = 1 To 1000
  AddElement(a())
  a() =a
Next
NewList b()
CopyList(a(),b())
ForEach b()
  Debug b()
Next
genre ça ? o_O
Avatar de l’utilisateur
Ar-S
Messages : 9472
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: MergeList.. Une option supplémentaire

Message par Ar-S »

Merci,

Mais non ^^
J'ai même remplacé mergeliste par un simple

Code : Tout sélectionner

ForEach B()
addelements (a())
A() = B()
Next
Mais je voulais juste une option à mergelist afin de ne pas avoir à copier la liste ou à me retaper un Addelement etc
;)

C'est plus une histoire de possibilité de mergelist qui me plairait de voir plutôt qu'un réel problème.
~~~~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
boby
Messages : 261
Inscription : jeu. 07/juin/2007 22:54

Re: MergeList.. Une option supplémentaire

Message par boby »

Ok, donc en fait ce que tu souhaiterais, c'est pouvoir (par exemple) coller ta liste b() à la suite de ta liste a() tout en concervant la possibilité d'utiliser b() à la suite de ton oppération ?

Si c'est ça, je me permet d'exprimer mon avis qui n'est que mon avis et non pas la véritée vrai et absolut.

Celon moi, la fonction mergelist ne fait que donner l'adresse de la liste b() comme element suivant de la liste a() (histoir de ne pas avoir à copier la mémoire, ce qui rend l'oppération extrémement rapide) suite à quoi la fonction supprime l'adresse du premier element de la liste b() à cette même liste pour ne plus la rendre accécible.

Ta demande semble donc très simple à mettre en place, puisqu'il suffit de "zapper" la dernière oppération MAIS :

Celon moi, ça va à l'encontre des principes de purebasic. Je m'explique. PureBasic est un language qui se veut un maximum "noob friendly" hors, ce que tu demande ne l'est absolument pas.

Qu'un utilisateur tente d'accéder à une même liste chainé simultanément via 2 thread plante... Bon... Y'a un moment, si tu fait nimp avec ta mémoire, c'est ton problème.
Le soucis, c'est qu'avec conservation de l'accès aux données de ta liste b() via cette même liste ET en même temps via la liste a() (suite au merge) provoquerai ce même problème alors qu'on demande un accès à 2 liste "différente" (b() faisant partie intégrante de a() suite au mergeliste)

N'étant pas doué pour exprimer clairement ce que je veux dire, je t'ai fait un petit exemple qui devrait être plus parlant :

Code : Tout sélectionner

Global NewList a(),NewList b()
Procedure reada()
  ForEach a()
    Debug "A : " +a()
  Next
EndProcedure

Procedure readb(value)
  ForEach b()
    Debug "B : " +b()
  Next
EndProcedure


For a = 1 To 5
  AddElement(a())
  a() =  a
Next
For a = 5 To 20
  AddElement(b())
  b() = a
Next
ForEach b()
  AddElement(a())
  CopyMemory(@b(),@a(),SizeOf(integer))
Next
CreateThread(@readb(),0)
reada()
Comme tu peux le voir, les résultats sont assé farfelu... Et JE crois que Fred cherche à éviter ce genre de résultats avec les fonctions native de PB.
Avatar de l’utilisateur
Ar-S
Messages : 9472
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: MergeList.. Une option supplémentaire

Message par Ar-S »

Pour dire le pourquoi je voulais faire ceci.
A() = Liste de radios fixe géré par moi. Le prog va la chercher sur le web
B() = User Liste modifiable par l'user

En gros mon lecteur merge les 2 listes pour les afficher d'un bloc ( la liste A() ).
Si l'user décide de virer/ajouter une liste, je ne fais apparaitre que B() pour qu'il fasse ses modifs.
Il y a plusieurs façons de faire, je ne suis pas bloqué.
Selon moi, la fonction mergelist ne fait que donner l'adresse de la liste b() comme element suivant de la liste a() (histoir de ne pas avoir à copier la mémoire, ce qui rend l'oppération extrémement rapide) suite à quoi la fonction supprime l'adresse du premier element de la liste b() à cette même liste pour ne plus la rendre accécible.
Je comprends ce que tu veux dire, reste à voir si c'est ce qui se passe et surtout si la team aurait de quoi rendre cette copie possible via un flag (quitte à utiliser un genre de macro invisible automatisant le ForEach b() : addelement a() : a() = b() : next )

Après tout on est dans "Suggestions et améliorations" et Noël n'est pas si loin :wink:
~~~~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
Marc56
Messages : 2146
Inscription : sam. 08/févr./2014 15:19

Re: MergeList.. Une option supplémentaire

Message par Marc56 »

Dans le même style (jouer avec les listes) :mrgreen:

À un moment, j'ai refais une grande partie de mon media player en me disant que ce serait mieux d'utiliser des Maps plutôt que des Listes car justement je pourrais fusionner plusieurs listes sans avoir de doublons. J'ai passé 2H à refaire toute la partie liste, puis j'ai lancé et... :o toutes mes listes étaient en désordre. ? 8O alors que j'ai commencé un système pour que l'utilisateur puisse les trier :oops:
Jamais encore utilisé des Maps avec PB :( alors je relis la doc:
Map: « L'ordre d'insertion des éléments n'est pas conservé (contrairement à une liste), une map ne peut donc pas être triée. » :roll:
Retour en arrière (heureusement je backup tout le dossier à chaque gros changement) :)

:wink:
Ollivier
Messages : 4190
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: MergeList.. Une option supplémentaire

Message par Ollivier »

@Marc56

ça dépend de ce qu'on trie. Les maps me donnent des vertiges dans le sens où la création de données est simplissime. Par contre, la gestion et la suppression de données, c'est difficile.

C'est-à-dire qu'une map permet de faire n'importe quoi et d'offrir l'accès à l'utilisateur si nécessaire. On peut faire des tableaux multi-dimensionnels, des listes. On peut faire un tableau spatio-temporel : imbouffable à schématiser. On peut faire un tableau en forme de panier de basket ou les noeuds sont des cases de données.

Bref, ça peut glisser vite comme une savonnette à la mousson.

Pourtant, avec rigueur, une map, ça permet le tri. Et c'est le but : accéder à une seule donnée, à partir d'une chaîne, et en un temps record.

Cette chaîne d'accès peut être comme un chemin de répertoire. Et, au lieu de déboucher sur une chaîne, ça peut déboucher sur un pointeur. Libre ensuite de pointer des listes, des tableaux ou des buffers mémoire selon les besoins.

Ce sont apparemment des sons que tu tries, pas la gestion des données.
Ollivier
Messages : 4190
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: MergeList.. Une option supplémentaire

Message par Ollivier »

@ArS

peut-être copier ta demande, le plus simplement possible dans la section wishlist du site us/en.

Tu souhaites juste une option où MergeLists peut ne pas effacer la liste source.
Avatar de l’utilisateur
Ar-S
Messages : 9472
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: MergeList.. Une option supplémentaire

Message par Ar-S »

Probablement.
Je m'en occuperai ;)
~~~~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
Répondre