Page 1 sur 1

Salut à Tous, Besoin d'Aide

Publié : dim. 27/mars/2005 11:09
par Cagou-77
un dépannage sur ce bout de code qui ne marche pas
problême de pointeur :

Code : Tout sélectionner

 Structure TableVirtuelle
   ID.s
   Libelle.s
EndStructure

NewList vtTypePiece.TableVirtuelle()

Procedure.l Ascan( *List, Valeur.s )
   ForEach *List()
      If *List\ID = Valeur
         ProcedureReturn ListIndex(*List())
       EndIf
   Next
EndProcedure

Index = Ascan( @vtTypePiece, idTypePiece )
Merci de votre Aide, Bon Dimanche de Pâques .

Publié : dim. 27/mars/2005 11:35
par Oliv
J'ai essayé différentes choses et je n'ai pas réussi, mais tu ne peux pas faire comme ça, déjà pour envoyer l'adresse mémoire de ta liste, c'est @vtTypePiece()
Ensuite après il faut travailler sur les adresses mémoires, on ne peut plus travailler sur les listes.. Pour quoi ne fais tu pas :

Code : Tout sélectionner

Structure TableVirtuelle 
   ID.s 
   Libelle.s 
EndStructure 

NewList vtTypePiece.TableVirtuelle() 

Procedure.l Ascan(Valeur.s ) 
   ForEach vtTypePiece() 
      If vtTypePiece()\ID = Valeur 
         ProcedureReturn ListIndex(vtTypePiece()) 
       EndIf 
   Next 
EndProcedure 

Index = Ascan(idTypePiece.s) 
Tu as plusieures listes ?

Remerciment à Oliv

Publié : dim. 27/mars/2005 13:23
par Cagou-77
Oui je voulais passer différentes liste de même structure en paramêtre donc
ta soluce ne convient pas .
Merci quand même .

Publié : dim. 27/mars/2005 14:05
par Oliv
Ok, donc je pensais savoir comment utiliser les listes avec leur adresse mémoire mais je n'y arrive pas.
Denis si tu passes tu pourrais nous expliquer ? :oops:

EDIT : J'ai repris le code "SaveLinkedList()" de purearea et je suis arrivé à ce que tu veux, je comprends mieux les listes, mais si quelqu'un sait comment ça fonctionne, merci d'expliquer :roll:

Code : Tout sélectionner

Procedure Ascan(*FirstElement,Valeur.s) 
  StringAddress.l : Index.l : Index_Trouve.l; On déclare les varaibles.
  Index_Trouve = -1
  
  Repeat
    StringAddress = PeekL(*FirstElement) ; On récupère l'adresse mémoire du champ ID.
    If PeekS(StringAddress) = Valeur ; On compare les deux valeurs.
      ProcedureReturn Index ; On renvoi la place de l'élément
    EndIf
    *FirstElement = PeekL(*FirstElement - 8) + 8 ; On se place dans l'élément suivant (là je ne sais pas du tout comment)
    Index + 1
  Until *FirstElement = 8 ; La je ne comprends pas non plus, pourquoi tout le temps ce chiffre 8 ? Il n'a rien à voir 
 ; avec la taille de la Structure puisaque le code était à la base pour n'importe quelle structure
  
  ProcedureReturn -1 ; Si on a trouvé aucune correspondance on renvoi -1
  
EndProcedure



Structure TableVirtuelle 
  ID.s 
  Libelle.s 
EndStructure 

NewList vtTypePiece.TableVirtuelle() 
AddElement(vtTypePiece())
vtTypePiece()\ID = "5"

AddElement(vtTypePiece())
vtTypePiece()\ID = "12"

AddElement(vtTypePiece())
vtTypePiece()\ID = "1"

idTypePiece.s = "12"

If CountList(vtTypePiece()) > 0 ; IMPORTANT
  FirstElement(vtTypePiece()) ; Sans cete commande on commence à l'élément courant
  Index = Ascan( @vtTypePiece(),idTypePiece ) 
  Debug Index
EndIf

Merci Oliv

Publié : dim. 27/mars/2005 14:30
par Cagou-77
tu est un Chef, maintenant je peu avancer .

Merci et bon Après-midi .

Michel

Publié : dim. 27/mars/2005 17:21
par nico
Oliv,

Code : Tout sélectionner

*FirstElement = PeekL(*FirstElement - 8) +8; On se place dans l'élément suivant (là je ne sais pas du tout comment) 
Comme tu le sais, à la structure initiale est rajoutée 2 pointeurs (suivant et précédent).

donc *FirstElement - 8 permet de remonter vers le pointeur suivant de la structure qui contient lui aussi une adresse. Avec PeekL(*FirstElement - 8 ), on va lire cette adresse. Mais on se retrouve maintenant avec l'adresse de début de la structure correspondant à pointeur suivant, donc on se décale de 8 octets PeekL(*FirstElement - 8 ) +8 pour se trouver sur le champ ID.

Code : Tout sélectionner

Until *FirstElement = 8
Cette ligne découle du code précédent; en effet dans le dernier élément de la structure, le pointeur suivant de cette structure est égale à zéro.
Mais comme *FirstElement = PeekL(*FirstElement - 8 ) + 8, finallement *FirstElement vaut 8 au lieu de 0.

J'espère avoir été clair.

Publié : dim. 27/mars/2005 18:31
par Oliv
nico a écrit : J'espère avoir été clair.
Je pense que oui :D , on verra bien la prochaine fois que je me sert de ça :lol:
Merci