Berechnung gibt falschen Wert aus



  • hallo!
    Kann mir bitte jemand bei dem nachfolgenden Code weiterhelfen?
    Ich stehe an, wahrscheinlich ist es wieder nur eine Kleinigkeit.
    Beim Code unter OnBerechnen4 wird ein falscher Wert (viel zu hoch) ausgegeben:

    void CWasserGDlg::OnKillfocusAlt() 
    {	
    	GetDlgItemText (IDC_ALT, m_strAlt);	//Eingabestring bei Windows abholen
    	m_dAlt=atof (m_strAlt);				//numerischen Wert ermitteln
    
    	m_dAlt= ( (long int) (10.0 * m_dAlt) ) /10.0;//auf 1 Stelle nach dem Komma abschneiden
    	m_strAlt.Format ("%2.1f", m_dAlt);	//abgeschnittenen Wert editieren und in die
    	SetDlgItemText (IDC_ALT, m_strAlt);	//Editbox stellen
    }
    
    void CWasserGDlg::OnKillfocusNeu() 
    {		
    	GetDlgItemText (IDC_NEU, m_strNeu);
    	m_dNeu=atof (m_strNeu);
    
    	m_dNeu= ( (long int) (10.0 * m_dNeu) ) /10.0;
    	m_strNeu.Format ("%2.1f", m_dNeu);
    	SetDlgItemText (IDC_NEU, m_strNeu);
    }
    
    void CWasserGDlg::OnKillfocusAltp() 
    {
    	GetDlgItemText (IDC_ALTP, m_strAltp);
    	m_dAltp=atof (m_strAltp);
    
    	m_dAltp= ( (long int) (10.0 * m_dAltp) ) /10.0;
    	m_strAltp.Format ("%2.1f", m_dAltp);
    	SetDlgItemText (IDC_ALTP, m_strAltp);
    }
    
    void CWasserGDlg::OnKillfocusNeup() 
    {
    	GetDlgItemText (IDC_NEUP, m_strNeup);
    	m_dNeup=atof (m_strNeup);
    
    	m_dNeup= ( (long int) (10.0 * m_dNeup) ) /10.0;
    	m_strNeup.Format ("%2.1f", m_dNeup);
    	SetDlgItemText (IDC_NEUP, m_strNeup);
    }
    
    void CWasserGDlg::OnKillfocusDiffh() 
    {
    	GetDlgItemText (IDC_DIFFH, m_strDiffh);
    	m_dDiffh=atof (m_strDiffh);
    
    	m_dDiffh= ( (long int) (10.0 * m_dDiffh) ) /10.0;
    	m_strDiffh.Format ("%2.1f", m_dDiffh);
    	SetDlgItemText (IDC_DIFFH, m_strDiffh);
    }
    void CWasserGDlg::OnBerechnen1() 
    {		
    	UpdateData(FALSE);
    	double diff = m_dNeu - m_dAlt;			// Differenz berechnen
    	CString help;
    
    	help.Format ("%4.2f", diff);
    	SetDlgItemText (IDC_DIFF, help);		//Ausgabe des Wertes
    	UpdateData(TRUE);
    }
    
    void CWasserGDlg::OnBerechnen2() 
    {
    	UpdateData(FALSE);
    	double diffp = m_dNeup - m_dAltp; // Differenz berechnen
    	CString help;
    
    	help.Format ("%4.2f", diffp);
    	SetDlgItemText (IDC_DIFFP, help);
    	UpdateData(TRUE);
    }
    void CWasserGDlg::OnBerechnen3() 
    {
    	// TODO: Code für die Behandlungsroutine der Steuerelement-Benachrichtigung hier einfügen
    
    }
    void CWasserGDlg::OnBerechnen4() 
    {
    	double diffh = m_dDiff - m_dDiffp; // Differenz berechnen
    	CString help;
    
    	help.Format ("%4.2f", diffh);
    	SetDlgItemText (IDC_DIFFH, help);
    }
    

    bitte um Hilfe
    mfg oldi



  • UpdateData?



  • Erstmal: Ist es Absicht, daß du dort kein UpdateDate(FALSE); eingebaut hast? Als nächstes solltest du eventuell mal die verwendeten Eingabedaten (m_dDiff und m_dDiffp) überprüfen, ob sie die erwarteten Werte haben.



  • hallo!
    egal ob und wo ich UpdateData verwende, es ändert sich nichts! könnt ihr mir trotzdem noch weiterhelfen?,
    danke
    oldi



  • Einfache Möglichkeit der Fehlersuche:

    void CWasserGDlg::OnBerechnen4() 
    {
        // Testausgabe:
        TRACE("m_dDiff = %4.2f, m_dDiffp = %4.2f\n",m_dDiff,m_dDiffp);
    
        double diffh = m_dDiff - m_dDiffp; // Differenz berechnen
        CString help;
    
        help.Format ("%4.2f", diffh);
        SetDlgItemText (IDC_DIFFH, help);
    }
    

    Und dann vergleich mal die Ausgabe im Trace-Fenster des Debuggers mit den Werten, die du erwartet hast.

    (alternativ kannst du auch auf die Zeile "double diffh=..." eine Breakpoint setzen und dort deine Werte kontrollieren)



  • mach mal ert UpdateData(TRUE);

    dann berechnen und dann
    UpdateData(FALSE);



  • du hast das nämlich vertauscht



  • danke für Eure rasche Antwort:
    auch mit dem Wechseln von UpdateData(TRUE FALSE) löst sich das Problem nicht,
    habe alle möglichen Variationen der Einträge schon probiert, nur leider ohne Erfolg!
    bei TRACE bekomme ich keine Testausgabe.
    bei der Ausführung von OnBerechnen4 bekomme ich immer den Wert 6112686355.
    vielleicht fällt Euch dazu noch etwas ein!
    ich bin schon leicht am verzweifeln, mfg



  • Bist du sicher, daß du den entsprechenden Button mit der richtigen Funktion verknüpft hat? (nicht daß er etwas völlig anderes ausführt, wenn du dort draufklickst)

    Aber wenn immer der selbe Wert ausgespuckt wird, sieht es sehr nach einem falsch (oder gar nicht) initialisierten Eingabewert aus.

    *sieht sich nochmal den kompletten Quelltext an*
    Du hast dort OnKillFocus..() Methoden für m_dNeu, m_dAlt (Eingabewerte für Berechnen1), m_dNeup, m_dAltp (Eingabewerte für Berechnen2) und m_dDiffh (Ausgabewert von Berechnen4). Vielleicht wäre es besser, statt des letzteren die entsprechenden Eingabefelder (m_dDiff und m_dDiffp) zu überwachen.



  • oldi schrieb:

    bei TRACE bekomme ich keine Testausgabe.

    Dumme Frage: Wo suchst du die Ausgabe? 😉



  • es bezog sich auf cStoll:
    // Testausgabe:
    TRACE("m_dDiff = %4.2f, m_dDiffp = %4.2f\n",m_dDiff,m_dDiffp);

    und das verstand ich leider nicht!
    vielleicht könnstes Du mir weiterhelfen?
    mfg



  • Dass du das TRACE meinst, war mir klar. 😉
    Ich wollte nun wissen, wo du nach dem ausgegebenen Text suchst.
    Der erscheint in der Debug-Ausgabe und zwar nur, wenn du mit F5 startest.

    Wenn du das genauer haben möchtest, schau doch mal da. 🙂



  • Dieses TRACE() gibt einen Text auf ein spezielles Ausgabefenster des Debuggers aus (die Formatierungsmöglichkeiten sind die selben wie bei printf()). Was du dort ausgegeben haben willst, landet im Visual Studio im selben Fenster, wo auch Compilerfehler gemeldet werden.



  • danke für Eure Mühe



  • Klappt es denn jetzt? 😕


Anmelden zum Antworten