Page 1 sur 1
(Shared) Partager une LinkedList
Publié : jeu. 22/janv./2009 3:47
par pure444
Salut, c'est mon premier post, et je trouve ce forum genial.
Je n'aime pas avoir trop de procedures dans mes programmes, mais je veux qu'elles soient complètes et que incorporent un maxi de code, malgé les pertes de vitesse.
Alors j'ai un petit probleme en partager une LinkedList situé dans une procedure
Le mot clef Shared ne fontionne pas correctement dans le code N.2
Code N.1 (le programme fonctionne bien avec Global)
Structure Animal
Nom.s
Vitesse.l
EndStructure
Global NewList Animaux.Animal()
Procedure ColAnimal(Nom.s,Vitesse,Flags.b=0, INFOFlags_GetElementByNom1_SortByNom2_SortByVitesse3_ClearCollection99.b=0)
If flags=99: ClearList(Animaux()):EndIf;éffacer la collection
If flags=1; trouver un animal
;*Ancien_Element = @MaListe() ; On mémorise l'adresse de l'élément courant
ResetList(Animaux()) ; Effectue une recherche de tous les éléments nommés
While NextElement(Animaux()) And (Animaux()\Nom <> Nom):Wend
;ChangeCurrentElement(MaListe(), *Ancien_Element) ; Restitue l'ancien élément courant (mémorisé avant la recherche)
Else
If Len(nom)
AddElement(Animaux())
Animaux()\Nom = nom
Animaux()\Vitesse = Vitesse
EndIf
EndIf
If flags=2
SortStructuredList(Animaux(), #PB_Sort_Ascending, OffsetOf(Animal\Nom), #PB_Sort_String)
ElseIf flags=3
SortStructuredList(Animaux(), #PB_Sort_Ascending, OffsetOf(Animal\Vitesse), #PB_Sort_Long)
EndIf
EndProcedure
;Ajouter les animaux et respectives vitesses dans la collection
ColAnimal ("tigre",59)
ColAnimal ("lion",49)
ColAnimal ("chat",539)
ColAnimal ("lievre",549)
ColAnimal ("girafe",259)
ColAnimal ("souris",5)
ColAnimal ("vache",39)
ColAnimal ("lapin",59,3); ajoute le lapin et fait un trie des vitesses
ForEach Animaux():Debug Animaux()\Nom+" - Vitesse : "+Str(Animaux()\Vitesse):Next
ColAnimal ("girafe",0,1); rechercher la vitesse de la girafe
Debug Animaux()\Vitesse
Code N.2 (Shared provoque une erreur)
Procedure ColAnimal(Nom.s,Vitesse,Flags.b=0, INFOFlags_GetElementByNom1_SortByNom2_SortByVitesse3_ClearCollection99.b=0)
Static Init.b
If Init=0
Init=1
Structure Animal
Nom.s
Vitesse.l
EndStructure
Shared NewList Animaux.Animal() ;?========================================ERROR
End If
If flags=99: ClearList(Animaux()):EndIf;éffacer la collection
If flags=1; trouver un animal
;*Ancien_Element = @MaListe() ; On mémorise l'adresse de l'élément courant
ResetList(Animaux()) ; Effectue une recherche de tous les éléments nommés
While NextElement(Animaux()) And (Animaux()\Nom <> Nom):Wend
;ChangeCurrentElement(MaListe(), *Ancien_Element) ; Restitue l'ancien élément courant (mémorisé avant la recherche)
Else
If Len(nom)
AddElement(Animaux())
Animaux()\Nom = nom
Animaux()\Vitesse = Vitesse
EndIf
EndIf
If flags=2
SortStructuredList(Animaux(), #PB_Sort_Ascending, OffsetOf(Animal\Nom), #PB_Sort_String)
ElseIf flags=3
SortStructuredList(Animaux(), #PB_Sort_Ascending, OffsetOf(Animal\Vitesse), #PB_Sort_Long)
EndIf
EndProcedure
;Ajouter les animaux et respectives vitesses dans la collection
ColAnimal ("tigre",59)
ColAnimal ("lion",49)
ColAnimal ("chat",539)
ColAnimal ("lievre",549)
ColAnimal ("girafe",259)
ColAnimal ("souris",5)
ColAnimal ("vache",39)
ColAnimal ("lapin",59,3); ajoute le lapin et fait un trie des vitesses
ForEach Animaux():Debug Animaux()\Nom+" - Vitesse : "+Str(Animaux()\Vitesse):Next
ColAnimal ("girafe",0,1); rechercher la vitesse de la girafe
Debug Animaux()\Vitesse
Merci de vos réponses
Publié : jeu. 22/janv./2009 9:26
par PAPIPP
Voici une solution il est préférable de définir la liste dans le
prg principal avec la version PB430
Code : Tout sélectionner
Structure Animal
Nom.s
Vitesse.l
EndStructure
Procedure ColAnimal(List animaux.animal(),Nom.s, Vitesse, Flags.b = 0, INFOFlags_GetElementByNom1_SortByNom2_SortByVitesse3_ClearCollection99.b = 0)
Static Init.b
If Init = 0
Init = 1
EndIf
If flags = 99 : ClearList(Animaux()) : EndIf;éffacer la collection
If flags = 1; trouver un animal
;*Ancien_Element = @MaListe() ; On mémorise l'adresse de l'élément courant
ResetList(Animaux()) ; Effectue une recherche de tous les éléments nommés
While NextElement(Animaux()) And (Animaux()\Nom<>Nom) : Wend
;ChangeCurrentElement(MaListe(), *Ancien_Element) ; Restitue l'ancien élément courant (mémorisé avant la recherche)
Else
If Len(nom)
AddElement(Animaux())
Animaux()\Nom = nom
Animaux()\Vitesse = Vitesse
EndIf
EndIf
If flags = 2
SortStructuredList(Animaux(), #PB_Sort_Ascending, OffsetOf(Animal\Nom), #PB_Sort_String)
ElseIf flags = 3
SortStructuredList(Animaux(), #PB_Sort_Ascending, OffsetOf(Animal\Vitesse), #PB_Sort_Long)
EndIf
EndProcedure
;Ajouter les animaux et respectives vitesses dans la collection
NewList Main_anim.animal()
ColAnimal(main_anim(),"tigre", 59)
ColAnimal(main_anim(),"lion", 49)
ColAnimal(main_anim(),"chat", 539)
ColAnimal(main_anim(),"lievre", 549)
ColAnimal(main_anim(),"girafe", 259)
ColAnimal(main_anim(),"souris", 5)
ColAnimal(main_anim(),"vache", 39)
ColAnimal(main_anim(),"lapin", 59, 3); ajoute le lapin et fait un trie des vitesses
ForEach main_anim()
Debug Main_anim()\Nom + " - Vitesse : " + Str(main_anim()\Vitesse)
Next
*ad_ret.animal=ColAnimal(main_anim(),"girafe", 0, 1); rechercher la vitesse de la girafe
Debug main_anim()\vitesse
De cette façon on garde toute souplesse
Par contre il est indispensable de conserver la structure qui doit être
identique dans la procédure et dans le prg principal
Publié : jeu. 22/janv./2009 12:43
par pure444
Salut PAPIPP, c'est bien tenté, mais ça ne me résoude pas le problème.
Sur ton code, la Structure Animal continue toujours en déhors de la procédure, et les rajouts dans la collection sont un peu durs à écrire (je suis fénéant
ColAnimal(main_anim(),"tigre", 59)
ou
ColAnimal ("tigre",59)
J'aime bien les procedures ainsi parce que c'est plus fàcil de faire du copier/coler pour le transfère dans d'autres programmes.
Le fait aussi c'est que quand j'appuie sur Ctrl+F4 (pour cacher le code des procedures), je ne veux voir aucune structure linkedlist sur mon code, je sais que c'est possible, mais j'ai perdu le lien

En tout cas, merci pour l'éffort
Publié : jeu. 22/janv./2009 13:14
par PAPIPP
Comme on ne peut pour l’instant passer une structure d’une procédure à un prg principal
Il est nécessaire de définir cette structure dans le prg principal
La définition de la structure doit être connue dans les deux entités
Voici maintenant un prg pour fainéant
Code : Tout sélectionner
Structure Animal
Nom.s
Vitesse.l
EndStructure
Macro A(N,V,F=0)
ColAnimal(main_anim(),N, V)
EndMacro
Procedure ColAnimal(List animaux.animal(),Nom.s, Vitesse, Flags.b = 0, INFOFlags_GetElementByNom1_SortByNom2_SortByVitesse3_ClearCollection99.b = 0)
Static Init.b
If Init = 0
Init = 1
EndIf
If flags = 99 : ClearList(Animaux()) : EndIf;éffacer la collection
If flags = 1; trouver un animal
;*Ancien_Element = @MaListe() ; On mémorise l'adresse de l'élément courant
ResetList(Animaux()) ; Effectue une recherche de tous les éléments nommés
While NextElement(Animaux()) And (Animaux()\Nom<>Nom) : Wend
;ChangeCurrentElement(MaListe(), *Ancien_Element) ; Restitue l'ancien élément courant (mémorisé avant la recherche)
Else
If Len(nom)
AddElement(Animaux())
Animaux()\Nom = nom
Animaux()\Vitesse = Vitesse
EndIf
EndIf
If flags = 2
SortStructuredList(Animaux(), #PB_Sort_Ascending, OffsetOf(Animal\Nom), #PB_Sort_String)
ElseIf flags = 3
SortStructuredList(Animaux(), #PB_Sort_Ascending, OffsetOf(Animal\Vitesse), #PB_Sort_Long)
EndIf
EndProcedure
;Ajouter les animaux et respectives vitesses dans la collection
NewList Main_anim.animal()
A("tigre", 59)
A("lion", 49)
A("chat", 539)
A("lievre", 549)
A("girafe", 259)
A("souris", 5)
A("vache", 39)
A("lapin", 59, 3) ; ajoute le lapin et fait un trie des vitesses
ForEach main_anim()
Debug Main_anim()\Nom + " - Vitesse : " + Str(main_anim()\Vitesse)
Next
A("girafe", 0, 1); rechercher la vitesse de la girafe
Debug main_anim()\vitesse
Publié : jeu. 22/janv./2009 13:17
par gnozal
Code : Tout sélectionner
Structure Animal
Nom.s
Vitesse.l
EndStructure
NewList Animaux.Animal() ; <----- déclaration
Procedure ColAnimal(Nom.s,Vitesse,flags.b=0, INFOFlags_GetElementByNom1_SortByNom2_SortByVitesse3_ClearCollection99.b=0)
Static Init.b
Shared Animaux.Animal() ; <----- partage
If Init=0
Init=1
EndIf
If flags=99: ClearList(Animaux()):EndIf;éffacer la collection
If flags=1; trouver un animal
;*Ancien_Element = @MaListe() ; On mémorise l'adresse de l'élément courant
ResetList(Animaux()) ; Effectue une recherche de tous les éléments nommés
While NextElement(Animaux()) And (Animaux()\Nom <> Nom):Wend
;ChangeCurrentElement(MaListe(), *Ancien_Element) ; Restitue l'ancien élément courant (mémorisé avant la recherche)
Else
If Len(Nom)
AddElement(Animaux())
Animaux()\Nom = Nom
Animaux()\Vitesse = Vitesse
EndIf
EndIf
If flags=2
SortStructuredList(Animaux(), #PB_Sort_Ascending, OffsetOf(Animal\Nom), #PB_Sort_String)
ElseIf flags=3
SortStructuredList(Animaux(), #PB_Sort_Ascending, OffsetOf(Animal\Vitesse), #PB_Sort_Long)
EndIf
EndProcedure
;Ajouter les animaux et respectives vitesses dans la collection
ColAnimal ("tigre",59)
ColAnimal ("lion",49)
ColAnimal ("chat",539)
ColAnimal ("lievre",549)
ColAnimal ("girafe",259)
ColAnimal ("souris",5)
ColAnimal ("vache",39)
ColAnimal ("lapin",59,3); ajoute le lapin et fait un trie des vitesses
ForEach Animaux():Debug Animaux()\Nom+" - Vitesse : "+Str(Animaux()\Vitesse):Next
ColAnimal ("girafe",0,1); rechercher la vitesse de la girafe
Debug Animaux()\Vitesse
Sinon, on peut aussi passer la liste en argument de la procédure.
Publié : jeu. 22/janv./2009 14:20
par pure444
@PAPIPP > Lol pour la Macro, je ne connaissais pas cette histoire, ça peut me rendre service un jour,
Mais dans ton dernier code, le trie des vitesses n'est pas pris em compte, et la vitesse de la girafe est de 0 km
@gnozal > merci pour la participation, mais si on Globalise Animaux à l'exterieur de la procedure, on a plus besoin d'appliquer Shared Animaux au niveau de la prcedure (Voir code N.1 que pour l'instant marche bien sur PureBasic 4.30)
Normalement dans les autres langages, les structures publiques sont situés aussi à l'exterieur des procedures. Comme je viens de m'inérésser à Pure, et que j'ai vu pas mal de bonnes choses, je pensais qu'on pouvait faire autrement ...Voir mot clef List, sur le manuel Purebasic, où c'est écrit:
Les listes chaînées sont toujours locales par défaut, donc pour accéder à partir d'une procédure à une liste chaînée définie dans le code source principal du programme, l'utilisation de Global ou Shared est requise. Il est également possible de passer une liste chaînée en paramètre d'une procédure à l'aide du mot-clef List.
Voila , c'est le mot clef Shared qui m'a induit dans la confusion.
Publié : jeu. 22/janv./2009 14:36
par gnozal
pure444 a écrit :@gnozal > merci pour la participation, mais si on Globalise Animaux à l'exterieur de la procedure, on a plus besoin d'appliquer Shared Animaux au niveau de la prcedure (Voir code N.1 que pour l'instant marche bien sur PureBasic 4.30)
Dans mon exemple, la liste n'est pas globale ...
C'était pour illustrer l'utilisation correcte de 'Shared', comme ce mot clé figure dans le titre de ce thread.
Publié : jeu. 22/janv./2009 15:41
par pure444
C'est bien sûr juste, c'est moi qui a mal compris le manuel dont j'ai publié un extrait ci-dessus.
Puisque on y est aussi avec des Structures, je demanderais une dernière chose:
Peut'on connaitre par code les noms des propres variables intervenientes dans une Structure ? (Dans ce cas: nom$, vitesse.l)
Publié : jeu. 22/janv./2009 23:25
par PAPIPP
Oups!
Correction d'une petite erreur
Code : Tout sélectionner
Structure Animal
Nom.s
Vitesse.l
EndStructure
Macro A(N, V, F = 0)
ColAnimal(main_anim(), N, V,F)
EndMacro
Procedure ColAnimal(List animaux.animal(), Nom.s, Vitesse, Flags.b = 0, INFOFlags_GetElementByNom1_SortByNom2_SortByVitesse3_ClearCollection99.b = 0)
Static Init.b
If Init = 0
Init = 1
EndIf
If flags = 99 : ClearList(Animaux()) : EndIf;éffacer la collection
If flags = 1; trouver un animal
;*Ancien_Element = @MaListe() ; On mémorise l'adresse de l'élément courant
ResetList(Animaux()) ; Effectue une recherche de tous les éléments nommés
While NextElement(Animaux()) And (Animaux()\Nom<>Nom) : Wend
;ChangeCurrentElement(MaListe(), *Ancien_Element) ; Restitue l'ancien élément courant (mémorisé avant la recherche)
Else
If Len(nom)
AddElement(Animaux())
Animaux()\Nom = nom
Animaux()\Vitesse = Vitesse
EndIf
EndIf
If flags = 2
SortStructuredList(Animaux(), #PB_Sort_Ascending, OffsetOf(Animal\Nom), #PB_Sort_String)
ElseIf flags = 3
SortStructuredList(Animaux(), #PB_Sort_Ascending, OffsetOf(Animal\Vitesse), #PB_Sort_Long)
EndIf
EndProcedure
;Ajouter les animaux et respectives vitesses dans la collection
NewList Main_anim.animal()
A("tigre", 59)
A("lion", 49)
A("chat", 539)
A("lievre", 549)
A("girafe", 259)
A("souris", 5)
A("vache", 39)
A("lapin", 59, 3) ; ajoute le lapin et fait un trie des vitesses
ForEach main_anim()
Debug Main_anim()\Nom + " - Vitesse : " + Str(main_anim()\Vitesse)
Next
A("girafe", 0, 1); rechercher la vitesse de la girafe
Debug main_anim()\vitesse
Publié : jeu. 22/janv./2009 23:26
par PAPIPP
Oups!
Correction d'une petite erreur
Code : Tout sélectionner
Structure Animal
Nom.s
Vitesse.l
EndStructure
Macro A(N, V, F = 0)
ColAnimal(main_anim(), N, V,F)
EndMacro
Procedure ColAnimal(List animaux.animal(), Nom.s, Vitesse, Flags.b = 0, INFOFlags_GetElementByNom1_SortByNom2_SortByVitesse3_ClearCollection99.b = 0)
Static Init.b
If Init = 0
Init = 1
EndIf
If flags = 99 : ClearList(Animaux()) : EndIf;éffacer la collection
If flags = 1; trouver un animal
;*Ancien_Element = @MaListe() ; On mémorise l'adresse de l'élément courant
ResetList(Animaux()) ; Effectue une recherche de tous les éléments nommés
While NextElement(Animaux()) And (Animaux()\Nom<>Nom) : Wend
;ChangeCurrentElement(MaListe(), *Ancien_Element) ; Restitue l'ancien élément courant (mémorisé avant la recherche)
Else
If Len(nom)
AddElement(Animaux())
Animaux()\Nom = nom
Animaux()\Vitesse = Vitesse
EndIf
EndIf
If flags = 2
SortStructuredList(Animaux(), #PB_Sort_Ascending, OffsetOf(Animal\Nom), #PB_Sort_String)
ElseIf flags = 3
SortStructuredList(Animaux(), #PB_Sort_Ascending, OffsetOf(Animal\Vitesse), #PB_Sort_Long)
EndIf
EndProcedure
;Ajouter les animaux et respectives vitesses dans la collection
NewList Main_anim.animal()
A("tigre", 59)
A("lion", 49)
A("chat", 539)
A("lievre", 549)
A("girafe", 259)
A("souris", 5)
A("vache", 39)
A("lapin", 59, 3) ; ajoute le lapin et fait un trie des vitesses
ForEach main_anim()
Debug Main_anim()\Nom + " - Vitesse : " + Str(main_anim()\Vitesse)
Next
A("girafe", 0, 1); rechercher la vitesse de la girafe
Debug main_anim()\vitesse
Publié : ven. 23/janv./2009 9:00
par pure444
Voila PAPIPP, ça fonctionne maintenant, merci!
Je me suis permis de m'inspirer sur ton code pour rajoutter une autre collection et un autre macro.
C'est vrai que c'est pas mal intéréssant, heureusement que le code des macros ne sera pas inclus dans l'executable

En voici le code:
Code : Tout sélectionner
; Programme pour gérér des collections simples
Structure Animal
Nom.s
Vitesse.l
EndStructure
NewList List1.animal()
NewList List2.animal()
; on inscrit aussi les INFOFlags afin de les connaitre sur la barre d'état
;----------------------------------------------------------------------------
Macro ColAnim1(Animal, Vitesse, Flags = 0,ListViewID=0,DebugList=0,INFOFlags_GetElementByNom1_SortByNom2_SortByVitesse3_ClearCollection99= 0)
ColAnimal(List1(), Animal, Vitesse,Flags,ListViewID,DebugList)
EndMacro
Macro ColVoiture(Voiture, Vitesse, Flags = 0,ListViewID=0,DebugList=0,INFOFlags_GetElementByNom1_SortByNom2_SortByVitesse3_ClearCollection99= 0)
ColAnimal(List2(), Voiture, Vitesse,Flags,ListViewID,DebugList)
EndMacro
Procedure.s ColAnimal (List animaux.animal(), Nom.s, Vitesse, Flags.b = 0,ListViewID=0,DebugList=0,INFOFlags_GetElementByNom1_SortByNom2_SortByVitesse3_ClearCollection99.b = 0)
If Flags = 99 : ClearList(Animaux()) : EndIf;éffacer la collection
If Flags = 1; trouver un animal
ResetList(Animaux())
While NextElement(Animaux()) And (Animaux()\Nom<>Nom) : Wend
If ListIndex(Animaux())>-1:ProcedureReturn Str(Animaux()\Vitesse):EndIf
Else ; rajouter des éléments
If Len(nom)
AddElement(Animaux())
Animaux()\Nom = nom
Animaux()\Vitesse = Vitesse
EndIf
EndIf
If Flags = 2
SortStructuredList(Animaux(), #PB_Sort_Ascending, OffsetOf(Animal\Nom), #PB_Sort_String)
ElseIf Flags = 3
SortStructuredList(Animaux(), #PB_Sort_Ascending, OffsetOf(Animal\Vitesse), #PB_Sort_Long)
EndIf
If DebugList
ForEach Animaux():Debug Animaux()\Nom+" - Vitesse : "+Str(Animaux()\Vitesse):Next
ElseIf ListViewID
EndIf
EndProcedure
Debug "> Rajouter des animaux et respectives vitesses dans la collection "
ColAnim1 ("tigre",59)
ColAnim1 ("lion",49)
ColAnim1 ("chat",539)
ColAnim1 ("lievre",549)
ColAnim1 ("girafe",259)
ColAnim1 ("souris",5)
ColAnim1 ("vache",39)
ColAnim1 ("lapin",59,3,0,1); ajoute le lapin, fait un trie des vitesses et affiche la list
Debug "> Vitesse de la girafe: " + ColAnim1 ("girafe", 0, 1)
Debug "> Rajouter des voitures et respectives vitesses dans une autre collection "
ColVoiture("Porche",122)
ColVoiture("BMW",112)
ColVoiture("Mercedez",99)
ColVoiture("Audio",133)
ColVoiture("Fiat",111,2,0,1); ajoute la Fiat, fait un trie des marques et affiche la list
Debug "> Vitesse de la BMW: " + ColVoiture ("BMW", 0, 1)
Debug "> Effacer la collection de voitures" + ColVoiture("",0,99);
Debug "> Vitesse de la BMW: " + ColVoiture ("BMW", 0, 1)
Debug "> Vitesse de girafe: " + ColAnim1 ("girafe", 0, 1)