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=8b0fb551d53b4ea77efa789553398efeMé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

Bug de Dynamic indexing

 
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
 Ectelion
Membre reconnu


Inscrit le: 12 Nov 2011
Messages: 1062
Sujets: 107
Spécialité en worldedit: Inactif(Enfin presque)
Médailles: 1 (En savoir plus...)
Créateur d'unité (Quantité : 1)

MessagePosté le: 24/07/15 18:38    Sujet du message: Bug de Dynamic indexing Citer

C'est en rapport avec le système que j'ai posté il y a peu, j'ai modifié la façon dont il gère les dégâts et depuis j'ai quelques bugs(effets persistant et autres signes d'un problème d'allocation/réallocation alors j'ai fait mes recherches et j'ai vu que le système faisait ses réallocation de cette façon
Secret:

Code:
----------
i[0] = i[0]
i[1] = i[1]
i[2] = i[2]
i[3] = i[3]
i[4] = i[4]
i[5] = i[5]
i[6] = i[6]
i[7] = i[7]
i[8] = i[8]
i[9] = i[9]
i[10] = i[10]
-Initialisation avec 11 instances-
----------
i[5] = ended
i[5] = i[10]
i[10] = deallocated
----------
i[0] = i[0]
i[1] = i[1]
i[2] = i[2]
i[3] = i[3]
i[4] = i[4]
i[5] = i[10]
i[6] = i[6]
i[7] = i[7]
i[8] = i[8]
i[9] = i[9]
----------
i[2] = ended
i[2] = i[9]
i[9] = deallocated
----------
i[0] = i[0]
i[1] = i[1]
i[2] = i[9]
i[3] = i[3]
i[4] = i[4]
i[5] = i[10]
i[6] = i[6]
i[7] = i[7]
i[8] = i[8]
----------
i[5] = ended
i[5] = i[8]
i[8] = deallocated
----------
i[0] = i[0]
i[1] = i[1]
i[2] = i[9]
i[3] = i[3]
i[4] = i[4]
i[5] = i[8]
i[6] = i[6]
i[7] = i[7]
----------
i[2] = ended
i[2] = i[7]
i[7] = deallocated
----------
i[0] = i[0]
i[1] = i[1]
i[2] = i[7]
i[3] = i[3]
i[4] = i[4]
i[5] = i[8]
i[6] = i[6]
----------
i[5] = ended
i[5] = i[6]
i[6] = deallocated
----------
i[0] = i[0]
i[1] = i[1]
i[2] = i[7]
i[3] = i[3]
i[4] = i[4]
i[5] = i[6]
----------
i[2] = ended
i[2] = i[6]
i[5] = deallocated
----------
i[0] = i[0]
i[1] = i[1]
i[2] = i[6]
i[3] = i[3]
i[4] = i[4]
----------
i[2] = ended
i[2] = i[4]
i[4] = deallocated
----------
i[0] = i[0]
i[1] = i[1]
i[2] = i[4]
i[3] = i[3]
----------
i[2] = ended
i[2] = i[3]
i[3] = deallocated
----------
i[0] = i[0]
i[1] = i[1]
i[2] = i[3]
----------
i[2] = ended
i[2] = i[2]
i[2] = deallocated
----------
i[0] = i[0]
i[1] = i[1]
----------                     |   
i[1] = ended                   |i[0] = ended
i[1] = i[1]                    |i[0] = i[1]
i[1] = deallocated             |i[1] = deallocated
----------                     |----------
i[0] = i[0]                    |i[0] = i[1]
----------                     |----------
i[0] = ended                   |i[0] = ended
i[0] = i[0]                    |i[0] = i[0]
i[0] = deallocated             |i[0] = deallocated



Si pour les dernières étapes il y deux possibilités c'est parce que mes BJDebugMsg signalent qu'il y a bien réallocation mais pas si c'est i[0] qui prend la valeur de i[1] ou non.

Comme ce mode de fonctionnement m'apparaît correct, je vous demande donc à vous si vous avez une idée de l'origine du problème.

Le code, si ça vous intéresse:

Secret:

Jass:
/*                                                                    API:
                Here's a simple Damage Over Time (DoT) library allowing you to easily create customs poisons/burns/whatever you want
               
                How to use:
                    Just call DamageOverTime.create() in any custom script/JASS code with the following parameters (you must respect the order indicated)
                        -The unit that will suffer the damage
                        -The unit that will inflict the damage
                        -How long will it last
                        -How often will the unit suffer damage
                        -The amount of damage
                        -The model of the special effect indicating the damage is being applied
                        -Where on the unit the model will be located
                   
                Exemple:
                    call DamageOverTime.create(udg_Target, udg_Caster, 2.50, 0.50, 125, udg_Model, "chest" )
                   
                    This means that a unit will be 25 points of damage every 0.50s for 2.50 seconds
                   
               

*/

library SimpleDoT

    globals
        private constant real Interval = 0.03
    endglobals

/*

                                                            DO NOT TOUCH ANYTHING BELOW

*/
    globals
        private boolean testmode = TRUE
        private integer Count = -1
        private timer Time = CreateTimer(  )
        private DamageOverTime array Instance
    endglobals
   
     struct DamageOverTime
        real damage
        real interval
        real lasting
        real cinterval
        effect model
        unit target
        unit caster
        boolean isattack
        boolean isranged
        weapontype typeofweapon
        attacktype typeofattack
        damagetype typeofdamage
        integer index
       
       
        static method create takes unit t, unit c, real l, real i, real d, string m, string a, boolean ia, boolean ir,attacktype at, damagetype dt, weapontype wt  returns DamageOverTime
            set Count = Count + 1
            set Instance[Count] = DamageOverTime.allocate()
            set Instance[Count].lasting = l
            set Instance[Count].caster = c
            set Instance[Count].damage = d
            set Instance[Count].interval = i
            set Instance[Count].cinterval = i
            set Instance[Count].target = t
            set Instance[Count].typeofattack = at
            set Instance[Count].typeofdamage = dt
            set Instance[Count].typeofweapon = wt
            set Instance[Count].isattack = ia
            set Instance[Count].isranged = ir
            set Instance[Count].model = AddSpecialEffectTarget( m, t, a)
            set Instance[Count].index = Count
            if testmode == true then
                call BJDebugMsg("An Instance of Struct was created with the following parameters: |c00FF0000Target|r: " + GetUnitName(t) + " |c00FF0000Caster|r: " + GetUnitName(c) + " |c00FF0000Damage|r: " + R2S(d) + " |c00FF0000Duration|r: " + R2S(l) + " |c00FF0000Interval|r: " + R2S(i) )
            endif
            if Count == 0 then
                call TimerStart( Time, Interval, TRUE, function DamageOverTime.Loop )
            endif
            return Instance[Count]
        endmethod
       
       private static method Loop takes nothing returns nothing
            local DamageOverTime i
            local integer c = Count
            loop
                exitwhen c == -1
                set i = Instance[c]
                call i.action()
                set c = c - 1
            endloop
        endmethod
       
        private method action takes nothing returns nothing
            if this.lasting >= 0.00 then
                set this.lasting = this.lasting - Interval
                set this.cinterval = this.cinterval - Interval
                if this.cinterval <= 0.00 then
                    call UnitDamageTarget( this.caster, this.target, this.damage / (this.lasting / this.interval), this.isattack, this.isranged, this.typeofattack, this.typeofdamage, this.typeofweapon )
                    set this.cinterval = this.interval
                endif
            else
                call DestroyEffect( this.model )
                if testmode == TRUE then
                    if this != Instance[Count] then
                        call BJDebugMsg("The instance number |c00FF0000" + I2S(this.index) )
                        call BJDebugMsg("|rnow contain the instance number |c00FF0000" + I2S(Instance[Count].index) )
                    endif
                    call BJDebugMsg("|rThere is now |c00FF0000" + I2S(Count) +"|r instances running|n")
                endif
                set this = Instance[Count]
                call Instance[Count].deallocate()
                set Count = Count - 1
                if Count == -1 then
                    call PauseTimer( Time )
                    call BJDebugMsg("No more instance running")
                endif
            endif
        endmethod
       
    endstruct

endlibrary


_________________
Inactif(Enfn presque)
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé
 kungfu-sheep
Anomalie floodiforme


Inscrit le: 14 Avr 2011
Messages: 1846
Sujets: 119
Spécialité en worldedit: fonctions paramétriques, équation de mouvement.


MessagePosté le: 26/07/15 18:16    Sujet du message: Citer

d'après la trace d'exécution quand i[0] est end ça fonctionne correctement.
C'est donc uniquement si i[1] est end à la fin que ça bloque ?

premièrement d'un point de vu logique Count devrait commencer à 0. Count est la pour compter les instances en cours, il ne peut pas y avoir -1 instance.
ça veut donc aussi dire démarrer et arrêter ta methode loop à Count == 1, et arrêter ta loop quand c = 0.

sinon le problème est assez simple.
tu as une condition qui isole le cas où tu supprimes la dernière instance, c'est bien car celle la elle n'est pas à réattribuer.
sauf que dans ton if tu ne la désalloues pas, et en plus tu n'as pas mi de else pour les autres cas donc la suite que tu cherches à éviter va se produire quoi qu'il arrive.

donc :

Jass:

                call DestroyEffect( this.model )

                    if this != Instance[Count] then


                    endif


                set this = Instance[Count]
                call Instance[Count].deallocate()
                set Count = Count - 1
                if Count == -1 then
                    call PauseTimer( Time )

                endif
            endif


doit devenir :

Jass:

                call DestroyEffect( this.model )

                    if this != Instance[Count] then
Instance[Count].deallocate()
Count = Count - 1
                    else


                set this = Instance[Count]
                call Instance[Count].deallocate()
                set Count = Count - 1
endif
                if Count == -1 then
                    call PauseTimer( Time )

                endif
            endif



à peut près (je l'ai écrit à l'arrache il manque peut être des trucs) mais l'idée est la.
_________________
22:27:43<Seiraw> Bah y a deux genre de personnes
22:27:57<Seiraw> les soumis et les soumises
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé Envoyer l'e-mail
 Ectelion
Membre reconnu


Inscrit le: 12 Nov 2011
Messages: 1062
Sujets: 107
Spécialité en worldedit: Inactif(Enfin presque)
Médailles: 1 (En savoir plus...)
Créateur d'unité (Quantité : 1)

MessagePosté le: 27/07/15 13:59    Sujet du message: Citer

Pour le Count = -1 c'est parce que j'ai l'habitude d'incrémenter au début, si je déplace le Count = Count + 1 à la fin j'initialiserai Count à 0 et pas -1

Ensuitey'a un truc que j'ai du mal à comprendre, tu dis qu'il faut faire:

Jass:
if this != Instance[Count] then
   call Instance[Count].deallocate()
   set Count = Count - 1
else
   set this = Instance[Count]
   call Instance[Count].deallocate()
   set Count = Count - 1
endif


mais c'est plutôt l'inverse non ? Parce que si l'instance n'est pas Instance[Count] et que je deallocate simplement Instance[Count] ben j'ai une instance qui s'arrête et une autre qui est vide si je me trompe pas donc du coup ça fait qu'on a ce schéma:

Instance[0] = tourne
Instance[1] = tourne
...
Instance[X] = se termine
...
Instance[Count] = tourne

ce qui fait qu'on a:

Instance[X] != Instance[Count]

On deallocate Instance[Count] et on fait Count - 1

donc au final on a:

Instance[0] = tourne
Instance[1] = tourne
...
Instance[X] = vide (ben ouais, elle s'est terminée)
...
Instance[Count] = deallocated (donc vide aussi du coup)

Après pour ce qui est de i[0] et i[1], je peux pas répondre, je sais pas quel cas de figure se produit.
_________________
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé
 kungfu-sheep
Anomalie floodiforme


Inscrit le: 14 Avr 2011
Messages: 1846
Sujets: 119
Spécialité en worldedit: fonctions paramétriques, équation de mouvement.


MessagePosté le: 27/07/15 15:06    Sujet du message: Citer

oui l'inverse bien sur (j'ai ecrit ca a l'arrache :p) tu as teste ?
_________________
22:27:43<Seiraw> Bah y a deux genre de personnes
22:27:57<Seiraw> les soumis et les soumises
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé Envoyer l'e-mail
 Ectelion
Membre reconnu


Inscrit le: 12 Nov 2011
Messages: 1062
Sujets: 107
Spécialité en worldedit: Inactif(Enfin presque)
Médailles: 1 (En savoir plus...)
Créateur d'unité (Quantité : 1)

MessagePosté le: 27/07/15 18:08    Sujet du message: Citer

Non, j'ai pas pu(pas JNGP à portée de main) mais dès que c'est fait j'updaterai le sujet.
_________________
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
Page 1 sur 1

 
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