bubblesort



  • Hallo!
    Ich soll ein Char-Array mit Telefonbucheinträgen, mit Hilfe des Bubblesort-Algorithmus nach Namen sortieren. Die Klassenhierarchie und Methodennamen waren soweit vorgeben.

    Mein Programm sieht so aus:

    #include <iostream>
    
    using namespace std;
    
    class sortable
    {
    	public:
    		char *primkey;
    
    		sortable(){}
    
    		sortable* sinkingSort(sortable *feld, int anz)
    		{
    			for(int obergrenze = anz-1; obergrenze > 0; --obergrenze)
    			{
    				bool austausch = false;
    				for(int pos = 0; pos < obergrenze; ++pos)
    				{
    					if(strcmp(feld[pos].primkey, feld[pos+1].primkey))
    					{
    						char *tmp = feld[pos].primkey;
    						feld[pos].primkey = feld[pos-1].primkey;
    						feld [pos-1].primkey = tmp;
    						austausch = true;
    					}
    				}
    				if(!austausch)
    				{
    					break;
    				}
    			}
    			return feld;
    		}
    
    		~sortable(){}
    };
    
    class Telefonbucheintrag : public sortable
    {
    	private:
    		char *telefonnummer;
    		char *vorname;
    		char *name;
    
    	public:
    		Telefonbucheintrag(){}
    
    		Telefonbucheintrag(char* telefonnummer, char* vorname, char* name)
    		{
    			this->telefonnummer = telefonnummer;
    			this->vorname = vorname;
    			this->name = name;
    			primkey = name;
    		}
    
    		char *getTelefonnummer()
    		{
    			return telefonnummer;
    		}
    
    		char *getVorname()
    		{
    			return vorname;
    		}
    
    		char *getName()
    		{
    			return name;
    		}
    
    		~Telefonbucheintrag(){}
    };
    
    int main()
    {
    	Telefonbucheintrag* Telefonbuch[10];
    	Telefonbuch[0] = new Telefonbucheintrag("94949","fritz","mueller");  
    	Telefonbuch[1] = new Telefonbucheintrag("49649","karl","tell");
    	Telefonbuch[2] = new Telefonbucheintrag("66161","heiz","tor");
    	Telefonbuch[3] = new Telefonbucheintrag("94125","hilde","mett");
    	Telefonbuch[4] = new Telefonbucheintrag("12144","helga","zabel");
    	Telefonbuch[5] = new Telefonbucheintrag("32629","emma","tillmann");
    	Telefonbuch[6] = new Telefonbucheintrag("46998","ursula","maier");
    	Telefonbuch[7] = new Telefonbucheintrag("26598","ute","keller");
    	Telefonbuch[8] = new Telefonbucheintrag("71561","maria","mustermann");
    	Telefonbuch[9] = new Telefonbucheintrag("82321","herbert","schmitz");
    
    	for(int i = 0; i < 10; ++i)
    	{
    		cout << Telefonbuch[i]->getTelefonnummer() << ' ' 
    			 << Telefonbuch[i]->getVorname() << ' ' 
    			 << Telefonbuch[i]->getName() << endl;
    	}
    
    	Telefonbuch[0]->sinkingSort((sortable*)Telefonbuch, 10);
    
    	for(int i = 0; i < 10; ++i)
    	{
    		cout << Telefonbuch[i]->getTelefonnummer() << ' ' 
    			 << Telefonbuch[i]->getVorname() << ' ' 
    		 	 << Telefonbuch[i]->getName() << endl;
    	}
    
    	cin.get();
    
    	return 0;
    }
    

    bei:

    if(strcmp(feld[pos].primkey, feld[pos+1].primkey))
    

    bekomme ich eine Speicherzugriffverletzung

    Was kann ich ändern damit es funktioniert?

    Gruß, nihilfire



  • Der Hase versteckt sich in der Zeile 17, wenn mich nicht alles täuscht, passiert folgendes:
    Wenn pos == ( obergrenze - 1 ) ist, dann kracht´s beim Zugriff auf das feld[pos+1] (in dieser if- Bedingung). Das Feld gibt es nämlich nicht, der Zugriff geht ins Leere.

    Gruß
    Christian



  • hmmm... so:

    if(strcmp(feld[pos].primkey, feld[pos-1].primkey))
    

    geht es aber auch nicht

    Komisch ist auch, dass der Debugger angibt anz(Zeile 13) hat den Wert: 4848328, statt der übergebenen 10 (Zeile 96)... ich kann aber nicht herausfinden woran es liegt.

    Gruß, nihilfire



  • nihilfire schrieb:

    hmmm... so:

    if(strcmp(feld[pos].primkey, feld[pos-1].primkey))
    

    geht es aber auch nicht

    Natürlich nicht! Jetzt passiert der Fehlerhafte Zugriff immer noch, nur eben gleich beim ersten Durchlauf der for()- Schleife. (Zugriff auf das "minus-erste-Element) Lass es einfach so wie vorher und reduziere die anzahl auf (obergrenze - 1) , dann macht es glaube ich Sinn.

    Das andere Problem kann ich nicht angehen, da fehlt mir das Wissen... die Synthax ist mir unbekannt.

    Gruß
    Christian



  • Es gibt so an die drei bis vier Fehler in der Methode sinkingSort. Hier die korrigierte Fassung

    sortable** sinkingSort(sortable** feld, int anz) // Pointer-Pointer statt nur Pointer
            {
                for(int obergrenze = anz-1; obergrenze > 0; --obergrenze)
                {
                    bool austausch = false;
                    for(int pos = 0; pos < obergrenze; ++pos)
                    {
                        if( strcmp(feld[pos]->primkey, feld[pos+1]->primkey) > 0 ) // > 0 vergessen
                        {
                            sortable* tmp = feld[pos]; // tausche sortable* und nicht nur primkey
                            feld[pos] = feld[pos+1];  // +1 statt -1
                            feld [pos+1] = tmp;
                            austausch = true;
                        }
                    }
                    if(!austausch)
                    {
                        break;
                    }
                }
                return feld;
            }
    

    Und der Aufruf muss dann entsprechend

    Telefonbuch[0]->sinkingSort( (sortable**)Telefonbuch , 10);
    

    heißen.

    Gruß
    Werner



  • Hallo Werner!

    Jetzt geht es, vielen Dank für deine Hilfe! 🙂

    Gruß, nihilfire


Anmelden zum Antworten