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 ?
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
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.
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

, on verra bien la prochaine fois que je me sert de ça
Merci