Pointeurs de chaînes

Vous avez une idée pour améliorer ou modifier PureBasic ? N'hésitez pas à la proposer.
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Pointeurs de chaînes

Message 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 :?:
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Pointeurs de chaînes

Message 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
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message 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
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message 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
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message 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:
Avatar de l’utilisateur
SPH
Messages : 4947
Inscription : mer. 09/nov./2005 9:53

Message par SPH »

Je suis aussi pour une simplification des pointeurs qui semblent etre le top du top en terme de rapidité

!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.12LTS- 64 bits
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message 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
Répondre