Turbo Pascal - Problem mit StrNew bzw. Dispose


S

schlseb ohne PW

Hallo zusammen,

habe mir mit Hilfe von Pointern in TurboPascal eine Funktion geschrieben, welche das Vorkommen von Strings in anderen Strings prüft und diese ersetzt:

Code:
procedure StrRepl{(str1, str2,  str3 :PChar)};
{---------------------------------------------------------------
  Datum 05.03.10 SSe  Letzte Žnderung
  Sucht innerhalb eines Strings (str1) nach einer Zeichnefolge
  (str2) und ersetzt diese durch eine andere (str3) (alle
  Vorkommen).
  Fr šbergabewerte sind nullterminierte Strings erforderlich,
  die entweder mit StrPCopy(PChar, String) (Unit Strings er-
  forderlich) direkt aus Pascalstrings erzeugt werden k”nnen,
  oder als selbstdefinierte Typen von Chararrays bergeben werden
  k”nnen.

  Beispiel:

  type
     CArray = array[0..X] of Char; {X = ben”tigte L„nge)

  var
     Ptr1, Ptr2       :array[0..Y]; {Y = ben”tigte L„nge)
     text             :CArray;
     suchtext,
     ersatztext       :String;

  begin
     ...
     Readln(f, text);
     suchtext:= 'abc';
     ersatztext:= 'xyz';
     StrRepl(text, StrPCopy(Ptr1, suchtext), StrPCopy(Ptr2, ersatztext));
     ...
  end;

 ---------------------------------------------------------------}
var anfang, ende,
    Puffer1, Puffer2       :PChar;
    len1, len2, len3       :Word;


begin
{$R+}
    Puffer1:= StrNew(str1);
    Puffer2:= StrNew(str1);
    len1:= StrLen(Puffer1);
    len2:= StrLen(str2);
    len3:= StrLen(str3);
    anfang:= StrPos(Puffer1,str2);
    while anfang <> nil do begin
      StrMove(Puffer2, Puffer1, anfang-Puffer1);
      StrMove(Puffer2+(anfang-Puffer1), str3, len3);
      ende:= anfang+len2;
      StrMove(Puffer2+(anfang+len3-Puffer1), ende, Puffer1+len1-ende);
      len1:= len1+len3-len2;
      StrMove(Puffer1,Puffer2,len1);
      anfang:= StrPos(Puffer1, str2);
    end;
    ende:=Puffer1+len1;
    ende^:= #0;
    StrCopy(str1,Puffer1);
    if Puffer1 <> nil then StrDispose(Puffer1);
    if Puffer2 <> nil then StrDispose(Puffer2);
{$R-}
end;
Nun tritt manchmal ein Laufzeitfehler auf, weil
Puffer2:= StrNew(str1);
in Puffer 2 'o´' schreibt, obwohl Puffer 1 die korrekte Kopie von str1 enthält. Den Laufzeitfehler (Fehler 204: Ungültige Zeigeroperation) liefert dann StrDispose(Puffer2)!

Hat vielleicht irgendjemand eine Idee, wie es dazu kommt?
 
S

schlseb ohn PW

Mittlerweile kommt kein Laufzeitfehler mehr, sondern das Programm scheint sich wie in einer Endlosschleife aufzuhängen und zwar nach dem ersten Aufruf von StrNew() in der Prozedur. Allerdings wird die Prozedur an anderer Stelle in einer Schleife ausgeführt und wird zunächst mehrmals fehlerfrei ausgeführt, bevor es dann zu dem Fehler kommt.
Tatsächlich treten Probleme bei dieser Prozedur erst seit Dienstag auf, davor habe ich sie mehrere Male ohne Probleme getestet und seither keine Änderungen vorgenommen, wenn man von if Puffe# <> NIL absieht, welches ich in der Hoffnung ergänzt habe Fehler vorher abzufangen, denn am Dienstag kam die Laufzeitfehlermeldung noch aufgrund eines Leeren Puffer2 (=nil), bevor StrNew(...) dann Mittwochs plötzlich 'o´' zurückgegeben hat. (Alles wiederum, nachdem die Schleife bereits einige male durchgelaufen war!)!

Als kleine Hintergrundinfo sei angemerkt, dass ich versuche in einem vordefinierten Templet (.txt) darin enthaltene Platzhalter (<'Name'>) durch dynamische Einträge aus dem Programm zu ersetzen und das Ergebnis in einer Logdatei auszugeben.

Wäre wirklich toll, wenn jmd eine Idee zu meinem Problem hat, oder eigene Erfahrungen mit der Unit Strings schildern kann.

Gruß schlseb