Schreibzugriff Hashtabelle



  • Hallo zusammen!

    Ich habe folgendes Problem beim Schreiben einer Klasse Sparse_Matrix:
    Die Matrix soll als Hashtable angelegt werden. Allerdings hab ich immer noch Probleme mit der Funktion void sparse_matrix::put. Diese gibt mir nämlich auch dann meine Fehlermeldung aus, wenn sie es mE gar nicht dürfte...
    Würde mich freuen, wenn mir jemand helfen könnte!
    Danke

    aus der Headerdatei:

    typedef  std::pair<int, int> key; 
    
    struct hashfunktion {             
        std::size_t operator() (key wert) const {
    	std::tr1::hash < int >hashFunktion;
    	return hashFunktion(wert.first) + hashFunktion(wert.second);
    }};
    
    typedef std::tr1::unordered_map < key, double, hashfunktion > hashmap; 
    
    class Sparse_Matrix
    {
      private:
        int    Zeil, Spalt;              // Matrixdimension
        hashmap Mat;                     // Hasmap fuer Matrixelemente
    (...)
    
    //Konstruktor
    
    Sparse_Matrix::Sparse_Matrix (int sp, int ze) {
    
    	if (sp <= 0 || ze <= 0)
    		MatFehler("Nur Matrizen mit positivem Format!");
    	Spalt=sp;
    	Zeil=ze;	
      	Mat.empty();
    
    }
    
    // Kopierkonstruktor
    
    (...)
    
    // Lesezugriff
    
    (...)
    
    // Schreibzugriff
    
    void Sparse_Matrix::put (int ze, int sp, double x)
    
    {
    
    	if (!(ze>this->Zeil) && !(sp>this->Spalt))
    	{	
    		key ij;
    		ij.first=ze;
    		ij.second=sp;
    
      		for (hashmap::iterator it=Mat.begin(); it!=Mat.end(); ++it)
    			if (it->first==ij) it->second = x;
    
    	}	
    
    	else
    	{
    		printf("%d %d %d %d",ze,this->Zeil,sp,this->Spalt);
    		MatFehler("Ungueltiger Index!");
    	}	
    
    }
    


  • Mehrere Anmerkungen:

    a) Grundsätzlich solltest du deine Variablennamen sprechender wählen, hilft einerseits um selbst den Code nach einen halben Jahr verstehen zu können, und zum anderen, hilft es denen die dir helfen sollen. Ich verstehe vor allem nicht warum du Namen krampfhaft abkürzt bei denen ein weiteres Zeichen schon sprechende Variablennamen ergeben würde (Zeil/Spalt).

    b) Du wählst in für zeile/spalte aus, willst aber keine negativen Dimensionen zulassen. Warum nicht gleich "unsigned int"? Ansonsten solltest du auch neben den Überschreiten von den Dimensionen, auch das unterschreiten abfangen.

    c) Es erschwert imho das Lesen ungemein, wenn man ungewohnte Sachen liest (wie z.B. eine if-Anweisung in dem der if-Fall auch noch in der gleichen Zeile steht).

    d) C++ oder C (Ich frage wegen der Vermengung von C und C++-Bibliothek wie z.B. einerseits std::map anderseits aber printf).

    Den Fehler hier, sehe ich aber auch nicht (wenn gleich ich den logischen Ausdruck anders schreiben würde):

    if (!(ze>this->Zeil) && !(sp>this->Spalt))
      // ...
      else
    
      // Imho lesbarer: if(zeile < this->maxZeile && spalte < this->maxSpalte)
    

    cu André


Anmelden zum Antworten