Page 1 sur 1

Dim

Publié : mer. 21/avr./2004 18:39
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

:?

Publié : mer. 21/avr./2004 18:43
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 ?

Publié : mer. 21/avr./2004 20:37
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é ?

Publié : mer. 21/avr./2004 20:41
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 )

Publié : mer. 21/avr./2004 21:06
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 ?

Publié : mer. 21/avr./2004 21:14
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.

Publié : mer. 21/avr./2004 21:17
par nico
Merci les gens! :D

Publié : mer. 21/avr./2004 21:39
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:

Publié : mer. 21/avr./2004 22:26
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.

Publié : jeu. 22/avr./2004 3:48
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 :)

Publié : jeu. 22/avr./2004 6:29
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