AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Funktion nur sporadisch einsetzbar

Offene Frage von "Svenkan"
Ein Thema von Svenkan · begonnen am 28. Aug 2007 · letzter Beitrag vom 29. Aug 2007
Antwort Antwort
Seite 1 von 2  1 2      
Svenkan

Registriert seit: 10. Feb 2007
Ort: Bersenbrück
547 Beiträge
 
Delphi 7 Enterprise
 
#1

Funktion nur sporadisch einsetzbar

  Alt 28. Aug 2007, 17:42
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?
Sven Kannenberg
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#2

Re: Funktion nur sporadisch einsetzbar

  Alt 28. Aug 2007, 17:45
Machen wir es mal einfach: Was für eine Ausgabe erwartest du und was für eine Ausgabe macht die Funktion?
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Svenkan

Registriert seit: 10. Feb 2007
Ort: Bersenbrück
547 Beiträge
 
Delphi 7 Enterprise
 
#3

Re: Funktion nur sporadisch einsetzbar

  Alt 28. Aug 2007, 17:55
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.
Sven Kannenberg
  Mit Zitat antworten Zitat
Der_Unwissende

Registriert seit: 13. Dez 2003
Ort: Berlin
1.756 Beiträge
 
#4

Re: Funktion nur sporadisch einsetzbar

  Alt 28. Aug 2007, 18:01
Zitat von Svenkan:
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
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#5

Re: Funktion nur sporadisch einsetzbar

  Alt 28. Aug 2007, 18:41
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.
  Mit Zitat antworten Zitat
Svenkan

Registriert seit: 10. Feb 2007
Ort: Bersenbrück
547 Beiträge
 
Delphi 7 Enterprise
 
#6

Re: Funktion nur sporadisch einsetzbar

  Alt 28. Aug 2007, 21:30
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.
Sven Kannenberg
  Mit Zitat antworten Zitat
Der_Unwissende

Registriert seit: 13. Dez 2003
Ort: Berlin
1.756 Beiträge
 
#7

Re: Funktion nur sporadisch einsetzbar

  Alt 29. Aug 2007, 10:22
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]
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#8

Re: Funktion nur sporadisch einsetzbar

  Alt 29. Aug 2007, 10:52
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 von Muetze1:
Er bekommt immer das letzte Zeichen zurück.
  Mit Zitat antworten Zitat
Svenkan

Registriert seit: 10. Feb 2007
Ort: Bersenbrück
547 Beiträge
 
Delphi 7 Enterprise
 
#9

Re: Funktion nur sporadisch einsetzbar

  Alt 29. Aug 2007, 12:26
Wenn ich das -1 rausnehme, klappt es überhaupt nicht mehr. Dann verhält sich das Ganze wie ne zu groß-geratenene StringReplace-Funktion.
Dann werden nämlich nur noch die '=' entfernt, das wars.

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.
Sven Kannenberg
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#10

Re: Funktion nur sporadisch einsetzbar

  Alt 29. Aug 2007, 12:40
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.
Andreas
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:37 Uhr.
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