Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi StringReplace und Sigsegv (https://www.delphipraxis.net/176702-stringreplace-und-sigsegv.html)

Monday 21. Sep 2013 11:59

StringReplace und Sigsegv
 
Hallo,

ich stehe vor einem echt seltsamen Problem mit StringReplace. Der Code ist etwas größer, daher habe ich es etwas verkürzt:

Code:
  hs1 := hs; //= strings
{funktioniert}  hs1 := Stringreplace(hs1, 'r', '2', [rfReplaceAll]);
{funktioniert}  hs1 := Stringreplace(hs1, 'n', '2', [rfReplaceAll]);
{funktioniert}  hs1 := Stringreplace(hs1, 'b', '2', [rfReplaceAll]);
{Sigsegv Fehler!?}  hs1 := Stringreplace(hs1, 'k', '2', [rfReplaceAll]);
{Sigsegv Fehler!?}  hs1 := Stringreplace(hs1, 'q', '2', [rfReplaceAll]);
{funktioniert}  hs1 := Stringreplace(hs1, 'R', '1', [rfReplaceAll]);
{funktioniert}  hs1 := Stringreplace(hs1, 'N', '1', [rfReplaceAll]);
Ich verstehe nicht, warum "h" oder "q" ein problem darstellt. hs enthält verschiedene Buchstaben, kann die Buchstaben die ersetzt werden sollen enthalten, muss aber nicht. Des seltsame ist, das vorher die stringreplace normal ausgeführt werden, dann aber auf einmal ein sigsegv auftritt obwohl es im prinzip das völlig gleiche ist. Noch seltsamer ist, das an dieser Stelle sigsegv aber auch nur manchmal auftritt und nicht immer... (10 mal ausgeführt, einmal sigsegv...) wenn er aber auftritt, dann bei stringreplace.

Hat jemand eine Idee? Ist es denkbar dass der Sigsegv an dieser Stelle auch nur "zufällig" aufgetretten ist und der wirkliche Fehler woanders zu suchen ist??


Lg
Monday


P.S. zu dem Zweck der Replace: Es ist ein Hilfsstring für einen späteren Algorithmus...

Klaus01 21. Sep 2013 13:35

AW: StringReplace und Sigsegv
 
Hallo,

tritt der Fehler auch auf, wenn Du die Ersetzungen in einer Schleife durchführst?

In etwa so:

Delphi-Quellcode:
for i:= 1 to length(hs) do
  begin
    if hs[i] in ['r','n','b','k','q'] then
      hs[i] := '2'
    else
      if hs[i] in ['R','N'] then
        hs[i] := '1';
  end;
Edit: Wenn Dein Applikation mit SigSegV sich verabschiedet, wird meines Wissens auch ein core file generiert. Dieses kannst Du mit gdb auswerten. Vielleicht kommst Du so auf den Verursacher.

Grüße
Klaus

Monday 21. Sep 2013 18:37

AW: StringReplace und Sigsegv
 
Hallo Klaus,

danke für deine Hilfe.

Ja dein Code hat funktioniert. Nun hat mir die ganze Sache aber keinen Ruh gelassen, weil es absolut komisch ist, dass der gleiche Code dreimal hintereinander funktioniert und dann nicht mehr. Nachdem ich meinen Code wieder eingesetzt habe, ist der Fehler wieder verschwunden - was ja eigentlich auch nicht sein dürfte - immerhin hatte ich den Fehler ja ein paar Stunden. Es ist der derselbe Code. Ich kann den Sigsegv nicht mehr reproduzieren?! Mal sehen, ob ich ihn morgen wieder bekomme.

Lg
Monday

Furtbichler 22. Sep 2013 09:31

AW: StringReplace und Sigsegv
 
Es ist garantiert nicht der Code, der den Fehler verursacht, sondern höchstens auslöst. Du hast in deiner Anwendung vorher irgendwo einen schweren Schnitzer (z.B. Stack zerschossen), der dann in der Folge irgendwann zu diesem sigsegv führt. Es ist blanker Zufall, das es in dieser Konstellation passierte. Vermutlich bzw. vielleicht wäre der Fehler auch verschwunden, wenn Du die Zeilen vertauscht hättest.

Mein Tipp: Entweder arbeitest Du mit DLLs und die Parameterliste ist falsch, oder du bügelst vorher über eine lokale Variable (die auf dem Stack liegt). Kann aber auch etwas vollkommen anderes sein. :cry:


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:08 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz