Programm kompiliert, stürzt dann aber ab
-
Dieser Teil war eigentlich angegeben. Dieser Kommentar auch...

-
Dann erkläre mal bitte was das hier bewirken soll
pp = new Punkt; pp = 0;Da sind noch ganz viele andere Fehler drin.
z. Bsp.
Wo wird im CopyConstructor Speicher vereinbart.
Was genau macht dein Zuweisungsoperator wenn dein übergebenes Feld eine andere Größe hat als das Orginalfeld?
-
// Standardkonstruktor PFeld() { pp = new Punkt;pp Zeigt jetzt auf Speicher für einen Punkt
pp = 0;pp Zeigt jetzt auf nichts mehr. Du hast keinen Zeiger mehr für den zuvor anglegten Speicher, so dass Du ihn nicht mehr frei geben könntest => Memoryleak.
dim = 0; } // Parameterkonstruktor PFeld(int d) { pp = new Punkt;pp Zeigt jetzt auf Speicher für einen Punkt. Ist d > 0 greift bereits der 2. Schleifendurchlauf auf Speicher zu, der Dir nicht gehört, was früher oder später zum Absturz führt.
for (int i = 0; i < d; i++) { pp[i].x = 0; pp[i].y = 0; } }
-
Braunstein schrieb:
Dann erkläre mal bitte was das hier bewirken soll
pp = new Punkt; pp = 0;Da sind noch ganz viele andere Fehler drin.
z. Bsp.
Wo wird im CopyConstructor Speicher vereinbart.
Was genau macht dein Zuweisungsoperator wenn dein übergebenes Feld eine andere Größe hat als das Orginalfeld?// Kopierkonstruktor PFeld(const PFeld ©) { pp = new Punkt[copy.dim]; for (int i = 0; i < dim; i++) { this->pp[i].x = copy.pp[i].x; this->pp[i].y = copy.pp[i].y; } }Wie hier http://www.c-plusplus.net/forum/232010-full angegeben, habe ich die Zuweisung mit swap versucht aber ich bekomme eine Fehlermeldung "Keine Instanz von Überladene Funktion swap stimmt mit der Argumentliste überein. Argumenttypen sind: (PFeld)"
// Zuweisungsoperator PFeld& PFeld::operator=(PFeld const& ob2) { if (this != &ob2) { PFeld tmp(ob2); swap(tmp); } return *this; }
-
tntnet schrieb:
...was früher oder später zum Absturz führt...
Wo soll ich das dann machen? Wie oben erwähnt, "In dieser Klasse wird dynamisch Speicher allokiert" war angegeben.
-
Markuslab schrieb:
tntnet schrieb:
...was früher oder später zum Absturz führt...
Wo soll ich das dann machen? Wie oben erwähnt, "In dieser Klasse wird dynamisch Speicher allokiert" war angegeben.
Was genau war vorgegeben? Dass deine Konstruktoren, so wie du sie hier gepostet hast, vorgegeben waren, kann ich kaum glauben. Beim einen schmeißt du den Zeiger gleich ganz weg, beim anderen erzeugst du nur einen Punkt, wo du doch u.U. mehrere bräuchtest.
-
Markuslab schrieb:
tntnet schrieb:
...was früher oder später zum Absturz führt...
Wo soll ich das dann machen?
Nicht nur für einen Punkt Speicher allozieren. Du weißt wie das geht, das seh ich an deinem zuletzt geposteten Kopierkonstruktor.
-
// Standardkonstruktor PFeld() { pp = 0; dim = 0; } // Parameterkonstruktor PFeld(int d) { pp = new Punkt[d]; for (int i = 0; i < d; i++) { pp[i].x = 0; pp[i].y = 0; } }?
-
Was machst du hier eigentlich?
Du hast eine Frage gestellt (die in der Form, oder leicht abgeändert, jeder Programmierer auf der Welt jeden Tag öfters stellen könnte, er löst es aber dann doch selbst) und ignorierst im Prinzip die Antworten, fragst aber dann mit minimalen Verbesserungen nach, ob das jetzt passt.
So programmiert man nicht !
Weder im Beruf noch im Hobby noch in der Uni/Schule (denn du kannst ja in der Klausur auch keinen alle 30 Sekudnen fragen, ob das jetzt besser ist*).Jetzt mal ernst beiseite: Ich denke, du willst nur mal eben das Fach bestehen und danach nicht mehr mit Programmierung in Berührung kommen? Aber auch dafür musst du ein bisschen tun.
*: Wenn doch, dann sag Bescheid, für so eine lächerliche Edukationseinrichtung gibts sicherlich viele Interessierten. Der Terminus "den Abschluss im lotto gewonnen haben" passt dahin sicherlich gut.
-
Sorry, du hast recht aber du weißt auch nicht in was für einer Lage ich gerade bin. Ich versuche parallel mehrere Aufgaben zu machen. Es ist ja nicht so, dass ich jetzt nichts gemacht habe. Ich habe das Programm so verbessert, wie hier angegeben. Das dann laufen lassen und es stürzt immer noch ab ohne eine Ausgabe von einer Fehlermeldung. Deswegen einfach die Verbesserung kurz noch mal gepostet, nicht dass ich es "falsch verbessert" habe.
-
Also gut find ich das noch immer nicht. Wenn du ein Objekt mit dem Standardkonstruktor erstellst, gibt es kein new. Es gibt aber ein delete wenn es dann zerstört wird. Ein delete ohne new... (delete auf NULL ist zwar ok, aber trotzdem nicht schön)
-
Deine persönliche Lage in allen Ehren, im Berufsleben wird da auch in den seltensten Fällen Rücksicht drauf genommen. Wenn man eine Projekt bis Tag X fertig haben soll und das auch fertig hat dann, dann gitbs Geld. Wenn mans erst ab dem Tag X+1 fertig hat, gibts kein Geld, egal was ist...
Welche Betriebssystem und welchen Editor und Compiler nutzt du?
Es gibt sogenannte Debugger. Damit kannst du Breakpoints im Sourcecode setzen und beim Ausführen hält dein Programm dort an und zeigt dir alle Variablen mit aktuellem Wert an. Da kannst du dann überprüfen, ob das stimmt was da zu sehen ist.Für Windows kann ich Visual Studio mit seinem Debugger empfehlen, der ist echt einer der Besten, die es gibt (wie ich finde, der Compiler ist etwas verschrien hier im Forum).
Weiter reicht mein Horizont auch grad nicht, ausser einem Namen: gdb für Linux und den GCC Compiler.Aber zu dem Thema werden dir hier andere noch weiter helfen können.
-
Das ist ein Missbrauch von NULL

-
out schrieb:
Also gut find ich das noch immer nicht. Wenn du ein Objekt mit dem Standardkonstruktor erstellst, gibt es kein new. Es gibt aber ein delete wenn es dann zerstört wird. Ein delete ohne new... (delete auf NULL ist zwar ok, aber trotzdem nicht schön)
Und wie willst du das "lösen"? Entweder im Standardkonstruktor noch ein sinnloses new, oder im Destruktor auf Null abfragen -- beides schlechtere Alternativen.
-
Da gibt's gar nix zu "lösen", das delete NULL ist in solchen Fällen vollkommen OK.