Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi String mit gleichen Zeichen füllen z.B. s:='aaaaaaaa' (https://www.delphipraxis.net/22865-string-mit-gleichen-zeichen-fuellen-z-b-s-%3Daaaaaaaa.html)

gmarts 25. Mai 2004 12:52


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

ims 25. Mai 2004 12:59

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

Pr0g 25. Mai 2004 13:00

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:
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;
Um eine Variable bspw. mit 5 "a" zu füllen, würde der Aufruf so aussehen:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  s: String;
begin
  s := '';
  s := FillString(s, 'a', 5);
end;
MfG Pr0g

Stevie 25. Mai 2004 13:01

Re: String mit gleichen Zeichen füllen z.B. s:='aaaaaaaa'
 
function DupeString(const AText: string; ACount: Integer): string; in der Unit StrUtils...

gmarts 25. Mai 2004 13:04

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.

ims 25. Mai 2004 13:05

Re: String mit gleichen Zeichen füllen z.B. s:='aaaaaaaa'
 
ob es allerdings mit DupeString() schneller geht...?


gruss, dave

gmarts 25. Mai 2004 13:06

Re: String mit gleichen Zeichen füllen z.B. s:='aaaaaaaa'
 
Muss ich wohl testen! :)

Wahrscheinlich benutzt DupeString() intern auch ne Schleife.

Stevie 25. Mai 2004 13:07

Re: String mit gleichen Zeichen füllen z.B. s:='aaaaaaaa'
 
Zitat:

Zitat von ims
ob es allerdings mit DupeString() schneller geht...?

Urteile selbst... :wink:
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;

Steve 25. Mai 2004 13:08

Re: String mit gleichen Zeichen füllen z.B. s:='aaaaaaaa'
 
Zitat:

Zitat von gmarts
Wahrscheinlich benutzt DupeString() intern auch ne Schleife.

Jap, so schaut's aus
zwar 'nur' Pointer-Gefummel, aber nevertheless ne Schleife :)


Gruß
Stephan

edit: Ups, zu langsam :stupid:

gmarts 25. Mai 2004 13:09

Re: String mit gleichen Zeichen füllen z.B. s:='aaaaaaaa'
 
Danke! Na dann ist ja alles geklärt :freak: !

Stevie 25. Mai 2004 13:09

Re: String mit gleichen Zeichen füllen z.B. s:='aaaaaaaa'
 
Zitat:

Zitat von Steve
edit: Ups, zu langsam :stupid:

[OT]Das i macht den Unterschied! 8)[/OT]

sakura 25. Mai 2004 13:11

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:
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;
...:cat:...

P.S.: DupeString ca. 1 Sekunde; FillChar ca. 20 Millisekunden :shock:

nailor 25. Mai 2004 13:11

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;

sakura 25. Mai 2004 13:14

Re: String mit gleichen Zeichen füllen z.B. s:='aaaaaaaa'
 
Zitat:

Zitat von nailor
wie wärs mit stringofchar

Ich habe wieder etwas gelernt :firejump: Im Ernst, StringOfChar und meine Variante sind ca. gleich schnell, StringOfChar ist allerdings durch den Compiler besser integriert und somit wohl einen klitzekleinen Tick schneller ;)

...:cat:...

Stevie 25. Mai 2004 13:16

Re: String mit gleichen Zeichen füllen z.B. s:='aaaaaaaa'
 
Zitat:

Zitat von sakura
P.S.: DupeString ca. 1 Sekunde; FillChar ca. 20 Millisekunden :shock:

Bei mir 1 sek und 60 ms

Hast gewonnen! :roll:

P.S. Bei mir ist StringOfChar etwas langsamer...

P.P.S Endlich Club Member

nailor 25. Mai 2004 13:16

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:

Hier im Forum suchenstringofchar



ps: bei mir:
dupe 330 - 16 fillchar

sakura 25. Mai 2004 13:22

Re: String mit gleichen Zeichen füllen z.B. s:='aaaaaaaa'
 
Zitat:

Zitat von Stevie
P.S. Bei mir ist StringOfChar etwas langsamer...

Ich würde es Dir trotzdem empfehlen, da es "nativ" zu Delphi gehört ;)

...:cat:...

Stevie 25. Mai 2004 13:34

Re: String mit gleichen Zeichen füllen z.B. s:='aaaaaaaa'
 
Zitat:

Zitat von sakura
Zitat:

Zitat von Stevie
P.S. Bei mir ist StringOfChar etwas langsamer...

Ich würde es Dir trotzdem empfehlen, da es "nativ" zu Delphi gehört ;)

...:cat:...

Häh?? :gruebel: Versteh ich nicht...

nailor 25. Mai 2004 13:41

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)

sakura 25. Mai 2004 13:47

Re: String mit gleichen Zeichen füllen z.B. s:='aaaaaaaa'
 
Zitat:

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

Nicht unbedingt, ich habe mir schon einige lahme Delphi-Routinen umgeschrieben.

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:...

Stevie 25. Mai 2004 13:58

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?

sakura 25. Mai 2004 14:36

Re: String mit gleichen Zeichen füllen z.B. s:='aaaaaaaa'
 
Zitat:

Zitat von Stevie
Ok, aber was soll den dieses "Die Funktion ist bei Delphi dabei"? Sind das nicht beide?

Bin ich mal pingelich: Das eine ist eine fertige Funktion, das andere ist eine Lösung, welche auf zwei fertigen Funktionen basiert ;)

...:cat:...

Insider2004 15. Aug 2004 13:53

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