Envoyer une chaine en référence

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
bombseb
Messages : 445
Inscription : jeu. 25/août/2005 22:59
Localisation : 974
Contact :

Envoyer une chaine en référence

Message 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
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Envoyer une chaine en référence

Message par falsam »

Un petit bout de code peut etre pour voir comment tu stockes ta variable ?
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
bombseb
Messages : 445
Inscription : jeu. 25/août/2005 22:59
Localisation : 974
Contact :

Re: Envoyer une chaine en référence

Message 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"
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Envoyer une chaine en référence

Message 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.
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
bombseb
Messages : 445
Inscription : jeu. 25/août/2005 22:59
Localisation : 974
Contact :

Re: Envoyer une chaine en référence

Message 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...
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Re: Envoyer une chaine en référence

Message 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
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Re: Envoyer une chaine en référence

Message 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.
bombseb
Messages : 445
Inscription : jeu. 25/août/2005 22:59
Localisation : 974
Contact :

Re: Envoyer une chaine en référence

Message 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...
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Envoyer une chaine en référence

Message 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"
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
bombseb
Messages : 445
Inscription : jeu. 25/août/2005 22:59
Localisation : 974
Contact :

Re: Envoyer une chaine en référence

Message 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
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Envoyer une chaine en référence

Message 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)
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
bombseb
Messages : 445
Inscription : jeu. 25/août/2005 22:59
Localisation : 974
Contact :

Re: Envoyer une chaine en référence

Message par bombseb »

Oui mais là dans ces deux exemples tu ne passe pas la variable par référence... :mrgreen:
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Envoyer une chaine en référence

Message 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
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
bombseb
Messages : 445
Inscription : jeu. 25/août/2005 22:59
Localisation : 974
Contact :

Re: Envoyer une chaine en référence

Message 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 ?
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Envoyer une chaine en référence

Message 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
Dernière modification par falsam le sam. 22/mars/2014 15:20, modifié 2 fois.
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Répondre