![]() |
string zum array of char
hi,
ich möchte auf einfachsteweise, die daten eines strings in ein array of char "packen" sicher könnte ich dazu eine schleife nehmen, aber könnte das nicht einfacher/schöner gehen ? die function copy wird in der delphi hilfe zwar so beschrieben, das sie auch ein array zurückliefern könnte, mach sie aber nicht wisst ihr da was ? |
Re: string zum array of char
probiers mal mit ner einfachen zuweisung aus
ich mein das ginge... |
Re: string zum array of char
hi,
ne leider geht das nicht
Delphi-Quellcode:
Fehlermeldung : Inkompatible Typen : Array und ShortString
procedure TForm1.Button2Click(Sender: TObject);
var CharArray : array [0..254] of char; StringX : string[255]; begin CharArray := StringX; end; |
Re: string zum array of char
versuch ma ohne [255]... vielleicht isses dann kein shortstring mehr
|
Re: string zum array of char
das geht ja gar net :) habs aber getestet
Fehler array und string |
Re: string zum array of char
Edit : pred vergessen :oops: |
Re: string zum array of char
also scheints nur mit ner schleife zu gehen, schade
.Net hab ich Net ^^ deshalb kann ich den unteren code nicht nutzen ok, danke euch |
Re: string zum array of char
So geht's ab:
Delphi-Quellcode:
Gruss
type
PCharArray = ^TCharArray; TCharArray = array[0..255] of char; var CharArray: TCharArray; S: string; begin CharArray:= PCharArray(PChar(S))^; end; Shaman Edit: Den PChar kannst Du sogar weglassen |
Re: string zum array of char
Über einen Cast gehts:
Delphi-Quellcode:
mit einem ShortString:
procedure TForm1.Button1Click(Sender: TObject);
type TCharArray = array[0..255] of Char; PCharArray = ^TCharArray; var a: TCharArray; s: String; begin s := 'Test'; a := PCharArray(s)^; Form1.Caption := a; end;
Delphi-Quellcode:
Problem hier: Es schleichen sich am Anfang und ende ein paar Zeichen ein. Hab's auf die Schnelle nicht hinbekommen dass das sauber wird, aber es kompiliert schonmal ;)
procedure TForm1.Button1Click(Sender: TObject);
type TCharArray = array[0..255] of Char; var a: TCharArray; s: String[255]; begin s := 'Test'; a := TCharArray(s); Form1.Caption := a; end; \\edit: Boah, aber Millisekunden zu lahm :) |
Re: string zum array of char
es geht auch so ^^
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var A: array of Char; S: string; begin S := 'blablabla'; string(A) := PChar(S); Form1.Caption := string(A); end; |
Re: string zum array of char
danke euch ! das war echt eine gute idee mit dem casten !!
ich habe die zeit gemessen, einmal kopierte das programm die zeichen, das andere mal hab ich die zeichen mit dem casten rübergebracht beide ergebnisse sind gleich, 0 Milisekunden; dann machts keinen unterschied, wie ich die zeichen hin und herbewege vielen dank ! |
Re: string zum array of char
Du hast doch bestimmt nur ein einmaliges Ausführen gemessen, gell? Mach das mal in einer Schleife, so ~10.000.000 mal. Dann wirst du einen kräftigen Unterschied bemerken!
Hab mal grad ausprobiert:
Delphi-Quellcode:
Also im ersten Fall mit Cast, im 2. mit Kopierschleife. Und jetzt kommt der Knaller: Bei 21 Zeichen (wie hier im Bsp.) sind beide Verfahren tatsächlich faktisch gleich schnell. Mit weniger Zeichen ist die Kopierschleife erheblich schneller :shock:!!
type
TCharArray = array[0..255] of Char; PCharArray = ^TCharArray; . . . const st: string = 'AF724H8u+_99Hqifbq251'; . . . procedure TForm1.Button1Click(Sender: TObject); var A: TCharArray; S: string; i: Integer; t: Int64; begin S := st; t := GetTickCount; for i := 1 to 10000000 do A := PCharArray(S)^; t := GetTickCount - t; Form1.Caption := string(A)+' in '+IntToStr(t)+'ms'; end; procedure TForm1.Button2Click(Sender: TObject); var A: TCharArray; S: string; i,m: Integer; t: Int64; begin S := st; t := GetTickCount; for i := 1 to 10000000 do for m := 0 to Length(S) do A[m] := S[m+1]; t := GetTickCount - t; Form1.Caption := string(A)+' in '+IntToStr(t)+'ms'; end; Macht ein Cast so einen Aufwand? Ist doch im Grunde keine Arbeit hinter, oder? Ich hätte bis gerade noch meinen Ar*** darauf verwettet, dass der Cast immer schneller ist :roteyes:. gruss, ein verdutzter dizzy |
Re: string zum array of char
andererseits ist der cast bei bspw. 56 zeichen (damit hab ichs getestet) mehr als doppelt so schnell :!: kommt also ganz drauf an wofür man das einsetzen will...
|
Re: string zum array of char
ich hab es mehrfach ausgeführt, allerdings nicht in einer schleife ist , wie ich finde auch nicht nötig ( in meinem fall ) -> unrealistisch
du lässt
Delphi-Quellcode:
jedesmal die länge neu berechnen, ( oder ist es optimiert und wird nur einmal berechent ? glaub ich net )
..for m := 0 to Length(S) do..
das verbraucht zu viel zeit, da immer 255 zeichen kopiert werden sollen, könnte es ein konstanter wert sein ( ja ja jetzt geht die kleinkarriertheit los :drunken: ) beim casten werden auch alle zeichen werden kopiert |
Re: string zum array of char
man kann das ganze auch noch schneller machen
Delphi-Quellcode:
hab jetzt bisschen was ausgelassen, aber das prinzip sollte klar sein ;). an sonsten bleibt zu sagen, dass es, falls es sich nicht um einen der berüchtigten flaschenhälse handelt, es ziemlich egal sein dürfte, welche variante man wählt. man kann die typecast-version noch ein wenig tunen, aber die schleife kann man imho besser lesen.
asm
// [...] end; |
Re: string zum array of char
Zitat:
Zitat:
Also ist es - so man das an einer zeitkritischen Stelle verwenden will - abhängig von den vorliegenden Datentypen, und deren Längen und tatsächlich gefüllten Längen welche Variante man nun benutzt. Den Cast finde ich imho aber übersichtlicher, da es ja nur eine Zeile ist. Die Schleife sieht irgendwie "zerupft" aus :stupid:. |
Re: string zum array of char
das müsste ja auch mit memcopy (oder wie des hier heißt) gehen. einfach den ansistring zum pointer casten, mit Addr() die Adresse des ersten zeichens vom char array ermitteln und dann kopieren. ich denk mal, es ist langsamer als ein cast, aber mindestens schneller als durch den string iterieren und die chars einzeln zuweisen.
[edit] der cast ist ja nicht das langsame, sondern dass diese gecastete variable dann kopiert wird... also söllte memcopy doch schneller als das sein |
Re: string zum array of char
Dürfte einem Cast sehr ähnlich sein, da ja auch alles kopiert wird. Ermittelt man aber vorher die tatsächlich benötigte Länge, könnte das u.U. performanter sein, jupp.
|
Re: string zum array of char
hab mal ein bissl rumprobiert, die entsprechung der memcopy funktion ist die funktion move, und denn entsprechenden code will ich euch natürlich auch nicht vorenthalten :roll:
Delphi-Quellcode:
Edit: ich hab grad auch mal den zeittest gemacht, und eigentlich schneidet diese variante recht gut ab (im bsp. um 800 ms)
procedure TForm1.Button1Click(Sender: TObject);
var S: string; A: array of Char; begin S := 'blablabla'; SetLength(A,Length(S)); Move(PChar(S)^,A[0],Length(S)); Form1.Caption := string(A); end;
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var S: string; A: array of Char; I: Integer; T: Int64; begin S := 'blablablablablablablablablablablablablablablablablablabla'; SetLength(A,Length(S)); T := GetTickCount; for I := 1 to 10000000 do Move(PChar(S)^,A[0],Length(S)); Form1.Caption := string(A)+' in '+IntToStr(GetTickCount-T)+' ms'; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:45 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 by Thomas Breitkreuz