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 zum array of char (https://www.delphipraxis.net/28022-string-zum-array-char.html)

Snoop007 18. Aug 2004 19:46


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 ?

glkgereon 18. Aug 2004 19:52

Re: string zum array of char
 
probiers mal mit ner einfachen zuweisung aus

ich mein das ginge...

Snoop007 18. Aug 2004 20:00

Re: string zum array of char
 
hi,
ne leider geht das nicht
Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);
var
  CharArray : array [0..254] of char;
  StringX : string[255];
begin
  CharArray := StringX;
end;
Fehlermeldung : Inkompatible Typen : Array und ShortString

glkgereon 18. Aug 2004 20:03

Re: string zum array of char
 
versuch ma ohne [255]... vielleicht isses dann kein shortstring mehr

Snoop007 18. Aug 2004 20:04

Re: string zum array of char
 
das geht ja gar net :) habs aber getestet
Fehler array und string

Robert_G 18. Aug 2004 20:24

Re: string zum array of char
 
  • Lösung 1 - Iterieren:
    Delphi-Quellcode:
      set_Length(CharArray, length(StringVar));
      for i := 0 to pred(length(StringVar)) Do
        CharArray[i] := StringVar[i];
    Es gibt bestimmt noch eine elegante Lösung, sorry ich bin irgendwie nicht mehr so vertraut mit der RTTI von Delphi32. :?


  • Lösung 2 - .Net :P
    Delphi-Quellcode:
      CharArray := StringVar.ToCharArray();

Edit : pred vergessen :oops:

Snoop007 18. Aug 2004 20:37

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

Shaman 18. Aug 2004 20:38

Re: string zum array of char
 
So geht's ab:

Delphi-Quellcode:
type
  PCharArray = ^TCharArray;
  TCharArray = array[0..255] of char;
var
  CharArray: TCharArray;
  S: string;
begin
  CharArray:= PCharArray(PChar(S))^;
end;
Gruss
Shaman

Edit: Den PChar kannst Du sogar weglassen

dizzy 18. Aug 2004 20:38

Re: string zum array of char
 
Über einen Cast gehts:

Delphi-Quellcode:
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;
mit einem ShortString:

Delphi-Quellcode:
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;
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 ;)

\\edit: Boah, aber Millisekunden zu lahm :)

Nothine 18. Aug 2004 20:55

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;

Snoop007 18. Aug 2004 20:56

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 !

dizzy 18. Aug 2004 23:48

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:
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;
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:!!
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

Nothine 19. Aug 2004 00:03

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

Snoop007 19. Aug 2004 00:35

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:
..for m := 0 to Length(S) do..
jedesmal die länge neu berechnen, ( oder ist es optimiert und wird nur einmal berechent ? glaub ich net )
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

nailor 19. Aug 2004 01:39

Re: string zum array of char
 
man kann das ganze auch noch schneller machen

Delphi-Quellcode:
asm
// [...]
end;
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.

dizzy 19. Aug 2004 02:31

Re: string zum array of char
 
Zitat:

Zitat von Snoop007
du lässt [...] jedesmal die länge neu berechnen, ( oder ist es optimiert und wird nur einmal berechent ? glaub ich net )

Ich glaube auch nicht, dass das nur ein Mal gemacht wird... stimmt, das ist noch Potential drin :)

Zitat:

Zitat von Snoop007
[...] immer 255 zeichen kopiert werden sollen

Zwar ist dieses Zitat aus dem Zusammenhang gerissen, aber das hat mir jetzt die Idee gegeben, warum der Cast z.T. langsamer ist: Beim Cast wird alles kopiert, in der Schleife nur "Length" viele Chars.
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:.

ripper8472 19. Aug 2004 02:38

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

dizzy 19. Aug 2004 02:48

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.

Nothine 19. Aug 2004 03:06

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:
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;
Edit: ich hab grad auch mal den zeittest gemacht, und eigentlich schneidet diese variante recht gut ab (im bsp. um 800 ms)
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 03:44 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz