Problem mit temporärer Klassenvariable



  • Guten Abend!

    Ich bin gerade dabei eine einfache Verkehrssimulation für die Uni zu programmieren. Leider kriege ich seit 2 Stunden einen Fehler nicht behoben.
    Ich habe eine Klassenvariable vom Typ double angelegt (p_DMomentanGeschwindkeit). Diese soll die Geschwindigkeit (p_dMaxGeschwindkeit) eines PKW's einfach nur zwischenspeichern. Dann soll die p_dMaxGeschwindkeit auf 0 gesetzt werden, um einen leeren Tank zu simulieren. Sobald getankt wurde, soll es weitergehen.

    Leider kommen diese langen Zahlenwerte vor, sobald ich das Zwischenspeichern nicht auskommentiere. Weise ich in der if-Bedingung einen festen Wert wie z.B. 300 zu, klappt alles ausgezeichnet.

    Hat Jemand spontan eine Idee? 😕

    Ich poste auf Wunsch weiteren Code/ weitere Erklärungen.

    Ohne Bug:

    void PKW::vAbfertigung()
    {
    	Fahrzeug::vAbfertigung();
    
    	if(p_dTankinhalt >= 0.000001)								
    	{ 					
    		//p_dMaxGeschwindigkeit = p_dMomentanGeschwindigkeit;
    		p_dTankinhalt = p_dTankinhalt - dVerbrauch(); //Berechne neuen Tankinhalt	
    		if(p_dTankinhalt <= 0.000001)
    		{
    				p_dTankinhalt = 0;
    		}
    	}
    	else 
    	{
    	    //p_dMomentanGeschwindigkeit = dGeschwindigkeit();     //Zwischenspeichern der Geschwindigkeit des Fahrzeugs
    		p_dMaxGeschwindigkeit = 0;						    //Auto fährt nicht weiter, wenn Tank leer
    	}
    }
    

    Zahl der PKW's:

    1
    Zahl der Fahrraeder:

    0

    ********* Neuen PKW anlegen *********
    Name : bmw

    Max. Geschwindigkeit : 200

    Tankvolumen (default: 55L) : 80

    Verbrauch (default: 6L) : 10

    ******* PKW angelegt (ID : 1) *******
    ID Name : MaxKmh Gesamtstrecke Gesamtverbrauch Tankinhalt Geschwindigkeit
    ----------------------------------------------------------------------------------------------------------
    1 bmw : 200.00 0.00 0.00 40.00 200.00

    1 bmw : 200.00 100.00 10.00 30.00 200.00

    1 bmw : 200.00 200.00 10.00 20.00 200.00

    1 bmw : 200.00 300.00 10.00 10.00 200.00

    1 bmw : 200.00 400.00 10.00 0.00 200.00

    1 bmw : 0.00 500.00 0.00 0.00 0.00

    1 bmw : 0.00 500.00 0.00 0.00 0.00

    bmw hat 80 Liter getankt.

    1 bmw : 0.00 500.00 0.00 80.00 0.00

    1 bmw : 0.00 500.00 0.00 80.00 0.00

    1 bmw : 0.00 500.00 0.00 80.00 0.00

    1 bmw : 0.00 500.00 0.00 80.00 0.00

    1 bmw : 0.00 500.00 0.00 80.00 0.00

    1 bmw : 0.00 500.00 0.00 80.00 0.00

    Mit Bug:

    void PKW::vAbfertigung()
    {
    	Fahrzeug::vAbfertigung();
    
    	if(p_dTankinhalt >= 0.000001)								
    	{ 					
    		p_dMaxGeschwindigkeit = p_dMomentanGeschwindigkeit;
    		p_dTankinhalt = p_dTankinhalt - dVerbrauch(); //Berechne neuen Tankinhalt	
    		if(p_dTankinhalt <= 0.000001)
    		{
    				p_dTankinhalt = 0;
    		}
    	}
    	else 
    	{
    	    p_dMomentanGeschwindigkeit = dGeschwindigkeit();     //Zwischenspeichern der Geschwindigkeit des Fahrzeugs
    		p_dMaxGeschwindigkeit = 0;						    //Auto fährt nicht weiter, wenn Tank leer
    	}
    }
    

    Zahl der PKW's:

    1
    Zahl der Fahrraeder:

    0

    ********* Neuen PKW anlegen *********
    Name : bmw

    Max. Geschwindigkeit : 200

    Tankvolumen (default: 55L) : 80

    Verbrauch (default: 6L) : 10

    ******* PKW angelegt (ID : 1) *******
    ID Name : MaxKmh Gesamtstrecke Gesamtverbrauch Tankinhalt Geschwindigkeit
    ----------------------------------------------------------------------------------------------------------
    1 bmw : 200.00 0.00 0.00 40.00 200.00

    1 bmw : -6277438562204192200000000000000000000000000000000000000000000000000.00100.00 -313871928110209700000000000000000000000000000000000000000000000000.003138719281102097000
    00000000000000000000000000000000000000000000000.00-6277438562204192200000000000000000000000000000000000000000000000000.00

    1 bmw : -6277438562204192200000000000000000000000000000000000000000000000000.00-3138719281102096100000000000000000000000000000000000000000000000000.00-31387192811020970000000000000000
    0000000000000000000000000000000000.00627743856220419400000000000000000000000000000000000000000000000000.00-6277438562204192200000000000000000000000000000000000000000000000000.00

    1 bmw : -6277438562204192200000000000000000000000000000000000000000000000000.00-6277438562204192200000000000000000000000000000000000000000000000000.00-31387192811020970000000000000000
    0000000000000000000000000000000000.00941615784330628840000000000000000000000000000000000000000000000000.00-6277438562204192200000000000000000000000000000000000000000000000000.00

    1 bmw : -6277438562204192200000000000000000000000000000000000000000000000000.00-9416157843306290400000000000000000000000000000000000000000000000000.00-31387192811020970000000000000000
    0000000000000000000000000000000000.001255487712440838800000000000000000000000000000000000000000000000000.00-6277438562204192200000000000000000000000000000000000000000000000000.00

    1 bmw : -6277438562204192200000000000000000000000000000000000000000000000000.00-12554877124408384000000000000000000000000000000000000000000000000000.00-3138719281102097000000000000000
    00000000000000000000000000000000000.001569359640551048100000000000000000000000000000000000000000000000000.00-6277438562204192200000000000000000000000000000000000000000000000000.00

    1 bmw : -6277438562204192200000000000000000000000000000000000000000000000000.00-15693596405510483000000000000000000000000000000000000000000000000000.00-3138719281102097000000000000000
    00000000000000000000000000000000000.001883231568661257700000000000000000000000000000000000000000000000000.00-6277438562204192200000000000000000000000000000000000000000000000000.00

    bmw hat -1.9e+066 Liter getankt.

    1 bmw : -6277438562204192200000000000000000000000000000000000000000000000000.00-15693596405510483000000000000000000000000000000000000000000000000000.00-3138719281102097000000000000000
    00000000000000000000000000000000000.000.00 -6277438562204192200000000000000000000000000000000000000000000000000.00

    1 bmw : 0.00 -18832315686612581000000000000000000000000000000000000000000000000000.000.00 0.00 0.00

    1 bmw : 0.00 -18832315686612581000000000000000000000000000000000000000000000000000.000.00 0.00 0.00

    1 bmw : 0.00 -18832315686612581000000000000000000000000000000000000000000000000000.000.00 0.00 0.00

    1 bmw : 0.00 -18832315686612581000000000000000000000000000000000000000000000000000.000.00 0.00 0.00

    1 bmw : 0.00 -18832315686612581000000000000000000000000000000000000000000000000000.000.00 0.00 0.00


  • Mod

    PBitte avollständiges, acompilierbares NMinimalbeispiel vposten!

    PIch vfinde adas aübrigens avoll anützlich, pwenn pman aüberall pdran vschreibt, pwas pwas vist. Atotal agut alesbar! PUnd pman vweiß aimmer pworan pman agerade vist. POhne adiese NKürzel vwäre adas psonst pnicht aklar. PWer vwüsste pschon, adas "NHund" aein NNomen vist, pohne aeinem BN pam NAnfang?



  • SeppJ schrieb:

    PBitte avollständiges, acompilierbares NMinimalbeispiel vposten!

    PIch vfinde adas aübrigens avoll anützlich, pwenn pman aüberall pdran vschreibt, pwas pwas vist. Atotal agut alesbar! PUnd pman vweiß aimmer pworan pman agerade vist. POhne adiese NKürzel vwäre adas psonst pnicht aklar. PWer vwüsste pschon, adas "NHund" aein NNomen vist, pohne aeinem BN pam NAnfang?

    das wird von uns gefordert, damit die Tutoren sofort wissen was gemeint ist. p ist private, d steht für double, bescheuert ich weiß... 😉



  • Damit wissen die woran Sie sind? Krass. Naja, lesbarkeit ist nicht jedermanns Sache. 🙂 🙂

    OT: ich hab noch nicht mit Klassen angefangen, aber macht das wirklich jmd? Alles zu kennzeichnen ob private double usw usw ???



  • beg__ schrieb:

    Damit wissen die woran Sie sind? Krass. Naja, lesbarkeit ist nicht jedermanns Sache. 🙂 🙂

    OT: ich hab noch nicht mit Klassen angefangen, aber macht das wirklich jmd? Alles zu kennzeichnen ob private double usw usw ???

    Das bleibt deren Geheimnis, ich würde es auch nicht so machen... 😃


  • Mod

    beg__ schrieb:

    OT: ich hab noch nicht mit Klassen angefangen, aber macht das wirklich jmd? Alles zu kennzeichnen ob private double usw usw ???

    Es ist nicht unüblich, Membervariablen in ihrer Schreibweise von lokalen Variablen zu unterscheiden.
    Ansonsten ist ungarische Notation in C++ und ähnlichen Sprachen nicht üblich und wird eher kritisch gesehen. Eventuell kann man noch ein Argument für apps hungarian machen, um zum Beispiel zu markieren, ob der Inhalt einer Datenstruktur aus einer vertrauenswürdigen Quelle kommt oder aus Nutzereingaben abgeleitet ist (und man bei der Verarbeitung mit böswilligen Falscheingaben rechnen muss).

    Das Thema kam im Forum oft dran, siehe zum Beispiel:
    http://www.c-plusplus.net/forum/p1773551#1773551
    Und viele andere mehr: Google: site:www.c-plusplus.net ungarische notation

    Zurück zum Thema:
    Krachi, auch wenn der Stil in meiner ersten Antwort satirischer Natur war, so gilt doch trotzdem die Bemerkung im ersten Absatz: Ohne ein vollständiges Minimalbeispiel wird man dir nicht helfen können.



  • @SeppJ , wie kennzeichnest du deine Membervariablen?



  • Könnte man diese "Tipps" guten Gewissens übernehmen ?

    http://bel.gsi.de/mk/sty/cstyle.html#Vorschlag12



  • Hab das Problem nun nach ausführlichem Debuggen gefunden. 😃
    Der Fehler war an einer Stelle die ich überhaupt nicht vermutet hatte.

    Ich habe eine Funktion anlegen geschrieben, mit der ich den Klassenvariablen per Input Werte zuweise. Allerdings habe ich dabei vergessen, den entsprechenden Konstruktor der Oberklasse aufzurufen, sodass meine geerbten Werte nicht definiert wurden. In der Folge kam es zu einem Speicherzugriff, der die merkwürdigen Werte erzeugt hat.

    Mich wundert nur, dass Visual Studio mich nicht gewarnt hat. 🙄

    void PKW::vAnlegen()
    {
    	Fahrzeug::Fahrzeug(); // HIER DAS FIX! -> Problem gelöst
    	string sName;
    	double dMaxSpeed, dTankvolumen, dVerbrauch;
    	cout << endl << "********* Neuen PKW anlegen *********" << endl;
    	cout << "Name  : ";
    	cin >> sName;
    	cout << endl << "Max. Geschwindigkeit  : ";
    	cin >> dMaxSpeed;
    	cout << endl << "Tankvolumen (default: 55L) : ";
    	cin >> dTankvolumen;
    	cout << endl << "Verbrauch (default: 6L) : ";
    	cin >> dVerbrauch;
    	cout << endl << "******* PKW angelegt (ID : " << p_iID << ") *******" << endl;
    
    	p_sName = sName;
    	p_dMaxGeschwindigkeit = dMaxSpeed;
    	p_dTempGeschwindigkeit = dMaxSpeed;
    	p_dVolumen = dTankvolumen;
    	p_dTankinhalt = p_dVolumen / 2;
    	p_dVerbrauch = dVerbrauch;
    }
    


  • Fahrzeug::Fahrzeug(); // HIER DAS FIX! -> Problem gelöst
    

    NEIIIHHHHN
    Was machst du da? Impelemtiere den Konstruktor von PKW richtig



  • Krachi schrieb:

    Fahrzeug::Fahrzeug(); // HIER DAS FIX! -> Problem gelöst

    LOL, das löst dir garantiert kein Problem. Du erzeugst damit ein temporäres Objekt vom Typ Fahrzeug. Da bei dir einiges im Argen ist, wird das wohl den Seiteneffekt haben, dass damit dein eigentliches Problem überdeckt wird. Aber weder ist es verschwunden, noch ist es gelöst, im Gegenteil.


  • Mod

    beg_offl schrieb:

    Könnte man diese "Tipps" guten Gewissens übernehmen ?

    http://bel.gsi.de/mk/sty/cstyle.html#Vorschlag12

    Nein, alle Begründungen und Erklärungen dort sind sachlich falsch.



  • Das sind die Richtlinien für irgendein Projekt oder eine Abteilung, warum sollte man die übernehmen wollen? Das ist deren interne Angelegenheit, die wahrscheinlich nicht mal für die Öffentlichkeit bestimmt ist.



  • Kennzeichnet Ihr Membervariablen dann mit m_xyz oder gar nicht ?



  • beg_ schrieb:

    Kennzeichnet Ihr Membervariablen dann mit m_xyz oder gar nicht ?

    beg_ sieht man hier und da. m_beg auch.
    Aber was mir gerade wichtig ist: Ist doch scheißegal!

    Wenn Du eine Diskussion über Coding Conventions öffnen willst: Forum "Rund um die Programmierung".
    Ansonsten lies über verschiedene Coding Conventions.

    Aber den Thread zu kapern ist unhöflich.



  • Sorry, war nicht meine Absicht. Over and Out



  • Bashar schrieb:

    Krachi schrieb:

    Fahrzeug::Fahrzeug(); // HIER DAS FIX! -> Problem gelöst

    LOL, das löst dir garantiert kein Problem. Du erzeugst damit ein temporäres Objekt vom Typ Fahrzeug. Da bei dir einiges im Argen ist, wird das wohl den Seiteneffekt haben, dass damit dein eigentliches Problem überdeckt wird. Aber weder ist es verschwunden, noch ist es gelöst, im Gegenteil.

    Du hast Recht! Ich habe im Verlauf der Programmierung bemerkt, dass weitere Objekte erzeugt wurden, die ich nicht wollte.

    Das Problem hat sich aber behoben. Ich habe alle meine Funktionen abgeändert, auf einmal hat es funktioniert, nur finde ich den Fehler nicht mehr, da ich nicht genau weiß, wie ich ihn behoben habe... 🙄


Anmelden zum Antworten