online faq recherche accueil
 

Il y a 166 utilisateurs connus et inconnus. Pour voir la liste des connectés connus, cliquez ici

 Mot :   Pseudo :  
 
Bas de page
Auteur
 Sujet :

tout sur les variables

 
n°4587322
Maximaxou
rejoignez les fidèles du JASS
Posté le 10-12-2006 à 03:50:16  profilanswer
 

Plus j'utilise l'éditeur, plus je me pose de questions de plus en plus poussées. Et j'aimerais éclaircir quelques points sur les variables :
 
1. Lorsqu'une variable ne contient pas de valeur, la plupart du temps (ou toujours), la valeur est alors NULL. Est-ce vrai pour tous les types ?
 
2. A propos des fuites de mémoire, est-ce que à chaque appel d'une variable globale, cela occasionne une fuite de mémoire ? Les variables locales n'occasionnent-elles aucune fuite de mémoire ? Si oui, cette fuite de mémoire est-elle proportionnelle à la taille de la variable ? Est-ce que les fuites de mémoires occasionnées par les variables de types codés sur un faible nombre de bits sont négligeables ? (je suppose que les types du genre unité, compétence ou encore déclencheur sont codés sur beaucoup plus de bits que les types booléen, entier, réel ... )
 
3. Les variables sont codées sur combien de bits ? (l'idéal serait un site affichant cela pour chaque type de variable). Quelles sont les limites min et max des types réel et entier ? Quelle est la précision des réels ?  
 
4. Quelle est la différence entre les variables locales et globales (i.e. comment l'ordinateur gère-t-il les variables dans la mémoire) ? Et donc pourquoi les variables globales occasionnent-elles des fuites de mémoire et les variables locales non ?
 
5. Les tableaux de variables (ou encore listes) : ont-ils une taille maximale ? Lorsque l'on déclare une variable globale  de type tableau de <type>, si dans déploiement on met N, la taille du tableau ainsi créé sera-t-elle de N ou N+1 ? (puisque il faut savoir que le plus petit indice d'un tableau n'est pas 1 mais 0) Si l'on déclare un tableau de N éléments et qu'on essaie de donner une valeur à un indice supérieur à N+1, que se passe-t-il ?
Lorsque l'on fait la déclaration d'un tableau en jass de la façon suivante : "local <type> <nom_var> array" ; quelle taille à alors la variable ainsi créée ? Comment donne-t-on une taille spécifique à un tableau ? Peut-on redimensionner un tableau à n'importe quel moment ? Si oui, l'ordinateur crée-t-il en réalité une nouvelle variable ? Et si oui, les valeurs du tableau sont-elles effacées ?
 
Je ne vois pas d'autres questions à poser sur les variables pour le moment.
Merci d'avance pour vos réponses.


Message édité par Maximaxou le 10-12-2006 à 04:04:11
n°4587326
Ayane
Posté le 10-12-2006 à 12:01:27  profilanswer
 

Tous les types peuvent sont en fait des entiers, mis à part le format des réels. Un entier est codé sur 4 octets.
 
1/ null est donc égale à 0, null est comparable avec tous les types même les réels.
 
2/ Etant donné que beaucoup de types sont des extentions de handle, donc des pointeurs, si tu ne détruit pas l'objet une fois que tu n'en a plus besoin, que ta variable soit locale ou globale, alors tu perdra le pointeur, donc la mémoire pour ton objet sera toujourrs alloué, c'est ce qu'on appele une fuite de mémoire. Pour des types tels que des points cela ne prend pas trop (deux réels), une unité prend en effet beaucoup, mais si tu en perd dans une boucle alors cela se fait sentir au cours de la partie. Si tu veux savoir s'il y a des fuites dans ta carte c'est simple, tu la lance et tu regarde dans le gestionnaire de processus si la mémoire utilisée par war3.exe augmente.
 
3/ Etant sur 4 octets tu peux faire le calcul ou le tester (set i = 0x7FFFFFFF), les limites pour un entier sont [-2147483648;2147483647], ce qui en Jass est amplement suffisant.
 
4/ C'est la même chose que pour du C++ ou tout autre langages utilisant des objets.
 
5/ D'après le common.j la limite est

Code :
  1. constant integer            JASS_MAX_ARRAY_SIZE             = 8192


Personne n'a jamais vraiment pris la peine de vérifier n'ayant pas d'utilité à faire des tableaux plus grands. Pour l'allocation de mémoire dans ce cas là je n'ais pas fait de teste mais il a l'air de se débrouiller assez bien là dessus. Les tableaux sont dynamiques, il les redimensionne tout seul en te conservant les valeurs. En fait il passe par un second tabbleau pour les index, permettant ainsi d'avoir des valeurs diverses.


Message édité par Ayane le 10-12-2006 à 12:34:01
n°4587327
Troll-Brai​n
http://worldedit.free.fr/forum
Posté le 10-12-2006 à 12:07:58  profilanswer
 

juste une petite remarque concernant la 2).
Si tu lance une partie perso et que tu bascules sur le gestionnaire des taches tu ne verras aucune fuite de mémoire en "direct". Warcraft arrête son traitement.
Si tu veux vraiment voir l'amplitude des fuites lance une partie en réseau local

n°4587329
Maximaxou
rejoignez les fidèles du JASS
Posté le 10-12-2006 à 14:08:17  profilanswer
 

Merci pour toutes ces informations.
 

Citation :

...si tu ne détruit pas l'objet une fois que tu n'en a plus besoin...


Comment peut-on détruire un objet ?
 
J'aimerais avoir plus d'informations sur les extensions de handle. Si j'ai bien compris, les entiers occasionneront autant de fuite de mémoire que les unités puisque c'est le pointeur qui n'est pas supprimé, et non le contenu de la variable directement, je me trompe ?


Message édité par Maximaxou le 10-12-2006 à 14:12:04
n°4587334
Ayane
Posté le 10-12-2006 à 17:35:32  profilanswer
 

Les entiers ne sont pas des objets.
 
Par exemple
 

Code :
  1. function Test takes nothing returns nothing
  2. call Location( 0., 0. )
  3. endfunction


Outre le fait que cette fonction ne sert à rien, elle produira une fuite de mémoire car elle créer un nouvelle instance de location qui n'est pas supprimé par la suite.
Pour éviter cela il faut faire:

Code :
  1. function Test takes nothing returns nothing
  2. local location p = Location( 0., 0. )
  3. call RemoveLocation( p )
  4. endfunction

n°4587343
Maximaxou
rejoignez les fidèles du JASS
Posté le 11-12-2006 à 00:32:26  profilanswer
 

ok. Et comment fait-on pour supprimer des objets d'autres types ?

n°4587350
Ayane
Posté le 11-12-2006 à 09:45:37  profilanswer
 

Ce sont toutes les fonctions qui commencent en Remove ou Destroy.

n°4587382
Maximaxou
rejoignez les fidèles du JASS
Posté le 12-12-2006 à 00:51:16  profilanswer
 

Quelle est la différence entre Destroy et Remove ?
 
Qu'est-ce que c'est "pool" dans DestroyUnitPool" ?
 
Si l'on veut libérer la mémoire utilisée par une variable de type unité il faut donc faire RemoveUnit(<var> ) ?
Mais dans ce cas l'unité est supprimée. Alors est-ce que c'est le contenu de la variable qui doit être supprimé et non le pointeur ?
Ou alors faut il supprimer le pointeur, d'une autre façon ?
 
exemple, mon trigger pour la glisse :

Code :
  1. function Trig_avancer_j1_Actions takes nothing returns nothing
  2.     local integer I = 0
  3.     local real speed = udg_slide_speed[I]
  4.     local real X
  5.     local real Y
  6.     local real A
  7.     local unit U
  8.     set U = udg_hero[I]
  9.     set X = GetUnitX(U)
  10.     set Y = GetUnitY(U)
  11.     if ( is_ice(X,Y) ) then
  12.         set A = Deg2Rad(GetUnitFacing(U))
  13.         call SetUnitPosition( U, X+speed*Cos(A),Y+speed*Sin(A) )
  14.     endif
  15.     call RemoveUnit(U) //à ne pas faire
  16. endfunction
  17. //===========================================================================
  18. function InitTrig_avancer_j1 takes nothing returns nothing
  19.     set gg_trg_avancer_j1 = CreateTrigger(  )
  20.     call TriggerRegisterTimerEventPeriodic( gg_trg_avancer_j1, 0.01 )
  21.     call TriggerAddAction( gg_trg_avancer_j1, function Trig_avancer_j1_Actions )
  22. endfunction


 
Que faut-il donc mettre à la place de call RemoveUnit(U) ligne 15 ?
Puisque je suppose qu'il faut libérer la mémoire, la variable U est de type unité, un objet.
Au fait si vous voyez un moyen quelconque permettant d'encore améliorer ce trigger, je suis prenant, bien que je ne vois pas d'autre possibilité de l'optimiser... sauf peut-etre créer des régions de début et de fin de glisse, et activer le déclencheur lorsque le personnage entre une zone de début de glisse et le désactiver lorsqu'il rentre dans une région de fin de glisse. Mais je n'ai pas que ça à faire et cela occasionneraient de nombreux bugs. De map contient plus de terre que de glace ^^.
 
PS : pourquoi ai-je décomposé mon trigger de glisse en 11 triggers, un par joueur ? Simplement pour pouvoir désactiver la glisse lorsque le personnage est mort, ainsi avoir le déclencheur le plus économe possible (inutile d'avoir un déclencheur qui gère la glisse des 11 personnages lorsque l'on est deux on trois dans la map !). Au passage cela résout le problème du personnage qui continue de glisser jusqu'à la terre lorsqu'il meurt :).
 
Bon je vais me coucher moi... bonne nuit à tous.


Message édité par Maximaxou le 12-12-2006 à 01:11:23
n°4587384
Troll-Brai​n
http://worldedit.free.fr/forum
Posté le 12-12-2006 à 17:22:39  profilanswer
 

cela veut dire que tu as une piscine d'unité ^^.
 
Explication par M. Ayane
 
Au lieu de 11 triggers tu aurais pu en faire un seul avec une variable bolenne déployée
 
Entre destroy et remove il n'y a pas de différence je penses, c'est juste un vocabulaire différent
 
tu peu faire set U = null mais je ne penses pas que cela soit necessaire, étant donné que c'est une variable locale et qui n'a d'existence que dans sa fonction, enfin à toi de tester  :jap:  
 


Message édité par Troll-Brain le 12-12-2006 à 17:27:51
n°4587386
Maximaxou
rejoignez les fidèles du JASS
Posté le 12-12-2006 à 18:54:15  profilanswer
 

Citation :

Fallait faire une piscine de poisson rouge, cela aurait évité d'avoir les paysans sur le dos.  
C'est sûr que si tu leur met des monstres affamés de chair humaine, cela a pour tendance de diminuer la productivité paysanne., et d'augmenter proportionellement la ratio moyen de peur/contentement paysanne  


mdr
 
En gros UnitPool c'est groupe d'unités.


Message édité par Maximaxou le 12-12-2006 à 18:54:28
n°4587390
Troll-Brai​n
http://worldedit.free.fr/forum
Posté le 12-12-2006 à 20:42:51  profilanswer
 

un groupe de type d'unité

n°4587394
Maximaxou
rejoignez les fidèles du JASS
Posté le 12-12-2006 à 22:28:01  profilanswer
 

non le type c'est "groupe d'unités"

n°4587396
Troll-Brai​n
http://worldedit.free.fr/forum
Posté le 12-12-2006 à 22:31:51  profilanswer
 

Maximaxou a écrit :

non le type c'est "groupe d'unités"


j'ai pas dit groupe de type unité mais groupe de type D'unité c'est du bon francais ^^

n°4587397
Maximaxou
rejoignez les fidèles du JASS
Posté le 12-12-2006 à 22:44:50  profilanswer
 

groupe de type "d'unités" ça veut rien dire lol
 
Je crois que j'ai enfin compris l'intérêt des variables locales par rapport aux variables globales quant aux fuites de mémoires : à la fin de l'exécution d'une fonction les variables locales sont supprimées. Ce que je ne comprends pas, c'est pourquoi chaque appel d'une variable globale provoque une fuite de mémoire.


Message édité par Maximaxou le 13-12-2006 à 01:09:38
n°4587411
Troll-Brai​n
http://worldedit.free.fr/forum
Posté le 13-12-2006 à 17:19:21  profilanswer
 

bien sur que si un groupe contenant plusieurs types d'unités c'est pas ma faute si tu te bats avec le français  :sarcastic:  
Euh en fait c'est pas à chaque appel, c'est juste quand elle ne sont plus utilisées

n°4587414
Maximaxou
rejoignez les fidèles du JASS
Posté le 13-12-2006 à 18:20:25  profilanswer
 

ah ok. Sinon Le type "d'unités", ça veut peut-être dire quelque chose, mais d'après mes connaissances en français, pas dans cette langue si voluptueuse.

n°4587418
Troll-Brai​n
http://worldedit.free.fr/forum
Posté le 13-12-2006 à 18:52:15  profilanswer
 

Code :
  1. type unittype           extends     handle


C'est ce que tu rajoutes/enleves/prends dans un unitpool.
Traduction : type d'unité   :sarcastic: ou autrement dit paysan, grunt, chevalier , etc...


Message édité par Troll-Brain le 13-12-2006 à 18:53:08
n°4587425
Maximaxou
rejoignez les fidèles du JASS
Posté le 13-12-2006 à 21:24:48  profilanswer
 

le type c'est alors "types d'unité"......ok je me cache xD

n°4587428
Troll-Brai​n
http://worldedit.free.fr/forum
Posté le 13-12-2006 à 21:54:57  profilanswer
 

c'est vrai que j'avais fait une grossière erreur de faute d'orthographe, les torts sont partagés


Message édité par Troll-Brain le 13-12-2006 à 22:07:13
n°4587429
Maximaxou
rejoignez les fidèles du JASS
Posté le 13-12-2006 à 22:05:30  profilanswer
 

^^ :p

n°4587447
Maximaxou
rejoignez les fidèles du JASS
Posté le 15-12-2006 à 04:07:45  profilanswer
 

une petite question : il est beaucoup plus rapide de faire une division par 256 que par 200 vu que les nombres sont stockés en binaire, n'est-ce pas ?

n°4587449
Troll-Brai​n
http://worldedit.free.fr/forum
Posté le 15-12-2006 à 15:48:18  profilanswer
 

surement mais on parle de nanosecondes là  :D

n°4587450
Maximaxou
rejoignez les fidèles du JASS
Posté le 15-12-2006 à 20:29:52  profilanswer
 

xD je sais mais je suis un perfectionniste, c'est d'ailleurs pourquoi je mets trois plombes à faire ma map :/ :D.

n°4587451
Ayane
Posté le 15-12-2006 à 21:38:04  profilanswer
 

Normalement remplacer des 0 par des 1 ne va rien changer au traitement, cela prendra le même temps. Ce n'est pas comme si on avait deriière un  compilateur qui va optimiser le code, il faut garder à l'esprit que le langage est interprêté et non compilé.
C'est pour cela que le code suivant

Code :
  1. if b then
  2. return a
  3. else
  4. return b
  5. endif


et

Code :
  1. if b then
  2. return a
  3. endif
  4. return b


Feront la même chose au niveau machine pour un langage compilé.
Alors qu'en Jass vu qu'il est interprêté tu lui donne un else en plus à analyser à chaque fois. Le deuxième code est donc une optimisation pour un langage interprêté.

n°4587452
Maximaxou
rejoignez les fidèles du JASS
Posté le 15-12-2006 à 22:06:26  profilanswer
 

ok


Aller à :
Ajouter une réponse