[gelöst] float in Edit->Text schreiben => Fehler im Compiler des BDS2009 ?



  • Hallo Gemeinschaft,

    mir ist gerade ein kleines Phänomen begegnet:

    void __fastcall TForm::EditKeyPress(TObject *Sender, char &Key)
    {
    	if(Key == VK_RETURN){
    		float TmpFloat,* pOldFloat= &floatArray[0];
    		try{
    			TmpFloat= (float)Edit->Text.ToDouble();
    		}
    		catch(const EConvertError &err){
    			Application->MessageBox(...);
    			Edit->Text= (*pOldFloat == 00000.0000000f) ? Edit->Hint : *pOldFloat;
                // Zeile 10 erzeugt richtigerweise: [C++ Fehler] *.cpp(157): E2034 Konvertierung von 'AnsiString' nach 'float' nicht möglich
    			if(*pOldFloat == 00000.0000000f){
    				Edit->Text= Edit->Hint;
    			}
    			else{
    				Edit->Text= *pOldFloat;
    			}
                // Zeile 12 bis 17 erzeugen keine Fehlermeldung ???
    		}
    		//...
    	}
    }
    //---------------------------------------------------------------------------
    

    Inhaltlich ist passiert ja dasselbe, also was ist da los - warum wird einmal eine Fehlermeldung erzeugt und einmal nicht???

    MfG

    Edit: [gelöst] in Thread-Titel eingefügt 😉



  • Hallo

    Liegt an dem Operator "?". Die beiden L-Values, die du für diese Anweisung angibst, müßen von selben Typ sein, implizite Konvertierung reicht nicht. Das ist auch kein Fehler des Builders, sondern im C++ Standard so festgeschrieben.
    Funktionieren sollte also das hier :

    Edit->Text= (*pOldFloat == 00000.0000000f) ? Edit->Hint : AnsiString(*pOldFloat);
    

    bis bald
    akari



  • Hallo akari,

    Danke erstmal für die Antwort. Die Erklärung warum Zeile 12 nicht akzeptiert wird ist soweit klar. Die Frage ist (und war) für mich vielmehr, warum Zeile 16 keine Fehlermeldung erzeugt!?
    Wird in Zeile 16 davon ausgegangen, dass ich den float-Wert als AnsiString haben möchte und daher automatisch umgewandelt (so verstehe ich "implizit konvertiert")?
    Dann frage ich mich ganz besorgt, warum ich float-Werte bisher immmer mit FloatToStrF(...) ausgegeben habe!?! 😞



  • Hallo

    Der Hintergrund ist das AnsiString entweder einen Konstruktor besitzt, der als Parameter float akzeptiert, oder einen Zuweisungsoperator für float. Dadurch kann float impliziet in AnsiString umgewandelt werden. Da du aber das Ergebnis der Konvertierung nicht beeinflußen kannst, bekommst du immer ein festes, systemnahes Format. Wenn du ein anderes Format haben willst (gerundet, anderes Dezimalzeichen), dann kommst du um FloatToStrF und Co. nicht umhin.

    bis bald
    akari



  • Verstehe, das wusste ich (wie gesagt) noch nicht, Danke für die Aufklärung akari. 🙂

    MfG



  • Wofür brauchst du die lokale Variable pOldFloat? Macht die Sache unnötig kompliziert, kannst du nicht direkt floatArray[0] benutzen?



  • Weil der Zeigerzugriff schneller ist als der direkte Arrayzugriff 😉



  • Guter Witz (vor allem, da array[0] = *(array+0) = *array ist)



  • Kolumbus schrieb:

    Weil der Zeigerzugriff schneller ist als der direkte Arrayzugriff 😉

    Da zitiere ich immer wieder gerne Donald E. Knuth:

    Donald E. Knuth schrieb:

    Premature optimization is the root of all evil

    In erster Linie sollte ein Programm für Menschen lesbar und verständlich sein, Optimierungen sollten nur dann vorgenommen werden, wenn wirklich ein Engpass besteht und dann sollte auch nur an diesem Engpass gefeilt werden.
    Im übrigen glaube ich nicht, dass die Verwendung des Zeigers auch nur eine Nanosekunde schneller ist als der Zugriff auf das erste Arrayelement.



  • Das gepostete Beispiel ist stark vereinfacht...

    1. wird nicht nur auf das erste Arrayelement zugegriffen, sondern vielfach in einer Schleife auch auf folgende Elemente und 2. ist das Array nicht immer dasselbe, sondern variiert - der Zeiger macht es in meinem Fall sogar übersichtlicher.

    MfG


Anmelden zum Antworten