Page 2 sur 4
Re: Envoyer une chaine en référence
Publié : sam. 22/mars/2014 13:19
par bombseb
Non, c'est pas ce que j'ai dit, je voulais dire que ce que j'avais fait au début était pas hyper propre (avec la structure)
enfin, ca marchait mais c'était un peu "overkill" juste pour passer une seule variable à une procédure...
Du coup j'ai préféré utiliser ta procédure avec le .String (que je trouve beaucoup plus propre que la mienne

)
Sauf que
Je m'aperçoit qu'elle ne marche pas...
Je récapitule :
Code : Tout sélectionner
Procedure.a incLettre (*lettre.String)
; Invalid memory access
Debug *lettre\s
EndProcedure
toto$ = "A"
incLettre (@toto)
Re: Envoyer une chaine en référence
Publié : sam. 22/mars/2014 13:49
par Backup
comme ça ça marche
mais j'ai peut etre pas compris le but ....
Code : Tout sélectionner
Declare.a incLettre (lettre)
calldebugger
toto$ = "A"
incLettre (@toto$)
Procedure.a incLettre (lettre)
; Invalid memory access
Debug "adresse de Toto ="+str(lettre)
Debug "contenue de Toto= "+peeks(lettre)
EndProcedure
; Epb
Re: Envoyer une chaine en référence
Publié : sam. 22/mars/2014 13:51
par falsam
bombseb a écrit :Je m'aperçoit qu'elle ne marche pas...
De cette maniére
Code : Tout sélectionner
Procedure.a incLettre (*lettre.String)
Debug PeekS(*lettre)
EndProcedure
toto$ = "A"
incLettre (@toto$)
Re: Envoyer une chaine en référence
Publié : sam. 22/mars/2014 14:03
par bombseb
Salut Dobro, en fait ce que je voulais c'est que ma proc puisse modifier la variable et que la modif soit visible depuis l’extérieur de cette procédure....
Falmsam, là oui ca marche en utilisant PeekS et PokeS, mais bon je ne trouve pas hyper élégant...
Re: Envoyer une chaine en référence
Publié : sam. 22/mars/2014 15:54
par falsam
bombseb a écrit :ca marche en utilisant PeekS et PokeS, mais bon je ne trouve pas hyper élégant...
L'interet de cette procédeure n'est pas d'afficher des valeurs mais de les manipuler.
Et c'est bien ce que tu recherches hein ?
bombseb a écrit :en fait ce que je voulais c'est que ma proc puisse modifier la variable et que la modif soit visible depuis l’extérieur de cette procédure....
Reprenons point par point
■
Tu commences ton code de cette maniére
■
ma proc puisse modifier la variable
je tiens compte que Peeks() n'est pas sexy pour toi

Code : Tout sélectionner
Procedure.a incLettre (*lettre.String)
CopyMemoryString("B", @*lettre)
EndProcedure
■
et que la modif soit visible depuis l’extérieur de cette procédure
Le code complet
Code : Tout sélectionner
Procedure.a incLettre (*lettre.String)
CopyMemoryString("B", @*lettre)
EndProcedure
toto$ = "A"
incLettre (@toto$)
Debug toto$
Voila voila

Re: Envoyer une chaine en référence
Publié : sam. 22/mars/2014 15:58
par bombseb
Merci amigo
En fait ce qui me chagrine c'est qu'on soit obligé de passer par une fonction pokeS ou copyMemorystring pour pouvoir faire ca....
Mais bon, soit
Merci pour ton coup de main en tout cas

Re: Envoyer une chaine en référence
Publié : sam. 22/mars/2014 16:00
par falsam
Tu as raison sur un point

Pourquoi ce code fonctionne
Code : Tout sélectionner
Procedure Dummy(*Buffer.Integer)
*Buffer\i = 2
EndProcedure
buffer=0
Dummy(@Buffer)
Debug Buffer
et pas celui là
Code : Tout sélectionner
Procedure.a Dummy(*Buffer.String)
*Buffer\s = "test"
EndProcedure
Buffer.s="titi"
Dummy(@Buffer)
Debug Buffer
Re: Envoyer une chaine en référence
Publié : sam. 22/mars/2014 16:05
par Backup
bombseb a écrit :Salut Dobro, en fait ce que je voulais c'est que ma proc puisse modifier la variable et que la modif soit visible depuis l’extérieur de cette procédure....
je vois pas le probleme ...
en continuant sur mon code exemple :
Code : Tout sélectionner
Declare.a incLettre (lettre)
calldebugger
toto$ = "A"
debug "avant l'appel de la procedure toto ="+toto$
incLettre (@toto$)
debug "Apres l'appel de la procedure toto="+toto$
Procedure.a incLettre (lettre)
; Invalid memory access
Debug "adresse de Toto ="+str(lettre)
Debug "contenue de Toto= "+peeks(lettre)
; on va changer le contenu de toto
pokes(lettre,"B")
EndProcedure
; Epb
En fait ce qui me chagrine c'est qu'on soit obligé de passer par une fonction pokeS ou copyMemorystring pour pouvoir faire ca....
ben .. une variable est un emplacement memoire auquel on a collé une etiquette ...
ça fait partie des premiers truc qu'on apprend en programmation "tout est emplacement memoire"
donc passer par Peek et poke , (qui sont peut etre les plus vielles instructions Basic du monde

me semble normal

Re: Envoyer une chaine en référence
Publié : sam. 22/mars/2014 16:06
par falsam
Le monsieur a bien dit que Poke c'est pas sexy

Re: Envoyer une chaine en référence
Publié : sam. 22/mars/2014 16:13
par Backup
Tu as raison sur un point

Pourquoi ce code fonctionne .... et pas celui là
ben en fait ils ne devraient pas fonctionner (les Deux) , a partir du moment ou Fred a choisi de ne plus typer les pointeurs
arretez de le faire

Re: Envoyer une chaine en référence
Publié : sam. 22/mars/2014 16:41
par falsam
Dobro a écrit :arretez de le faire

Je pense que rien ne t'empeche d'utiliser les pointeurs de cette façon (Perso je ne fais pas)
Code : Tout sélectionner
Text$ = "Hello Dobro"
*Text = @Text$
*Pointer.String = @*Text
Debug *Pointer\s
Re: Envoyer une chaine en référence
Publié : sam. 22/mars/2014 16:47
par bombseb
Bon en tout cas je sais comment faire maintenant
sinon, j'ai pas eu ma réponse : J'ai pas saisi la différence entre .s et .String

Re: Envoyer une chaine en référence
Publié : sam. 22/mars/2014 16:50
par Backup
ce qui vous trompe c'est l'utilisation de ".string"
il ne s'agit pas d'un Type au sens ".l ,.i ,.c, .s, etc .... "
mais de l'utilisation d'une Structure deja declaré dans Purebasic ...
comme il y en a des Tas d'autres ....
la preuve tu peut obtenir le meme resultat comme ça :
Code : Tout sélectionner
structure chaine
s.s
EndStructure
chaine.chaine
Text$ = "Hello Dobro"
*Text = @Text$
*Pointer.chaine = @*Text
Debug *Pointer\s
; Epb
autre exemple de structure deja declaré
lpPoint.POINT
Code : Tout sélectionner
lpPoint.POINT
Repeat
GetCursorPos_(lpPoint)
Debug "X = " + Str(lpPoint\x)
Debug "Y = " + Str(lpPoint\y)
Debug ""
Delay(50)
ForEver
Re: Envoyer une chaine en référence
Publié : sam. 22/mars/2014 16:51
par falsam
bombseb a écrit :Bon en tout cas je sais comment faire maintenant
sinon, j'ai pas eu ma réponse : J'ai pas saisi la différence entre .s et .String

Peut etre une réponse ici
http://www.purebasic.fr/french/viewtopi ... 934#p41934
Le sujet du post est "Remplacement de PeekS() par structure .String ???" ça devrait te plaire bombseb

Re: Envoyer une chaine en référence
Publié : sam. 22/mars/2014 16:53
par Backup
non l'explication est celle que je donne ....
filperj crois qu'il s'agit d'un type au sens Standard ....
alors qu'il s'agit d'une Structure Pre declaré par Purebasic ....