Petite question sur les procédures

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Brayan
Messages : 19
Inscription : mar. 24/juil./2012 23:06

Petite question sur les procédures

Message par Brayan »

Bonsoir !

Voilà, j’en profite pour demander conseil car le problème se présente à moi :)

Pourquoi ma variable est quand même = à 0 alors qu’elle est pourtant globale
Et que je lui ai affecté + 10 ? 8O

Code : Tout sélectionner

Global Valeur

Debug Valeur

Procedure ExempleGlobal(Valeur) 
  Valeur + 10
EndProcedure

ExempleGlobal(10)
Debug Valeur
Avatar de l’utilisateur
TazNormand
Messages : 1297
Inscription : ven. 27/oct./2006 12:19
Localisation : Calvados (14)

Re: Petite question sur les procédures

Message par TazNormand »

Je dois reconnaître que le comportement est bizarre, mais quand même, pourquoi appeler tes variables partout "Valeur", je pense que PB est perdu entre tous tes variables, la globale et celle passée en paramètre de la procédure.

Ce code fonctionne bien :

Code : Tout sélectionner

Global Valeur

Debug Valeur

Procedure ExempleGlobal(Vale)
  Debug valeur
  valeur=Vale + 10
  Debug valeur
EndProcedure

ExempleGlobal(10)
Debug Valeur
Edit : comportement tout à fait normal, voici ce que dit la doc sur l'instruction "Procedure" :
Une procédure est une partie du code indépendante du programme principal qui peut avoir des paramètres et ses propres variables. En PureBasic, les procédures sont récursives et peuvent donc s'appeler elles-mêmes. Lors de chaque appel à la procédure, les variables locales sont automatiquement initialisées avec la valeur 0. Pour accéder aux variables du programme principal, ils faut les partager en utilisant les mots clefs Shared ou Global (voir aussi: Protected et Static).
Image
Image
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

Re: Petite question sur les procédures

Message par G-Rom »

Pourquoi lui repondre ??
Avatar de l’utilisateur
TazNormand
Messages : 1297
Inscription : ven. 27/oct./2006 12:19
Localisation : Calvados (14)

Re: Petite question sur les procédures

Message par TazNormand »

Parce que pour une fois sa question n'est pas trop stupide, et qu'elle peut servir. J'avoue m'être fait piéger en lançant le code sans regarder la doc.

Il est ce qu'il est, mais là, je ne peux pas lui jeter la pierre non plus.

De toute façon, message supprimé dès son BAN (imminent)
Image
Image
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Petite question sur les procédures

Message par Backup »

si tu savais te servir du debugger tu aurai compris ce qui se passe !!

je reprends ton code :
et utilise le bouton STEP pour faire avancer le prg ( ouvre la fenetre "Variables" )

Code : Tout sélectionner

Global Valeur
calldebugger
declare  ExempleGlobal(Valeur) ; on declare la procedure ...

Debug Valeur  ; ici = 0 normale aucune attribution n'est faite ...  



ExempleGlobal(10)  ; ici  en appelant la procedure , tu attribut la valeur 10 au parametre  !! pas a une variable !!!  ... maintenant on saute a la procedure

; voir dans la procedure

; ici la suite apres la procedure
Debug Valeur  ; ça affiche 0 car ta variable Global n'as pas ete affecté !

; pour qu'elle fut affecté , il aurait fallut utiliser procedurereturn valeur" .. voir exemple suivant 



Procedure ExempleGlobal(Valeur) ; ici Valeur ( le parametre vaut 10 ) pourquoi , parceque tu attribus en direct une valeur (10) au parametre et tu lui donne un nom "valeur"
; du coup  le "Valeur" d'ici n'est pas le meme que ta variable globale 
; ça deviens une variable Locale  paceque faut bien que Purebasic fasse quelque chose de cette valeur passé en parametre !
; en purebasic tu as le droit d'avoir le meme nom de variable en dehors et en dedans d'une procedure ... 

  Valeur + 10  ; ici on ajoute 10 donc "Valeur" (variable local)=20
EndProcedure ; on quitte la procedure sans transmetre cette variable locale donc elle disparait cette valeur 20 et n'existe plus ! .. on remonte pour la suite



voila ce qu'il aurai fallu faire pour ressortir la valeur resultat de ta procedure

Code : Tout sélectionner

Global Valeur
calldebugger
Debug Valeur

Procedure ExempleGlobal(Valeur)
  Valeur + 10
  ProcedureReturn valeur
EndProcedure

valeur= ExempleGlobal(10)
Debug Valeur 
la prochaine fois utilise "Calldebugger" et trace ;)

rappel : ; en purebasic tu as le droit d'avoir le meme nom de variable en dehors et en dedans d'une procedure ...

toute variable en dehors d'une procedure doit etre considéré comme global ...
et rien n'empeche d'avoir 2 variables ayant le meme nom en dedans ou en dehors d'une procedure !
l'une sera locale ( celle dedans ) et l'autre global par defaut si pas spécifié
en principe du point de vu de la procedure , ce ne sont pas les meme variables ..
l'une est posé sur la pile pas l'autre
la preuve ici :

Code : Tout sélectionner

valeur=10 ; global
debug "valeur avant l'appel de la procedure ="+str(valeur)

Procedure ExempleGlobal()
  Valeur + 888
  Debug "cette valeur est local ="+str(Valeur) ; local
  ; et disparaitra a la sortie de la procedure 
EndProcedure

ExempleGlobal()
Debug "cette valeur est global ="+str(Valeur ) +" et n'as pas ete affecté par la procedure"
c'est pourquoi Fred a fait "Shared" qui permet de partager une variable Local Vers l'exterieur d'une procedure
Brayan
Messages : 19
Inscription : mar. 24/juil./2012 23:06

Re: Petite question sur les procédures

Message par Brayan »

Je vous remercie pour vos précieuses lumières ! :)
Merci a dobro pour ses exemples fort utile :wink:

Ban, moi, pourtant je pensais avoir fais des effort supplémentaire
certes ya encore quelques petit effort a faire et je le sais bien !

Je ne poste plus pour dire n'importe quoi !

Comment voulez vous que j'évolue si vous me jetez tous le temps la pierre et si vous locker a chaque fois mes sujet :wink:
De toute façon quoi que je fasse ou dises c'est pareil non ?

ça m’énerve que vous faite sa, j'ai plus aucune marge de manœuvre !
Vous croyez que c'est facile sa hein ?!

Vous ne m'acceptez plus et quoi que je dises, je suis locker !!!
C'est pas juste ! :wink:

Ya de l'abus moi je dis (je trouve)

Vous ne voyez même plus mes efforts, quoi que je face je suis le vilain petit canard !
Là vous répondez car vous y voyez peut être un intérêt mais sinon c'est locker !

Voilà, j'ai un mot a dire a dobro quand même:

Dobro, ya du bon en toi comme chacun d'entre nous, des mes début avec certain autres comme Ar'S par exemple tu m'as aider !
Tu m'as apporter des exemples et tous et tous, je te remercie pour ça !

Regarde, là aussi tu m’apporte quelque choses d’intéressant !
Tu m'as aussi beaucoup critiquer et insulter de boulet et tous et pour sa je te félicite pas hein :lol: !

Tu es pas facile quand tu t'y met tu sais ! :wink:
Bref, t'es utile quand même, même si des fois tu as un caractère difficile je trouve !

Voilà !
Dernière modification par Brayan le jeu. 02/août/2012 20:10, modifié 1 fois.
Brayan
Messages : 19
Inscription : mar. 24/juil./2012 23:06

Re: Petite question sur les procédures

Message par Brayan »

Bon bref !

Code : Tout sélectionner

Global Valeur = 50
Debug Valeur

Procedure ExempleGlobal(Valeur)
  Valeur + 15
  Debug Valeur
EndProcedure

ExempleGlobal(10)
Debug Valeur
Donc en gros le global sert a quoi ici, a rien 8O
J'y comprends rien moi, c'est a devenir bèèèèèèèèèè :lol:
Avatar de l’utilisateur
falsam
Messages : 7317
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Petite question sur les procédures

Message par falsam »

Brayan a écrit :Donc en gros le global sert a quoi ici, a rien J'y comprends rien moi
Dobro a écrit :en purebasic tu as le droit d'avoir le meme nom de variable en dehors et en dedans d'une procedure ... et rien n’empêche d'avoir 2 variables ayant le même nom en dedans ou en dehors ... ce ne sont pas les mêmes variables ... c'est pourquoi Fred a fait "Shared" qui permet de partager une variable Local Vers l'exterieur d'une procédure

Code : Tout sélectionner

Global Valeur = 50
Tu as déclaré Valeur une première fois. Ta variable est égale à 50.

Code : Tout sélectionner

Procedure ExempleGlobal(Valeur)
Tu déclares valeur une 2eme fois. Ta variable sera égale à 0.
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: Petite question sur les procédures

Message par Backup »

falsam a écrit :

Code : Tout sélectionner

Global Valeur = 50
Tu as déclaré Valeur une première fois. Ta variable est égale à 50.

Code : Tout sélectionner

Procedure ExempleGlobal(Valeur)
Tu déclares valeur une 2eme fois. Ta variable sera égale à 0.
oui , et si tu appel la procedure en attribuant une valeur :
ExempleGlobal(10)
ça reviens a creer une variable locale a la procedure avec comme valeur "10"

c'est implicite , le fait d'attribuer une valeur au parametre d'une procedure (en faisant "ExempleGlobal(10)" )
et que ce parametre a un nom (ici "Valeur" puisque tu as cree ta procedure Procedure ExempleGlobal(Valeur)
reviens a creer une variable locale avec comme nom "Valeur"

en fait tu as attribué en Directe un parametre a ta procedure

tu aurais pu faire : (de façon scolaire )

procedure toto (mon_parametre )
endprocedure

et faire l'appel suivant :

mon_parametre=10
toto (mon_parametre )

mais tu as choisi d'attribuer une valeur en directe :
soit :
toto (10 )


mais tu avais donné un nom a ce parametre toto (mon_parametre )
et bien ce nom deviens une variable locale , parceque faut bien que Purebasic mette ta valeur "10" quelque part !
alors il creer implicitement une variable locale avec ce nom !

il n'y a rien a comprendre... c'est comme ça :)
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Re: Petite question sur les procédures

Message par djes »

Pfff c'est beaucoup plus simple que ça :

La variable globale est différente de la variable locale (celle de la procédure). Même si elles ont le même nom. Dans ton programme tu n'as jamais changé la variable globale.
Golfy
Messages : 423
Inscription : mer. 25/août/2004 15:14
Localisation : Grenoble
Contact :

Re: Petite question sur les procédures

Message par Golfy »

Dobro a écrit :si tu savais te servir du debugger tu aurai compris ce qui se passe !!
...

Code : Tout sélectionner

Global Valeur
calldebugger
...
Nom de Zeus !!! je connaissais même pas ça 8O
Merci Dobro... cela m'évitera surement de poser des questions stupides sur mes codes (je repense au thread) :wink:

Je ne connaissais que le débogueur classique
Purebasic 5.30 full sous Windows XP (x86) et Win7 (64 bits), Linux Debian. Orientation réseaux, domotique
http://golfy.olympe.in/Teo-Tea/
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Petite question sur les procédures

Message par Backup »

Golfy a écrit : Nom de Zeus !!! je connaissais même pas ça 8O
Merci Dobro... cela m'évitera surement de poser des questions stupides sur mes codes (je repense au thread) :wink:

Je ne connaissais que le débogueur classique
bhoooo ! arrete , je ne marche pas dans cette blague ! :lol:
Golfy
Messages : 423
Inscription : mer. 25/août/2004 15:14
Localisation : Grenoble
Contact :

Re: Petite question sur les procédures

Message par Golfy »

Golfy a écrit : Nom de Zeus !!! je connaissais même pas ça 8O
je viens d'essayer sur un petit code : Excellent ! Magique ! quand je pense que je suis passé à coté de ça pendant des années... je te promets que je n'avais jamais essayé le debogueur comme cela ! d'ailleurs, je trouvais le deboguage compliqué (avec des "debug variable" de partout...)

Conclusion : RTFM

PS : j'ai la honte de l'année :oops:
Purebasic 5.30 full sous Windows XP (x86) et Win7 (64 bits), Linux Debian. Orientation réseaux, domotique
http://golfy.olympe.in/Teo-Tea/
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Re: Petite question sur les procédures

Message par djes »

T'as pas à avoir honte ; je viens de regarder le manuel et c'est incroyable la quantité de choses qui ont été ajoutées depuis la dernière fois que j'ai regardé ! Le déboggueur console, par exemple, je ne savais même pas que ça existait... C'est un sacré boulot 8O
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Petite question sur les procédures

Message par Backup »

Golfy a écrit :Conclusion : RTFM

ça veut dire quoi RTFM ? 8O
Répondre