Eclipse Fehlermeldungen
-
@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 undm_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
Wennm_countTips > m_maxTips
, dann bedeutet, das, dass deinoperator+
bei einem vorherigen Aufruf irgendwann mal in Zeile 29 ein Element beim_tips[m_maxTips]
eingefügt haben muss: Schliesslich wirdm_countTips
nur in Zeile 29 durch die Anweisungm_countTips++
größer. Wennm_countTips
nun aber größer alsm_maxTips
ist, dann war es beim vorangegangen Aufruf vonoperator+
gleichm_maxTips
, dam_countTips
in Zeile 29 immer nur um 1 größer wird. Das bedeutet, dass du beim vorherigen Auruf einen Tip an Positionm_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 zwischenm_countTips
undm_maxTips
ab. Kleiner als 0 können diese Werte auch nicht sein, da es sich umunsigned
-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 mitmaxTips
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 desoperator+=
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 deinesoperator+=
vor demreturn
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 diesesassert
auf einen Fehler laufen. Damit weisst du dann, dass du in deinemoperator+=
irgendwo einen Programmierfehler hast. Zusicherungen/Assertions sind ein Hilfsmittel, mit dem man solche Fehler frühzeitig finden kann. Solcheassert
s 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 demif
steht, 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 besagterif
-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 dassnew
/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önnenEs 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 ?
-
@Programmer33 sagte in Eclipse Fehlermeldungen:
Gerne können Nutzer einen schöneren Weg darstellen wie ich es besser lösen kann ?
Was lösen? Aufgabenstellung = ?