![]() |
String-Result auf welche länge setzen?
Moin,
Delphi-Quellcode:
Obiges Beispiel funktioniert ja nicht, da der Resultstring die Länge 0 hat.... nur auf welche Länge setze ich ihn, wenn ich noch gar nicht weiss wie lang er wird? Immer die Länge um 1 vergrössern kanns ja nicht sein oder?
function irgendwas: string;
var PRes: PChar; begin Result := ''; PRes := @Result[1]; // hier weiter end; |
Re: String-Result auf welche länge setzen?
Ist aber die einzige Möglichkeit, wenn du nicht weist, wie groß der String wird.
Außer du gibst ihm erstmal eine Maximallänge, die du dann zum Schluss wieder kürzt (find ich aber ziemlich dirty). |
Re: String-Result auf welche länge setzen?
Dein Frage ist so gut wie unverständlich.
Aber ich zeige hier mal ein Beispiel, wie man mit SetLength und Zeigern arbeitet: Der "Trick" bei folgender Funktion ist, dass zuerst so viel Speicher mit SetLength reserviert wird, wie das Ergebnis max. haben kann. Am Ende wird dann auf die wirkliche Größe reduziert.
Delphi-Quellcode:
function KonvertUmlaute(const s: string): string;
var i,slen: integer; src,dst: PChar; begin slen := Length(s); SetLength(Result, slen * 2); // Ergebnis kann u.U. doppelt so groß if slen = 0 then Exit; src := PChar(@s[1]); dst := PChar(@Result[1]); for i := 1 to slen do begin case src^ of 'ä': begin dst[0] := 'a'; dst[1] := 'e'; Inc(dst,2); end; 'ö': begin dst[0] := 'o'; dst[1] := 'e'; Inc(dst,2); end; 'ü': begin dst[0] := 'u'; dst[1] := 'e'; Inc(dst,2); end; 'Ä': begin dst[0] := 'A'; dst[1] := 'E'; Inc(dst,2); end; 'Ö': begin dst[0] := 'O'; dst[1] := 'E'; Inc(dst,2); end; 'Ü': begin dst[0] := 'U'; dst[1] := 'E'; Inc(dst,2); end; 'ß': begin dst[0] := 's'; dst[1] := 's'; Inc(dst,2); end; else dst^ := src^; Inc(dst); end; Inc(src); end; SetLength(Result, dst-PChar(@Result[1])); end; |
Re: String-Result auf welche länge setzen?
Hi,
Delphi-Quellcode:
Solche Konstrukte sind insbesondere bei Rechenintensiven Prozessen sehr langsam.
Result := Result + 'das';
Wenn du also gewissermassen abschätzen kannst, wie lang der String wird, setze ihn und und leg am Ende noch einmal die Länge fest. Ansonsten könntest du auch eine StringList verwenden, diese ist aber auch nicht immer und überall einsetztbar. |
Re: String-Result auf welche länge setzen?
Moin,
danke für die Antworten und Dein Beispiel, shmia. Das Problem ist aber, das ich die genaue Resultgrösse nicht wissen kann, da sie u.U nicht nur verdoppelt wird, sondern ganze Wörter hinzukommen sollen. Wenn man weiss das das Result nachher kleiner ist, als ein übergebener String, dann ist das ja alles ganz easy, da man das Result ja nur auf die Grösse des des Strings setzen muss. Umgekehrt ist das für mich aber nicht so einfach, ich denke ein "* 2" reicht da nicht. |
Re: String-Result auf welche länge setzen?
Wenn du das längste Wort ermittelt hast, ist das auch ganz easy,
dabei könnten allerdings Speicher-Probleme auftreten, je nachdem wieviel Speicher du reservieren müsstest. |
Re: String-Result auf welche länge setzen?
API Funktionen arbeiten so, dass sie die Größe des benötigten Puffers zurückgeben, wenn zu wenig Speicher angefordert wurde. Üblicherweise geht man dann so vor, dass man die Funktion zweimal aufruft, einmal mit nil, um rauszubekommen wie viel Speicher man reservieren muss und dann noch ein zweites mal mit einem Puffer der entsprechend groß ist. GetWindowsDirectory ist zum Beispiel so eine Funktion, nur dass man da üblicherweise MAX_PATH nimmt, weil das Windowsverzeichnis nicht länger sein kann. ;)
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:40 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