Page 1 sur 3
Shared ou Global, lequel choisir ???
Publié : jeu. 30/nov./2006 10:48
par Kwai chang caine
Bonjour à tous.
Je m'excuse de poser des questions aussi terre à terre, mais malgres ce que je lis dans l'aide ou ailleurs, je n'ai toujours pas percuté sur la différence fondamentale entre SHARED et GLOBAL.
Je m'explique, lorsque l'on a une procedure, si l'on veut partager une variable, donc que sa valeur sorte de cette procedure on peut la declarer SHARED, bien
Mais si dans la meme procedure on la declare global (parce qu'apparement on a le droit) la valeur sort bien aussi, alors ou est la difference ???
Ou mieux encore en debut de prg on la declare GLOBAL et basta.
Est il déconseillé de declarer global dans une procedure ???? est ce là, la difference ?? C'est pas facile à comprendre tant que l'on ne programme pas à un haut niveau, je suppose....
Merci
Bonne journée
Publié : jeu. 30/nov./2006 11:09
par Backup
j'avais commencer par ecrire quelque chose, mais cela n'as pas l'air d'etre ça
je croyais que Shared partageait en lecture seulement une variable Locale !!
en fait Shared, transforme une variable Local en variable Global !!

puisque apres on peut influencer son contenu meme en dehors de la procedure
cela peut etre utile si a un moment precis on a besoin de transformer une variable local en global
Publié : jeu. 30/nov./2006 11:17
par Kwai chang caine
Merci DOBRO
Maintenant c'est tres clair, évidement, je ne raisonnais qu'en sortie et pas en entrée
Bonne journée.
Publié : jeu. 30/nov./2006 11:21
par Backup
non j'ai modifié mon message !!
en principe je pense que cela aurai du etre comme ça ! mais en fait...
relit plus haut !:D
en fait "Shared" est strict contraire de "Protected"
puisque protected rend temporairement locale une variable global !!
bien que Shared ne soit pas temporaire elle !
une fois transformé en global , elle le reste !!
vu que les procedures en purebasic sont incapable de renvoyer aisément plusieurs résultats (procedure Return)
j'utilise encore un max de variable Global
il faut etre imaginatif au niveau des noms de variables, pour ne pas se mélanger les pinceaux , c'est tout

Publié : jeu. 30/nov./2006 11:53
par Kwai chang caine
D'accord mais si c'est pour qu'elle devienne globale et le rester pourquoi on la nomme pas globale tout de suite dans la procedure ??
Et on peux nommer global dans une procedure???? ce qui veux dire que l'on va repasser dessus a chaque fois que l'on appelle la procedure et donc la redimensionner a chaque passage.....ça ne pose pas de bleme ???
Moi aussi j'utilise beaucoup de global.
Mais on m'avait dis que c'etait pas bien
Et que les "Vrais" il le faisait pas, surtout en VB.
Alors comme moi quand je serais grand je voudrais etre un "vrai" comme les "vrais", je commençais a éssayer de mettre des SHARED, car ceux qui sont pas des "vrais" ils connaissent pas les SHARED
Voila, merci pour l'explication et la correction de l'explication (Vitesse redoutale)
Une autre encore plus bete, tu sais comment on efface ce satané panneau de deboguage de @*#$$#£µ# par le code ???
Je cherche depuis tout a l'heure l'instruction qui effacerait ce que j'ecris en debug et je ne trouve pas.
C'est fou ça, deja qu'on s'embete avec ce qui est dur, on s'.......... autant avec des trucs tout simples
Merci
Publié : jeu. 30/nov./2006 12:25
par Backup
tu peut utiliser la console pour debugger !
Declare Change()
OpenConsole (): EnableGraphicalConsole (1)
CallDebugger
For t=1 To 5
Change()
PrintN ( Str (a)) ; affiche le contenu de la variable locale A , alors que l'on est en dehors de la procedure !!
; on ne devrai pas pouvoir ecrire dedans !!
a=a+1000
ClearConsole ()
Next t
Procedure Change()
Shared a ; le resultat est partagé avec l'exterieur
a = a+10
PrintN ( Str (a)) ; et pourtant la variable a son contenu belle et bien modifié !!
EndProcedure
Publié : jeu. 30/nov./2006 12:59
par Kwai chang caine
J'ai essayé ton code, et il s'arrete sur CallDebugger
Bon,...... je continue et rien n'apparait, et il marque terminé.
Pour le coup cette fois, c'est un peu trop éffacé comme tableau de déboguage

Publié : jeu. 30/nov./2006 13:05
par Backup
tu le lance en mode debug
cela s'arrete c'est normal !!
puis tu fait "pas a pas" avec le debugger
seulement l'affichage de la variable sera sur la console !!
on remplace l'affichage "debug" par "PrintN(variable _a afficher)"
l'avantage, tu peut faire des affichages qui reste sur le meme endroit
grace a "ConsoleLocate(x, y)"
comme ça par exemple
Code : Tout sélectionner
OpenConsole():EnableGraphicalConsole(1)
CallDebugger
For t=1 To 50
ConsoleLocate(10,10)
PrintN(Str(t));
Next t
ClearConsole()
CloseConsole()
ou bien utiliser la couleur pour faire resortir un detail
par exemple que la variable deviens negative
Code : Tout sélectionner
; a lancer en mode debug
; puis "pas a pas"
t=50
OpenConsole():EnableGraphicalConsole(1)
CallDebugger
For i=1 To 50
ConsoleLocate(10,10)
t=t-10
If t>=0
ConsoleColor(7, 0)
Else
ConsoleColor(12, 0)
EndIf
PrintN(Str(t));
Next i
ClearConsole()
CloseConsole()
ps : tu peut te faire une procedure "debug" qui va ouvrir la console et afficher la variable passer en parametre !!
comme ça :
Code : Tout sélectionner
; a lancer en mode debug
; puis "pas a pas"
Declare xDebug(x,y,variable)
t=50
CallDebugger
OpenConsole():EnableGraphicalConsole(1) ; on ouvre notre output
; prg a debugger !!
For i=1 To 50
t=t-10
xDebug(10,10,t)
Next i
; fin de prg
ClearConsole() ; on efface
CloseConsole() ; on ferme
Procedure xDebug(x,y,variable)
ConsoleLocate(x,y)
t=t-10
If variable>=0
ConsoleColor(7, 0)
Else
ConsoleColor(12, 0)
EndIf
PrintN(Str(variable));
EndProcedure
Publié : jeu. 30/nov./2006 14:04
par Kwai chang caine
Je connaissais pas du tout
Rooooooooohhhh dis donc, ça me rapelle le qb45 sous dos, que j'ai programmé + de 10 ans, moi qui suis un nostalgique .....
On pourrait presque tout programmer comme avant alors .....
Les locates, les prints, etc.....
Merci de cette nouvelle combine,le seul truc qui est dommage, c'est que la fenetre reste pas au dessus de l'appli, et quand on a besoin de cliquer la fenetre passe derriere, il faut redimensionner et positionner les 2 fenetres pour qu'elle ne se chevauchent pas.
C'est un peu plus contraignant.
Mais l'idée est bonne, comme dab.
Au fait tu ne m'a pas répondu, on peux nommer une variable globale dans une procedure???? ce qui veux dire que l'on va repasser dessus a chaque fois que l'on appelle la procedure et donc la redimensionner a chaque passage.....ça ne pose pas de bleme ???
Encore merci

Publié : jeu. 30/nov./2006 14:25
par Backup
bon finalement c'est bien ça !
Shared partage en lecture avec l'exterieur de la procedure, mais pas en ecriture !!
dans l'exemple suivant le a dans la procedure reste a 10
alors que celui qui est en dehors augmente !!
il y a 2 'a' mais ce ne sont pas les memes !!
tu peut declarer une global ou tu veux, mais c'est pas "joli", il vaut mieux prendre l'habitude de déclarer tes global au debut du prg !!
Code : Tout sélectionner
Declare Change()
OpenConsole():EnableGraphicalConsole(1)
CallDebugger
For t=1 To 5
Change()
PrintN(Str(a)); affiche le contenu de la variable A (c'est pas la meme que dans la procedure )
a=a+1000
ClearConsole()
Next t
Procedure Change()
Shared a ; le resultat est partagé avec l'exterieur
Global b
a = a+10
PrintN(Str(a))
EndProcedure
Publié : jeu. 30/nov./2006 14:25
par Flype
Kwai chang caine a écrit :Au fait tu ne m'a pas répondu, on peux nommer une variable globale dans une procedure???? ce qui veux dire que l'on va repasser dessus a chaque fois que l'on appelle la procedure et donc la redimensionner a chaque passage.....ça ne pose pas de bleme ???
c'est effectivement un peu obscure comme situation. c'est pour çà que perso je ne le fais pas. J'ai un pote qui me dit toujours pour blaguer 'Quand on connait pas - On touche pas !'. Bon sans aller jusque là, ne connaissant pas réellement les comportements (qui peuvent changer d'une version PB à l'autre) j'évite de le faire. Pour moi une Globale se déclare en haut du code source - hors procédure. Ceci dit parfois je le fais dans le cadre d'une Userlib ou d'une DLL dans la procédure d'initialisation de la DLL. Mais dans ce cas, même si la Globale est dans une procédure - la fonction d'init est appelée qu'une seule fois (au démarrage du programme, point).
Publié : jeu. 30/nov./2006 14:28
par Backup
a mon avis SHARED PLANTE !!
dans le prg ci dessus le 2em print effectuer, ne devrai pas afficher "0"
car on a shared la A dans la procedure, donc en sortie de proc on devrai avoir la premier affectation de a , soit "10" !!!
la presence de "Global b ", dans la procedure fou le bazard !!
Code : Tout sélectionner
Declare Change()
OpenConsole():EnableGraphicalConsole(1)
CallDebugger
For t=1 To 5
Change()
PrintN(Str(a)); DEVRAI AFFICHER 10 !!!!
a=a+1000
ClearConsole()
Next t
Procedure Change()
Shared a ; le resultat est partagé avec l'exterieur
Global b
a = a+10
PrintN(Str(a))
EndProcedure
Publié : jeu. 30/nov./2006 15:22
par Kwai chang caine
donc pas de globale dans les procedures , juste des SHARED, si j'ai bien compris.
Quoi qu'il en soit, hors mis la prise de place, c'est bien ou faut eviter les globales??????
Publié : jeu. 30/nov./2006 15:40
par Backup
Kwai chang caine a écrit :donc pas de globale dans les procedures , juste des SHARED, si j'ai bien compris.
Quoi qu'il en soit, hors mis la prise de place, c'est bien ou faut eviter les globales??????
ça a rien a voir avec la place qu'elles prennent
c'est juste que lorsque tu a beaucoup de procédure sue un projet important
que tu travaille a plusieurs, tu ne connais pas spécialement le nom de toute les variables d'un prg, donc pour éviter d'utiliser une variable qui risque d'avoir le même nom dans une autre procédure, on travaille avec des locales, comme ça pas de chevauchement
mais si comme moi tu utilise une bonne syntaxe pour tes variables, en principe y a pas de raisons, mais faire gaffe en cas de boulot a plusieurs !!
tout ça pour parler de la "portée des variables"
certains vont te dire que c'est indispensable (les pro qui bossent en équipe

), mais pour un petit programmeur chez soi, qui bosse sur SON projet
alors tu fais bien comme tu le sens

Publié : jeu. 30/nov./2006 15:59
par Kwai chang caine
Bon d'accord, c'est vrai que je n'avais pas pensé au travail d'équipe.
Faut dire que dans mon equipe ya moi et moi-meme
Bon donc en résumé, les globales c'est bien, on peux en mettre mais de preference en debut de programme et eviter de les mettres dans les procedures.Pour les procedures il faut utiliser SHARED
1/ Est ce que j'ai bien compris ma Xieme leçon donnée par mes professeurs favoris ?
2/ Pour reinitialiser un tableau on refait dim tableau(x) n'importe-ou, ou on en a besoin, et il repart a zero ?? ya pas d'autre methode ???