Autor |
Beitrag |
morphi
Hält's aus hier
Beiträge: 3
|
Verfasst: Fr 25.02.05 17:51
Ich möchte den Text aus der Textbox Edit2 in Edit1 umgedreht haben also das aus Wurzel "lezruW" wird. z.B. ich bin anfäger
danke Morphi
|
|
delfiphan
      
Beiträge: 2684
Erhaltene Danke: 32
|
Verfasst: Fr 25.02.05 17:57
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| Var A, B : String; I : Integer; begin A := 'Wurzel'; B := A; For I := 1 to length(A) do B[length(A)-I+1] := A[I]; end; |
|
|
uall@ogc
      
Beiträge: 1826
Erhaltene Danke: 11
Win 2000 & VMware
Delphi 3 Prof, Delphi 7 Prof
|
Verfasst: Fr 25.02.05 18:03
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| varr A : String; I : Integer; B : char; begin A := 'Wurzel'; For I := 1 to length(A) do begin b := a[i]; A[I] := A[length(A)-i+1]; A[length(A)-i+1] := b; end; end; |
für lange strings ist das besser da kein 2ter string angelegt werden muss
Zuletzt bearbeitet von uall@ogc am Fr 25.02.05 18:13, insgesamt 1-mal bearbeitet
|
|
BeniSchindler
      
Beiträge: 82
Win 2k / suse9.1
D7 Prof / Kylix 3
|
Verfasst: Fr 25.02.05 18:03
Oder :
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9:
| Var A, B : String; Index : Integer; begin A := 'Wurzel'; B := ''; For Index := length(A) downto 1 do B := B + A[Index]; end; |
_________________ Result := 42; Application.ProcessMessages;
|
|
uall@ogc
      
Beiträge: 1826
Erhaltene Danke: 11
Win 2000 & VMware
Delphi 3 Prof, Delphi 7 Prof
|
Verfasst: Fr 25.02.05 18:12
das ist bis jetzt die schlechteste variante da delphi da immer einen neuen string erstellen muss
|
|
delfiphan
      
Beiträge: 2684
Erhaltene Danke: 32
|
Verfasst: Fr 25.02.05 18:15
So werden ständig neue Strings aneinandergehängt :O
//Edit: Ok stimmt glaub ich nicht ganz.. :\ auf jeden Fall ist es performancemässig am besten, wenn du nicht ständig was zu einem String dazufügst. Wenn die Länge eines Strings am Anfang schon gegeben ist, dann solltest du das auch am Anfang festlegen.
Zuletzt bearbeitet von delfiphan am Fr 25.02.05 18:19, insgesamt 1-mal bearbeitet
|
|
jasocul
      
Beiträge: 6393
Erhaltene Danke: 147
Windows 7 + Windows 10
Sydney Prof + CE
|
Verfasst: Fr 25.02.05 18:18
Dürfte noch schneller sein:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| Var A, B : String; Index : Integer; laenge : Integer; begin A := 'Wurzel'; laenge := Length(A); SetLength(B,laenge); For Index := laenge downto 1 do B[laenge+1-Index] := A[Index]; end; |
|
|
uall@ogc
      
Beiträge: 1826
Erhaltene Danke: 11
Win 2000 & VMware
Delphi 3 Prof, Delphi 7 Prof
|
Verfasst: Fr 25.02.05 18:20
jasocul
1.) hast du 2 strings -> das mag ich schon net ;>
2.) downto schleife langsamer als for to schleife
3.) speichert delphi die länge eh in einem register (ebx) von daher isses egal ob du das vorher in eine variable auslagerst
|
|
delfiphan
      
Beiträge: 2684
Erhaltene Danke: 32
|
Verfasst: Fr 25.02.05 18:22
Wer hat Lust, das ganze jetzt noch in Assembler zu schreiben 
|
|
delfiphan
      
Beiträge: 2684
Erhaltene Danke: 32
|
Verfasst: Fr 25.02.05 18:26
Ich denke sowieso nicht, dass length(S) langsamer ist als ne gewöhnliche Variable zu lesen. Length wird nicht in einen call verwandelt, oder? Zu mindest nicht bei Pascal-Strings.
|
|
uall@ogc
      
Beiträge: 1826
Erhaltene Danke: 11
Win 2000 & VMware
Delphi 3 Prof, Delphi 7 Prof
|
Verfasst: Fr 25.02.05 18:27
length(s) wird bei einer schleifenvariable in EBX geschrieben, sollte also genausoschnell / shcneller sein
da delphi auch die variable in EBX packen würde
|
|
delfiphan
      
Beiträge: 2684
Erhaltene Danke: 32
|
Verfasst: Fr 25.02.05 18:29
Also ich meinte eher grundsätzlich so... Bzw. beispielsweise in der For-Schleife drin:
Delphi-Quelltext 1: 2:
| For I := 1 to length(A) do B[length(A)-I+1] := A[I]; |
|
|
uall@ogc
      
Beiträge: 1826
Erhaltene Danke: 11
Win 2000 & VMware
Delphi 3 Prof, Delphi 7 Prof
|
Verfasst: Fr 25.02.05 18:32
meine variante hatte sogar noch nen bug
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| var s: string; i, l: integer; b: char; begin s := 'das ist ein test'; l := length(s); for i := 1 to l div 2 do begin b := s[i]; s[i] := s[l-i+1]; s[l-i+1] := b; end; form1.caption := s; end; |
ich muss nur die hälfte des strings machen ;>
|
|
jasocul
      
Beiträge: 6393
Erhaltene Danke: 147
Windows 7 + Windows 10
Sydney Prof + CE
|
Verfasst: Fr 25.02.05 18:34
Neue Variante und Kommentare:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| Var A : String; B : Char; Index : Integer; Ende : Integer; laenge : Integer; begin A := 'Wurzel'; laenge := Length(A); Ende := (laenge div 2)+1; For Index := laenge downto ende do begin B := A[laenge+1-Index]; A[laenge+1-Index] := A[Index]; A[Index] := B; end; end; |
Da ich die Länge mehrfach benötige macht es durchaus Sinn. Ich hätte allerdings auch auf A[0] zugreifen können. Da kann es aber zu Problemen mit AnsiStrings kommen.
Die neue Variante hat auch nur noch einen String.
Eine for..downto ist meistens schneller als for..to. Dazu gab es auch schon Threads, weil Delphi das auch in diese Richtung optimiert, wenn es möglich ist.
Die Schleife läuft jetz nur noch über die Hälfte des Strings.
Wenn jetzt noch was verbessert werden soll, läuft es auf Assembler raus.
//EDIT:
Mist. Hätte ich nicht kommentiert wäre ich schneller gewesen als uall@ogc 
|
|
delfiphan
      
Beiträge: 2684
Erhaltene Danke: 32
|
Verfasst: Fr 25.02.05 18:39
morphi hat folgendes geschrieben: | ich bin anfäger |
Morphi wird Freude haben
Eben genau das war meine Frage: Ob denn length(S) in einen Function-Call oder bei normalen Strings direkt in ein S[0] übersetzt wird.
//Edit: Hui, ist aber schwach, es gibt tatsächlich einen Function Call. Hätte jetzt fast gedacht, dass das zu S[0] optimiert wird.
Zuletzt bearbeitet von delfiphan am Fr 25.02.05 18:43, insgesamt 2-mal bearbeitet
|
|
Sprint
      
Beiträge: 849
|
Verfasst: Fr 25.02.05 18:41
morphi hat folgendes geschrieben: | Ich möchte den Text aus der Textbox Edit2 in Edit1 umgedreht haben also das aus Wurzel "lezruW" wird. z.B. ich bin anfäger |
Delphi-Quelltext 1:
| Edit1.Text := AnsiReverseString(Edit2.Text); |
Unter Delphi 7 gibt es die Funktion AnsiReverseString. Unter Delphi 5 nicht. Bei Delphi 6 weiß ich es nicht.
_________________ Ciao, Sprint.
|
|
jasocul
      
Beiträge: 6393
Erhaltene Danke: 147
Windows 7 + Windows 10
Sydney Prof + CE
|
Verfasst: Fr 25.02.05 18:43
Dann jetzt nochmal für Morphi:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
| procedure TForm1.Button1Click(Sender: TObject); Var A : String; B : Char; Index : Integer; Ende : Integer; laenge : Integer; begin A := Edit2.Text; laenge := Length(A); Ende := (laenge div 2)+1; For Index := laenge downto ende do begin B := A[laenge+1-Index]; A[laenge+1-Index] := A[Index]; A[Index] := B; end; Edit1.Text := A; end; |
|
|
Dominique
      
Beiträge: 92
|
Verfasst: Fr 25.02.05 18:45
|
|
Dominique
      
Beiträge: 92
|
Verfasst: Fr 25.02.05 18:51
Sprint hat folgendes geschrieben: |
Unter Delphi 7 gibt es die Funktion AnsiReverseString. Unter Delphi 5 nicht. Bei Delphi 6 weiß ich es nicht. |
leider ist's mit stringfunktionen bis delphi 7 nicht so üppig.
ein tip an morphi: guck doch zwischendurch mal in die delphi hilfe 
|
|
delfiphan
      
Beiträge: 2684
Erhaltene Danke: 32
|
Verfasst: Fr 25.02.05 18:53
Ok, wir geben uns geschlagen  Ist ca. 4 mal schneller als Jasocul's korrigierte Methode von uall
// Edit: und ca. 20% schneller als meine, wenn man dort noch die Länge zuvor in einer Variablen speichert ;(
|
|