rekursions bug

Status
Nicht offen für weitere Antworten.
I

iltis

Gast
hallo zusammen,
ich verstehe es einfach nicht, bitte hilf mir jemand auf die sprünge...
ich habe eine rekursive methode, die eine xmldatei durchläuft und für jedes gefundene xmlelement einen X3DNode (im prinzip einen punkt mit den koordinaten x,y,z) zeichnet. dabei sollen X3DNodes immer deren Childknoten enhalten, also ineinander verschachtelt sein, so wie auch in der xmldatei. wenn jeder X3DNode die z-position 10 relativ zu seinem parent hat, ist jede "ebene" 10 einheiten verschoben. ok, meine erste methode funktioniert soweit:

Code:
// position eines elementes ist jeweils um 10 einheiten auf der z-achse verschoben ( relativ zum parent )
float[] position = new float[]{0,0,-10};

public void traverseDocument(Element e, X3DNode parent, float[] position){

//process current element  

    // neuen X3DNode erzeugen und als child an parent anfügen
       X3DNode newChild = creator.createX3DObject(position, parent);
       
    // erzeugten X3DNode als parent setzen
	MFNode child = (MFNode)newChild.getField("children");
        parent = child.get1Value(0);

//process Children

	List chList = e.getChildren();
        Iterator itr = chList.iterator();
        while(itr.hasNext()){         
       		 Element next = (Element)itr.next();
       		 traverseDocument(next, parent, position);
        }
}
leider muss ich die rekursion aber von "unten" beginnen (also bei nicht beim ersten, sondern beim letzten xmlelement anfangen), weil ich später noch eine variable übergeben muss. aber wenn ich das ganze umdrehe, funktioniert es leider nicht mehr:

Code:
public void traverseDocument(Element e, X3DNode parent, float[] position){
        
//process Children  
 
	 List chList = e.getChildren();
         Iterator itr = chList.iterator(); 
         while(itr.hasNext()){         
           	 Element next = (Element)itr.next();
       		 traverseDocument(next, parent, position);
        }
        
//process current element  

    // neuen X3DNode erzeugen und als child an parent anfügen
       X3DNode newChild = creator.createX3DObject(position, parent);
       
    // erzeugten X3DNode als parent setzen
	MFNode child = (MFNode)newChild.getField("children");
        parent = child.get1Value(0);      
}

hierbei sind die punkte nicht pro "ebene" um 10 einheiten versetzt, sondern liegen alle auf einem punkt. scheinbar sind die X3DNodes nicht ineinander verschachtelt. aber wieso nicht?? ???:L
 
S

SlaterB

Gast
keine Ahnung worum es geht,
aber allgemeine Tipps:

1.
falls du ein riesiges Dokument zum testen verwendest und bei den Ergebnissen nicht durchsiehst,
dann nimm doch mal ein einfaches mit nur zwei Nodes..

2.
falls du eine Ahnung hast von dem was das Programm so tun soll,
dann lass doch die undurchschaubaren Bestandteile (X3DNode, Zeichnen usw.) raus und ersetze sie durch Log-Ausgaben:
System.out.println("hier wird Node x erzeugt mit parent y und position z");

solange sowas alles fehlt kann man nicht enrsthaft von Fehlersuche sprechen
-------

da fällt mir doch noch was am Code auf:
du scheinst
//process current element
und
//process Children
einfach zu vertauschen,

in der ersten Version wird aber zuerst der Variable parent etwas zugewiesen
parent = child.get1Value(0);

und dann bei den Kindern verwendet,

in der zweiten Variante findet das nicht mehr statt,
da wird das parent vom Rekursionsanfang unverändert bis zum Ende durchgereicht,
ALLE Knoten (auch die später verarbeiteten in höheren Ebenen) arbeiten immer mit diesem Start-parent oder eben NULL

da diese parent ja nicht vorhanden sind hilft vielleicht als einfache Lösung die Tiefe der Rekursion zu zählen
(Integer-Variable, 10 am Anfang, +10 bei jeder Stufe) und diese als z-Wert zu verwendent

falls
X3DNode newChild = creator.createX3DObject(position, parent);
explizit parent braucht, dann musst du zwangsläufig dieses VOR den Kindern erstellen ;)
 
G

Gast

Gast
danke für die tipps. auf logausaben war ich auch schon gekommen. hab das irgendwie unterschätzt, bin jetzt 4 tage dran und verstehe immer weniger. das mit den parents stimmt. ich brauche wohl auch eigentlich die children. ok, ich werds weiter probieren. thanx anyway.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen

Ähnliche Java Themen

Neue Themen


Oben