"ungültige Gleitkommaoperation" (war: (wie verhext) Es will net richtig laufen )



  • n'Abend,

    bin n newbie in C++ und hab n kleines Problem, vielleicht könnt Ihr mir helfen.

    Die Werte für die Variablen "gewicht" und "bier" werden via Edit-Felder eingegeben, jedoch beim ButtonClick kommt ne Fehlermeldung "ungültige Gleitkommaoperation". Aber was noch komischer is, wenn ich die Zeile
    "c=alkbier/(r*gewicht)" mit // rausmache, bekomme ich einen Wert für c und ich bekomme 0 für alkbier ( werden dann in die entsprechnden Edit-Felder ausgegeben ).

    Hier mal der Quellltext ( habe C++Builder 3 und WinXP, falls das wichtig wäre )

    //---------------------------------------------------------------------------
    
    float r;
    
    void __fastcall TForm1::RadioGroup1Click(TObject *Sender)
    {
    switch (RadioGroup1->ItemIndex)
    {
    case 0: r = 0,7;
    break;
    case 1: r = 0.6;
    }
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    float gewicht, bier, alkbier, c, cneu;
    
    gewicht = StrToFloat (Edit1->Text);
    
    bier = StrToFloat ( Edit2->Text);
    
    alkbier = bier * 0,05 * 0,8;
    
    c = alkbier/(r*gewicht);
    
    Edit3->Text = c;
    
    Edit4->Text = alkbier;
    
    }
    //---------------------------------------------------------------------------
    

    Thx schon mal in voraus.

    <edit>1. Bitte Code-Tags verwenden!
    2. Bitte aussagekräftige Überschriften erstellen!
    </edit>

    [ Dieser Beitrag wurde am 09.06.2003 um 01:22 Uhr von junix editiert. ]



  • float r=1;
    du musst r einen Wert zuweisen da du sonst durch Null teilst.



  • Thx, das hat zwar die Fehlermeldung beseitigt, aber warum kommen als Ergebnisse für "c" und "alkbier" immer 0 ?

    Und beim "Wegkommentieren" der Zeile " c=alkbier/(r*gewicht)" ist es immernoch das Gleiche. Warum?



  • Folgende Punkte:

    • Kommentare im Quelltext sind immer sinnvoll.
    • Grundsätzlich solltest du dir angewöhnen, deinen Quelltext zu formatieren. Es gibt da gewisse Style-Regeln die man einhalten sollte.
      - Man rückt nach Beginn eines Blockes ('{') immer 4 Leerzeichen (oder 1 Tab) ein.
      - Man achtet etwas auf die Lesbarkeit der sourcen. Z.b: ist eine Anweisung auf der selben Zeile wie das case-statement höchst unlesbar
      - Man schreibt grundsätzlich blöcke die logisch zusammenhängen ohne eine Leerzeile dazwischen, das macht das Ganze höchst unlesbar...
    • Man kann nicht einfach einem AnsiString alles zuweisen (siehe unten für weitere Erklärungen

    So, zum letzten Punkt oben:
    Wenn du ein nicht-AnsiString-Objekt einem AnsiString zweisen willst, dann wird ein temporäres AnsiString-Objekt erstellt, in dessen Konstruktor - nach Möglichkeit - der Wert übergeben wird. Betrachtet man den Konstruktor des AnsiString in der Hilfe so stellt man fest, dass es keinen Konstruktor für float-Variablen gibt, nur für double. Das Eine wäre nun also, die float-Variable durch einen double zu ersetzen, das Andere wäre es, eine Konvertierungsroutine die Float Zu String konvertiert zu benutzen.

    -junix



  • mit

    case 0: r = 0,7;

    wird das nix!!!!!!!!!!!!!!!!!!!

    (Da wird immer 0 zufewiesen! Eigentlich sollte ein Fehler kommen?



  • Schon mal was von ENGLISCHER Zeichensetzung gehört???
    😉 😉 😉

    [ Dieser Beitrag wurde am 09.06.2003 um 20:30 Uhr von aaaabyx editiert. ]



  • probiers doch mal mit

    case 0: r = 0.7; // <--- so mut dat
    

    und nicht mit

    case 0: r = 0,7; // und nicht so [zwischen komma und Punkt ist ein kleiner aber feiner Unterschied]
    

    😉



  • Hab ich doch alles schon gesagt, MENSCH!


Anmelden zum Antworten