Funktion die Baum erstellt interpretiert die Daten falsch und erzeugt falsche Werte



  • ich weis, dummer name :/, er beschreibts aber am besten. Versuch das Ding jetzt schon seit 2h zu debuggen, komm aber keinen schritt weiter. ich wette, dass es wieder mal nur an einem zeichen liegt, aber ich komm nicht drauf.

    also, es geht darum: ich parse folgenden string:

    <person><nick>otze</nick><id></id><alter>18</alter></person>
    

    die ausgabe nachd em parsen ist folgende:

    //das soll einen baum darstellen, die <> gehören auch zur ausgabe
           person
    <  nick    id   alter >
     < otze >  <>  < 18 >
    

    die < > dienen dazu werte von leeren Knoten unterscheiden zu können, ein Knoten umschließt seine Kinder also mit jeweils einem Knoten am anfang und am ende.
    Wichtig ist noch, dass ein Knoten entweder einen einzigen wert oder Kindknoten hat, eine mischung aus beidem geht nicht(ist hinterher für den algo wichtig)

    am parser hängts also nicht, die ausgabe ist so gewollt.

    nun möchte ich dieses mittels boost::spirit geparste konstrukt in einen anderen Baum transformieren, um damit weiter arbeiten zu können.

    hierzu benutze ich folgende funktion:

    //das wo test dransteht hab ich zu debugzwecken eingefügt
    template<class Iterator>
    void createTree(Iterator i,Iterator end,Node& node){
    	while(i!=end){
    
    		std::cout<<"parent ";//test
    
    		//this must be the name of a node so we create one
    		Key key(i->value.begin(),i->value.end());
    		Node& newNode=node.addNode(key);
    
    		//access childnodes
    		Iterator childBegin=i->children.begin();
    		Iterator childEnd=i->children.end();
    
    		//skip token "<" and ">"
    		++childBegin;
    		--childEnd;
    
    		//when the childnode has no children it must be a value
    		if(childBegin->children.empty()){
    			typename Node::Value val(childBegin->value.begin(),childBegin->value.end());
    			newNode.setValue(val);
    
    			std::cout<<"value ";//test
    		}
    		else
    		{
    			//this child is another node
    			for(;childBegin!=childEnd;++childBegin){
    
    				std::cout<<"child\n";//test
    
                    createTree(childBegin,childEnd,newNode);
    			}
    		}
    		++i;
    	}
    }
    

    nun zu dem problem ansich: diese funktion scheint auf ganzer linie zu versagen.
    dies ist die ausgabe, wenn ich hinterher den transformierten Baum ausgebe:

    person
        alter
            18
        alter
            18
        alter
            18
        id
            >
        id
            >
        nick
            otze
    

    als funktion benutz ich folgende:

    void t(XML::TagTree<char>& root){
    	for(XML::TagTree<char>::iterator i=root.begin();i!=root.end();++i){
    
    		std::cout<<i->getKey()<<" "<<i->getValue().get<std::string>()<<std::endl;
    
    		for(XML::TagTree<char>::iterator inner=i->begin();inner!=i->end();++inner){
    			std::cout<<"    "<<inner->getKey()<<std::endl;
    			std::cout<<"        "<<inner->getValue().get<std::string>()<<std::endl;
    
    		}
    	}
    }
    

    daran wirds aber hoffentlich nicht liegen 😉

    da ich danach den debugger angeworfen hab, und ich nicht weiter kam, hab ich diese testausgaben reingebracht.

    hier das interessante ergebnis:

    parent child
    parent value parent value parent value child
    parent value parent value child
    parent value
    

    ich komm einfach nicht weiter 😞

    (und falls ihr den fehler sofort seht noch ne frage: ich benutze atm eine map für die speicherung der knoten, dies verändert aber die reihenfolge der einträge, andererseits muss ich aber auch schnell nach einträgen/ gruppen von einträgen mit der gleichen id suchen können, was würdet ihr mir da als kompromiss empfehlen?)



  • hab vorhin noch 2h dran gesessen, danach nen kaffe getrunken, und während ich in das brötchen gebissen habe viels mir wie schuppen von den augen:

    //this child is another node
    for(;childBegin!=childEnd;++childBegin){
    
        std::cout<<"child\n";//test
    
        createTree(childBegin,childEnd,newNode);
    }
    

    die for schleife war der bösewicht, da ja createtree noch ein weiteres mal durch die nodes durchläuft 🙄

    die ausgabe ist nun so:

    person
        alter
            18
        id
            >//hier sollte eigentlich kein zeichen stehen
        nick
            otze
    

    kann vielleicht jemand sehen, warum das > zeichen nicht gelöscht wird?



  • ka

    aber für einen der über 3500 post hat, solltest du wirlich bessere überschriften wählen

    ich meine, wenn die fkt. das macht was du willst, dann musst du ja nicht posten. gerade, da sie nicht das macht was du willst, postet du ja hier. dann können wirkliche fast alle post die gleiche überschrift wie du haben 🙄

    das nur mal btw



  • eine genauere überschrift wäre gewesen:
    funktion zum erstellen eines baumes erstellt nodes doppelt und dreifach, wobei der inhalt der nodes auch verfälscht wird.

    auch nicht so das wahre(zumindest war ich mir der problematik der überschrift bewusst, wie man an satz 1 sieht), vorallem da sie zu lang für eine überschrift wäre.

    das auch nur mal so btw.



  • nö aber du musst ja keinen roman schreiben

    es reicht, wenn in der überschrift

    das gebiet drinnen ist ( z.b. BAUM ), denn einer der noch nie was mit bäumen gemacht hat, weiss gleich ( aha kann ich wahrscheinlich nicht lösen )

    und dann noch kurz was das prob ist

    eine möglichkeit wäre

    "Baum, Nodes mehrfach vorhanden! + falscher inhalt"

    dann weiss gleich jemand

    "aha es geht um bäume und es gibt probs bei den nodes"

    fertig aus

    einfach

    "funktion will nicht"

    ist nicht grad der hit. kann ja fast alles sein ( u.a. auch deine Tree's )

    nur mal so BTW



  • newkid_ schrieb:

    das gebiet drinnen ist ( z.b. BAUM ), denn einer der noch nie was mit bäumen gemacht hat, weiss gleich ( aha kann ich wahrscheinlich nicht lösen )

    genau.

    ich hab das thema mal verändert, und otze kann es korrigieren, wenn üben möchte.



  • korrigert.

    so nun back2 new topic 🙄



  • hab jetzt auchd en letzten fehler beseitigt. da fehlte eine überprüfung ob childBegin==childEnd ist nachdem die "<" und ">" zeichen übersprungen wurden.

    ich danke allen die sich den code einmal angeschaut haben 🙂


Anmelden zum Antworten