Eclipse Fehlermeldungen



  • 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.



  • Soll ich diese Bedingung also vorher einbauen ?
    m_tips = new CTip [m_maxTips+12];

    
    CLottoTicket& CLottoTicket::operator+= (CTip tip){
    
    	m_tips = new CTip [m_maxTips+12];
    	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;
    
    }
    
    
    
    
    
    

    Jetzt ok?
    Hoffe das es jetzt passt will an einer anderen Aufgabe weiter lernen 😀



  • @Programmer33 sagte in Eclipse Fehlermeldungen:

    Soll ich diese Bedingung also vorher einbauen ?
    m_tips = new CTip [m_maxTips+12];

    WTF?

    Jetzt ok?

    Nein! Jetzt hast du ein Speicherleck und einen Zugriff auf zerstörte und freigegebene Objekte eingebaut. Weisst du überhaupt, was du tust oder schiebst du nur irgendwelche zusammenkopierte Zeilen hin- und her in der Hoffnung durch Zufall ein korrektes Programm zu erhalten?

    Ich weiss nicht, was ich noch schreiben soll. Nochmal zum mitschreiben:

    Die Bedingung m_countTips > m_maxTips, das ist das was in den Klammern hinter dem ifsteht, ist nicht korrekt. Diese Bedingung führt dazu, dass du das Array zu spät vergrößerst. Du musst es schon vorher vergrößern, und nicht erst dann, m_countTips > m_maxTips gilt.

    Das hat überhaupt nichts mit der von dir verschobenen Zeile zu tun, die vorher an der richtigen Stelle stand. Du musst also nur diese Zeile verändern:

    if( m_countTips > m_maxTips ){
    

    und zwar derart, dass der if-Block ausgeführt wird, wenn das Array zu dem Zeitpunkt des Aufrufs exakt voll ist und nicht erst dann wenn es voll ist und noch ein zusätzliches Element ausserhalb der Array-Grenzen hineingequetscht wurde.

    Das musst du nach all meinen Erklärungen hinbekommen, ansonsten kann ich dir nur ernsthaft raten, dir frühzeitig ein anderes Fach zu suchen, da ich dann Zweifel haben werde, ob du damit je glücklich wirst.

    Edit: Noch etwas zum Verständnis: Wenn ich sage du vergrößerst das Array zu spät, dann meine ich damit nicht "zu spät in der Funktion", sondern "zu spät im Ablauf des Programms". Das Vergrößern war schon an der richtigen Stelle, nur muss dieses bei einem früheren Aufruf von operator+= stattfinden. Das wird mit besagter if-Bedingung gesteuert.



  • Ah if m_maxTips == m_countNumbers

    War irgendwie total verwirrt ,dachte mein Code passt nicht.

    Hoffe das jetzt ok ist ?🤣



  • @Programmer33 sagte in Eclipse Fehlermeldungen:

    Ah if m_maxTips == m_countNumbers

    Grad aus dem Keller vom Weinen zurückgekommen. Das ich das noch erleben darf! Aber ... warum zum Henker m_countNumbers? Was ist das für eine Variable, wo kommt die her? Wenn du mit solchen Sachen irgendwann mal erfolgreich sein willst, dann musst du schon sehr sorgfältig arbeiten. Selbst bei scheinbar banalen Dingen. Ich denke die Variable sollte anders heissen.

    War irgendwie total verwirrt ,dachte mein Code passt nicht.

    Er hat auch nicht gepasst. Er wahr falsch und hat die Zusicherung verletzt. Punkt. Was man allerdings sagen konnte ist, er war einigermaßen nah dran. Das interessiert Computer allerdings nicht: Ein falsches Bit und deine Ariane 5 macht beim Start einen Looping und landet kopfüber wieder auf der Startrampe.

    Hoffe das jetzt ok ist ?🤣

    Auch wenn ich es wahrscheinlich bereuen werde: Zeig nochmal den Code, den du jetzt hast. Bis auf die if-Bedingung sah der Code weitgehend okay aus - auch wenn ich das doppelte Kopieren für schlechten Stil halte (nicht dass new/delete nicht schon schlechter Stil wären, aber dafür kannst du ja ausnahmsweise nichts). Und auch wenn ich sage es sieht "okay" aus, sehe ich auch nicht immer alles. Du solltest den Code schon selbst noch ausgiebig testen.



  • Sorry war kurz weg.
    Finnegan ich möchte sowieso kein Programmierer werden . Habe nur 1 Fach Programmierung ,dass mich verrückt macht.
    Aber da bin ich ehrlich ,da gibt es Leute die das besser machen können 😀

    Es gibt aber nur m_countNumbers ? Mit was sonst vergleichen .
    Hier mal Header und Code nochmal:

    #ifndef CLOTTOTICKET_H_
    #define CLOTTOTICKET_H_
    #include<iostream>
    #include<string>
    #include"CTip.h"
    
    class CLottoTicket{
    
    private:
        std::string m_name;
    	unsigned short m_maxTips;
    	unsigned short m_countTips = 0;
    	CTip* m_tips;
    
    public:
    	CLottoTicket(std::string name,unsigned short maxTips = 12);
    	~CLottoTicket();
    	std::string getName();
    	CLottoTicket& operator+= (CTip tip);
    	float winnings(CTip drawing,float winFor3,float winFor4,float winFor5,float winFor6);
    	void printSuccessful(CTip drawing);
    
    };
    
    
    
    
    #include<iostream>
    #include "CTip.h"
    #include "CLottoTicket.h"
    using namespace std;
    
    
    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];
    
    
    }
    
    CLottoTicket::~CLottoTicket(){
    
    	delete[] m_tips;
    }
    
    
    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;
    
    }
    
    
    
    
    

    Ja bitte kontrolliere den Weg .
    Damit ich weiss ,dass der Weg richtig ist



  • Hast du auch eine konkrete Frage?



  • Finnegan wollte nochmal über den Code drüber schauen .
    Gerne können Nutzer einen schöneren Weg darstellen wie ich es besser lösen kann ?


Anmelden zum Antworten