Fehlermeldung: Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt
-
Hallo zusammen,
im Zuge einer Übung bin ich auf die im Titel beschriebene Fehlermeldung gestoßen. Leider kann ich sie nicht interpretieren. Ich habe keine Fehler und keine Warnungen vom Compiler.
Der Programmcode zur Berechnung einer quadratischen Gleichung wie folgt:
/******************************************************************** Berechnugn von quardratischen Gleichungen ********************************************************************// #include <iostream> #include <math.h> struct QuadGleichung { double a, b, c, p, q; int anzahl; }; //Struktur: a*x^2 + b*x + c = 0 //p = reelle Lösung 1 //q = reelle Lösung 2 QuadGleichung & quadGleich(double a, double b, double c); //Berechnugn der Gleichung void showQuad(const QuadGleichung &a); //Ergebnisanzeige //------------------------------------------------------------------- int main(){ QuadGleichung dummy = quadGleich(1, 1, -20); showQuad(dummy); system("pause"); } //------------------------------------------------------------------- QuadGleichung& quadGleich(double a, double b = 0, double c = 0){ static QuadGleichung *p; double x1, x2;//Zwischenspeicher für Ergebnisse static QuadGleichung hilf1;//Rückgabewert static int hilf;//Zwischenspeicher Anzahl der Lösungen x1 = (-b + sqrt((b * b) - 4 * a * c)) / (2 * a); x2 = (-b - sqrt((b * b) - 4 * a * c)) / (2 * a); if(x1 == 0) ++hilf; if(x2 == 0) ++hilf; p -> p = x1; p -> q = x2; p -> anzahl = hilf;//Anzahl der reellen Lösungen return hilf1; } //------------------------------------------------------------------- void showQuad(const QuadGleichung &a){ if(a.p != 0) std::cout << "x1 = " << a.p << std::endl; if(a.q != 0) std::cout << "x2 = " << a.q << std::endl; }
Im Unterprogramm quadGleich weiche ich von der Lösung aus dem Buch ab. Ich benutze einen Pointer. Liegt es daran?
Zudem verstehe ich nicht, warum die Warnmeldungen nur verschwinden, wenn ich die lokalen Variablen im Unterprogramm quadGleich als statisch deklariere.
Ich bitte um Rat.
-
float schrieb:
Im Unterprogramm quadGleich weiche ich von der Lösung aus dem Buch ab. Ich benutze einen Pointer. Liegt es daran?
Nein, es liegt daran, dass dein Zeiger nicht initialisiert ist und nicht auf ein Objekt zeigt. Wozu soll der überhaupt nütze sein, du benutzt ihn danach gar nicht mehr.
Zudem verstehe ich nicht, warum die Warnmeldungen nur verschwinden, wenn ich die lokalen Variablen im Unterprogramm quadGleich als statisch deklariere.
Weil die Variablen alle nicht initialisiert sind. static hat als Nebeneffekt, dass sie, wenn nichts anderes angegeben ist, mit 0 initialisiert werden (deshalb bekommst du bei deinem Pointer netterweise auch diese Messagebox, anscheinend werden Nullzeiger speziell abgefangen, normalerweise würde einfach irgendwelcher zufälliger Schrott oder ein Absturz oder gar nichts passieren).
Tipp: Schau dir an was static macht, bevor du damit versuchst, Warnungen zu unterdrücken. (Noch ein Tipp: Die Nullinitialisierung ist nicht der einzige Effekt)
-
float schrieb:
[...] bin ich auf die im Titel beschriebene Fehlermeldung gestoßen. [...] Ich habe keine Fehler und keine Warnungen vom Compiler.
Widersprichst du dir nicht? Oder meinst du einen Laufzeitfehler (z.B. eine Exception?)
#include <math.h> // nimm <cmath>, das ist C++ Standard QuadGleichung& quadGleich(double a, double b = 0, double c = 0){ static QuadGleichung *p; // wo gibst du p einen Wert? static QuadGleichung hilf1; // statische Variable p -> p = x1; // Dereferenzierung von nicht initalisierten Zeigern ist gefährlich p -> q = x2; p -> anzahl = hilf;//Anzahl der reellen Lösungen return hilf1; }
Ohne
static
isthilf1
eine lokale Variable, das heisst, sie existiert nach Ende der Funktion nicht mehr. Die zurückgegebene Referenz auf sie ist dann ungültig. Ausserdem solltest du mit Pointern aufpassen (d.h. nicht dereferenzieren, wenn sie keinen gültigen Wert besitzen).
-
Danke für die schnelle Hilfe.
Der Pointer ist wirklich nicht initialisiert. Er kennt auch die Adresse nicht, auf die er zeigen soll. --> Fehler 1
Er werde Morgen das Unterprogramm ohne Zeiger umschreiben. Ich glaube es geht nicht mit Pointern für diese Anwendung.