std::map find fehler



  • pumuckl und SeppJ, vielen Dank für die schnellen Antworten.

    Zu 1)

    NodeType pNewNode = new NodeType(nGlobNr, coo);
    

    war ein Tippfehler. Richtig lautet die Zeile:

    NodeType *pNewNode = new NodeType(nGlobNr, coo);
    

    Zu 2) Ich prüfe zunächst, ob der Eintrag schon vorhanden ist und füge ihn nur zu, wenn dies noch nicht der Fall ist. Zudem erhalte ich den gleichen Fehler, wenn ich die map.insert - Funktion verwende.

    Ich stelle jetzt eine abgespeckte Version meines Codes zusammen und werden ihn posten, sobald ich damit fertig bin.

    Thilo



  • SeppJ schrieb:

    Da werden Pointer sortiert, das ist dir klar, oder?

    Der Schlüssel ist doch vom Typ int.

    @Thilo: zu wenig Kontext gibt's hier.



  • Nochmals vielen Dank für die Antworten. Wie gewünscht, habe ich den orginalen Code etwas reduziert, um ihn vollständiger anzugeben. Auch mit diesem Ausschnitt kann ich den Fehler reproduzieren. Für Hinweise zum Fehler wäre ich Euch dankbar.

    #include <vector>
    #include <map>
    #include <stdlib.h>
    #include <iostream>
    
    struct Node
    {
    	std::vector< double > _coo;
    	int     _globNr;
    };
    
    class NLs
    {
    public:							
    	NLs(){};						
    	void addNode(int nGlobNr,  std::vector< double > *coo);
    	Node* findNode(int nGlobNr);
    protected:						
    	std::map< int,  Node* > m_mapND;		
    };
    
    void NLs::addNode(int nGlobNr, std::vector< double > *coo)
    {
    	Node *newNode = NULL;
    	std::map <int, Node*>::const_iterator iter;
    	int tf(0);
    	iter = this->m_mapND.find(nGlobNr);
    	if(iter==m_mapND.end())		
    	{
    		newNode = new Node();
    		for(int i=0; i<3; i++)
    			newNode->_coo.push_back( (*coo)[i] );
    		newNode->_globNr = nGlobNr;
    		m_mapND.insert(std::pair< int, Node* >(nGlobNr,newNode) );		
    	}	
    }
    Node* NLs::findNode(int NodeNr)
    {
    	std::map <int, Node* >::iterator iter;
    	Node *fN;	
    
    	iter = m_mapND.find(NodeNr);
    	if(iter!=m_mapND.end()){
    		fN = iter->second;
    		return fN;
    	}
    	else{
    		std::cout << " Knoten mit der globalen Nr " << NodeNr << " nicht gefunden " << std::endl;
    		return NULL;
    	}
    
    }
    int main()
    {			
    	NLs NodeList;
    	std::vector< double > coo(3);
    	coo[0] = 0.0;
    	coo[1] = 1.3;
    	coo[2] = 4.6;
    
    	NodeList.addNode(1, &coo);
    	NodeList.addNode(2, &coo);
    	NodeList.addNode(3, &coo);
    	NodeList.addNode(4, &coo);
    
    	Node* fN = NodeList.findNode(4);
    }
    


  • Ich kann dein Problem nicht nachvollziehen. Habe den Code eben ausprobiert, da findet er einen Knoten.



  • @ daddy_felix: Das habe ich befürchtet. Kann es sein, dass der Fehler durch eine Compilereinstellung verursacht wird?



  • Thilo schrieb:

    @ daddy_felix: Das habe ich befürchtet. Kann es sein, dass der Fehler durch eine Compilereinstellung verursacht wird?

    Schwierig. Compilereinstellungen die ein gültiges Programm ungültig machen sind selten 😉

    Hast du mal ne Debug-Anzeige, was am Ende in der map steht?



  • In der Map stehen die Knoten. Diese sind jedoch nicht aufstreigend, sondern absteigend sortiert.

    - m_mapND [4]
    + [0] (4,0x004b6388 {_coo=[3](0.00000000000000000,1.3000000000000000,4.5999999999999996) _globNr=4 }) std::pair<const int, Node *>
    + [1] (3,0x004b6240 {_coo=[3](0.00000000000000000,1.3000000000000000,4.5999999999999996) _globNr=3 }) std::pair<const int, Node *>
    + [2] (2,0x004b60f8 {_coo=[3](0.00000000000000000,1.3000000000000000,4.5999999999999996) _globNr=2 }) std::pair<const int, Node *>
    + [3] (1,0x004b2b00 {_coo=[3](0.00000000000000000,1.3000000000000000,4.5999999999999996) _globNr=1 }) std::pair<const int, Node *>



  • Thilo schrieb:

    Diese sind jedoch nicht aufstreigend, sondern absteigend sortiert.

    Das ist wurscht, solang das Suchen konsistent geschieht. Versuch mal mit dem Debugger durch map::find zu steppen und schau, was er da macht, und warum er den Knoten nicht findet.



  • Ich kann da auch nichts erkennen, was falsch sein soll.

    Trotzdem ein paar Kommentare:

    Thilo schrieb:

    class NLs
    {
    public:							
    	NLs(){};						
    	void addNode(int nGlobNr,  std::vector< double > *coo);
    	Node* findNode(int nGlobNr);
    protected:						
    	std::map< int,  Node* > m_mapND;		
    };
    

    Das Semikolon hinter dem {} ist überflüssig. Selbst die ganze Zeile ist überflüssig.

    Thilo schrieb:

    void NLs::addNode(int nGlobNr, std::vector< double > *coo)
    

    besser: std::vector<double> const& coo

    Thilo schrieb:

    {
    	Node *newNode = NULL;
    	std::map <int, Node*>::const_iterator iter;
    	int tf(0);
    	iter = this->m_mapND.find(nGlobNr);
    	if(iter==m_mapND.end())		
    	{
    		newNode = new Node();
    		for(int i=0; i<3; i++)
    			newNode->_coo.push_back( (*coo)[i] );
    

    Das geht auch einfacher:
    newNode->_coo = *coo; // bzw "= coo;", falls coo eine Referenz ist

    Thilo schrieb:

    newNode->_globNr = nGlobNr;
    		m_mapND.insert(std::pair< int, Node* >(nGlobNr,newNode) );
    

    der value_type Deiner map ist pair<const int,Node*>.



  • Das Problem ist gelöst. Hatte nicht aufgepasst und eine Datei des Compilers geändert (functional.h).

    Nochmals vielen Dank für die vielen und schnellen Antworten. Ich werde die Hinweise beachten!


Anmelden zum Antworten