Inscrit le: 12 Nov 2011 Messages: 1062 Sujets: 107 Spécialité en worldedit: Inactif(Enfin presque) Médailles: 1 (En savoir plus...)
Posté le: 24/07/15 18:38 Sujet du message: Bug de Dynamic indexing
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
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
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
Inscrit le: 14 Avr 2011 Messages: 1846 Sujets: 119 Spécialité en worldedit: fonctions paramétriques, équation de mouvement.
Posté le: 26/07/15 18:16 Sujet du message:
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
Inscrit le: 12 Nov 2011 Messages: 1062 Sujets: 107 Spécialité en worldedit: Inactif(Enfin presque) Médailles: 1 (En savoir plus...)
Posté le: 27/07/15 13:59 Sujet du message:
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. _________________
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