![]() |
Funktion nur sporadisch einsetzbar
Ich hab folgende Funktion:
Delphi-Quellcode:
Ich setzte das einmal in meinen HTML-Plänen ein, dort wird bspw. R8aR8bcd ausgegeben. In meinen RTF-Plänen wird allerdings korrekt R8abcd aus meinen Daten gemacht.
function Compress(const s: string): string;
var Item, OldPrefix, NewPrefix: string; Index: Integer; begin with TStringList.Create do try Delimiter := '='; DelimitedText := s; OldPrefix := ''; Result := ''; for Index := 0 to Count - 1 do begin Item := Strings[Index]; NewPrefix := Copy(Item, 1, Length(Item) - 1); if SameText(OldPrefix, NewPrefix) then Result := Result + Copy(Item, Length(Item), 1) else begin Result := Result + Item; OldPrefix := NewPrefix; end; end; finally Free; end; end; Dabei ist es jedesmal:
Delphi-Quellcode:
Jemand ne Idee?
if baender=FALSE then
klasse:=Compress(klasse); |
Re: Funktion nur sporadisch einsetzbar
Machen wir es mal einfach: Was für eine Ausgabe erwartest du und was für eine Ausgabe macht die Funktion?
|
Re: Funktion nur sporadisch einsetzbar
In dem Beispiel habe ich 'R8a=R8b=R8c=R8d='.
Daraus soll die Funktion 'R8abcd' machen. Leider gibt er in einen Plänen 'R8aR8bcd' aus, in anderen funtkioniert es aber problemlos, obwohl der Code der selbe ist. |
Re: Funktion nur sporadisch einsetzbar
Zitat:
ich glaube die Zeile solltest Du dann aber auch etwas ändern. Ich denke nicht, dass Copy auf einem höheren Startindex definiert ist, Du bekommst also wahrscheinlich eher zufällig einen Wert zurück. Gruß Der Unwissende |
Re: Funktion nur sporadisch einsetzbar
Er bekommt immer das letzte Zeichen zurück. An dem Konstrukt ist nichts auszusetzen. Copy() will den Stringindex haben und der ist 1-basierend.
Aso, und falls der Index doch mal höher als die Länge des Strings ist, dann gibt Copy() immer einen Leerstring zurück. Copy() arbeitet nicht mit Pointern auf den übergebenen Wert sondern legt immer einen eigenen Result string an. Von daher bekommst du niemals Zufallswerte/-strings. Dieses Verhalten lässt sich auch gut ausnutzen, wenn man nicht explizit die Länge eines Strings abtesten will und man nur das Zeichen bzw. Teilstring an einer bestimmten Stelle im String haben will. |
Re: Funktion nur sporadisch einsetzbar
Also die Funktion ist korrekt aufgebaut?
Das gleiche Phänomen hatte ich vorher schonmal, als ich das in Schüler- und Lehrerplan eingebaut hatte. Da hats im Schülerplan problemlos funktioniert, während im Lehrerplan die gleichen Probleme auftraten, wie jetzt im Schülerplan. Aus dem Lehrerplan habe ich es rausgenommen, da kann es gut verschmerzt werden. Aber im Schülerplan muss die Möglichkeit für diese Auflistung auf jeden Fall bestehen bleiben. |
Re: Funktion nur sporadisch einsetzbar
Zitat:
Sorry, fälschlich davon ausgegangen, dass die Indexierung falsch wäre. Ist sie aber nicht, mein Fehler! Die Funktion ist korrekt. Die Frage ist also, wie Du Deine Eingabe erzeugst. Hast Du da mal geschaut, ob der String den Du übergibst bei HMTL und RTF immer dem entspricht was Du erwartest? [/edit] |
Re: Funktion nur sporadisch einsetzbar
Wieso Length()-1? Er will doch das letzte Zeichen erhalten oder nicht? Wenn ja, dann ist die Angabe mit length() schon ganz richtig - wie ich vorhin schon schrieb:
Zitat:
|
Re: Funktion nur sporadisch einsetzbar
Wenn ich das -1 rausnehme, klappt es überhaupt nicht mehr. Dann verhält sich das Ganze wie ne zu groß-geratenene StringReplace-Funktion. :D
Dann werden nämlich nur noch die '=' entfernt, das wars. Zitat:
|
Re: Funktion nur sporadisch einsetzbar
Irgendwie wird hier im Trüben gefischt.
Es gibt nur eine saubere Möglichkeit die Funktion richtig zu machen und das ist ein Unit-Test.
Delphi-Quellcode:
Nur mit Testfällen kommt man 100% ans Ziel. Alles andere wäre nur ein Herumgedoktere.
procedure Test_Compress(const s,d:string);
var erg : string; begin erg := Compress(s) if erg <> d then raise Exception.CreateFmt('Compress(%s) liefert <%s>, richtig ist aber <%s>', [s,erg,d])); end; procedure Test; begin Test_Compress('R8a=R8b=R8c=R8d=', 'R8abcd'); Test_Compress('R7a=R7b=R8a', 'R7abR8a'); // und so weiter // bitte selbsttätig neue Testfälle ausdenken Bei jeder Änderung an der Funktion müssen alle Testfälle neu durchgespielt werden. Ansonsten hat man einen Programmcode, der meistens tut, aber in manchen Fällen versagt. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:44 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz