![]() |
String mit gleichen Zeichen füllen z.B. s:='aaaaaaaa'
Hallo!
Wie erstelle ich einen String mit n gleichen Zeichen ohne eine Schleife zu benutzen? z.B. n=5 und zeichen:='a' dann s:='aaaaa' Man kann ja Strings addieren, gibt es dann auch eine Funktion, die sie multipliziert? MfG GM |
Re: String mit gleichen Zeichen füllen z.B. s:='aaaaaaaa'
hi gmarts
hmm, hab keinen plan wie das ohne schleife gehen soll. was hindert dich denn daran, eine schleife zu benutzen?? mit einer for-schleife bräuchtest du 2 zeilen... gruss, dave |
Re: String mit gleichen Zeichen füllen z.B. s:='aaaaaaaa'
Weiß nicht, ob Delphi dafür eine Funktion bietet, sonst kannst du es mit Rekursion lösen:
Delphi-Quellcode:
Um eine Variable bspw. mit 5 "a" zu füllen, würde der Aufruf so aussehen:
function FillString(s, zeichen: String; count: Integer): String;
begin s := s + zeichen; if Length(s) < count then s := FillString(s, zeichen, count); Result := s; end;
Delphi-Quellcode:
MfG Pr0g
procedure TForm1.Button1Click(Sender: TObject);
var s: String; begin s := ''; s := FillString(s, 'a', 5); end; |
Re: String mit gleichen Zeichen füllen z.B. s:='aaaaaaaa'
function DupeString(const AText: string; ACount: Integer): string; in der Unit StrUtils...
|
Re: String mit gleichen Zeichen füllen z.B. s:='aaaaaaaa'
Danke für die schnellen Antworten!
Danke Stevie!!!! Habe ich in der Delphi-Hilfe wohl übersehen. :thuimb: Wahrscheinlich bin ich nur zu pingelig. :) Eine Schleife/Rekursion erscheint mir zu langsam, besonders wenn n in den 6stelligen Bereich geht und ich diese Schleife während einer Berechnung mehrmals aufrufen muss. |
Re: String mit gleichen Zeichen füllen z.B. s:='aaaaaaaa'
ob es allerdings mit DupeString() schneller geht...?
gruss, dave |
Re: String mit gleichen Zeichen füllen z.B. s:='aaaaaaaa'
Muss ich wohl testen! :)
Wahrscheinlich benutzt DupeString() intern auch ne Schleife. |
Re: String mit gleichen Zeichen füllen z.B. s:='aaaaaaaa'
Zitat:
Delphi-Quellcode:
function DupeString(const AText: string; ACount: Integer): string;
var P: PChar; C: Integer; begin C := Length(AText); SetLength(Result, C * ACount); P := Pointer(Result); if P = nil then Exit; while ACount > 0 do begin Move(Pointer(AText)^, P^, C); Inc(P, C); Dec(ACount); end; end; |
Re: String mit gleichen Zeichen füllen z.B. s:='aaaaaaaa'
Zitat:
zwar 'nur' Pointer-Gefummel, aber nevertheless ne Schleife :) Gruß Stephan edit: Ups, zu langsam :stupid: |
Re: String mit gleichen Zeichen füllen z.B. s:='aaaaaaaa'
Danke! Na dann ist ja alles geklärt :freak: !
|
Re: String mit gleichen Zeichen füllen z.B. s:='aaaaaaaa'
Zitat:
|
Re: String mit gleichen Zeichen füllen z.B. s:='aaaaaaaa'
DupeString nutzt intern auch eine Schleife. Ich würde Dir empfehlen auf SetLenght und FillChar auszuweichen.
Mache mal eine Leere App mit einem Button und zwei Labels und vergleiche die Ergebnisse. Hier der Button-OnClick Code:
Delphi-Quellcode:
...:cat:...
procedure TForm1.Button1Click(Sender: TObject);
var Start, Stop, Freq: Int64; R1, R2: String; begin QueryPerformanceCounter(Start); R1 := DupeString('a', 10000000); QueryPerformanceCounter(Stop); QueryPerformanceFrequency(Freq); Label1.Caption := Format('%n ms', [(Stop - Start) / Freq * 1000]); QueryPerformanceCounter(Start); SetLength(R2, 10000000); FillChar(R2[1], 10000000, 'a'); QueryPerformanceCounter(Stop); QueryPerformanceFrequency(Freq); Label2.Caption := Format('%n ms', [(Stop - Start) / Freq * 1000]); end; P.S.: DupeString ca. 1 Sekunde; FillChar ca. 20 Millisekunden :shock: |
Re: String mit gleichen Zeichen füllen z.B. s:='aaaaaaaa'
wie wärs mit stringofchar
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin caption := stringofchar('a', 100); end; |
Re: String mit gleichen Zeichen füllen z.B. s:='aaaaaaaa'
Zitat:
...:cat:... |
Re: String mit gleichen Zeichen füllen z.B. s:='aaaaaaaa'
Zitat:
Hast gewonnen! :roll: P.S. Bei mir ist StringOfChar etwas langsamer... P.P.S Endlich Club Member |
Re: String mit gleichen Zeichen füllen z.B. s:='aaaaaaaa'
::: froi ::: :party: :cheers: :bouncing4:
aber ich glaub die frage hatten wir schon ein paarmal :wink: ![]() ps: bei mir: dupe 330 - 16 fillchar |
Re: String mit gleichen Zeichen füllen z.B. s:='aaaaaaaa'
Zitat:
...:cat:... |
Re: String mit gleichen Zeichen füllen z.B. s:='aaaaaaaa'
Zitat:
|
Re: String mit gleichen Zeichen füllen z.B. s:='aaaaaaaa'
die katze herself ;)
empfieht, die StringOfChar-Variante zu nehmen, weil sie "von sich aus" bei Delphi dabei ist. Auch falls sie (ist sie aber nicht ;) ) langsamer sein sollte. ###### Ich vermute, dass dieses vorteilhaft ist a) bei der Optimierung des Codes durch den Compiler (?) b) der Zukunftssicherheit des Codes (die DIYS-Variante könnte irgendwann Fehler hervorrufen, StringOfChar wird es wahrscheinlich noch ne ganze Weile geben) |
Re: String mit gleichen Zeichen füllen z.B. s:='aaaaaaaa'
Zitat:
Ich denke mal, daß es bei der Überprüfung welche schneller ist, eher zu Messfehlern gekommen ist (ich denke mal +/-10 Millisekunden ;) ), da es immer noch andere Dinge zu tun gibt auf dem PC. Ein weiterer Grund ist, das StringOfChar eine einzige Zeile benötigt und einfach sauberer ist. Das ist dann von Vorteil für den Entwickler ;) ...:cat:... |
Re: String mit gleichen Zeichen füllen z.B. s:='aaaaaaaa'
Ok, aber was soll den dieses "Die Funktion ist bei Delphi dabei"? Sind das nicht beide?
|
Re: String mit gleichen Zeichen füllen z.B. s:='aaaaaaaa'
Zitat:
...:cat:... |
Re: String mit gleichen Zeichen füllen z.B. s:='aaaaaaaa'
Vergesst die Bastelei! Um den Code zukunftsicher und portabel zu halten, auf jeden Fall die eingebauten Delphi-Funktionen DupeString/StringOfChar verwenden. Die millisekundenzählerei ist lächerlich. Die meiste Zeit wird durch schlechte Alogorithmen oder schwachsinnige Programmierung vergeudet.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:11 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