tutorials.de Buch-Aktion 02/2012
ERLEDIGT
NEIN
ANTWORTEN
1
ZUGRIFFE
1025
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    schlseb ohne PW Tutorials.de Gastzugang
    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 :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    
    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?
     

  2. #2
    schlseb ohn PW Tutorials.de Gastzugang
    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
     

Ähnliche Themen

  1. Turbo Pascal Schleifen Problem
    Von freizeit-psychologe im Forum Sonstige Sprachen
    Antworten: 2
    Letzter Beitrag: 04.12.09, 16:45
  2. Turbo Pascal
    Von hpatrick im Forum Delphi, Kylix, Pascal
    Antworten: 1
    Letzter Beitrag: 24.04.06, 17:31
  3. Problem mit Turbo Pascal
    Von Old_Faithful_m im Forum Sonstige Sprachen
    Antworten: 3
    Letzter Beitrag: 27.02.04, 16:44
  4. Turbo Pascal
    Von mister_ed im Forum Sonstige Sprachen
    Antworten: 4
    Letzter Beitrag: 31.01.02, 14:53
  5. Turbo Pascal Wav
    Von [EVIL] Soldier im Forum Sonstige Sprachen
    Antworten: 4
    Letzter Beitrag: 13.08.01, 11:16