problem bei iterator initialisierung



  • Also Fehler sehe ich hier keine. Und die Warnungen lauten, wörtlich übersetzt:

    "FGraph.h:59: Referenz auf lokale Variable tIter wird zurückgegeben"
    "FGraph.h:176: Variable test wird nirgends benutzt"



  • eben, ich auch nicht ... :P, aber in eclipse wird immer diese zeile rot markiert und der code lässt sich einfach nciht ausführen:

    my->getChildren(ptr,children);
    


  • Also laut dem Build-Log war die Erzeugung der obeispiel4.exe erfolgreich. Dein Eclipse spinnt :p



  • hmm hab jetzt neugestartet, aber immer noch das selbe problem 😞

    ich hab jetzt das programm trotzdem ausgeführt, obwohl eclipse mich gefragt hat, ob trotz fehler bla ... und bekomme dann eine endlosschleife öÖ ... ich glaube es liegt an der methode:

    void getChildren(T* x,std::vector<T*> children){
    
    		T *myTPtrx = x;
    		bool found = false;
    		unsigned int myidx = 0;
    		T *test = myVec[myidx];
    		while((unsigned)myidx != myVec.size()){
    
    			if(myVec[myidx] == myTPtrx){
    				for(unsigned int i = 0;i<myVec.size();i++){
    					for(unsigned int j = 0;j<myVec.size();j++){
    						if((unsigned)myMap[i][j] == 1 && (i == myidx)){
    								children.push_back(myVec[j]);
    								std::cout<<"children "<<j<<" "<<myMap.size()<<" "<<myVec.size()<<std::endl;
    								myTPtrx = myVec[j];
    								found = true;
    							}
    
    					}
    				}
    			}
    			if(found){
    				myidx = 0;
    				found = false;
    			}
    			else{
    				myidx++;
    				}
    		}
    	}
    

    aber seltsamerweise funktioniert das ganze außerhalb der iterator klasse, aber nur nicht wenn ich das über die iteratorklasse aufrufe :((((



  • man ist das blöd, wenn man nicht registriert ist 😛 -> naja sry für den doppelpost, aber wollte noch hinzufügen, dass das prog ab hier abstürzt und es kommt eine windows "problem wurde festgestellt"-fenster:

    if(myVec[myidx] == myTPtrx){....
    


  • int0xicated schrieb:

    man ist das blöd, wenn man nicht registriert ist...

    DAS wäre ja nun schnell und preiswert zu ändern... :p 😉

    ..."FGraph.h:59: Referenz auf lokale Variable tIter wird zurückgegeben"...

    Dass der Compiler hier weitermacht, bedeutet aber nicht, dass alles in Ordnung sei.
    Das ist IMHO ein sehr gefährlicher Fehler, den man unbedingt ausmerzen sollte.

    Gruß,

    Simon2.



  • hmm aber wie kann ich den ausmerzen? ich brauch den titer für diese methode bzw. imkrement operator -> man machts ja auch so, glaub ich.

    fwd_iter &operator++(int){
    			if(m_iter==m_end)//edit
    				return(*this);
    			fwd_iter tIter = *this;
    			++m_iter;
    			return (tIter);
    		}
    

    aber habt ihr keine ahnung, weshalb das ding immer abstürzt? ich verzweifle nämlich schon fast und sollte eigentlich shcon fertig sein.

    lg



  • Gib halt keine Referenz zurück. Das erreichst Du sehr einfach, indem Du das & wegnimmst.



  • Hier stand Blödsinn...



  • so jetzt gebe ich im Konstruktor vom iterator eine referenz auf die hauptklasse fgraph mit und damit gehts ... wieso geht es sonst nicht? öÖ

    descendant_iter(T* x,FGraph& g){
    g.getChildren(x,children);
    m_end=children.end();
    m_iter=children.begin();

    }



  • Möglicherweise Zufall? Hast Du die Warnungen inzwischen korrigiert?

    Dir sollte auch klar sein, dass die Funktion getChildren das Argument children nicht verändert? (Call-By-Value)



  • int0xicated schrieb:

    ... wieso geht es sonst nicht? öÖ
    ...

    Eben weil Du eine Referenz auf ein lokales Objekt zurückgibst ... wie es die Warnung besagte.
    Mit einer "Warnung" sagt Dir der Compiler halt: "Das kann ich zwar verarbeiten ... aber ich bezweifele, dass da das rauskommt, was Du möchtest"
    Hier halt: "Du gibst eine Referenz zurück auf ein Objekt, dass nicht mehr existiert" => Ergo: Es wird "krachen", wenn Du darauf zugreifst. (@Forenpolizei: Jaja... ich weiß, es ist "undefiniert" - was nicht bedeutet, dass es "krachen" uss..... aber hier hat er offensichtlich das Glück, dass es "kracht").

    Gruß,

    Simon2.



  • ja, hab alle warnungen ausgebessert und wegen der call by value sache, da bin ich auch draufgekommen und habs ausgebessert. danke euch!


Anmelden zum Antworten