for-Schleife bricht mittendrin ab (Zähler geht kaputt)



  • Hallo,

    ich steht gard irgendwie auf der Leitung. Ich habe ein Memo, in das eine Textdatei mit ca. 30000 Zeilen geladen wird. Diese Datei soll Zeile für Zeile durchsucht werden.

    int i, i_zeilen=0;
    AnsiString a_aktZeile;
    char c_aktZeile[255];
    
    i_zeilen=Memo1->Lines->Count;
    for (i=0;i<i_zeilen;i++)
        {
        a_aktZeile=Memo1->Lines->Strings[i];
        strcpy(c_aktZeile,a_aktZeile.c_str());
        if (StrPos(c_aktZeile,"Suchtext")!=0)
           {
           Application->MessageBoxA("gefunden","Ooops!",1);
           }
        }
    

    ist ja eigentlich ganz einfach, aber nach 25023 Durchläufen springen die beiden Integerwerte i und i_zeilen auf ganz seltsame Werte (i = 19 Millionen und i_zeilen = 14 Millionen) und dann beendet sich die Schleife natürlich, weil 19 Millionen größer 14 Millionen sind.

    Ich vermute, daß da irgendwo eine Überlauf stattfindet, aber ich komme nicht weiter. Kann mir da mal jemand auf die Sprünge helfen? Das Ganze übrigens in BCB6 Pro.

    mfG und Danke schonmal, Jens



  • Klingt nach nem Speicherüberlauf.

    Generell bei statischen Puffern solltest du strncpy mit der Länge (Pufferlänge - 1) verwenden. Ausserdem solltest du den Puffer vor der erstmaligen Verwendung mittels memset() auf 0 setzten.

    Übringens: Was hast du gegen AnsiString::Find?

    -junix



  • int i, i_zeilen=0;
    AnsiString a_aktZeile;
    
    i_zeilen=Memo1->Lines->Count;
    for (i=0;i<i_zeilen;i++)
        {
        a_aktZeile=Memo1->Lines->Strings[i];
        }
    

    Passiert der Fehler auch in dieser Fassung? Warum verwendest Du überhaupt char? Bist Du sicher, dass keine Zeile länger als 255 Zeichen ist?

    Und noch ein Tip, wenn Du die 30000 Zeilen nicht anzeigen mußt, kannst Du TStringList nehmen, das sollte schneller sein. (Niemand schaut sich 30000 Zeilen an...)



  • Hallo,

    Deine Zähler sollten schon ausreichen. Evtl. ist aml eine Zeile länger als 255 Zeichen. Dann schreibt dein strcpy in nicht allozierten Speicher.
    Warum machst du das überhaupt so kompliziert. AnsiString hat ja auch eine schöne Memberfunktion namens Pos()

    Ciao

    [Edit] das war ja viel zu spät. Man sollte halt zwischendurch nicht telefonieren. 😉 [/Edit]



  • @junix
    AnsiString::Pos, nicht Find (das würde eher zu std::string passen).



  • ist ein Memo nicht begrenzt in der groesse der aufnehmbaren daten? bei nem richedit muss man ja auch tricksen, damit dort mehr als 64k reingehen.



  • Braunstein schrieb:

    @junix
    AnsiString::Pos, nicht Find (das würde eher zu std::string passen).

    Hehe stimmt... hatte da wohl was vermischt... aber meine IAR Embedded Workbench bietet leider keine VCL (o;

    -junix



  • Boah, manchmal stehe ich mir aber auch sowas von auf selber auf den Füßen! Natürlich war eine Zeile länger als 255 Zeichen! Und zur Strafe hab ich gleich 'ne Stunde nach AnsiString::Find in der Borland-Hilfe gesucht 😉

    char benutze ich deshalb, weil bei Projekten, die auch unter Linux (mit Kylix) laufen sollen, immer wieder Konflikte zwischen WideString und AnsiString auftreten. Aber leider bin ich da auch nicht konsequent.

    Danke an Alle 😉

    mfG, Jens


Anmelden zum Antworten