Zahlen aus AnsiString



  • Hallo!

    Habe folgendes Problem:

    ST = Memo4->SelText;
      Memo3->Lines->Add(ST);
      Memo3->Lines->Add(" ");
    
      Laenge = ST.Length();
      for(k=0;k<Laenge;k++)
      {
      :arrow_right:    if( IsNumeric(ST[k]))  
        {
          Zaehler++;
          Ausgabe[Zaehler]=ST[k];
        }
      }
      AT = StrToInt(Ausgabe);
    

    Gibt beim kompilieren keinen Fehler, erst zur Laufzeit entsteht eine Accessviolation.

    Würde mich über hilfreiche Hinweise freuen!

    Jannika



  • Was sind Laenge (int?), ST (AnsiString?) und AT (int?)?
    Arbeitest du mit Pointern?



  • Upps habe ich vergessen zu kopieren:

    AnsiString        ST, Ausgabe;
      int               k,Zaehler=0,Laenge, AT;
      ST = Memo4->SelText;
      Memo3->Lines->Add(ST);
      Memo3->Lines->Add(" ");
    
      Laenge = ST.Length();
      for(k=1;k<=Laenge;k++)
      {
        if( IsNumeric(ST[k]))
        {
          Zaehler++;
     :arrow_right:       Ausgabe[Zaehler]=ST[k];
        }
      }
      AT = StrToInt(Ausgabe);
    

    Also, durch Änderung des Startwertes von k von 0 auf 1 geht mein Programm jetzt ein Stückchen weiter.

    ST = "WS9 "; // Zwei Leerzeichen hinten dran!

    Die Abfrage IsNumeric klappt, wenn er allerdings in die Anweisung nach der if-Abfrage reinspringt, wird Zähler zwar auf 1 gesetzt, aber bei der nächsten Zeile kommt wieder eine Accessviolation!



  • Ich nehme mal an ST ist ein AnsiString. Da beginnt die Zählung bei 1 und nicht bei 0.
    also statt

    for(k=0;k<Laenge;k++)
    

    lieber

    for(k=1;k<=Laenge;k++)
    


  • Das Erste Problem ist also gelöst. 😉
    Du kannst doch Ausgabe so nichts zuweisen. Intern hat der String doch die Länge 0.
    also lieber

    Ausgabe+=ST[k];
    

    statt

    Ausgabe[Zaehler]=ST[k];
    


  • Vielen Dank für eure Hilfe, aber ich habe inzwischen selbst eine Lösung gefunden 🕶 :

    ST = ST.TrimRight();
      ST = ST.Delete(1,2);
    /*  Laenge = ST.Length();
      for(k=1;k<=Laenge;k++)
      {
        if( IsNumeric(ST[k]))
        {
          Zaehler++;
          Ausgabe[Zaehler]=ST[k];
        }
      }*/
      AT = StrToInt(ST)-1;
    

    Mit Trim habe ich einfach die Leerzeichen weggeschnitten und da IMMER WS am Anfang steht kann ich getrost Delete(1,2) ausführen!

    Bis bald zum nächsten Problem.... 😉

    Eure Jannika


Log in to reply