Thread StringReplace Zugriffsverletzung



  • Hallo,

    ich ersetze in meinem Thread bestimmte Zeichen von Strings und dabei gibt er jedesmal eine Zugriffsverletzung aus die ich vollkommen NICHT verstehen kann.
    Vielleicht könnt ihr mich ja aufklären.

    Hier mal ein String namens kategorie_m wo ich bestimmte Zeichen ersetze.

    kategorie_m = StringReplace(kategorie_m, "+-KOMMA-+", ",",TReplaceFlags() << rfReplaceAll);
    kategorie_m = StringReplace(kategorie_m, "+-BACKSLASH-+", "\n",TReplaceFlags() << rfReplaceAll);
    

    und dabei kommt dann eine Zugriffsverletzung! hääää WIESO verdammter Mist?!
    *FRUST*



  • Hallo

    Die beiden Zeilen sind bestenfalls der Auslöser, aber sicher nicht der Grund für die Zugriffsverletzung. Mehr können wir ohne weiteren Code nicht sagen.

    bis bald
    akari



  • Wenn ich das Ersetzen des Strings auskommentiere kommt keine Zugriffsverletzung mehr...
    Also muss das doch der grund dafür sein

    Davor lade ich die Inhalte der einzelnen String von der Tabelle mittels:

    maschinen_id_use_m=menue_form->maschinen_grid->Cells[0][maschinen_id_merken];
    bezeichnung_m=menue_form->maschinen_grid->Cells[1][maschinen_id_merken];
    hersteller_m=menue_form->maschinen_grid->Cells[2][maschinen_id_merken];
    typ_m=menue_form->maschinen_grid->Cells[3][maschinen_id_merken];
    

    Ansonsten funktioniert es wirklich einwandfrei !!!
    Außer dieses ersetzen, kann es einfachn niicht verstehen wie er dort eine zugriffsverletzung hinkriegt!!!



  • Nimm doch mal den Debugger. Ist kategorie_m vllt null?



  • Wie funktioniert das den mit dem Debugger ???
    LOL @ Me



  • Deine Vermutung war richtig es ist wirklch so das einzelne variablen NULL waren!
    Danke für den Tipp.

    Aber trotzdem würde ich gerne wissen wie es mit dem Debugger funktioniert!



  • Hallo

    Der Umgang mit dem Debugger wird hier beschrieben.
    Da aber kategorie_m vom Typ String sein muß, kann es nicht NULL sein. Eventuell ist aber this NULL. Deshalb ist ja wie gesagt ohne weiteren Code, der zum Beispiel zeigt wie der bereits gezeigte Code vom Thread aus aufgerufen wird, nicht möglich eine konkrete Antwort zu geben.

    bis bald
    akari





  • Danke für den Link, so du hast Recht ich mache eine IF Abfrage ob String == NULL ist und wenn das der Fall ist soll er kein Replace machen.
    Aber die Abfrage funktioniert trotzdem nicht.
    Also er wirft wieder die zugriffsverletzung!
    Mhh....was meinst du mit "this" könnte NULL sein?!



  • Hallo

    ich mache eine IF Abfrage ob String == NULL ist

    Falls du das so oder so ähnlich meinst :

    AnsiString kategorie_m;
    ...
    if (kategorie_m == NULL)
    

    dann kannst du diese Überprüfung auch sein lassen. Denn wie ich schon gesagt habe, wird eine Instanz von AnsiString niemals NULL sein. So eine Überprüfung macht nur Sinn wenn du einen Zeiger (z.B. auf AnsiString) hättest. Hast du aber nicht, da du kategorie_m ja direkt an StringReplace übergeben kannst.

    Also zum dritten Mal : Ohne weiteren relevanten Code oder vernünftige Debugging-Infos von dir können wir nur raten.

    /Edit : Schlimmer noch : Bei dem Vergleich wird NULL implizit in ein char* umgewandelt. Das bedeutet der Vergleich wird vom Compiler so umgesetzt :

    AnsiString kategorie_m;
    ...
    if (kategorie_m == "0")
    

    was ja nun wirklich nicht das ist was du willst.

    bis bald
    akari



  • Das Schöne an undefiniertem Verhalten ist, dass es völlig unberechenbar ist. Wenn du zur Laufzeit auch nur ein Mal einen ungültigen Speicherzugriff machst kann alles mögliche passieren, dein Programm kann ohne Probleme weiterlaufen, es kann sofort abstürzen, oder es kann an Stellen abstürzen, die mit dem eigentlichen Problem überhaupt nichts zu tun haben. Zur Entwicklung im Debug Modus lohnt es sich hin und wieder, die Anwendung mit aktiviertem Codeguard laufen zu lassen, das überprüft Speicherzugriffe auf Gültigkeit und meldet Verletzungen (beim BCB6 nicht immer, aber oft. Beim CG2007 gehts schon deutlich besser).



  • So habe jetzt herausgefunden das er bei einem bestimmten String diesen Fehler verursacht. Das ist nämlich bei einem sehr langen String könnte das vielleicht ein Anhaltspunkt sein?
    Die anderen Strings macht er ohne Probleme jedoch wenn er bei diesem ankommt erscheint die Zugriffsverletzung!

    Nämlich genau bei diesen 2 Aktionen:

    technischedaten_m = StringReplace(technischedaten_m, "+-KOMMA-+", ",",TReplaceFlags() << rfReplaceAll);
    technischedaten_m = StringReplace(technischedaten_m, "+-ENTER-+", "\r",TReplaceFlags() << rfReplaceAll);
    

    Ich weiß nicht wieso aber beim ersetzen dieser Zeichen passiert irgendetwas außergewähnliches!



  • Glaube ich kaum, in meiner Anwendung hantiere ich ohne Probleme mit Strings, die um die 32K gross sind. Ich vermute den Fehler woanders. Spasseshalber kannst du ja ein Konsolenprojekt erzeugen, das in einem grossen String die Ersetzung durchführt. Wenn das auch nicht klappen sollte gucken wir mal weiter.



  • So mir ist jetzt aufgefallen, das er die zugriffsverletzung immer wirft wenn ein Sonderzeichen wie z.B.: ³ oder ² oder & oder so etwas sich in dem String befindet.

    Ich habe es auch mit diesen Sonderzeichen in einem anderen Programm getestet es funktioniert trotzdem. Man was ist das für ein Mist.



  • So, mir ist jetzt aufgefallen, dass du alle bisherigen Hilfestellungen ignorierst und nur fleissig dein Problem beschreibst.
    In meiner Spielanwendung funktioniert das Ersetzen in einem beliebig grossen String (auch mit den von dir angegebenen "fehlerverursachenden" Zeichen).
    Vermutlich hast du dir irgendwo deinen Speicher zerschossen und daher verweise ich noch einmal auf mein Posting von 15:54.


Log in to reply