StrToFloat ohne try...catch... - wie?



  • Schreib dir doch 'ne Funktion:

    bool CanStrToFloat(String Value)
    {
      try
      {
        float test=StrToFloat(Value); // Testen, ob's geht
        return true; // Bei Erfolg wird true zurückgegeben
      }
      catch(...)
      {
        return false; // Ansonsten eben false ;)
      }
    }
    

    EDIT:

    Ist wunderbar,um den Quelltext zu kürzen:

    String sTmp="0,4321";
    float fTmp=0;
    if(CanStrToFloat(sTmp))
      fTmp=StrToFloat(sTmp);
    else
      Application->MessageBox("Konnte Wert nicht umwandeln.","Fehler",16);
    


  • das ist mir alles klar, was ihr schreibt. für die Antworten danke ich erstmal.
    jedes Mal, wenn im Builder eine Exception abgefangen wird, wird die Programmausführung aus dem Entwicklungsumgebung heraus angehalten und eine entsprechende Meldung ausgegeben. Das nervt mich.



  • Das kann man ausschalten... außerdem kann man auch nur "Projekt erstellen" und dann die Exe ausführen...



  • @Ingo: debugger...
    nimm dazu STRG+F9 😉
    ist projekt aktualisiern oder erzeugen oder sowas halt.



  • Ingo schrieb:

    das ist mir alles klar, was ihr schreibt. für die Antworten danke ich erstmal.
    jedes Mal, wenn im Builder eine Exception abgefangen wird, wird die Programmausführung aus dem Entwicklungsumgebung heraus angehalten und eine entsprechende Meldung ausgegeben. Das nervt mich.

    dann programmiere gleich anständige ich fange solche sachen so ab, daß die exceptions erst gar nicht auftreten!



  • 🤡



  • ..ausser du willst GANZ ausführlich gehn:

    bool isValidFloat(String strNumber)
    {
      for (int i = 1; i <= strNumber.Length(); i++)
      {
        if (  ((strNumber[i] == '.' || strNumber[i] == ',') && (strNumber[i] != DecimalSeparator))
           || ((strNumber[i] < '0' || strNumber[i] > '9') && (strNumber[i] != DecimalSeparator) && (strNumber[i] != '-'))
           || ((strNumber[i] == '-') && (i > 1))  )
          return false;
      }
      return true;
    }
    

    ...ich würds net tun 🙂
    und natürlich müsste dann noch ne Prüfung rein, ob die Zahl in Float reinpasst, nicht dass der String 1000 Zeichen lang ist 🙂

    Grüße,
    Robert



  • Ja und du müsstest auch noch prüfen, ob nicht vielleicht die wissenschaftliche Schreibweise verwendet wird. Sowas auf Gültigkeit zu prüfen ist imho sehr aufwändig. Würg. Es wird, das war ja schon meine Vermutung, bei der try/catch-Geschichte bleiben müssen.



  • Ganz genau, denn für soetwas wurde try...catch... ja gemacht.



  • Hallo,

    Jede Exception verbraucht Speicher...
    Besser man nimmt das hier : "TryStrToFloat" zu finden in "SysUtils".

    Bis dann denn,
    🙂
    Nash



  • Habe Sysutils.hpp eingebunden, nehme an, dass das die entsprechende Bib ist. Aber leider behauptet der Compiler beharrlich, TryStrToFloat nicht zu kennen. Wäre ne undefinierte Funktion 😞



  • Jede Exception verbraucht Speicher...

    Ja und da die heutigen Recvner dafür nicht ausgelegt wurden, sollten man darauf also komplett verzichten. der speicherverbrauch ist hierbei so hoch, dass man wirklich eine andere lösung suchen sollte! 😃



  • Ingo schrieb:

    Habe Sysutils.hpp eingebunden, nehme an, dass das die entsprechende Bib ist. Aber leider behauptet der Compiler beharrlich, TryStrToFloat nicht zu kennen. Wäre ne undefinierte Funktion 😞

    Bei mir (BCB 5) ist die Funktion TryStrToFloat auch nicht vorhanden. Die beste Lösung ist also immer noch Exceptions fangen. Wegen dem Speicher würde ich mir auch keinen Kopf machen.

    bis bald
    akari



  • Hallo,

    Eigentlich sollte es egal sein, wieviel Speicher ein Rechner hat. Es geht darum, nicht unnötig Speicher zu verbrauchen. Es ist auch nicht so schlimm, wenn das nur ein paar mal passiert, aber wenn man das in einer Schleife mit mehreren tausend Durchläufen macht, kommen auch 512 MB bald an ihre Grenze. Durch solche Aktionen wird der Speicher fragmentiert und unter Umständen kann dann für andere Programme nicht mehr ein genügend großer Speicherbereich aloziert werden.
    Außerdem gibt es doch schon genug speicherfressende Programme, warum noch ein neues hinzufügen... 🙄

    @ Ingo :
    Also im 6er C++Builder gibt es "TryStrToFloat()"...

    Bis dannd enn,
    🙂
    Nash



  • Nash schrieb:

    Hallo,

    Eigentlich sollte es egal sein, wieviel Speicher ein Rechner hat. Es geht darum, nicht unnötig Speicher zu verbrauchen. Es ist auch nicht so schlimm, wenn das nur ein paar mal passiert, aber wenn man das in einer Schleife mit mehreren tausend Durchläufen macht, kommen auch 512 MB bald an ihre Grenze. Durch solche Aktionen wird der Speicher fragmentiert und unter Umständen kann dann für andere Programme nicht mehr ein genügend großer Speicherbereich aloziert werden.
    Außerdem gibt es doch schon genug speicherfressende Programme, warum noch ein neues hinzufügen... 🙄

    @ Ingo :
    Also im 6er C++Builder gibt es "TryStrToFloat()"...

    Bis dannd enn,
    🙂
    Nash

    Wieviel Speicher braucht denn eine Exception? Und ich schreibe bewußt eine Exception. Denn selbst wenn ich eine Schleife mit tausend Durchläufen habe, werfe ich doch nur eine Exception, um diese Schleife in Fehlerfall (also eigentlich Ausnahmefall) zu beenden.
    Klar, wenn TryStrToFloat bei mir vorhanden wär, würde ich auch das nehmen. Doch ich arbeite doch lieber mit Exceptions als selber eine Konvertierroutine zu schreiben.

    bis bald
    akari



  • Hallo Nash,

    gebe dir vollkommen Recht! TryStrToFloat kannte ich bisher auch nicht, gefällt mir aber.
    Es geht auch nicht unbedingt um den Speicher, sondern darum wie sauber programmiert ist! Und die Lösung mit try catch ist irgendwie nicht so ganz sauber und macht den Quellcode meiner Einsicht nach unnötig unübersichtlich.

    Grüße,
    Robert



  • Die Funktionen gibt es erst ab dem 6er...

    Jetzt würde mich nur interessieren, wieso ein try... catch so viel Speicher verbrauchen soll?? Ich setze das sehr intensiv ein, um bestimmte Konditionen abzufangen, aber mir ist bisher nicht aufgefallen, dass das einen enormen Speicherverbrauch verursachen soll. Ehrlich gesagt kann ich das auch nicht nachvollziehen.



  • rowisoft schrieb:

    Hallo Nash,

    gebe dir vollkommen Recht! TryStrToFloat kannte ich bisher auch nicht, gefällt mir aber.
    Es geht auch nicht unbedingt um den Speicher, sondern darum wie sauber programmiert ist! Und die Lösung mit try catch ist irgendwie nicht so ganz sauber und macht den Quellcode meiner Einsicht nach unnötig unübersichtlich.

    Grüße,
    Robert

    das glaubst du doch jetzt nicht im ernst? man sollte auch drauf hinweisen, dass es mehr möglichkeiten als nur try catch gibt. aber das deswegen eine software unnötig speicher verbraucht habe ich noch nie gesehen und der code wird dadruch nicht unübersichtlicher sondern zeigt mir, dass auf das abfangen der fehler geachtet wurde...fertig....



  • Hallo!

    aber das deswegen eine software unnötig speicher verbraucht habe ich noch nie gesehen

    Hab ich nicht auch geschrieben, dass es NICHT um den Speicher geht?

    und der code wird dadruch nicht unübersichtlicher sondern zeigt mir, dass auf das abfangen der fehler geachtet wurde...fertig....

    Das meinst du aber jetzt wohl nicht ernst?
    Es muss nicht bedeuten, dass das ein Fehler ist, wenn man prüfen möchte, ob StrToFloat hinhauen wird.

    Aufgabe: Du hast ne Textdatei mit irgendwelchen Werten in jeder Zeile. Jetzt sollst du rausfinden, ob da wirklich nur Floats in jeder Zeile sind, oder ob da auch ein Text dabei ist - und dann möchte ich wissen, wie oft Text drin ist.
    Mit try catch müsstest du alle x-tausend Zeilen überprüfen - im dümmsten Fall hast du x-tausend Exceptions gehabt, die du alle unterdrückt hast.
    Ausserdem sagt dir die try catch Methode noch lange nicht sicher, dass es sich nicht um einen Float-Wert handelt. Was ist wenn ein anderer Fehler auftaucht - keine Ahnung, Speicher voll.... - dann bringst du die Meldung, dass kein gültiger Float, obwohls gar net stimmt, weil ein anderer Fehler ist.

    Ich will nicht sagen, dass die try catch Methode ein Verbrechen ist. Warum aber sollte ich auf TryStrToFloat verzichten, wenn ich diese schöne Methode doch habe??!? Damit der Code unübersichtlicher wird? (und das wird er mit Sicherheit, wenn ich statt 1 Zeile min. 3 hab)

    Ich denke, da wirst du mit deiner Meinung ziemlich einsam dastehen, wenn deine Meinung ist, dass "TryStrToFloat" nicht sauberer ist als "try catch"

    Ausserdem war die Frage dieses Themas: StrToFloat ohne try...catch... - wie?
    Und wenn du wieder schreibst mit "try...catch..." ist die Aufgabenstellung nicht erfüllt, 0 Punkte, Note 6 oder gekündigt 🙂

    Grüße,
    Robert


  • Mod

    Hallo

    vermutlich ist beides GENAU gleich
    (try...catch wird in Try... verwendet)

    Der Nachteil der zweiten Variante ist - Fehler muessen weiterhion abgefangen werden (Speicher voll, .....)

    MfG
    Klaus


Anmelden zum Antworten