Page 1 sur 1

Pointeurs de chaînes

Publié : dim. 30/juil./2006 12:34
par Dr. Dri
Je vais relancer le débat pour apporter une proposition de syntaxe pour obtenir le vrai pointeur d'une chaine de caractère. :twisted:

Pour résumer la chose:
Une chaine de caractère c'est une suite d'octet qui démarre à l'adresse X
Une variable S contient l'adresse X, cette variable S se situe à l'adresse Y
L'opérateur @ qui permet d'obtenir l'adresse Y d'une variable retourne l'adresse X dans le cas d'une chaine.

En utilisant la Structure String il est possible de pointer sur des chaines
Un pointeur *P de type String nécessite l'adresse Y de la chaine S

il est possible de passer par un pointeur temporaire *T pour obtenir une adresse Y
(qui ne sera même pas l'adresse de S mais celle de *T)
l'utilisation du pointeur temporaire n'est donc pas fiable à 100%

Un petit code d'exemple pour l'illustrer

Code : Tout sélectionner

;déclaration des variables
s.s = "PureBasic"
*p.String
*t

;pointe sur s par l'intermédiaire de *t
*t = @s
*p = @*t

Debug *p\s ;là c'est bon

;change la valeur de s à l'aide de *p
*p\s = "Hello"

Debug s ;là c'est toujours bon

;rechange la valeur de s à l'aide de *p
*p\s = Space(10000)

Debug s ;affiche Hello au lieu d'une longue série d'espaces
Donc tout ca pour dire (j'ai essayé de faire simple dans mes explications) que dans la mesure où il n'est pas possible de pointer sur une chaine avec l'opérateur @, je suggère un nouvel opérateur qui servira à pointer uniquement sur les chaines de caractères (dans des variables, tableaux listes et/ou structures...).

@S retourne l'adresse X de la chaine
@@S retournerai l'adresse Y de la chaine

Dri :?:

Re: Pointeurs de chaînes

Publié : dim. 30/juil./2006 13:05
par Backup
Dr. Dri a écrit : il n'est pas possible de pointer sur une chaine avec l'opérateur @
et pourtant ça marche non

Code : Tout sélectionner

a$="A" ; "A"=65 en ascii !!

adresse.l=@a$

Debug adresse.l ; affiche bien l'adresse du debut de la chaine
Debug @a$; affiche bien l'adresse du debut de la chaine



Debug PeekL(@a$) ; affiche bien le chifre "65" qui correspond a "A"
Debug PeekL(adresse.l); affiche bien le chifre "65" qui correspond a "A"

je comprends pas ! ça marche on peut bien avoir l'adresse du depart de la chaine avec @
et on peut lire le contenu de a$ avec @a$ et peekl

je vois pas ou ça marche pas 8O

Publié : dim. 30/juil./2006 13:43
par Dr. Dri
t'as pas vraiment lu ? ou alors je suis pas asez clair ?
j'ai l'habitude de pas être clair mais là j'ai vraiment essayé d'expliquer le plus simplement possible.

En gros il est possible de pointer sur le contenu d'une chaine de caractères mais par sur la variable en elle-même.

je vais te montrer un exemple peut-être un peu plus concret qui met en évidence la différence entre les variables numériques et les chaines.

Code : Tout sélectionner

;une structure qui contient tous les types de base
Structure TousLesTypes
  b.b
  w.w
  l.l
  q.q
  f.f
  d.d
  c.c
  s.s
EndStructure

Struct.TousLesTypes

;pour chaque type on affecte une valeur
;qu'on va afficher avec un peek en pointant via la structure
Struct\b = 111
Debug PeekB( @Struct + OffsetOf(TousLesTypes\b) )

Struct\w = 5050
Debug PeekW( @Struct + OffsetOf(TousLesTypes\w) )

Struct\l = 70707
Debug PeekL( @Struct + OffsetOf(TousLesTypes\l) )

Struct\q = 70707070707
Debug PeekQ( @Struct + OffsetOf(TousLesTypes\q) )

Struct\f = 159.5    
Debug PeekF( @Struct + OffsetOf(TousLesTypes\f) )

Struct\d = 159.5E20
Debug PeekD( @Struct + OffsetOf(TousLesTypes\d) )

Struct\c = 200
Debug PeekC( @Struct + OffsetOf(TousLesTypes\c) )

;maintenant si on fait la même chose pour une chaine
;de caractère ca ne donne pas le bon résultat...
;parce qu'on a là un VRAI pointeur vers la chaine Struct\s
Struct\s = "PureBasic"
;Debug PeekS( @Struct + OffsetOf(TousLesTypes\s) )

;donc pour que PeekS fonctionne il faut lui fournir
;l'adresse qu'on obtient avec l'opérateur @

Debug PeekS( PeekL( @Struct + OffsetOf(TousLesTypes\s) ) )
Dri

Publié : dim. 30/juil./2006 14:32
par Backup
ce que je constate c'est
qu'entre

Debug PeekS( @Struct + OffsetOf(TousLesTypes\s))
et
Debug PeekS( PeekL( @Struct + OffsetOf(TousLesTypes\s) ) )

dans le premier qui ne marche pas tu transmet l'adresse
de la variable @Struct + OffsetOf(TousLesTypes\s)

alors que dans le deuxieme tu transmet
l'adresse du CONTENU de @Struct + OffsetOf(TousLesTypes\s)
grace au "PeekL"

ce qui ,'est effectivement pas la meme chose !! 8O

mais bon je ne doit pas saisir toute les nuances de ce que tu veux :D

alors je vais etre d'accord avec ta suggestion, meme si je ne la comprends pas :D


ALORS FRED TU EN PENSE QUOI DE ça ??

8O 8O

Publié : dim. 30/juil./2006 14:39
par Dr. Dri
Dobro a écrit :ce qui n'est effectivement pas la meme chose !! 8O

mais bon je ne doit pas saisir toute les nuances de ce que tu veux :D
Bah ce que je veux c'est avoir accès aux deux ^^
Pouvoir pointer le contenu ET la variable

Puisque les chaines sont un type à part, je propose une syntaxe à part
Mais bon la syntaxe que je propose pourrait se lire @@S

@ -> pointeur vers la variable
@ -> qui pointe vers le contenu
S -> de la variable chaine S

(si on simplifie on a un pointeur vers la variable chaine S :P)

Dri :drinking:

Publié : mer. 16/août/2006 20:45
par SPH
Je suis aussi pour une simplification des pointeurs qui semblent etre le top du top en terme de rapidité

Publié : dim. 31/déc./2006 11:10
par Anonyme2
Je n'étais pas interveu mais Dr. Dri a raison.

Fred, encore un peu d'huile de coude :D et on devrait avoir ça