Zeiger und Segmentation fault



  • Hallo,

    ich schon wieder

    Ich will in einem von mir erstellen Baum nach und nach jedem Blatt einen Wertzuweisen könne, habe mich da wohl aber verzeigt. Jedenfalls bekomme ich bei der fett markierten Stelle einen Segmentation fault.

    Hier ist der Funktionsaufruf, der den diesen hervorruft.

    /* 
     * File:   Encoder.hpp
     * Author: anna
     *
     * Created on 11. Oktober 2009, 20:49
     */
    
    #include <map>
    #include <string>
    #include <fstream>
    #include <list>
    #include <string>
    #include <set>
    
    #include "TreeNode.hpp"
    
    using namespace std;
    
    class Encoder {
    private:
        fstream file;
        map<unsigned char, unsigned int> freq_map;
        list<TreeNode> NodeList;
    	map<unsigned char, string> dictionary;
    
    public:
    
        Encoder(string s) {
    
        	//IntSet = new set<int>();
        	// IntList = new list<int>;
    
        	file.open( s.c_str(), fstream::in );
            createFrequencyMap();
    
            NodeList.clear();
    
       		createTree();
       		createBitCodes();
    
            cout << "Successfull";
        }
    
        Encoder(){
    
        }
    
    private:
    
        void createFrequencyMap() {
    
            // file.open( s.c_str(), fstream::in );
            char ctmp = file.get();
    
            while (ctmp != EOF) {
                // cout << ctmp << "\n";
                freq_map[ctmp]++;
                // _totalCharCount++;
    
                ctmp = file.get();
    
            }
        }
    
        // Bitcode fehlt
        void createTree() {
        	TreeNode smallest;
            for (map<unsigned char, unsigned int>::iterator iter = freq_map.begin(); iter != freq_map.end(); ++iter) {
                TreeNode temp((*iter).first, (*iter).second);
                NodeList.push_front(temp);
            }
            // Man darf gespannt sein
            while (NodeList.size() != 1) {
    
                NodeList.sort();
    
                smallest = NodeList.front();
                // pop_front für löschen
                NodeList.pop_front();
                TreeNode ndsmallest = NodeList.front();
                NodeList.pop_front();
                // TreeNode connection(smallest.getFrequency() + ndsmallest.getFrequency(), *smallest, *ndsmallest);
                TreeNode connection(smallest.getFrequency() + ndsmallest.getFrequency(), &smallest, &ndsmallest);
                //connection.setLeftDaughter(&smallest);
    
                NodeList.push_front(connection);
            }
            cout << NodeList.front().getFrequency();
        }
    
    	void createBitCodes(){
    		// Beginne das Hinzufügen von Bitcodes am Wurzelknoten mit dem Bitcode 0
    		addBitCode(NodeList.front(),"0");	
    	}
    
    	void addBitCode(TreeNode node, string bitcode){
    		// Falls Knoten nur ein Verbindungsknoten ist
    		if(!node.isLeaf()){
    			// Erstelle zwei erweiterte strings
    			string stringZero = bitcode+"0";
    			string stringOne = bitcode+"1";
    			// Versuche diese Bitcodes bei den Töchtern unterzubringen
    			[b]addBitCode(*node.getLeftDaughter(), stringZero);[/b]
    			//addBitCode(*node.getRightDaughter(), stringOne);	
    
    		}	
    		else{ 
    
    			//dictionary[node.getCharacter()] = bitcode;	
    			cout << "bla" <<node.isLeaf();
    
    		}
    		cout << "bla" <<node.isLeaf();
    	}
    
    	void const printTree() {
    
    	}
    
    }; /* _ENCODER_HPP */
    

    TreeNode::getLeftDaughter gibt einen TreeNode* zurück.

    (und ich weiß, using namespace im header ist böse ;))

    Würde mich freuen, wenn mir jemande den richtigen Weg zeigen (*schenkelklopf*) könnte. Ich hab glaub ich fast alle Schreibweisen durch.



  • Das wirst du mit rumprobieren nicht hinkriegen.

    Ein Segfault gibt es, wenn du auf Speicher zugreifst, der dir nicht gehört. Hier heisst das, dass getLeftDaughter einen ungültigen Zeiger zurückgibt. Das heisst für dich, dass du schauen musst, warum dort nichts gültiges drin ist. (gibt es überhaupt ein Element Links davon? Ist da ein Null Zeiger? usw.)


  • Mod

    addBitCode sollte vermutlich besser eine Referenz nehmen. Vielleicht funktioniert auch das Kopieren von treenodes nicht richtig.


Anmelden zum Antworten