Question de pointeur ...

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Question de pointeur ...

Message par Thyphoon »

sur pureArea j'ai trouvé un code qui me permt de trié une liste chainé
je joints le code trouvé

ce que je voudrais faire c'est utilisé une structure plus complexe et choisir ma methode de trie
dans le code on trouve
compare=CompareMemoryString(*Name,@var()\s,1)

et je voudrais pouvoir passer dans la procedure n'importe quel variable de la strucure ... au lieu de @var()
est ce que si a la procedure
find_var(*Name.Byte)
je la transforme en

find_var(*Name.Byte,chxtrie.l)
et que la ligne je la modifie en
compare=CompareMemoryString(*Name,chxtrie,1)
il me suffit de faire alors un
find_var(@a$,@var()\titre) ou find_var(@a$,@var()\numero)
pour savoir comment je veux trier ?
est ce que c'est correct ?
et si je veux que ma procedure fonctionne avec des liste différente que faut il que je modifie ?
Je fais des essaies mais ça plante tout le temps...j'ai pas encore bien saisie l'utilisation des * et des @

Code : Tout sélectionner

; English forum: http://purebasic.myforums.net/viewtopic.php?t=7503&highlight=
; Author: GPI
; Date: 14. September 2003

NewList var.String() 
Procedure find_var(*Name.Byte) 
  ResetList(var()) 
  half=CountList(var())>>1 
  If half 
    SelectElement(var(),half) 
    pos=half 
    quit=0 
  Else 
    pos=0 
    If NextElement(var())=0 
      quit=2 
    Else 
      quit=0 
    EndIf 
  EndIf 
  oldcompare=0 
  While quit=0 
    compare=CompareMemoryString(*Name,@var()\s,1) 
    If half 
      Select compare 
        Case -1:half>>1:pos-half:SelectElement(var(),pos) 
        Case 0:quit=1 
        Case 1:half>>1:pos+half:SelectElement(var(),pos) 
      EndSelect 
    Else 
      If compare=0 
        quit=1 
      ElseIf compare=oldcompare Or oldcompare=0 
        oldcompare=compare 
        If compare=-1 
          If PreviousElement(var())=0 
            ResetList(var()) 
            quit=2 
          EndIf 
        Else 
          If NextElement(var())=0 
            LastElement(var()) 
            quit=2 
          EndIf 
        EndIf 
      Else 
        If oldcompare=1 
          If PreviousElement(var())=0 
            ResetList(var()) 
          EndIf 
        EndIf 
        quit=2 
      EndIf 
    EndIf    
  Wend 
  If quit=2 
    ProcedureReturn 0 
  Else 
    ProcedureReturn 1 
  EndIf  
EndProcedure 
Procedure ADD_Element(a$) 
  find_var(@a$) 
  AddElement(var()) 
  var()\s=a$ 
EndProcedure 

ADD_Element("hallo") 
ADD_Element("adfa") 
ADD_Element("2345") 
ADD_Element("uioa") 
ADD_Element("23jlk") 
ADD_Element("osad") 
ResetList(var()) 
While NextElement(var()) 
  Debug var()\s 
Wend 
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Re: Question de pointeur ...

Message par Anonyme2 »

Thyphoon a écrit : ce que je voudrais faire c'est utilisé une structure plus complexe et choisir ma methode de trie dans le code on trouve
compare=CompareMemoryString(*Name,@var()\s,1)

et je voudrais pouvoir passer dans la procedure n'importe quel variable de la strucure ... au lieu de @var()
Tu dis n'importe quelle variable de la structure, mais ce sont bien des chaines ?

C'est quoi ce chxtrie.l ?

Un choix de tri ?
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Message par Thyphoon »

je vais essayer d'être claire dans ce que je raconte lolllll
voilà ce que je veux faire
j'ai une chaine avec une structure du type

Code : Tout sélectionner

Structure GameStructure
  title.s
  romtitle.s
  type.l
EndStructure

NewList ListGames.GameStructure()
NewList OtherGames.GameStructure()
et je voudrais pouvoir trier ces listes en fonction de leur structure ...
par title, type, romtitle ou autre...

le code que j'ai trouvé sur Purearea lui trie au fur et a mesure qu'on rentre les donné... le seul hic c'est que dans l'exemple c'est toujours la même list var() et que la structure est unique /s ..
Est ce que c'est un peu plus claire ? ou bien je suis bon a être piqué ? :P
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

Tu as des chaines et un type Long.

Tu pourrais changer la Structure comme ceci pour faciliter les choses mais peut-être que ça entraîne beaucoup de changement dans ton code :?:

Code : Tout sélectionner

Structure GameStructure 
  title.s 
  romtitle.s 
  type.s   ; le changement ici
EndStructure 
De cette manière, tu n'a plus qu'à trier avec des chaines en utilisant le code de GPI que j'ai modifié

Je pensais pouvoir faire tout en une seule procedure mais j'ai des problèmes avec les pointeurs, les instructions ResetList(), SelectElement() n'accepte pas de pointeur 'structuré'. Enfin pour l'instant je n'y suis pas arrivé.

Donc tu devras copier 2 fois la procédure car tu as 2 listes chainées et renommer la 2eme procedure et aussi changer toutes les occurences de la liste chainée pour mettre le nom de la deuxième.

Ca a l'air de trier mais sur les chiffres, par exemple sous forme de chaine bien sur, le "11" se situe devant le "2" :roll:

Il faudrait revoir la procedure de tri.

Dans le code qui suit tu changes la valeur de la variable ChoixTri pour trier en fonction du champ.

Code : Tout sélectionner

Structure GameStructure 
  title.s 
  romtitle.s 
  type.s
EndStructure 

NewList ListGames.GameStructure() 

Procedure find_var(*Name.Byte, Index) 
; ici index devra indiquer si c'est le 1er élément, le second ou le 3eme à prendre
; en référence pour trier la liste, un test sera effectué au niveau de la comparaison
; des chaines pour passer la bonne string
  ResetList(ListGames()) 
  half=CountList(ListGames())>>1 
  If half 
    SelectElement(ListGames(),half) 
    pos=half 
    quit=0 
  Else 
    pos=0 
    If NextElement(ListGames())=0 
      quit=2 
    Else 
      quit=0 
    EndIf 
  EndIf 
  oldcompare=0 
  While quit=0 
    If index = 1   ; 1er champ
       compare=CompareMemoryString(*Name,@ListGames()\title,1) 
    ElseIf index = 2  ; second champ
       compare=CompareMemoryString(*Name,@ListGames()\romtitle,1) 
    Else    ; 3eme champ
       compare=CompareMemoryString(*Name,@ListGames()\type,1) 
    EndIf

    If half 
      Select compare 
        Case -1:half>>1:pos-half:SelectElement(ListGames(),pos) 
        Case 0:quit=1 
        Case 1:half>>1:pos+half:SelectElement(ListGames(),pos) 
      EndSelect 
    Else 
      If compare=0 
        quit=1 
      ElseIf compare=oldcompare Or oldcompare=0 
        oldcompare=compare 
        If compare=-1 
          If PreviousElement(ListGames())=0 
            ResetList(ListGames()) 
            quit=2 
          EndIf 
        Else 
          If NextElement(ListGames())=0 
            LastElement(ListGames()) 
            quit=2 
          EndIf 
        EndIf 
      Else 
        If oldcompare=1 
          If PreviousElement(ListGames())=0 
            ResetList(ListGames()) 
          EndIf 
        EndIf 
        quit=2 
      EndIf 
    EndIf    
  Wend 
  If quit=2 
    ProcedureReturn 0 
  Else 
    ProcedureReturn 1 
  EndIf  
EndProcedure 

Procedure Add_Element(*a.GameStructure, Index)
; ici index devra indiquer si c'est le 1er élément, le second ou le 3eme à prendre
; en référence pour trier la liste, un test sera effectué au niveau de la comparaison
; des chaines pour passer la bonne string
  
  If Index = 1  ; 1er champ
     find_var(@*a\title, Index) 
  ElseIf Index = 2  ; 2eme champ
     find_var(@*a\romtitle , Index) 
  Else   ; 3eme champ
     find_var(@*a\type     , Index) 
  EndIf
  
  AddElement(ListGames()) 
  ListGames()\title=*a\title
  ListGames()\romtitle=*a\romtitle
  ListGames()\type=*a\type
EndProcedure 


ChoixTri = 3  ; = 1 on tri avec title, =2 avec romtitle et = 3 avec type

a.GameStructure\title    = "title_A"
a.GameStructure\romtitle = "JeuxF"
a.GameStructure\type     = "11"
ADD_Element(a, ChoixTri) 

a.GameStructure\title    = "titleB"
a.GameStructure\romtitle = "JeuxE"
a.GameStructure\type     = "25"
ADD_Element(a, ChoixTri) 

a.GameStructure\title    = "titleC"
a.GameStructure\romtitle = "JeuxD"
a.GameStructure\type     = "7"
ADD_Element(a, ChoixTri) 

a.GameStructure\title    = "titleD"
a.GameStructure\romtitle = "JeuxC"
a.GameStructure\type     = "1"
ADD_Element(a, ChoixTri) 

a.GameStructure\title    = "titleE"
a.GameStructure\romtitle = "JeuxB"
a.GameStructure\type     = "3"
ADD_Element(a, ChoixTri) 

a.GameStructure\title    = "titleF"
a.GameStructure\romtitle = "JeuxA"
a.GameStructure\type     = "2"
ADD_Element(a, ChoixTri) 


ForEach ListGames()
 Debug ListGames()\title
 Debug ListGames()\romtitle
 Debug ListGames()\type 
 Debug " "
Next
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

Encore une chose, un champ ne doit pas être vide sinon ça plantera dur... car un champ d'une variable structuré non défini signifie que la mémoire n'est pas allouée d'ou un pointeur à 0.
Dernière modification par Anonyme2 le jeu. 11/nov./2004 22:02, modifié 1 fois.
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Message par Thyphoon »

merci c'est geant !!! :D
Je t'embrasse pas mais le coeur y est !!! :wink:
Répondre