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:
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?
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?