Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Funktion nur sporadisch einsetzbar (https://www.delphipraxis.net/98525-funktion-nur-sporadisch-einsetzbar.html)

Svenkan 28. Aug 2007 16:42


Funktion nur sporadisch einsetzbar
 
Ich hab folgende Funktion:

Delphi-Quellcode:
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;
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.
Dabei ist es jedesmal:

Delphi-Quellcode:
   if baender=FALSE then
    klasse:=Compress(klasse);
Jemand ne Idee?

Luckie 28. Aug 2007 16:45

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?

Svenkan 28. Aug 2007 16:55

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.

Der_Unwissende 28. Aug 2007 17:01

Re: Funktion nur sporadisch einsetzbar
 
Zitat:

Zitat von Svenkan
Delphi-Quellcode:
Result := Result + Copy(Item, Length(Item), 1)

Hi,
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

Muetze1 28. Aug 2007 17:41

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.

Svenkan 28. Aug 2007 20:30

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.

Der_Unwissende 29. Aug 2007 09:22

Re: Funktion nur sporadisch einsetzbar
 
Zitat:

Zitat von Svenkan
Also die Funktion ist korrekt aufgebaut?

[edit]
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]

Muetze1 29. Aug 2007 09:52

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:

Zitat von Muetze1
Er bekommt immer das letzte Zeichen zurück.


Svenkan 29. Aug 2007 11:26

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:

Zitat von Der_Unwissende
Hast Du da mal geschaut, ob der String den Du übergibst bei HMTL und RTF immer dem entspricht was Du erwartest?

Das ist alles einwandfrei. Irgendwas läuft da an der Umwandlung falsch, aber das komische ist einfach, dass es in manchen Teilen des Programms klappt und in anderen nicht.

shmia 29. Aug 2007 11:40

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:
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
Nur mit Testfällen kommt man 100% ans Ziel. Alles andere wäre nur ein Herumgedoktere.
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 14:13 Uhr.
Seite 1 von 2  1 2      

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