Darstellung von Variablen

Hallo!

Ich habe ein Programm geschrieben zur Berechnung von Kleinsuden (Bier brauen). Ich habe MS Visual C++ benutzt. In dem Programm werden die benötigten Angaben über einen Dialog eingegeben und dann in einem Document (View) die errechneten Ergebnisse ausgegeben, zum drucken zum Beispiel. Mein Problem ist jetzt, dass schon nach dem Start des Programms, ohne dass eine Berechnung erfolgt ist, bei einigen Variablen, die ich eigentlich im Konstruktor mit 0 bzw. 0.0f bei float Variablen, die merkwürdige Ausgabe -1.$ oder ähnliche Sachen anstatt 0.0 erscheint. Wie kann ich das vermeiden, hängt das mit der formatierung zusammen. Kann mir da bitte jemand helfen?

Rene

hallo,
das ganze waere leichter zu beantworten wenn man den quelltext sehen koennte. kann es irgendwie sein dass speicher falsch allokiert wird?

unter welchem system denn? c/c++ kann ziemlich sensibel sein bei der speicherallokation. wenn da etwas schief geht, zerhackt es einem schon ganz gerne mal den speicher. aber wie gesagt: man muesste sich das ganze mal anschauen koennen.

cu joshua

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo Rene!

ich gehe davon aus, dass Du den DDX/DDV-Mechanismus für Datenaustausch zwischen Variablen und Controls verwendest. Jetzt hat man aber leider keine Möglichkeit, in der float-Variante von DDX-Text( …), welche der Class-Wizard automatisch anlegt, die Anzahl der anzuzeigenden Nachkommastellen festzulegen.
Wenn Du nun im Konstruktor Deiner Variable 0.0f zuweist, kann sich gut und gerne auch -1E-15 beinhalten, was ja auch korrekt ist, da -1E-15 innerhalb der von Dir angegebenen Genaugkeit (1 Stelle nach dem Komma) mit 0.0f übereinstimmt. Und dieser Wert führt zu der komischen Anzeige.
Du hast nun 2 Möglichkeiten:

  1. Du arbeitest mit CString-Variablen, welche Du bei der Anzeige mit dem float-Wert auf die gewünschte Genauigkeit füllst (entsprechendes gilt beim Lesen des Wertes).

  2. Du rufst in der Funktion DoDataExchange( ) Deines Dialoges eine modifizierte Variante von DDX-Text( ) auf, welche Dir die Angabe der gewünschten Nachkommastellen erlaubt. Ein Beispiel dafür könnte so lauten:

    /****************************************************************************
    Erledigt den Datenaustausch für float-Variablen, wobei die Genauigkeit
    angegeben werden kann.
    Übergabe
    pDX Zeiger auf Datenkontext.
    nEditID Control-ID.
    fVal Referenz auf zugehörige Variable.
    nDigits Anzahl der gewünschten Nachkommastellen.
    *****************************************************************************/

    void HF::smiley:DXn_Text(CDataExchange* pDX, int nEditID, float& rfVal, int nDigits )
    {
    CWnd* pCtrlWnd; // Zeiger auf zu behandelndes Control
    CString strVal; // Hilfsstring
    float fTmp; // Hilfsvariable

    // Zeiger auf Control holen
    pCtrlWnd=pDX->m_pDlgWnd->FromHandle( pDX-&gt:stuck_out_tongue_winking_eye:repareEditCtrl( nEditID ));

    if ( pDX->m_bSaveAndValidate ){ // Wert holen und prüfen
    pCtrlWnd->GetWindowText( strVal );
    if( sscanf( strVal, „%f“, &rfTmp )!=1 )
    pDX->Fail( ); // Exception abwerfen
    rfVal=fTmp; // Wert übernehmen
    }
    else { // Wert schreiben
    strVal.Format( „%.*f“, nDigits, rfVal );
    pCtrlWnd->SetWindowText( LPCTSTR( strVal ));
    }
    }

Jetzt musst Du Dich nur noch für die gewünschte Zahl der Nachkommastellen entscheiden (etwa 3?).

Grüße Safog

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]