Page 2 sur 4

Re: Envoyer une chaine en référence

Publié : sam. 22/mars/2014 13:19
par bombseb

Code : Tout sélectionner

Elle est malpropre ma procédure ? Hahaha :mrgreen: 
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 :mrgreen:)

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 .... :mrgreen:

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 :mrgreen:
Tu commences ton code de cette maniére

Code : Tout sélectionner

toto$ = "A"
incLettre (@toto$)
ma proc puisse modifier la variable
je tiens compte que Peeks() n'est pas sexy pour toi :mrgreen:

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

Code : Tout sélectionner

Debug toto$
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 :mrgreen:

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 :oops:

Merci pour ton coup de main en tout cas :wink:

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 :mrgreen:

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 :roll: :)

Re: Envoyer une chaine en référence

Publié : sam. 22/mars/2014 16:41
par falsam
Dobro a écrit :arretez de le faire :roll: :)
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 :mrgreen:

sinon, j'ai pas eu ma réponse : J'ai pas saisi la différence entre .s et .String :oops:

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 :mrgreen:

sinon, j'ai pas eu ma réponse : J'ai pas saisi la différence entre .s et .String :oops:
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 :mrgreen:

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 .... :roll:

filperj crois qu'il s'agit d'un type au sens Standard ....

alors qu'il s'agit d'une Structure Pre declaré par Purebasic ....