Dim

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Dim

Message par nico »

Pourriez vous m'éclairer,

Si je déclare un tableau avec la variable dim dans une procédure, celle-ci est normalement locale, comment la rendre globale avec shared ?

exemple:

procedure toto()
dim truc.w(20)
shared ?
endprocedure

:?
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

il suffit de tester :)
Je dirais que c'est global

Code : Tout sélectionner

Procedure essai()
   Dim Toto(4)
   Toto(2)=456
EndProcedure

essai()

Toto(1)=123
Debug Toto(1)   
Debug Toto(2) 
Remarque , je comprends ta question , c'est vrai que l'aide dit ça :
Shared permet de rendre une variable d'une procédure accessible depuis l'extérieur. Si vous souhaitez rendre un tableau accessible de cette manière, vous devez utiliser le nom du tableau sans parenthèse.
je ne comprends pas pourquoi on doit utiliser shared sur un tableau , étant donné qu'il est global ?
LavaLava
Messages : 173
Inscription : dim. 28/mars/2004 17:42
Localisation : Provence

Message par LavaLava »

Point du tout nico !

Voila la doc en anglais :

Code : Tout sélectionner

Shared allows a variable to be accessed within a procedure.

You do not need to use the Shared command to access arrays or linked lists which were defined outside a procedure, since they are always global
Donc une variable tableau est toujours globale. J'ai testé et c'est vrai !

Par contre en testant je me suis aperçu que le code suivante plante PB !

Code : Tout sélectionner

Procedure test()
  Dim toto(3)
 toto(1)=123
EndProcedure

;test()

Toto(2)=456 
Debug Toto(1)    
Debug Toto(2)    
J'ai le PB 3.81 est-ce que ce bug à été corrigé ?
Avatar de l’utilisateur
cederavic
Messages : 1338
Inscription : lun. 09/févr./2004 23:38
Localisation : Bordeaux

Message par cederavic »

ben la comme ça, sa parrait tout a fait logique puisque tu n'appelle pas la proc qui créé l'array ;) (il est en commentaire :P )
LavaLava
Messages : 173
Inscription : dim. 28/mars/2004 17:42
Localisation : Provence

Message par LavaLava »

J'ai mis la virgule de commentaire exprés! et quand je lance le code, le compilateur ne me donne aucune erreur et PB plante...

Mais j'ai un autre truc rigolo :

Code : Tout sélectionner

Procedure test()
  Dim toto(3)
  toto(1)=123
EndProcedure

test()
Dim toto(3)
toto(2)=456
Debug toto(1)
Debug toto(2)
Et le resultat est :
0
456
Bizarre que le compilateur ne me dise pas que le tableau est déja déclaré !

Je marche sur un oeuf car comme je l'ai dit je suis en PB3.81 et peut être que c'est réparé ... mais ça sens le boque !
Quelqu'un peut-il tester ce code en 3.90 ?
LavaLava
Messages : 173
Inscription : dim. 28/mars/2004 17:42
Localisation : Provence

Message par LavaLava »

Cé remoi et j'ai relut la doc, donc cé pas rigolo !
Le PB est plus fort que ce que je croyais et on à droit de refaire un Dim avec un tableau existant : c'est le resizing !
Donc mon dernier code est tout à fait OK.
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message par nico »

Merci les gens! :D
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

La version anglaise
Shared allows a variable to be accessed within a procedure.

You do not need to use the Shared command to access arrays or linked lists which were defined outside a procedure, since they are always global
Et la version française
Shared permet de rendre une variable d'une procédure accessible depuis l'extérieur.

Si vous souhaitez rendre un tableau accessible de cette manière, vous devez utiliser le nom du tableau sans parenthèse.
même si j'ai du mal avec l'anglais , je crois que je vais réinstaller la doc anglaise :lol:
LavaLava
Messages : 173
Inscription : dim. 28/mars/2004 17:42
Localisation : Provence

Message par LavaLava »

Il y a des chose qui me turlupine et j'avais l'impression de m'être enduit avec de l'erreur ... J'ai donc tout relut et voila :
Arrays are always globally accessable in PureBasic. This means that they can always be accessed from inside procedures without needing to use the Global or Shared commands.
Donc un tableau est toujours global (Ce qui résoud le probléme de nico)

Code : Tout sélectionner

a=10
Procedure Test()
  Shared a
  a=20
EndProcedure
Procedure Retest()
  a=30
EndProcedure

Test()
Retest()

Debug a
Le resultat est 20
Donc Shared permet, dans une procédure et de manière ponctuelle, de rendre globale une variable d'origine locale.

Contois, ne te formalise pas par les différence entre doc anglaise et française. C'est vrai qu'il y a souvent des erreurs (et pas qu'en PB) mais j'ai lut que beaucoup d'effort avait été fait à ce sujet dans la dernière version.
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

Oui j'ai vu les améliorations de la doc française depuis la version 3.72 , et c'est une bonne chose .

Mais comme ça fait deux fois en peu de temps que la doc anglaise apporte une information plus complète (FlipBuffers()) et plus juste (shared), je me dis qu'en cas de doute ou d'incertitude avec la doc française ,je devrais d'abord consulter la doc anglaise avant de venir poster ici.

Crois moi , j'apprécie l'effort qui a été fait sur la doc .Et c'est dans cet esprit que je parlais de comparer plus souvent les deux docs , afin de souligner les écarts (pour la prochaine mise à jour de la doc française ), rien de plus . Quand on s'exprime rapidement , on est parfois maladroit :)

et là je fais court aussi car je vais bosser :)
Guimauve
Messages : 1015
Inscription : mer. 11/févr./2004 0:32
Localisation : Québec, Canada

Message par Guimauve »

Un petit truc à moi pour les tableaux, je fais un Enumeration de chacun des éléments du tableau et j'ajoute une constante pour dimensionner le tableau à la fin. ex.

Code : Tout sélectionner

Enumeration
	#ELEMENT1
	#ELEMENT2
	#ELEMENT3
	#ELEMENT4
	#...
	#DIMSIZE
EndEnumeration

Dim Montableau.s(#DIMSIZE)
De cette manière je m'assure que le tableau n'a qu'un seul élément de plus que mes besoins. Ça évite de réserver de la mémoire inutilement. Malheureusement c'est pas toujours possible de faire ça. Enfin, c'est mieux de le faire quand c'est possible.

Et je confirme un tableau est Global, on peut lire les éléments du tableau à partir de tout les procédures d'un programme.

A+
Guimauve
Répondre