Page 1 sur 4

Envoyer une chaine en référence

Publié : sam. 22/mars/2014 11:12
par bombseb
Bonjour,

Je désirerais envoyer une chaine de caractère en reference à une procédure, suis-je obligé de passer par une structure ?

Parceque si je fait ca :

Code : Tout sélectionner

Procedure.a maProc (*param.s)
Et bien ca ne marche pas....

D'ailleurs, j'en profite pour poser une question : Pour envoyer un paramètre par référence, il n'y a pas plus simple que d'envoyer l'adresse de la variable ? Il n'y a pas un mot clef "ref" ou un truc comme ca ?

Merci d'avance

Re: Envoyer une chaine en référence

Publié : sam. 22/mars/2014 11:20
par falsam
Un petit bout de code peut etre pour voir comment tu stockes ta variable ?

Re: Envoyer une chaine en référence

Publié : sam. 22/mars/2014 11:27
par bombseb
Arf je viens de modifier mon prog comme ca (et ca marche) :

Code : Tout sélectionner

Structure strChaine
  Chaine$
EndStructure

Global Chaine.strChaine

Procedure.a incLettre (*str.strChaine)
  *str\Chaine$ = "toto"
EndProcedure
sinon j'avais fait un truc comme ca (de mémoire) :

Code : Tout sélectionner

Procedure.a incLettre (*prout.s)
  *prout\s = "toto"
EndProcedure
Il me disait "Native types can't be used by pointers"

Re: Envoyer une chaine en référence

Publié : sam. 22/mars/2014 11:33
par falsam
Les pointeurs ne peuvent pas, ou plutôt ne peuvent plus être typés :)

PS : je pense que ça devait être un bug auparavant de typer un pointeur.

Re: Envoyer une chaine en référence

Publié : sam. 22/mars/2014 11:36
par bombseb
ok d'acc :wink:

Sinon, est-ce que tu sais s'il est prévu dans une futur version de PB d'ajouter un mot clef "ref" pour pouvoir envoyer n'importe qu'elle variable en référence ?
Je suis tombé sur un post de 2004 de Fred qui disait que c'était prévu...

Re: Envoyer une chaine en référence

Publié : sam. 22/mars/2014 11:41
par nico
T'avais une erreur du compilateur car tu n'a pas assigné de structure, c'est comme cela:

Code : Tout sélectionner

Procedure.a incLettre (*prout.String)
  *prout\s = "toto"
EndProcedure

Re: Envoyer une chaine en référence

Publié : sam. 22/mars/2014 11:43
par nico
ajouter un mot clef "ref" pour pouvoir envoyer n'importe qu'elle variable en référence
Ben c'est @ qui permet d'envoyer l'adresse, c'est pas compliqué sauf exeption.

Re: Envoyer une chaine en référence

Publié : sam. 22/mars/2014 11:45
par bombseb
ah oui alors là je ne comprend plus....

Je croyait que .s ca voulais dire "string" justement, je pensais que c'était la même chose

Effectivement avec .String ca marche...

Re: Envoyer une chaine en référence

Publié : sam. 22/mars/2014 11:47
par falsam
Avec ce que tu as fais ça fonctionne non ? Si on compléte ton code

Code : Tout sélectionner

Structure strChaine
  Chaine$
EndStructure

Global Chaine.strChaine

Procedure.a incLettre (*str.strChaine)
  *str\Chaine$ = "toto"
EndProcedure

Chaine\Chaine$ = "titi"

incLettre(Chaine)


Debug chaine\Chaine$
Aprés traitement de ton pointeur, la valeur de chaine passe bien de "titi" à "toto"

Re: Envoyer une chaine en référence

Publié : sam. 22/mars/2014 11:51
par bombseb
Ouioui ca marche bien avec ce que j'avais fait, mais c'est plus simple comme tu m'a dit avec .String dans la déclaration de la procédure

Je trouvais ca dommage de passer par une structure juste pour une variable

Re: Envoyer une chaine en référence

Publié : sam. 22/mars/2014 11:57
par falsam
Effectivement si c'était juste pour passer UN seul string tu n'avais pas besoin de structure.

Code : Tout sélectionner

Procedure.s incLettre(buffer.s)
  Debug buffer
EndProcedure

inclettre("toto")
:mrgreen:

ou

Code : Tout sélectionner

monstring.s = "toto"

Procedure.s incLettre(buffer.s)
  Debug buffer
EndProcedure


inclettre(monstring)

Re: Envoyer une chaine en référence

Publié : sam. 22/mars/2014 12:02
par bombseb
Oui mais là dans ces deux exemples tu ne passe pas la variable par référence... :mrgreen:

Re: Envoyer une chaine en référence

Publié : sam. 22/mars/2014 12:32
par falsam
bombseb a écrit :Oui mais là dans ces deux exemples tu ne passe pas la variable par référence... :mrgreen:
Tu as raison je me moquais :)
mais je vais quand même faire mon Noob car je comprend mal le "by reference"

Ce code ne correspond pas à un passage de variable par référence ?

Code : Tout sélectionner

Procedure.s incLettre(*Buffer)   
  PokeS(*Buffer, "toto")
EndProcedure

Monstring.s = "titi"

incLettre(@Monstring)
Debug Monstring

Re: Envoyer une chaine en référence

Publié : sam. 22/mars/2014 12:37
par bombseb
Heu...si pourquoi ??

Je voulais juste le faire proprement, je croyais qu'il y avait peut être un mot clef "ref" comme en C#....

Question : du coup, c'est quoi la différence entre .String et .s ?

Re: Envoyer une chaine en référence

Publié : sam. 22/mars/2014 13:10
par falsam
bombseb a écrit :Je voulais juste le faire proprement
Elle est malpropre ma procédure ? Hahaha :mrgreen:

Quand à ta question je vais laisser les pro du pourquoi faire simple quand on peut faire compliqué y répondre :)

Tout ce que je peux te dire c'est que buffer.s correspond bien à une variable alphanumérique.

■ je suis perplexe devant cette manière de faire !

Code : Tout sélectionner

Procedure Dummy(*Buffer.Integer)
  *Buffer\i = 2
EndProcedure

buffer=0
Dummy(@Buffer)
Debug Buffer
et

Code : Tout sélectionner

Procedure.s Dummy(*Buffer.String)
  PokeS(*Buffer, "toto")
EndProcedure

Buffer.s="titi"
Dummy(@Buffer)
Debug Buffer
Je trouve ça assez obscur e