IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Flash Discussion :

[FLASH MX2004] Encore un bug dans flash ?


Sujet :

Flash

  1. #1
    Membre expérimenté Avatar de Lorenzo77
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    1 472
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2006
    Messages : 1 472
    Points : 1 537
    Points
    1 537
    Par défaut [FLASH MX2004] Encore un bug dans flash ?
    salut,

    je crois que je viens encore de tomber sur une erreur ... je vous laisse le code pour apprecier l'enormité de la chose

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    for (var nbA = 0; nbA < 600; nbA++) {
    	// fait un truc quelconque
    }
    //
    function faitUnQuadrillage() {
    	with (this) {
    		lineStyle(1, 0, 100);
    		for (var nbA = 0; nbA < 550; nbA += 10) {
    			moveTo(nbA, 0);
    			lineTo(nbA, 400);
    		}
    		for (var nbA = 0; nbA < 400; nbA += 10) {
    			moveTo(0, nbA);
    			lineTo(550, nbA);
    		}
    	}
    }
    faitUnQuadrillage();
    si vous virez le 1er FOR ou si vous virez le WITH ou si vous enlevez le code de la fonction, le quadrillage de la scene apparait comme il ce doit ...
    toute l'erreur se situe au niveau de l'initialisation de nbA dans les boucles suivantes, puisque je suis dans une fonction, je declare des variables qui doivent etre crées le temps de la fonction hors cette variable existe déja au niveau de la scene et c'est la ou le WITH doit foutre sa merde il y a un espece de téléscopage en mémoire et non seulement le nbA n'est pas crée localement mais en plus il reprend la valeur du nbA de la scene

    je viens de passer 30mn a chercher avant de comprendre l'incomprehensible ...

    je rajoute le FLA pour vos tests

  2. #2
    Expert éminent

    Avatar de freegreg
    Profil pro
    Inscrit en
    Août 2002
    Messages
    4 376
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Gard (Languedoc Roussillon)

    Informations forums :
    Inscription : Août 2002
    Messages : 4 376
    Points : 8 779
    Points
    8 779
    Par défaut
    La boucle for n'est jusqu'à flash 8 qu'un "alias" de while

    Quand on ecrit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for(var n:Number=0; n<10; n++) {
       ...
    }
    flash comprend:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    var n:Number = 0;
    while(n<10) {
       ...
       n++;
    }
    donc il ne considère pas la variable comme locale, elle est donc exploitable en dehors de la boucle.

    On arrive donc à un code qui pourrait ressembler à cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    function test() {
    	with(this) {
    		var n:Number = 0;
    		trace("2 : " + n);
    	}
    }
    var n:Number = 100;
    trace("1 : " + n);
    test();
    trace("3 : " + n);
    qui renvoit:
    1 : 100
    2 : 100
    3 : 100
    En fait, en 2, on fait un this.n qui fait référence au n déclaré 1 et pas au n déclaré en 2.
    C'est clair qu'il y a de quoi s'arracher les cheveux

    Ps : Dans Flash 9, on obtiendra bien :
    1 : 100
    2 : 0
    3 : 100
    J'en déduis qu'ils ont implémenté une vraie boucle for

  3. #3
    Membre expérimenté Avatar de Lorenzo77
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    1 472
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2006
    Messages : 1 472
    Points : 1 537
    Points
    1 537
    Par défaut
    quand je parlais de "localement", c'etait par rapport a la fonction qui inclut tout ce code puisque sauf erreur : le code d'une fonction est censé etre stocké sur la pile et non pas dans le tas ..

    c'est quand meme une belle merde puisque tout ce qui est déclaré localement dans une fonction (avec un VAR) est censé etre detruit pour justement eviter ce genre de "fuite" .. j'ai l'impression de jouer avec des références

    maxiMerda !!

  4. #4
    Membre émérite
    Avatar de jean philippe
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 062
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 062
    Points : 2 313
    Points
    2 313
    Par défaut
    Pour résoudre le problème, tu peux écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    function test() {
    	for (var nbA = 0; nbA<600; nbA++) {
    		trace(nbA);
    	}
    	// fait un truc quelconque
    }
    function faitUnQuadrillage() {
    	with (_root) {
    		lineStyle(1, 0, 100);
    		for (var nbA = 0; nbA<550; nbA += 10) {
    			moveTo(nbA, 0);
    			lineTo(nbA, 400);
    		}
    		for (var nbA = 0; nbA<400; nbA += 10) {
    			moveTo(0, nbA);
    			lineTo(550, nbA);
    		}
    	}
    }
    faitUnQuadrillage();
    test();

Discussions similaires

  1. Réponses: 16
    Dernier message: 04/03/2008, 16h51
  2. [FLASH MX2004] Vidéo en streaming dans Flash ?
    Par micatmidog dans le forum Flash
    Réponses: 5
    Dernier message: 30/04/2006, 21h51
  3. Réponses: 3
    Dernier message: 06/07/2005, 12h27
  4. Réponses: 6
    Dernier message: 14/12/2004, 03h47
  5. Réponses: 3
    Dernier message: 13/10/2004, 11h43

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo