014
23.08.2017, 09:28 Uhr
ao
(Operator)
|
Ehrlich gesagt, passt da ziemlich wenig, eigentlich nur der Konstruktor und der Destruktor.
1. der Operator += soll laut Aufgabenstellung ein Member-Operator von CCalendar sein. So wie du ihn geschrieben hast, ist er global, und das m_entries im Operator ist nicht das m_entries von CCalendar. Lokale Variablen mit m_ zu prefixen trägt nicht zur Verständlichkeit des Codes bei. 2. ich habe keine Ahnung, was feld und j sein sollen, und ich schätze, der Compiler auch nicht. 3. dein Umgang mit m_entries ist total chaotisch. Erst allozierst du ein Array von Zeigern auf CCalendar (höchstwahrscheinlich ist das eine Indirektion zuviel, die dir noch Kopfzerbrechen machen wird, aber egal, dein Bier). Im Kopf der ersten Schleife weist du m_entries = 0 zu, damit ist das zuvor allozierte Array unerreichbar verloren -> Speicherleck. Und in der inneren Schleife weist du ihm nochmal was neues zu, und zwar einen Wert, der größer ist als der in der Abbruchbedingung der äußeren Schleife, so dass diese nach einem einzigen Durchlauf verlassen wird - war dir das klar? 4. Abgesehen davon fängst du mit dem entry, der eigentlich eingefügt werden soll, nicht das Geringste an, und der Bubblesort sortiert auch einfach nur irgendwas Unerkennbares in der Gegend herum.
Mach nicht alles auf einmal. Mach erstmal die richtigen Funktionsköpfe und sorg dafür, dass alles in den Klassen definiert ist, in die es gehört, damit m_entries tatsächlich das ist, was du denkst (ein Member von CCalendar) und nicht eine lokale Variable mit einem ungeschickten Namen.
Danach mach das Array-Handling (Speicher vergrößern, bestehende Einträge umkopieren, neuen Eintrag anhängen, alten Speicher sauber loswerden), erst mal ohne Sortierung. Beachte, dass du während dieser Zeit zwei Arrays hast, das alte und das neue. Du brauchst also außer dem m_entries-Pointer noch einen weiteren temporären, mit dem du arbeitest. Du kannst zur Verbesserung der Klarheit auch zwei Arbeits-Pointer verwenden, etwa so:
C++: |
CCalendarEntry * oldEntries = m_entries; // das alte Array CCalenderEntry * newEntries = new CCalendarEntry [m_numEntries + 1]; // das neue Array /* jetzt Daten von alt nach neu umkopieren, den neuen Entry anhängen und dann ... */ m_entries = newEntries; // m_entries auf das neue Array zeigen lassen delete [] oldEntries; // das alte Array zerlegen
|
Und als letztes änderst du das so ab, dass der neue Eintrag an der richtigen Stelle eingefügt wird. Das ist aber kein Fall für Bubblesort, sondern für Insertionsort. Es ist sogar der "natürliche Lebensraum" für Insertionsort. |