String in Float umwandeln



  • Hallo

    Das hättest du auch schnell durch Nachschlagen in der Builder-Hilfe rausfinden können...

    DecimalSeparator = '.';
    

    bis bald
    akari



  • da hast recht, sorry...

    Aber jetzt hab ich auch schon das nächste Problem 😉

    ich hab die Größe des Puffers (buf) auf 512 erhöht:

    char buf[512]="time=12.0111996706285 \nairspeed=22.0635795593262 \naltitude=2043.95642089844 
    \nvario=-0.000195638305740431 \ncompass=270 \nslipball=0 
    \nturnrate=0 \nyawstringangle=-0.0215568039566278 \nradiofrequency=123.5 
    \nyaw=4.71238899230957 \npitch=0 \nbank=0 
    \nquaternionx=0 \nquaterniony=0 \nquaternionz=9.73535918546986E-8
     \nquaternionw=1 \nax=0.249863708019257 \nay=0.849863708019257 
    \naz=0 \nvx=25 \nvy=-4.07301695304341E-6 
    \nvz=0 \nrollrate=-0.00339330825954676 \npitchrate=0
     \nyawrate=0";
    

    Und jetzt bekomme ich die Fehlermeldung: "Der Index der Liste überschreitet das Maximum (49)" 😞



  • Das hat mit deinem Puffer aber nichts zu tun. Hier läuft irgendein List-Objekt (TList, TStringList etc.) über. Geh mal mit dem Debugger durch. Kontrollier doch einfach mal ob in Daten auch genug Strings sind (Count).



  • Braunstein schrieb:

    Das hat mit deinem Puffer aber nichts zu tun. Hier läuft irgendein List-Objekt (TList, TStringList etc.) über. Geh mal mit dem Debugger durch. Kontrollier doch einfach mal ob in Daten auch genug Strings sind (Count).

    Das es an der TStringList ligt ist klar, aber wie kann ich das Problem beheben?

    Die Codestelle:

    string Eingang;
    Eingang=buf;
    
    TSysCharSet bchars;
    bchars << '=';
    Eingang = WrapText(Eingang.c_str(), "\n", bchars, 0).c_str(); //Fügt nach jedem = einen Zeilenumbruch ein
    
    TStringList* Daten = new TStringList();
    Daten->Text = Eingang.c_str(); //String in TStringList einlesen
    string Zeilen[3];
    
    for(int loop=0; loop<3; loop++)
    {
        int loop2=loop+(loop+1);
        Zeilen[loop] = Daten->Strings[loop2].c_str(); //Daten Aus jeder 2. Zeile der TStringList in Array legen
    }
    


  • Wie gesagt, in TStringList::Count steht die Anzahl der Zeilen der Stringlist drin. Kontrolliere im Debugger wo der Fehler auftritt und schau dann nach auf welches Listenelement du zugreifen willst. Am besten wäre es, wenn du bei Zugriffen auf deine StringList imm Count mit überprüfst.
    In deinem Code kann ja loop2 maximal 5 werden. das kann den fehler also nicht verursachen.



  • Das Problem muss ja wohl in Zeile 9 Liegen, weil dort die TStringList gefüllt wird.

    Dort wird ja, wie ich es verstehe, der Inhalt der String-Variable "Eingang" in einzelne Zeilen (bei jedem "\n") aufgeteilt, sind es dort zu viele Zeilen, oder was ist das Problem?



  • Das Problem kann nicht in dieser Zeile liegen, da sich hier deine StringList bei Bedarf von selbst vergrößert bis alle Strings hineinpassen.
    Hier noch einmal der Hinweis auf den Debugger.
    Nicht raten - testen !



  • Ich hab alles versucht, konnte aber den Fehler nicht finden...



  • Bei Bedarf, falls dein Quelltext nicht zu groß ist, kannst du ihn mir per Mail schicken.



  • Vielen Dank 🙂

    Das ist schon der ganze Code:

    #include <iostream.h>
    #include <vcl.h>
    
    void main()
    {
     DecimalSeparator = '.';
     char buf[512]="time=12.0111996706285 \nairspeed=22.0635795593262 \naltitude=2043.95642089844 \nvario=-0.000195638305740431 \ncompass=270 \nslipball=0 \nturnrate=0 \nyawstringangle=-0.0215568039566278 \nradiofrequency=123.5 \nyaw=4.71238899230957 \npitch=0 \nbank=0 \nquaternionx=0 \nquaterniony=0 \nquaternionz=9.73535918546986E-8 \nquaternionw=1 \nax=0.249863708019257 \nay=0.849863708019257 \naz=0 \nvx=25 \nvy=-4.07301695304341E-6 \nvz=0 \nrollrate=-0.00339330825954676 \npitchrate=0 \nyawrate=0";
    
     /*cout<<"buf: "<<buf<<endl<<endl;
    
     int i;
     for (i=0;i<50;i++)
     {
      cout<<"buf["<<i<<"]: "<<buf[i]<<endl;
     }
     cout<<endl;
     */
    
     string Eingang;
     Eingang=buf;
     cout<<Eingang<<endl<<endl;
    
    TSysCharSet bchars;
    bchars << '=';
    Eingang = WrapText(Eingang.c_str(), "\n", bchars, 0).c_str(); //Fügt nach jedem = einen Zeilenumbruch ein
    
    cout<<Eingang<<endl<<endl; //Ausgabe zur Kontrolle
    
    TStringList* Daten = new TStringList();
    Daten->Text = Eingang.c_str(); //String in TStringList einlesen
    float Zeilen[3];
    
    for(int loop=0; loop<25; loop++)
    {
        int loop2=loop+(loop+1);
        Zeilen[loop] = StrToFloat(Daten->Strings[loop2].c_str()); //Daten Aus jeder 2. Zeile der TStringList in Array legen
    }
    
    for(int loop=0; loop<25; ++loop)
    {
        cout<<Zeilen[loop]<<endl; //Ausgabe der einzelnen Zeilen
    }
    
    /*
    float test;
    test=StrToFloat(Zeilen[2].c_str());
    cout<<test<<endl;
     */
     getchar();
    }
    


  • Hier sind ein paar Fehler drin.
    1. Zeilen ist nur 3 Elemente groß, du versuchst aber 25 abzulegen.
    2. Die Schleife läuft von 0 bis 25 wobei loop2 so maximal 49 werden kann, ohne das du überprüfst wieviel Elemente in deiner Stringlist überhaupt drin sind.
    Was soll das mit buf? Warum belegst du Eingang nicht direkt.

    Ich würde dir vorschlagen (wie schon ein paar mal) deine Schleife bis StringList->Count laufen zu lassen und aus der Variablen Zeilen einen vector<float> zu machen..
    z.Bsp. so

    int count = Daten->Count;
    std::vector<float> Zeilen;
    for(int loop=1; loop<count; loop += 2) // nur jede zweite Zeile
    {
        Zeilen.push_back(StrToFloat(Daten->Strings[loop])); //Daten Aus jeder 2. Zeile der TStringList in vector legen
    }
    

    Der auskommentierte Text darunter ist übrigens Unsinn.


Anmelden zum Antworten