Problem mit List



  • Hi.
    Kann mir vllt jemand sagen, ob es möglich ist, das einzige Element einer List zu löschen?
    irgendwie bekomme ich da nur ein fehler.
    der src sieht im mom so aus:

    openList.push_back(nStart);
    	nParent=nStart;
    	closedList.push_back(nParent);
    	for(iList=openList.begin(); iList!=openList.end(); iList++)
    	{
    		Node temp(iList->x, iList->y, iList->iIndex, iList->iSourcePoint, iList->F, iList->G, iList->H);
    		if(CompareFullNode(temp, nParent))
    			iList=openList.erase(iList);
    	}
    

    nStart ist, wie auch nParent vom typ "Node"
    iList ist ein list<Node>::iterator

    das prob is, das beim 1. durchlauf die liste nur ein eintrag hat, nämlich "nStart", bei weiteren durchläufen ist sie größer - da funktioniert das löschen.
    nur eben nicht beim 1. eintrag.


  • Mod

    Das Löschen aus der Liste ist nicht das Problem, das funktioniert natürlich auch für ein Element. Der Fehler liegt woanders. Geh mal mit dem Debugger durch und guck, ob das Programm überhaupt beim erase ankommt. Immerhin steht direkt davor ein if, welches ja nicht zwangsläufig erfüllt ist.



  • beim compare kann es eg kein problem geben.

    1. is da nicht viel dazu

    bool CompareFullNode(Node n1, Node n2)
    {
    	if(n1.F==n2.F && n1.G==n2.G && n1.H==n2.H && n1.iIndex==n2.iIndex &&
    		n1.iSourcePoint==n2.iSourcePoint && n1.x==n2.x && n1.y==n2.y)
    		return true;
    	return false;
    }
    

    und 2. hab ich schon getestet, ob das if klappt, wenn ich nur ne ausgabe mache.



  • openList.push_back(nStart);
        nParent=nStart;
        closedList.push_back(nParent);
        for(iList=openList.begin(); iList!=openList.end();)
        {
            Node temp(iList->x, iList->y, iList->iIndex, iList->iSourcePoint, iList->F, iList->G, iList->H);
            if(CompareFullNode(temp, nParent))
                iList=openList.erase(iList);
            else
               ++iList;
        }
    

    Probier das mal. Ansonsten poste vollständigen Beispielcode, der das Problem beinhaltet.



  • Okay, hab das mal versucht, der fehler kommt jedoch noch immer.
    hier erstmal die funktion, um die es sich handelt

    bool PathNodes::FindPath(void)
    {
    	PosVector2D vStart(nStart.x, nStart.y);
    	PosVector2D vTarget(nTarget.x, nTarget.y);
    	// Ist Der Startpunkt das Ziel?
    	if(ComparePositions(vStart, vTarget))
    		return true;	// Ja, ist er. Ziel gefunden...
    	// Ist der Startpunkt in einer Wand?
    	if(iPathMap[nStart.y][nStart.x]<0)
    		return false;	// Ja, ist er. So  gehts nicht...
    	// Startpunkt in die offene Liste haun..
    	openList.push_back(nStart);
    	nParent=nStart;
    	closedList.push_back(nParent);
    	for(iList=openList.begin(); iList!=openList.end(); iList++)
    	{
    		Node temp(iList->x, iList->y, iList->iIndex, iList->iSourcePoint, iList->F, iList->G, iList->H);
    		if(CompareFullNode(temp, nParent))
    			iList=openList.erase(iList);
    		else
    			++iList;
    	}
    //	do
    //	{
    		if(openList.size()!=0)
    			cout<<"[openList]: Ist nicht leer, is ja was drinne... "<<openList.size()<<endl;
    		if(closedList.size()!=0)
    			cout<<"[closedList]: Ist nicht leer, is ja was drinne... "<<closedList.size()<<endl;
    //	} while(...)
    	return true;
    }
    

    laut dem debugger kommt der fehler direkt bei der zeile mit "->erase(..)"
    hab leider keine ahnung was da nun falsch ist bzw wie ich das problem beheben kann 😞



  • Du erhöhst den Iterator zu oft (einmal im Schleifenkopf sowie einmal wenn gelöscht oder nicht gelöscht wird). Nimm den Inkrement im Schleifenkopf raus.



  • ah, danke, nun funktionert es.
    leider werd ich die funktion nun doch nicht mehr nutzen, weils nicht passt, wie ich will.
    trotzdem danke für eure hilfe 🙂


Anmelden zum Antworten