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 :

Re: Envoyer une chaine en référence

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

Re: Envoyer une chaine en référence

Message 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

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 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$)
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 »

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...
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 :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 :)
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 »

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

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

Re: Envoyer une chaine en référence

Message 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 :)
Dernière modification par Backup le sam. 22/mars/2014 16:09, modifié 1 fois.
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 »

Le monsieur a bien dit que Poke c'est pas sexy :mrgreen:
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%
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Envoyer une chaine en référence

Message 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: :)
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 »

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  
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 »

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

Re: Envoyer une chaine en référence

Message 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 
Dernière modification par Backup le sam. 22/mars/2014 16:52, modifié 1 fois.
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 :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:
Dernière modification par falsam le sam. 22/mars/2014 16:53, modifié 1 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%
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Envoyer une chaine en référence

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