Worldedit
  Worldedit
Le site sur l'éditeur de warcraft 3 !
 
  FAQFAQ   RechercherRechercher   Liste des MembresListe des Membres    Groupes d'utilisateursGroupes d'utilisateurs   medals.php?sid=9abd9e669fb07489f3592a28368cd3b5Médailles   S'enregistrerS'enregistrer 
 ProfilProfil   Se connecter pour vérifier ses messages privésSe connecter pour vérifier ses messages privés   ConnexionConnexion 
  FAQFAQ World Editor   UploadUploader une map ou une image    UploadAjouter sa map à l'annuaire   UploadConsulter l'annuaire

Nettoyer les fonctions (nullifier les variables)
Aller à la page 1, 2  Suivante
 
Poster un nouveau sujet   Répondre au sujet    Worldedit Index du Forum -> Aide sur les déclencheurs
Voir le sujet précédent :: Voir le sujet suivant  
Auteur Message
 Rommstein60
MODÉRATEUR À LA RETRAITE


Inscrit le: 23 Aoû 2007
Messages: 4766
Sujets: 136
Spécialité en worldedit: Keskesapeutfout'
Médailles: 1 (En savoir plus...)
Rédacteur de tuto #1 (Quantité : 1)

MessagePosté le: 02/10/09 16:02    Sujet du message: Nettoyer les fonctions (nullifier les variables) Citer

Yop Exclamation
Alors voilà, j'ai plusieurs questions, je sais qu'à la fin d'une fonction il faut nullifier les variables locales sous peine de leak, mais plusieurs problèmes se posent :

- Pour une fonction qui appelle des attributs, faut-il nullifier ceux-ci ?
Par exemple :

Jass:
function kikoolol takes integer i returns nothing
...
endfunction

Est-ce que je dois mettre 'set i = 0' à la fin de la fonction, ou c'est inutile ?

- Les conditions : un problème se pose, comment nullifier des variables alors que la dernière ligne de la fonction doit être le return ? (cela marche aussi pour les fonctions qui retournent quelque chose !)
J'ai ici un exemple d'un de mes système :

Jass:
function Model_Cond takes nothing returns boolean
        local integer player_number = GetTrackablePlayerNumber(GetTriggeringTrackable())
       
        return Current_Hero_Numb[player_number] != MAX_HEROES_BY_CLASS and IsPlayerInSelection(player_number)
endfunction

Ici, player_number ne peut apparemment pas être nullifié...

Help ? Sad

_________________
Leçon n°1 du WorldEdit : « Le violet > Troll-Brain »
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé
 Magus
Membre a fort taux de post


Inscrit le: 13 Oct 2007
Messages: 994
Sujets: 25
Spécialité en worldedit: Codeur


MessagePosté le: 02/10/09 16:26    Sujet du message: Citer

Alors pour commencer, non les paramètres d'une fonction ne leakent pas. Ils ne doivent pas être nullifiés.

Ensuite, il n'y a pas tous les types de variables qui leakent. Les entiers, les réels, les strings et les booléens ne leakent pas et il est donc inutile de les nullifier.
_________________
- La théorie c'est quand rien ne fonctionne mais tout le monde sait pourquoi.
- La pratique c'est quand tout fonctionne mais personne ne sait pourquoi.
- Chez moi la théorie et la pratique sont réunies, rien ne fonctionne et personne ne sait pourquoi.
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé MSN Messenger
 Rommstein60
MODÉRATEUR À LA RETRAITE


Inscrit le: 23 Aoû 2007
Messages: 4766
Sujets: 136
Spécialité en worldedit: Keskesapeutfout'
Médailles: 1 (En savoir plus...)
Rédacteur de tuto #1 (Quantité : 1)

MessagePosté le: 02/10/09 16:29    Sujet du message: Citer

Mhh ok, et donc c'est quel type de variable qui leak ?
_________________
Leçon n°1 du WorldEdit : « Le violet > Troll-Brain »
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé
 Troll-Brain
Ri1kamoua


Inscrit le: 23 Aoû 2007
Messages: 7143
Sujets: 147
Spécialité en worldedit: le troll, le flood, la vulgarité, mon coeur balance
Médailles: 2 (En savoir plus...)
Grand mage créateur de sort (Quantité : 1) Rédacteur de tuto #3 (Quantité : 1)

MessagePosté le: 02/10/09 16:34    Sujet du message: Citer

Y'a aucun leak dans tes exemples ?

Il faut juste se soucier de tous les types natifs d'handle (extends handle).
Bref de mémoire tout sauf "integer",'"real","string","boolean".

Y'a des exceptions, du genre tu peux te lever tôt pour avoir un leak sur un joueur, étant qu'un joueur ca ne se détruit pas autrement qu'IRL à coups de piolets.
Y'a aussi le cas des textag qui sont naturellement recyclés et surement d'autres cas.
Mais pour faire simple ne retient pas les exceptions.

En théorie une variable locale déclarés dans une fonction (takes ...) n'a pas besoin d'être nullifiée, ca serait fait automatiquement à la fin de la fonction.

Pour que war3 puisse recycler les index d'handle (en gros l'adresse des handle), il faut nullifier la variable qui pointait sur cet handle.
_________________
Le violet, c'est moche.
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé
 Rommstein60
MODÉRATEUR À LA RETRAITE


Inscrit le: 23 Aoû 2007
Messages: 4766
Sujets: 136
Spécialité en worldedit: Keskesapeutfout'
Médailles: 1 (En savoir plus...)
Rédacteur de tuto #1 (Quantité : 1)

MessagePosté le: 02/10/09 16:53    Sujet du message: Citer

Okay, mirci !
_________________
Leçon n°1 du WorldEdit : « Le violet > Troll-Brain »
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé
 Troll-Brain
Ri1kamoua


Inscrit le: 23 Aoû 2007
Messages: 7143
Sujets: 147
Spécialité en worldedit: le troll, le flood, la vulgarité, mon coeur balance
Médailles: 2 (En savoir plus...)
Rédacteur de tuto #3 (Quantité : 1) Grand mage créateur de sort (Quantité : 1)

MessagePosté le: 02/10/09 17:15    Sujet du message: Citer

Sinon pour les conditions étant donné qu'il n'existe pas de TriggerSleepCondition tu peux utiliser une variable globale à la place.
_________________
Le violet, c'est moche.
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé
 Bantas
Anomalie floodiforme


Inscrit le: 21 Aoû 2007
Messages: 1524
Sujets: 37

Médailles: 1 (En savoir plus...)
Rédacteur de tuto #3 (Quantité : 1)

MessagePosté le: 02/10/09 19:32    Sujet du message: Citer

Les leaks de handles locaux sont systématiques ou uniquement quand on détruit l'objet ?
Ah et aussi : Si je prends un handle (de type handle et pas un type héritier) il leak pas lui, si ?
_________________
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé
 Troll-Brain
Ri1kamoua


Inscrit le: 23 Aoû 2007
Messages: 7143
Sujets: 147
Spécialité en worldedit: le troll, le flood, la vulgarité, mon coeur balance
Médailles: 2 (En savoir plus...)
Rédacteur de tuto #3 (Quantité : 1) Grand mage créateur de sort (Quantité : 1)

MessagePosté le: 02/10/09 19:41    Sujet du message: Citer

Bantas a écrit:
Les leaks de handles locaux sont systématiques ou uniquement quand on détruit l'objet ?

Uniquement si l'objet est détruit (ultérieurement oupa).

Citation:
Ah et aussi : Si je prends un handle (de type handle et pas un type héritier) il leak pas lui, si ?

Si, bien sûr il leak.
_________________
Le violet, c'est moche.
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé
 jk2pach
Invité








MessagePosté le: 03/10/09 14:39    Sujet du message: Citer

Il faut nullifier les variables globales quand on s'en sert fréquement ou pas?

Genre toutes les fonctions de dégâts de groupe etc... (Avec une variable unité globale pour l'infligeur de dégâts par exemple)

(Désolé Rom, je me pose encore aussi ce genre de questions :p)
_________________
Revenir en haut
 Rommstein60
MODÉRATEUR À LA RETRAITE


Inscrit le: 23 Aoû 2007
Messages: 4766
Sujets: 136
Spécialité en worldedit: Keskesapeutfout'
Médailles: 1 (En savoir plus...)
Rédacteur de tuto #1 (Quantité : 1)

MessagePosté le: 04/10/09 12:25    Sujet du message: Citer

Another kession Exclamation

Déjà je voudrais savoir, quand on utilise (par exemple) SetTimerData (de TimerUtils), le timer aura pour valeur accrochée la structure et ses valeurs, ou bien un pointeur vers cette structure ?
Ensuite, est-ce que quand on destroy() une structure, est-ce qu'il faut quand même nullifier les variables ?

Jass:
library lib initializer Init
    struct my_struct
        integer i = 0
        sound s = null
        timer tim = null
       
        method Method_1 takes nothing returns nothing
            set .s = CreateSound("aaaaaaaaaaaa", false, true, false, 5, 10,"")
            set .i = 1
        endmethod
       
        method Method_2 takes nothing returns nothing
            call .destroy()
        endmethod
       
        static method TimerCallBack takes nothing returns nothing
            if thistype(GetTimerData(GetExpiredTimer())).i == 0 then
                call thistype(GetTimerData(GetExpiredTimer())).Method_1()
            else
                call thistype(GetTimerData(GetExpiredTimer())).Method_2()
            endif
        endmethod
    endstruct
   
    private function Init takes nothing returns nothing
        local my_struct data = my_struct.create()
       
        set data.tim = NewTimer()
        call SetTimerData(data.tim, data)
        call TimerStart(data.tim, 1, false, function my_struct.TimerCallBack)
    endfunction
endlibrary


Est-ce que ici avant .destroy() je dois faire :
set s = null
set tim = null
Question

Merci Exclamation

_________________
Leçon n°1 du WorldEdit : « Le violet > Troll-Brain »
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé
 jk2pach
Invité








MessagePosté le: 04/10/09 12:28    Sujet du message: Citer

1-Aucune idée
2-Pas besoin, puisque les valeurs de ta structure seront remplacées pendant l'utilisation suivante.
_________________
Revenir en haut
 Troll-Brain
Ri1kamoua


Inscrit le: 23 Aoû 2007
Messages: 7143
Sujets: 147
Spécialité en worldedit: le troll, le flood, la vulgarité, mon coeur balance
Médailles: 2 (En savoir plus...)
Rédacteur de tuto #3 (Quantité : 1) Grand mage créateur de sort (Quantité : 1)

MessagePosté le: 04/10/09 12:51    Sujet du message: Citer

Mais omg comment vous le dire ...

Ca ne leak uniquement que si l'handle référencé par la variable est détruit, dans ce cas il faut nullifier la variable.

Dans le cas d'une variable locale il faut impérativement la nullifier car en dehors de la fonction on n'y a plus accès, et l'id de l'handle n'est pas recyclé quand l'handle associé est détruit.
Ce qui a pour conséquence que l'allocation d'handle devient de plus en plus lent, et peut aussi rendre défaillant des codes utilisant la méthode d'attachement (GetHandleId(<handle>) - OFFSET).

Dans le cas d'une variable globale c'est beaucoup moins important de le faire, car normalement elle devrait être réutilisée, et donc l'id de l'handle devrait être recyclée tôt ou tard.
Mais dans ce cas il existe un leak (très) mineur :
http://www.thehelper.net/forums/showthread.php?t=136608

Il est donc de bonne habitude de nullifier les variables quand l'handle associé est détruit.

Pour le cas des structs, globalement une struct c'est "juste" une collection de variable globales array.
Et une instance de struct est juste un entier, l'index de ces variables globales array.

Il n'est pas évident qu'une instance de struct sera réutilisée.
Par ex à un moment clef du jeu on peut avoir besoin de 100 instances, puis par la suite pas plus de 10.
Si la struct contient des handle qui ont été détruit on a 90 leak potentiels ...

Pour automatiser la chose il suffit de déclarer une method nommée "onDestroy" dans lequel on nullifie toutes les variables handle, cette fonction sera automatiquement appelée quand on détruira l'instance de struct avec .destroy()

PS :
Romm tu leak d'un son, tu ne le détruit pas.
_________________
Le violet, c'est moche.
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé
 Rommstein60
MODÉRATEUR À LA RETRAITE


Inscrit le: 23 Aoû 2007
Messages: 4766
Sujets: 136
Spécialité en worldedit: Keskesapeutfout'
Médailles: 1 (En savoir plus...)
Rédacteur de tuto #1 (Quantité : 1)

MessagePosté le: 04/10/09 12:56    Sujet du message: Citer

Hey du calme, au moins mon raisonnement était juste Razz
La méthode onDestroy doit être statique j'imagine ?

_________________
Leçon n°1 du WorldEdit : « Le violet > Troll-Brain »
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé
 Troll-Brain
Ri1kamoua


Inscrit le: 23 Aoû 2007
Messages: 7143
Sujets: 147
Spécialité en worldedit: le troll, le flood, la vulgarité, mon coeur balance
Médailles: 2 (En savoir plus...)
Grand mage créateur de sort (Quantité : 1) Rédacteur de tuto #3 (Quantité : 1)

MessagePosté le: 04/10/09 13:44    Sujet du message: Citer

Citation:
La méthode onDestroy doit être statique j'imagine ?

Tu imagines mal.
_________________
Le violet, c'est moche.
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé
 Rommstein60
MODÉRATEUR À LA RETRAITE


Inscrit le: 23 Aoû 2007
Messages: 4766
Sujets: 136
Spécialité en worldedit: Keskesapeutfout'
Médailles: 1 (En savoir plus...)
Rédacteur de tuto #1 (Quantité : 1)

MessagePosté le: 04/10/09 14:12    Sujet du message: Citer

:'(
_________________
Leçon n°1 du WorldEdit : « Le violet > Troll-Brain »
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé
Montrer les messages depuis:   
Poster un nouveau sujet   Répondre au sujet    Worldedit Index du Forum -> Aide sur les déclencheurs Toutes les heures sont au format GMT + 1 Heure
Aller à la page 1, 2  Suivante
Page 1 sur 2

 
Sauter vers:  
Vous ne pouvez pas poster de nouveaux sujets dans ce forum
Vous ne pouvez pas répondre aux sujets dans ce forum
Vous ne pouvez pas éditer vos messages dans ce forum
Vous ne pouvez pas supprimer vos messages dans ce forum
Vous ne pouvez pas voter dans les sondages de ce forum


Powered by phpBB © 2001, 2005 phpBB Group
Traduction par : phpBB-fr.com