Delphi-PRAXiS

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.

Svenkan 29. Aug 2007 14:59

Re: Funktion nur sporadisch einsetzbar
 
Ich kann mir da jetz ein Schmunzeln nicht verkneifen..
Alles richtig..

Hier (Mittwoch/Donnerstag) das Beispiel, wo es nicht funktioniert.
Und hier, wie es richtig ist.

Phoenix 29. Aug 2007 15:49

Re: Funktion nur sporadisch einsetzbar
 
Zitat:

Zitat von Svenkan
Dabei ist es jedesmal:

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

Über den Umgang mit Boolean
Richtiger wäre:
Delphi-Quellcode:
if not baender then
   klasse := Compress(klasse);

Muetze1 29. Aug 2007 16:46

Re: Funktion nur sporadisch einsetzbar
 
Der Hinweis ist bei einem Vergleich auf false egal, da false immer 0 ist und nur true mit alles <> 0 definiert wurde. Seine Abfrage auf False ist in Ordnung...

oki 29. Aug 2007 17:49

Re: Funktion nur sporadisch einsetzbar
 
Zitat:

Zitat von Svenkan
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.

Schon mal geckeckt, ob der Inhalt des übergebenen String für deine HTML- und RTF-Pläne wirklich identisch ist?
Nicht, dass du in deiner Funktion suchst, aber was unterschiedliches rein geht (Lehrzeichen, nicht lesbarer ASCII-Code etc.).

Außerdem empfehle ich dann auch dringend die Methode Testunit, wie es shima es schon vorgeschlagen hat. So kannst du auf jeden Fall ermitteln, ob deine Funktion richtig arbeitet oder der Fehler von "außen" kommt.

Gruß oki

Svenkan 29. Aug 2007 18:12

Re: Funktion nur sporadisch einsetzbar
 
Wie weiter oben beschrieben, ist das alles gleich bzw. auch richtig.
Es hat vorher ja auch funktioniert.
Erst funktionierte es dort und im Lehrerplan nicht -> aus Lehrerplan entfernt.
Seitdem die RTF-Funktion drin ist funktioniert es dort und im Schülerplan nicht.
Es gibt auch keine glob. Variablen die da irgendwo überschrieben werden und dazu führen..
Und mit dem Unittest funktioniert das komischerweise auch beidem problemlos..

oki 29. Aug 2007 18:39

Re: Funktion nur sporadisch einsetzbar
 
Also, wenn es in der seperaten Unit funzt, dann liegt es nicht an der Function.

Du übergibst doch die Werte in der Variablen Klassen. Debug das doch mal oder schreib die werte in ein Log vor der Übergabe.

Gruß oki


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:16 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