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)