Shared ou Global, lequel choisir ???

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Shared ou Global, lequel choisir ???

Message 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 ??? 8O
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
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message 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
Dernière modification par Backup le jeu. 30/nov./2006 11:23, modifié 3 fois.
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Message par Kwai chang caine »

Merci DOBRO

Maintenant c'est tres clair, évidement, je ne raisonnais qu'en sortie et pas en entrée :P

Bonne journée.
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message 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 :D
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Message 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 ?? 8O

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

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

Voila, merci pour l'explication et la correction de l'explication (Vitesse redoutale):wink:

Une autre encore plus bete, tu sais comment on efface ce satané panneau de deboguage de @*#$$#£µ# par le code ??? :lol:
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 :mad:

Merci
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

tu peut utiliser la console pour debugger ! :D


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


Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Message par Kwai chang caine »

J'ai essayé ton code, et il s'arrete sur CallDebugger 8O

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 :lol: :lol: :lol:
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message 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 !! 8O

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

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 !! :D

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
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Message par Kwai chang caine »

Je connaissais pas du tout :P

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 :wink:
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message 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 

Dernière modification par Backup le jeu. 30/nov./2006 14:27, modifié 1 fois.
Avatar de l’utilisateur
Flype
Messages : 2431
Inscription : jeu. 29/janv./2004 0:26
Localisation : Nantes

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

Message 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 

Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Message 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??????
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message 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 :D

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

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 :D), mais pour un petit programmeur chez soi, qui bosse sur SON projet
alors tu fais bien comme tu le sens :D
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Message 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 :lol:

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

1/ Est ce que j'ai bien compris ma Xieme leçon donnée par mes professeurs favoris ? :lol:

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 ???
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Répondre