Comunidad de diseño web y desarrollo en internet online

¿Puede alguien explicar este ¿bug??

Citar            
MensajeEscrito el 08 May 2007 06:15 pm
Bueno, tengo una clase, que únicamente contiene propiedades, que se cargan desde un xml mediante otra clase.

Una de las propiedades es un array que contendrá otros objetos serializados mediante una clase similar que también se cargan desde el xml.

Una parte de la estructura del xml es esta:

Código :

<nivel atributos>
<nodohijo/>
<nodohijo/>
<nodohijo/>
</nivel>
<nivel atributos>
<!--nodo vacío -->
</nivel>
<nivel atributos>

</nivel>


Se cargan clases Nivel y Actividad mediante este código:

Código :

private function xmlOnLoad(sucess:Boolean)
   {
      //trace(this);
      var nivel:Nivel;
      var node:Array = this.firstChild.childNodes;
      var ln:Number = node.length;
      for (var i:Number = 0; i < ln; i++)
      {
         var nNode:XMLNode = node[i];
         nivel = new Nivel(nNode.attributes.nombre);
         var nArr:Array = nNode.childNodes;
         var nLn:Number = nArr.length;
         for (var j:Number = 0; j < nLn; j++)
         {
            var aNode:XMLNode = nArr[j];
            var act:Actividad = new Actividad(aNode.attributes.nombre, aNode.attributes.descripcion, aNode.attributes.tiempo);
            var aArr:Array = aNode.childNodes;
            var aLn:Number = aArr.length;
            for (var l:Number = 0; l < aLn; l++)
            {
               act.assests.push(aArr[l].attributes.source);
               //trace(act.assests);
            }
            nivel.actividades.push(act);
         }
         trace(nivel.actividades);
         levels.push(nivel);
      }
      onGameLoad();
   }


En resumidas cuentas, lo que hace es parsear el xml y sacar varios objetos Nivel que contienen un Array de objetos Actividad.

Lo curioso es que aunque los nodos del xml que tendrían que contener las actividades están vacíos, salvo en el primer caso, que sí contiene actividades, todos los siguientes objetos Nivel que se creaban tenían el mismo array de actividades, y eso que vi con el depurador que parseaba bien el xml (es decir se saltaba el for que tenía que rellenar las actividades cuando no las había). Todos los trace(nivel.actividades); daban lo mismo.

La clase Nivel es esta:

Código :

class Nivel
{
   public var name:String;
   public var actividades:Array = new Array();
   public var diploma:Boolean;
   function Nivel(name:String)
   {
      this.name = name;
   }
}


Y lo solucioné añadiendo una línea en el constructor:

Código :

this.actividades=[]


¿Alguien sabe por qué pasa, por qué lo de

Código :

nivel = new Nivel(nNode.attributes.nombre);

no funciona como debería?

Por Zah

BOFH

4290 de clabLevel

27 tutoriales
5 articulos

  Bastard Operators From Hell Editores

Zaragoza, España

firefox
Citar            
MensajeEscrito el 09 May 2007 02:03 pm
Hola, antes que nada no se si esté lo suficientemente capacitado para contestar esa pregunta, pero... a mi me se me ocurre el que pueda ser por la linea de la igualacion a [ ] eso no me convence, y pues no se, otra estrategia sería el crear un Object y esa instancia igualarla al operador new de la clase, por que es un poco raro, puesto que estoy de acuerdo contigo, no deberían tener el mismo valor, a menos de que se estén igualando a la misma instancia de la clase... esa es la unica respuesta que se me ocurre, y pues se me ocurre hacer eso del Object por que con eso aseguras que te asigne espacio en memoria... pero no se si eso funcione.
Saludos.

Por zelgadiss01

87 de clabLevel



 

The Silent Hills

msie
Citar            
MensajeEscrito el 09 May 2007 02:43 pm
Buenas, a simple vista me parece que te olvidaste de inicializar el array

Código :

var arr:Array;
arr = new Array()

En el ejemplo de arriba, 1ero lo creo y en la siguiente linea lo inicializo.

Claro que puedo hacerlo en una sola linea

Código :

var arr:Array = new Array()

El problema es q cuando tienes esto en una clase te tira error, porq te dice q no puedes inicializar la variable ahi y deberas hacerlo en el constructor de tu clase.

Espero haberte sido de utilidad,

D!

Por Dario!

28 de clabLevel



Genero:Masculino  

Capital Federal - BsAs - Argentina

firefox
Citar            
MensajeEscrito el 09 May 2007 04:44 pm
zelgadiss01, la línea de igualación es precisamente lo que lo hace funcionar. En cuanto a lo del objeto, pues si lo hago así no diferenciaría entre las variables públicas y privadas, y eso no me interesa demasiado. Además, si declaro la variable nivel:Object, sique haciendo lo mismo...


Dario!, la cosa no va por allí, el array sí está declarado e inicializado, de hecho tan declarado que no lo borra cuando vuelvo a igualar la variable a una instancia de la clase :crap:

Igual, muchas gracias :)

Por Zah

BOFH

4290 de clabLevel

27 tutoriales
5 articulos

  Bastard Operators From Hell Editores

Zaragoza, España

firefox
Citar            
MensajeEscrito el 10 May 2007 01:24 pm
Hola... oye tengo una idea mas concreta de lo que puede estar pasando mira, tengo un codigo como este:

Código :

class miClase
{
    private var instanceName:String;
    private var myVector:Array;
    
    public function miClase()
    {
        this.myVector = new Array();
        this.instanceName = "";
    }
    public function setName(pinstanceName:String):Void
    {
        this.instanceName = pinstanceName;
    }
    public function getName():String
    {
        return this.instanceName;
    }
    public function setArray(pArray:Array):Void
    {
        
        var arrayLength:Number=0;
        arrayLength = pArray.length;
        for (var i:Number = 0; i< arrayLength; i++)
        {
            this.myVector[i] = pArray[i];
        }
        //Si igualas a esto, el vector de la clase hace la asignacion correcta
        /*
            this.myVector= pArray;
            //Con esto el vector solo hace un vinculo al objeto, no igualacion..
            //donde el al cambiar el objeto externo cambia el objeto de la clase
        */
    }
    public function getArray():Array
    {
        return this.myVector;
    }
}


Y el codigo en el cual se utiliza es:

Código :

import miClase;
var miVectorcin:Array = new Array();

miVectorcin[0] = "Primer elemento";
miVectorcin[1] = "Segundo elemento";
miInstance = new miClase();
miInstance.setName("Instancia uno");
miInstance.setArray(miVectorcin);
trace(miInstance.getArray());
miVectorcin[0] = "Nuevo elemento uno";
miVectorcin[1] = "Nuevo elemento dos";
miInstance2 = new miClase();
miInstance2.setName("Instancia dos");
miInstance2.setArray(miVectorcin);

trace(miInstance.getName()+" Contiene:"+miInstance.getArray());
trace(miInstance2.getName()+" Contiene:"+miInstance2.getArray());


pero en lo que quiero hacer incapié es en esto:

Código :

 this.myVector = pArray;


Cuando hice esto, osea "igualar" el objeto del vector al objeto que recibia como parámetro también de tipo Array, al momento de imprimir los vectores de las dos instancias me regresaba el ultimo valor asignado, en este caso "Nuevo elemento uno","Nuevo elemento dos", pero cuando hacía esto:

Código :

        for (var i:Number = 0; i< arrayLength; i++)
        {
            this.myVector[i] = pArray[i];
        }


un for igualando elemento a elemento funcionaba correctamente, así que imagino que es algo parecido a lo que tu estás tratando de hacer, pero no se si es exactamente a lo que te refieres...
Saludos y espero ahora si sirva :crap:

Por zelgadiss01

87 de clabLevel



 

The Silent Hills

msie
Citar            
MensajeEscrito el 11 May 2007 09:28 pm
Perdona por tardar tanto en responder, pero es que quería leermelo con calma :)
Creo que ningún sitio hago un vínculo por referencia.
Mi duda es más bien conceptual, sobre por qué, cada vez que hago

Código :

variable = new MiClase()

no se borra todo el contenido que había antes en esa variable...

No es nada que no pueda solucionarse con un delete, o haciendo el código de manera distinta, aunque sí resulta bastante molesto.

Por Zah

BOFH

4290 de clabLevel

27 tutoriales
5 articulos

  Bastard Operators From Hell Editores

Zaragoza, España

firefox
Citar            
MensajeEscrito el 11 May 2007 10:33 pm

Código :

// codigo previo
for (var i:Number = 0; i < ln; i++)

      {

         var nNode:XMLNode = node[i];

         var nivel:Nivel = new Nivel(nNode.attributes.nombre);

// codigo posterior


El error es el scope de los for, que por asi decirlo crean su propia variables locales, por lo que ya no son del tipo Nivel, solo eso.

saludos

Por Maikel

BOFH

5575 de clabLevel

22 tutoriales
5 articulos

Genero:Masculino   Team Cristalab

Claber de baja indefinida

firefox
Citar            
MensajeEscrito el 12 May 2007 10:12 am
Pues... así lo tenía antes y hacía lo mismo :crap:

Por Zah

BOFH

4290 de clabLevel

27 tutoriales
5 articulos

  Bastard Operators From Hell Editores

Zaragoza, España

firefox

 

Cristalab BabyBlue v4 + V4 © 2011 Cristalab
Powered by ClabEngines v4, HTML5, love and ponies.