AnsiStrings & Doubles & Rechnungen damit



  • Hallo Leute,

    folgende Situationen:
    Server stellt ein grafisches Programm mit zufällig Platzierten Hindernissen auf, man selbst soll den Clienten schreiben, der sich connectet & eine Kugel automatisch durch diese zufällig Platzierten Hindernisse schleust.

    Ich will erstmal zum bestimmen, ob die Kugeln überhaupt eine Gefahr sind ein Steigungsdreieck zu jeder Kugel machen und so den Absoluten Abstand zu ihr berechnen.

    (Das Feld ist 600 * 400 Pixel lang)
    folgendes Problem:

    Ich bekomme immer die Meldung:
    "im programm bla.exe ist eine Exception der Klasse EConvertError aufgetreten. Meldung: "" ist kein gültiger Gleitkommawert.

    Ich hatte auch schon "0.00" dort drin stehen.
    PS: Das wäre die Position die Kugel, mit der ich unter anderem Rechne.

    Hier mal kurz der Code den ich dafür brauche, (er steht im Script nicht so wie hier untereinander)

    AnsiString Vx; // Vx = ort auf x koordinate zb. 412
       double *g1=new double[anz.ToDouble()];
       double *g2=new double[anz.ToDouble()];
       double *g3=new double[anz.ToDouble()];
       AnsiString *hindx=new AnsiString [anz.ToInt()];
       AnsiString *hindy=new AnsiString [anz.ToInt()];
       AnsiString *hindgroesse=new AnsiString [anz.ToInt()];
    // g1,g2,g3 für das Steigungsdreieck (gibt es evt. ne Vektorenlösung?)
    // die oberen ansistrings geben Ort der x/y koordinate & radius der hindernisse an
    
    // spätere berechnung des steigungsdreiecks:
             g1[i] = hindx[i].ToDouble() - Vx.ToDouble();
             g2[i] = hindy[i].ToDouble() - Vy.ToDouble();
             g3[i] = (g1[i]*g1[i]) + (g2[i]*g2[i]);
             g3[i] = sqrt(g3[i]);
    
    //ausgabe in einem editfeld:
            editfeld1->Text=g1[1]; // hier kommt dann nach Server start die obrige Meldung...
    

    Wäre super wenn jemand auf den ersten Blick sieht was falsch ist, oder ob es evt. viel zu viel Aufwand ist.



  • Hallo

    Das gehört ins Builder-Subforum. Es wird dich gleich ein Mod dahin verschieben.

    Die Fehlermeldung ist doch sehr aussagekräftig.
    Bei der AnsiString-Methode .ToDouble() soll ein String in ein Float konvertiert werden, der nicht zulässig ist, in deinem Fall ein leerer String.
    Du kannst entweder manuell vorher die Strings vergleichen (wenn es nur um leer und gültig geht) oder um die Konvertierungen einen try/catch-Block machen, um alle nicht konvertierbaren Strings abzufangen und dann gesondert Standardwerte zuzuweisen.

    /Edit : Wenn du den BCB6 oder höher hast, gibts dort auch die Funktion StrToFloatDef() die das ganze eventuell noch vereinfacht.

    bis bald
    akari



  • Also ich benutze den BCB5 und auch als ich den Wert 0.00 übermitteln wollte, hat es diese Fehlermeldung gegeben, bzw. ich weiß nicht wie ich sonst diese Rechnungen ausführen soll.



  • Hallo

    .ToDouble() geht von der lokalen (hier deutschen) Schreibweise aus. Also ist 0.00 fehlerhaft, sondern 0,00 ist korrekt.
    Du kannst entweder mit StringReplace das falsche durch das richtige Trennzeichen ersetzen, oder (was besser ist) beim Generieren des Strings aus der Original-Double selber ein festes länderunabhängiges Format mit FloatToStrF bzw der Systemvariable DecimalSeparator sorgen, das du dann an der Zielkonvertierung wieder genauso fest wieder einliest.

    bis bald
    akari



  • Kannst du mir mal kurz erzklären wie man den DecimalSeparator setzt?

    Einfach oben in den Konstruktor:
    DecimalSeparator=',';
    schreiben?



  • Hallo

    ja kannst du. Einfach mal ausprobieren.

    bis bald
    akari



  • Dieser Thread wurde von Moderator/in evilissimo aus dem Forum C++ in das Forum VCL/CLX (Borland C++ Builder) verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Also jetzt habe ich meinen Quellcode mal richtig in Ordnung gebracht, so dass alles - hoffentlich bzw. scheinbar - an der richtigen Stelle initalisiert wird.

    Ich bekomme jetzt auch wieder die Meldung, dass ich zumindest die Zahl "0.00" im Speicher habe.

    Ich habe aber immer noch das Problem mit dem Error, dass diese Zahl scheinbar keine Gleitkommazahl ist !

    Double Werte benutzen also bei uns diese Schreibweise: 0,xx?
    Wenn ja, scheint die obengenannte Funktion nicht zu funktionieren oder scheint falsch platziert zu sein.

    Hat da jemand eine Idee?


  • Mod

    Hallo

    DecimalSeparator=',';
    
    0.00
    

    ich hoffe du siehst was da falsch ist

    Mfg
    Klaus



  • Hallo,

    Das hier ist auch ziemlich merkwürdig

    double *g1=new double[anz.ToDouble()];
    double *g2=new double[anz.ToDouble()];
    double *g3=new double[anz.ToDouble()];
    AnsiString *hindx=new AnsiString [anz.ToInt()];
    AnsiString *hindy=new AnsiString [anz.ToInt()];
    AnsiString *hindgroesse=new AnsiString [anz.ToInt()];
    

    Du kannst doch eine Feldgröße nicht mit double angeben. Es würde hier wahrscheinlich implizit gekastet, ist aber trotzdem nicht schön. Außerdem reicht es doch, wenn du die Zahl nur einmal umwandelst.

    try
    {
      int size = anz.ToInt();
    }
    catch(EConvertError &e)
    {
    // irgendeine Fehlerbehandlung
    }
    double *g1=new double[size];
    double *g2=new double[size];
    double *g3=new double[size];
    AnsiString *hindx=new AnsiString [size];
    AnsiString *hindy=new AnsiString [size];
    AnsiString *hindgroesse=new AnsiString [size];
    

Anmelden zum Antworten