Eclipse Fehlermeldungen



  • ah ok danke



  • CLottoTicket::CLottoTicket(std::string name,unsigned short maxTips ){
    
    	m_name = name;
    	m_countTips = 0;
    	
    	m_name = name;
    
    		if (m_maxTips > 6)
    		{
    
    			m_maxTips = maxTips;
    
    		}
    		else
    		{
    			m_maxTips = 6;
    		}
    
    		m_tips = new CTip[m_maxTips];
    
    	
    }
    

    Ok so?



  • @Programmer33 sagte in Eclipse Fehlermeldungen:

    Ok so?

    • name wird zweimal zugewiesen. Nicht falsch, sieht aber schlampig aus.
    • Du prüfst mit m_maxTips > 6 eine nicht-initialisierte Variable -> Bug.
    • Dein if/else-Code folgt nicht exakt dem Wortlaut der Aufgabenstellung. Nur wenn die Zusicherung verletzt wird, soll der Minimalwert genommen werden. Für 6 wird die Zusicherung nicht verletzt, du setzt aber trotzdem den Minimalwert. Am Ende kommt zwar dasselbe heraus, da ich aber denke, dass die Aufgabe vornehmlich darauf abzielt, Anweisungen exakt umzusetzen, würde ich das vielleicht umformulieren.
    • Die Einrückung ist nicht konsistent.


  • Jetzt müsste es passen denke ich.
    Ich glaube die memeber Variable kann man in der if Bedingung auch schon nutzen ?

    
    CLottoTicket::CLottoTicket(std::string name,unsigned short maxTips ){
    
    	m_name = name;
    	m_countTips = 0;
    	
    
    		if (m_maxTips >= 6)
    		{
    
    			m_maxTips = maxTips;
    
    		}
    		else
    		{
    			m_maxTips = 6;
    		}
    
    		m_tips = new CTip[m_maxTips];
    
    	
    }```
    
    Jetzt müsste es passen ,denke ich


  • @Programmer33 sagte in Eclipse Fehlermeldungen:

    Jetzt müsste es passen denke ich.

    m_maxTips ist in Zeile 8 noch immer nicht initialisiert. Du prüfst also auf einen unspezifizierten Wert, der in keiner Beziehung zu dem übergebenen Parameter maxTips steht.



  • aha ok .Soll ich dann besser maxTips dort noch lassen ?
    Weil davor initialisieren soll man glaub ich nach der Aufgabenstellung nicht 😀

    Was sagt ihr zu meiner operator += Methode 😀

    CLottoTicket& CLottoTicket::operator+= (CTip tip){
    
    
    	if( m_countTips < m_maxTips){
    
    		CTip* temp = new CTip [m_maxTips];
    
    		for(int i = 0; i < m_maxTips; i++)
    		{
    			temp[i] = m_tips[i];
    		}
    
    			delete m_tips;
    
    		m_tips = new CTip [m_maxTips+12];
    
    		for(int i = 0; i < m_maxTips; i++) {
    			m_tips[i] = temp[i];
    		  }
    
    		delete[] temp;
    		m_maxTips += 12;
    
    
    
    	}
    
       m_tips[m_countTips++]= tip;
       return *this;
    
    }
    


  • @Programmer33 sagte in Eclipse Fehlermeldungen:

    aha ok .Soll ich dann besser maxTips dort noch lassen ?

    Prüfe einfach maxTips statt m_maxTips und alles wird gut.

    Was sagt ihr zu meiner operator += Methode 😀

    Unterirdisch. Erstaunlicherweise sollte sie jedoch fast funktionieren, wenn du das Array nicht nur dann vergrößern würdest, wenn noch genug Platz im Array ist. Schau dir die Bedingung in Zeile 4 nochmal genau an.

    Anmerkungen:

    • Bedingung in Zeile 4 (s.o.). Auch wenn man euch C++ aus dem letzten Jahrtausend lehrt, solltest du aus der Veranstaltung zumindest mitnehmen wie man Bedingungen richtig formuliert und dein logisches Denken schärfen.
    • Warum kopierst du die Array-Elemente zweimal? Einmal reicht. Denke dran, dass du einen Pointer auch einfach neu zuweisen kannst (m_tips = temp), damit kannst du dir eine Kopierschleife sparen.
    • In Zeile 13 löschst du kein Array, sondern nur ein einzelnes Element.

    Ansonsten sollte die Funktion weitgehend das Richtige tun,wenn ich nichts übersehen habe. Auch wenn es kein schönes und modernes C++ ist.



  • Ich habe es noch ein wenig verbessert .

    
    CLottoTicket& CLottoTicket::operator+= (CTip tip){
    
    
    	if( m_countTips < m_maxTips && m_countTips >0){
    
    		CTip* temp = new CTip [m_maxTips];
    
    		for(int i = 0; i < m_maxTips; i++)
    		{
    			temp[i] = m_tips[i];
    		}
    
    			delete[] m_tips;
    
    		m_tips = new CTip [m_maxTips+12];
    
    		for(int i = 0; i < m_maxTips; i++) {
    			m_tips[i] = temp[i];
    		  }
    
    		delete[] temp;
    		m_maxTips += 12;
    
    
    
    	}
    
       m_tips[m_countTips++]= tip;
       return *this;
    
    }
    
    
    
    
    

    So würde es passen oder dann ?
    Ich bin schon froh ,dass ich zum ersten mal so ne schwere Methode teilweise selber implementieren konnte



  • @Programmer33 sagte in Eclipse Fehlermeldungen:

    So würde es passen oder dann ?

    Schau dir die bedingung in Zeile 5 nochmal genau an. m_maxTips ist die Kapazität des Arrays und m_countTips die Anzahl der Tips, die gerade im Array gespeichert sind.

    Welche Bedingung ist erfüllt, wenn du keinen Platz mehr im Array hast? Oder anders: Wann ist die Kapazität erschöpft? Welche Bedingung gilt dann? Die, die dort bei dir in Zeile 5 steht, ist jedenfalls komplett falsch.

    Der Rest ist nicht schön, sollte aber funktionieren (ohne Garantie! Selbst testen!).



  • @Finnegan sagte in Eclipse Fehlermeldungen:

    Welche Bedingung ist erfüllt, wenn du keinen Platz mehr im Array hast? Oder anders: Wann ist die Kapazität erschöpft?

    Wenn (m_countTips > m_maxTips && m_countTips >0 )ist ? Dann ist der Speicher voll .

    Hatte in der Aufgabe verlesen 🙂
    Dachte man muss es machen wenn der nicht voll ist😀



  • @Programmer33 sagte in Eclipse Fehlermeldungen:

    new

    "nicht schön" fängt schon bei Zeile drei mit new an.



  • Wie hätte man die Aufgabe schöner lösen können ?
    Gerne erklären



  • @Programmer33 sagte in Eclipse Fehlermeldungen:

    Wie hätte man die Aufgabe schöner lösen können ?

    Was ist die Aufgabenstellung?



  • @Programmer33 sagte in Eclipse Fehlermeldungen:

    @Finnegan sagte in Eclipse Fehlermeldungen:
    Wenn (m_countTips > m_maxTips && m_countTips >0 )ist ? Dann ist der Speicher voll .

    Besser, aber immer noch falsch 😉
    Wenn m_countTips > m_maxTips, dann bedeutet, das, dass dein operator+ bei einem vorherigen Aufruf irgendwann mal in Zeile 29 ein Element bei m_tips[m_maxTips] eingefügt haben muss: Schliesslich wird m_countTips nur in Zeile 29 durch die Anweisung m_countTips++ größer. Wenn m_countTips nun aber größer als m_maxTips ist, dann war es beim vorangegangen Aufruf von operator+ gleich m_maxTips, da m_countTips in Zeile 29 immer nur um 1 größer wird. Das bedeutet, dass du beim vorherigen Auruf einen Tip an Position m_tips[m_maxTips] eingefügt haben musst.

    Ist das korrekt? Bedenke, dass dein Array m_maxTips Elemente hat. Auf welchen Index darfst du also maximal zugreifen, damit du nicht über die Grenzen das Array hinaus schreibst?

    Die Bedingung m_countTips > 0 ist übrigens auch nicht notwendig. Ob die Kapazität erschöpft ist, hängt nur von der Relation zwischen m_countTips und m_maxTips ab. Kleiner als 0 können diese Werte auch nicht sein, da es sich um unsigned-Typen handelt.



  • @Swordfish sagte in Eclipse Fehlermeldungen:

    Was ist die Aufgabenstellung?

    Die wurde in einem vorherigen Beitrag in einem Link zu einem Bild gepostet. Es gilt die Klasse nach einem vorgegebenen UML-Klassendiagramm umzusetzen. Dort ist der Typ des "Array" als CTip* vorgegeben. Die Frage, wie man es schöner machen kann stellt sich also leider nicht, wenn man nicht die Vorgaben im Klassendiagramm verletzen will. Ich denke es ist Teil der Aufgabe, diesen Vorgaben exakt zu folgen. Den Vorwurf mit dem Uralt-C++ muss man hier also wie so oft mal wieder dem Dozenten machen 😞



  • @Finnegan sagte in Eclipse Fehlermeldungen:

    Die wurde in einem vorherigen Beitrag in einem Link zu einem Bild gepostet.

    Ach so. Das erklärt einiges. Ich lese keinen Text in Bildern.



  • @Finnegan sagte in Eclipse Fehlermeldungen:

    Ist das korrekt? Bedenke, dass dein Array m_maxTips Elemente hat. Auf welchen Index darfst du also maximal zugreifen, damit du nicht über die Grenzen das Array hinaus schreibst?

    Index 5 ist der letzte Index .

    Aber ich bin jetzt verwirrt das mit dem einfügen vor der if Funktion🤣



  • @Programmer33 sagte in Eclipse Fehlermeldungen:

    Index 5 ist der letzte Index .

    Aber ich bin jetzt verwirrt das mit dem einfügen vor der if Funktion🤣

    Drücke diesen letzten Index mal nicht als konkrete Zahl, sondern allgemein unter Verwendung der Variablen m_maxTips aus. Schliesslich kann der Konstruktor auch mit maxTips größer 6 aufgerufen, oder das Array schonmal vergrößert worden sein.



  • Jetzt peile ich gerade wieder nichts mehr ☹
    Was meinst du genau ?



  • @Programmer33 sagte in Eclipse Fehlermeldungen:

    Jetzt peile ich gerade wieder nichts mehr ☹
    Was meinst du genau ?

    Ich versuche dich dazu anzuregen, dir selbst zu erschliessen, weshalb m_countTips > m_maxTips nicht korrekt ist, und was da stattdessen stehen muss. Du vergrößerst das Array zu spät, zu einem Zeitpunkt, wo bei einem vorherigen Aufruf des operator+= schon ein ungültiger Schreibzugriff über die Array-Grenzen hinaus stattgefunden hat.

    Im übrigen verletzt dein operator+= auch die Zusicherung 0 <= m_countTips <= m_maxTips aus dem Klassendiagramm, indem er erlaubt, dass diese Bedingung falsch wird. Diese Zusicherungen haben einen Grund, dass sie mit in Klassendiagramm stehen: Sie müssen nach dem Aufruf jeder Funktion deiner Klasse gültig sein. Ansonsten ist dein Programm nicht korrekt - und es findet ja auch tatsächlich ein ungültiger Array-Zugriff statt.

    Für so etwas gibt es übrigens in C++ auch die Funktion assert() (Englisch für Zusicherung) womit du im Debug-Modus solche Zusicherungen prüfen kannst und dein Programm dann auf einen Fehler läuft, wenn diese Zusicherungs-Bedingung nicht erfüllt ist. Du kannst das mal in dein Programm ans Ende deines operator+= vor dem return einbauen - beim Verlassen der Funktion muss die im Klassendiagramm angegebene Zusicherung schliesslich erfüllt sein:

    #include <cassert>
    
    ...
    
    CLottoTicket& CLottoTicket::operator+=(CTip tip) {
        ...
        assert(0 <= m_countTips && m_countTips <= m_maxTips);
        return *this;
    }
    

    Wenn du das drin hast, und nun in einem Test mehr Tips hinzufügst als die Kapazität (m_maxTips) des Array zulässt, wird dieses assert auf einen Fehler laufen. Damit weisst du dann, dass du in deinem operator+= irgendwo einen Programmierfehler hast. Zusicherungen/Assertions sind ein Hilfsmittel, mit dem man solche Fehler frühzeitig finden kann. Solche asserts für die im Klassendiagramm angegebenen Zusicherungen kannst du übrigens auch ruhig in dem Programm stehen lassen, wenn du es abgibst. Das macht garantiert keinen schlechten Eindruck, eher im Gegenteil.

    Nochmal: Die Ursache für diesen Fehler liegt wie gesagt in der Bedingung m_countTips > m_maxTips. Du vergrößerst das Array zu spät, nachdem schon ein ungültiger Schreibzugriff stattgefunden hat.


Anmelden zum Antworten