Voir le sujet précédent :: Voir le sujet suivant |
Auteur |
Message |
Doubotis Membre honoraire

Inscrit le: 10 Mai 2008 Messages: 246 Sujets: 15 Spécialité en worldedit: Worldediter ²
|
Posté le: 26/10/09 21:19 Sujet du message: Triggers et fonctions récursives |
|
|
Salutations tout le monde !
Je me demandais tout simplement si le programme pouvait surcharger suite à un amoncellement de fonctions récursives.
Actuellement, les sorts du Boss que je programme s'appellent elles-mêmes.
Quand le Boss dure 30 secondes, on s'en fiche un peu à la rigueur, mais dans le cas présent, le Boss peut durer de 3 à 4 minutes...
En clair : est-ce qu'utiliser la récursivité entraîne du leak ? (dans le cas que je viens de donner : à savoir un sort de boss qui s'appelle lui-même après un certain temps).
PS : J'ai craqué... Chuis passé au vJass... _________________
Soigner est la plus noble tâche que l'humanité puisse accomplir. |
|
Revenir en haut |
|
 |
Magus Membre a fort taux de post

Inscrit le: 13 Oct 2007 Messages: 994 Sujets: 25 Spécialité en worldedit: Codeur
|
Posté le: 26/10/09 21:23 Sujet du message: |
|
|
J'ai jamais essayé donc je peux rien te dire pour le leak est les performances.
Néanmoins, il est toujours possible de "dérécursifer". Fait voir ton code et tu verras (c'est plus simple d'expliquer avec un exemple). _________________
- 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 |
|
 |
Doubotis Membre honoraire

Inscrit le: 10 Mai 2008 Messages: 246 Sujets: 15 Spécialité en worldedit: Worldediter ²
|
Posté le: 26/10/09 21:29 Sujet du message: |
|
|
Jass: | function Trig_Darkalus_Invoquer_une_faille_Actions takes nothing returns nothing
local group EnnemiesUnits = null
local unit TargetOfSpell = null
set EnnemiesUnits = GetUnitsInRangeOfLocMatching(5000.0, GetUnitLoc(gg_unit_n000_0001), Condition(function IsEligibility))
set TargetOfSpell = GroupPickRandomUnit(EnnemiesUnits)
if (VerifyFailles() == true) then
call IssueTargetOrder( gg_unit_n000_0001, "slow", TargetOfSpell )
call TriggerSleepAction( 5.00 )
call UnitRemoveBuffBJ( 'B00D', TargetOfSpell )
call SetUnitManaBJ(TargetOfSpell, GetUnitStateSwap(UNIT_STATE_MANA, TargetOfSpell) - 100)
call CreateNUnitsAtLoc( 1, 'h000', Player(4), GetUnitLoc(TargetOfSpell), bj_UNIT_FACING )
call CreateLinkWithDarkalus(GetLastCreatedUnit() )
call TriggerSleepAction( 10.00 )
call ConditionalTriggerExecute( GetTriggeringTrigger() )
else
call DisplayTextToPlayer(Player(1), 0, 0, "Nombre de failles maximum atteint.")
endif
endfunction |
IsEligibility retourne true / false selon divers critères qu'il serait inutile d'expliquer ici.
VerifyFailles retourne true s'il reste de la place dans la variable déploiement pour acceuillir une faille, false sinon.
CreateLinkWithDarkalus définit la variable de déploiement.
Dans le cas présent, quand on a atteint le nombre maximum, la fonction s'arrête... Et appelle une autre fonction (pas encore écrite).
Cette autre fonction va ensuite (peut-être, mais le plus souvent ça sera le cas), appeller à nouveau la fonction "Trig_Darkalus_Invoquer_une_faille_Actions"... _________________
Soigner est la plus noble tâche que l'humanité puisse accomplir. |
|
Revenir en haut |
|
 |
Bantas Anomalie floodiforme

Inscrit le: 21 Aoû 2007 Messages: 1524 Sujets: 37
Médailles: 1 (En savoir plus...)
|
Posté le: 26/10/09 21:30 Sujet du message: |
|
|
Le leak n'est pas incontrôlable =o
Il vient généralement :
- des groupes d'unités et des points générés sans prévenir par le GUI.
- des variables locales non nullifiées.
- des références non-nullifiées vers des objets détruits (voir le topic sur le système de timer de Troll-Brain, j'avoue ne pas comprendre tous les détails de celui-ci).
- des boolexpr nuls ? (encore une fois, j'ai pas tout pigé ici)
Bref, en Jass, tu as en général le contrôle et tu sais où est-ce que tu crées des choses, et donc où tu dois en détruire.
EDIT : J'ai comme l'impression d'être à côté de la plaque pour le coup.. _________________
Dernière édition par Bantas le 26/10/09 21:32; édité 1 fois |
|
Revenir en haut |
|
 |
jk2pach Invité
|
Posté le: 26/10/09 21:31 Sujet du message: |
|
|
Si tu te mets au VJass: arrête d'utiliser des points, d'autant que maintenant on a GetSpellTargetX et pareil en Y; utilise un timer plutôt que TriggerSleepAction, et enfin: détruis tes variables (notamment le groupe!)
Et enfin, rend tes variables nulles. _________________
|
|
Revenir en haut |
|
 |
Magus Membre a fort taux de post

Inscrit le: 13 Oct 2007 Messages: 994 Sujets: 25 Spécialité en worldedit: Codeur
|
Posté le: 26/10/09 21:41 Sujet du message: |
|
|
Je ne comprend pas en quoi ta fonction est récursive. Peut être un problème de compréhension du mot récursif.
Définition d'une fonction récursive en programmation : C'est une fonction qui s'appelle elle même.
Exemple :
Jass: | function test takes integer a returns nothing
...
...
call test(a + 2)
endfunction |
ça c'est une fonction récursive. Dans ton exemple, je ne vois pas trop ou la fonction s'appelle elle même pour l'instant. _________________
- 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 |
|
 |
Doubotis Membre honoraire

Inscrit le: 10 Mai 2008 Messages: 246 Sujets: 15 Spécialité en worldedit: Worldediter ²
|
Posté le: 26/10/09 21:43 Sujet du message: |
|
|
Parce que n'est pas très visible :
Jass: | call ConditionalTriggerExecute( GetTriggeringTrigger() ) |
La voilà, la sale bête
(Oui, y a encore beaucoup de parties qui viennent du GUI, mais ça avance... Encore hier j'en étais nulle part sur la compréhension de ce language.
Enfin, j'en connaît assez maintenant pour savoir qu'on retrouve quelques marques du C, très trèèèès enfouies dans le fonctionnement.
Merci pour les conseils concernant le vJass, je vais essayer de me perfectionner de ce côté là.
Et d'arrêter de F***** CE P***** DE POINT VIRGULE A LA FIN DE CHAQUE LIGNE §§§§ _________________
Soigner est la plus noble tâche que l'humanité puisse accomplir. |
|
Revenir en haut |
|
 |
Ayane Bot administrateur

Inscrit le: 17 Sep 2007 Messages: 2012 Sujets: 49
Médailles: 2 (En savoir plus...)
|
Posté le: 26/10/09 21:54 Sujet du message: |
|
|
Lancer un déclencheur, lance un nouveau thread qui s'exécute indépendamment du déclencheur actuel. Donc l'exécution actuelle va se terminer avant l'exécution que l'on a lancé (en grande partie).
Pour faire simple: lancer un déclencheur n'est pas bloquant.
Donc tu n'auras pas de soucis particulier. _________________
|
|
Revenir en haut |
|
 |
Doubotis Membre honoraire

Inscrit le: 10 Mai 2008 Messages: 246 Sujets: 15 Spécialité en worldedit: Worldediter ²
|
Posté le: 26/10/09 21:58 Sujet du message: |
|
|
Merci  _________________
Soigner est la plus noble tâche que l'humanité puisse accomplir. |
|
Revenir en haut |
|
 |
Troll-Brain Ri1kamoua

Inscrit le: 23 Aoû 2007 Messages: 7146 Sujets: 147 Spécialité en worldedit: le troll, le flood, la vulgarité, mon coeur balance Médailles: 2 (En savoir plus...)
|
Posté le: 26/10/09 23:36 Sujet du message: |
|
|
Le leak saypabien, la parano saylemal, le vJass saylebien. _________________
Le violet, c'est moche. |
|
Revenir en haut |
|
 |
|