Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (GNU/Linux, *NIX, *BSD und Co) » Problem C++

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: [ 1 ] > 2 < [ 3 ]
010
22.08.2017, 12:38 Uhr
ao

(Operator)


Weil der Compiler beim Übersetzen von CCalendar nicht weiß, was ein CCalendarEntry ist. Es fehlen Include-Statements und/oder Forward-Deklarationen. Die Fehlermeldung "CCalendarEntry does not name a type" weist dich genau darauf hin.

Und hör bitte auf, Screenshots von deiner IDE zu verlinken, in denen die Tabellenfelder zu klein und die Texte abgeschnitten sind. Poste die Fehlermeldungen hier als Text. Falls nötig, lerne, wie du sie aus dem Problems-Fenster herausbekommst.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
011
22.08.2017, 13:44 Uhr
Alex33



Wäre der destruktor so in Ordnung ?

Da muss ich ja den Speicher freigeben obwohl gar keiner erstellt wurde

Also habe ich im Konstruktor Speicher angelegt :


C++:
#include "CCalendar.h"




CCalendar::CCalendar(int m_numberofEntries, CCalendarEntry* m_entries) {

       m_numberofEntries = numberofEntries;
       m_entries = entries;

m_entries = (CCalendarEntry*)malloc(m_numberofEntries *sizeof(CCalenderEntry));
}

CCalendar::~CCalendar() {
    // TODO Auto-generated destructor stub
    delete m_entries;
}








Passt es so?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
012
22.08.2017, 20:47 Uhr
ao

(Operator)


Nein, das ist falsch so. In der Aufgabe steht, dass der Konstruktor parameterlos sein soll, also musst du das auch so machen. Der Konstruktor initialisiert einen leeren Kalender. Das Einfügen von CalendarEntries geschieht NUR über den operator+=. (Ob das schön ist, die Einfügefunktion als Operator zu verkleiden, steht auf nem andern Blatt, ich hätte eine Methode AddEntry bevorzugt, aber seis drum, ist halt ne Übungsaufgabe, da kann man nichts Geistvolles erwarten)

Außerdem: Speicher, der mit malloc geholt wird, muss mit free freigegeben werden. Speicher der mit delete freigegeben wird, muss mit new geholt werden. Ersteres ist C, letzteres ist C++. Du solltest unbedingt die C++-Form verwenden, weil es sich bei CCalendarEntry um eine Klasse handelt.

Du kommst in Teufels Küche, wenn du Klassen mit malloc instanzierst, dabei wird nämlich kein Konstruktor ausgeführt. D.h. die Member bleiben uninitialisiert, und wenn du mal mit abgeleiteten Klassen arbeitest, dann wird auch die Vtable nicht aufgebaut, und das wird ganz übel, dann funktioniert nämlich die Ableitungsstruktur nicht. Also malloc bei Klassen ganz schnell wieder vergessen.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
013
23.08.2017, 00:15 Uhr
Alex33



Ich habe mal ein wenig weiter probiert:

Ich weiss nicht ob es quatsch ist ,aber ich habe es einfach mit einem bubblesort Algorithmus probiert ,aber glaube ich nicht ganz richtig leider:


C++:



#include "CCalendar.h"




CCalendar::CCalendar() {

      
}

CCalendar::~CCalendar() {
    if( m_entries >=0 ){
    delete m_entries;
    }
}

Calendar& operator+=(const CCalendarEntry& entry){
    
    
    CCalendarEntry** m_entries = new CCalendar* [m_numberofEntries+1];
    int temp;
    // Alle Elemente durchgehen (letztes ausgenommen)
    for(m_entries  = 0; m_entries  < m_numberofEntries-1; m_entries++)
    {
        // Position des zurzeit kleinstes Elementes
        unsigned int min_pos = m_entries;
    
        // unsortierten Teil des Feldes durchlaufen
        // und nach kleinstem Element suchen
        for( m_entries = m_numberofEntries+1; j < m_numberofEntries; j++)
            if(feld[j] < feld[min_pos] )
                min_pos = j;
    
        // Elemente vertauschen
        // Das kleinste Element kommt an das Ende
        // bereits sortierten Teils des Feldes
        int temp = feld[numberofEntries];
        feld[numberofEntries] = feld[min_pos];
        feld[min_pos] = temp;
    }
}




Passt es ein wenig wenigstens ?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
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.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
015
23.08.2017, 17:15 Uhr
Alex33



Ich versuche es jetzt bisschen zu proggen aber verstehe nicht so richtig wie ich es machen soll
Fällt mir so schwer

C++:
Calendar& operator+=(const CCalendarEntry& entry){

    CCalendarEntry * oldEntries = m_entries;  // das alte Array
    CCalenderEntry * newEntries = new CCalendarEntry [m_numberofEntries + 1];
    m_entries = newEntries;  // m_entries auf das neue Array zeigen lassen
    delete [] oldEntries;  // das alte Array zerlegen
    
    
    if(m_entries> CCalendarEntry [m_numberofEntries + 1]){
        
        
    }
    
    
    
}




Ich will das wenn man dass m_entries grösser ist als das andere Array ,dass das m_entries dann davor steht ?

Aber wie soll ich das machen ?

Ich verpeile gerade total
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
016
25.08.2017, 10:19 Uhr
ao

(Operator)



Zitat von Alex33:
Ich will das wenn man dass m_entries grösser ist als das andere Array ,dass das m_entries dann davor steht ?

Ich versteh kein Wort, der Satz ist wirr.

Nochmal der Reihe nach:

Mit dem new-Befehl holst du dir ein Array, das um 1 Element länger ist als das letzte. Das enthält aber noch keine sinnvollen Daten, nur N+1 leere Einträge.

Als nächstes musst du die alten Einträge einen nach dem anderen in das neue Array kopieren. Das klingt irgendwie nach Schleife, oder?

Dann hängst du den neuen Eintrag hinten an. (Da fehlt noch die Einsortierung an der richtigen Stelle, aber bring es erst mal so zum Laufen)

Als letztes gibst du das alte Array ans Betriebssystem zurück, das brauchst du nämlich nicht mehr.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
017
26.08.2017, 10:47 Uhr
Alex33




C++:

CCalendar& CCalendar::operator+=(const CCalendarEntry& entry) {
    CCalendarEntry *newEntries = new CCalendarEntry[m_numberOfEntries + 1]();


    if(m_entries != nullptr)
        delete[] m_entries;
    ++m_numberOfEntries;
    m_entries = newEntries;
    return *this;


for( m_numberofEntries= 0 ;  m_numberofEntries>0; m_numberofEntries++) {
if( m_entries> newEntries){

m_entries = newEntries;

return *this;
}

}


Ich peile es net was für eine Bedingung ich da einbauen soll?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
018
27.08.2017, 14:11 Uhr
ao

(Operator)


Mir scheint, das stimmt: Du peilst es net. Wie wärs denn, wenn du dich mal mit deinen Kursunterlagen beschäftigst? Irgendwas Verwertbares muss da doch drinstehen, oder?

Was ist das überhaupt? Studium? Ausbildung? Fortbildung?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
019
27.08.2017, 17:51 Uhr
Alex33



Es ist Studium und ich habe sau grosse Probleme beim Fach programmieren
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: [ 1 ] > 2 < [ 3 ]     [ C / C++ (GNU/Linux, *NIX, *BSD und Co) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: