Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Teile von "array of char" in "String" kopieren (https://www.delphipraxis.net/100822-teile-von-array-char-string-kopieren.html)

Bubblegum 4. Okt 2007 11:51


Teile von "array of char" in "String" k
 
ich möchte Teile eins "array [0..200] of char" in einen "String" kopieren.
Momentan mache ich das mit einer Vorschleife.
Dafür gibt's doch bestimmte eine schnellere Routine., aber finde keine Passende.

mkinzler 4. Okt 2007 11:56

Re: Teile von "array of char" in "String&
 
Du könntest den Speicherbereich kopieren.

Bubblegum 4. Okt 2007 11:57

Re: Teile von "array of char" in "String&
 
Mit mache ich das?

inherited 4. Okt 2007 11:58

Re: Teile von "array of char" in "String&quo
 
Zitat:

Zitat von Bubblegum
Momentan mache ich das mit einer Vorschleife.

Probiers mal mit einer Nachschleife :lol:

mkinzler 4. Okt 2007 11:59

Re: Teile von "array of char" in "String&
 
Schau dir mal Move() an.

Bubblegum 4. Okt 2007 12:04

Re: Teile von "array of char" in "String&
 
Zitat:

Zitat von inherited
Zitat:

Zitat von Bubblegum
Momentan mache ich das mit einer Vorschleife.

Probiers mal mit einer Nachschleife :lol:

Vorschleife :-D :-D :-D

Das kann nicht von mir gewesen sein!

shmia 4. Okt 2007 12:08

Re: Teile von "array of char" in "String&
 
Delphi-Quellcode:
var
  s: string;
  meinarray : array[0..200] of char;
begin
  SetString(s, PChar(@meinarray[40]), 30);
Nachtrag: Cast-Operator PChar() ergänzt

marabu 4. Okt 2007 12:09

Re: Teile von "array of char" in "String&
 
Hi,

ich würde es so machen:

Delphi-Quellcode:
var
  csa: array [Byte] of Char;
  idx, cnt: Integer;
  s: string;
begin
  // ...
  s := Copy(csa, idx, cnt);
end;
Grüße vom marabu

Bubblegum 4. Okt 2007 12:14

Re: Teile von "array of char" in "String&
 
Zitat:

Zitat von shmia
Delphi-Quellcode:
var
  s: string;
  meinarray : array[0..200] of char;
begin
  SetString(s, @meinarray[40], 30);

Das kann ich nicht kompilieren -> inkompatible Typen

shmia 4. Okt 2007 12:19

Re: Teile von "array of char" in "String&
 
Zitat:

Zitat von marabu
Delphi-Quellcode:
var
  csa: array [Byte] of Char;
  idx, cnt: Integer;
  s: string;
begin
  // ...
  s := Copy(csa, idx, cnt);
end;

Hmmm, das funktioniert zwar, ist aber nicht resourcensparend.
Delphi wandelt einen PChar (hier "csa") ja implizit in einen String um.
Da ja nirgends ein abschliesendes #0 definiert wurde, hängt es von den Umständen ab, wie gross
dieser String wird. Also wird ein langer String erstellt, nur um gleich drauf ein Teilstück rauszukopieren.

shmia 4. Okt 2007 12:30

Re: Teile von "array of char" in "String&
 
Zitat:

Zitat von Bubblegum
Das kann ich nicht kompilieren -> inkompatible Typen

Siehe korrigierten Beitrag #7.

sk0r 4. Okt 2007 12:50

Re: Teile von "array of char" in "String&
 
Ich gehe mal davon aus, dass du einen Bereich im Array kopieren willst.
Also nicht nur von Null bis zu einer bestimmten Zahl, sondern auch von
Vier auf eine bestimmte Zahl. Mit CopyMemory kannst du Chars kopieren.
Durch den letzten Parameter kannst du bestimmen, wie viele Buchstaben du
kopieren willst. Den Startpunkt kannst du ermitteln, indem du die Startadresse
mit der gewünschten Startzahl addierst. Beispiel:

Delphi-Quellcode:
procedure CopyArrayPart(lpszDest: PString; lpszSource: Pointer; dwStart, dwLength: DWord);
var
  lpszStringToPChar: PChar;
begin
  Dec(dwStart); //dwStart verringern, damit man nicht bei Null anfangen muss (Char Start bei Pascal Strings ist ja bei Eins und nicht bei Null, wie es bei nullterminierenden Strings der Fall ist).
  GetMem(lpszStringToPChar, dwStart + dwLength); //Speicher für ein PChar allozieren (so groß, dass man die gewünschten Buchstaben speichern kann)
  CopyMemory(lpszStringToPChar, Pointer(Cardinal(lpszSource) + dwStart), dwLength); //Die angegebene Anzahl der Buchstaben von der Startaddresse + ItemIndex kopieren
  lpszDest^ := strpas(lpszStringToPChar); //PChar in den String kopieren
  FreeMem(lpszStringToPChar, dwStart + dwLength); //PChars Speicher leeren
end;

procedure TForm1.FormCreate(Sender: TObject);
var
  lol: array[0..27-1] of Char;
  kaka: String;
  g: Byte;
begin
  //Das Char Array mit dem ABC LowerCase füllen
  for g := 0 to 27-2 do
    lol[g] := chr(g+97);

  kaka := ''; //Leerer String

  CopyArrayPart(@kaka, @lol, 3, 5); //Ab dem dritten(eigentlich viertem) Buchstaben anfangen und von da an fünf Buchstaben kopieren

  ShowMessage(kaka);

  exitprocess(0);
end;
Habe das gerade aus dem Kopf geschrieben. Ist sicherlich verbesserungsbedürftig.^^
Ob es jetzt schön schnell ist, weiß ich nicht. Ich finde es aber nicht so umständlich,
als wenn man eine For-Schleife benutzt.

Mfg: sk0r

marabu 4. Okt 2007 13:34

Re: Teile von "array of char" in "String&
 
Hallo Andreas,

Zitat:

Zitat von shmia
... das funktioniert zwar, ist aber nicht resourcensparend. ...

ich weiß, es ist auch nicht sehr schnell - ich kenne die Interna. Hätte ich deinen Beitrag gesehen, dann wäre mir klar gewesen, dass es um Geschwindigkeit geht. Der Ansatz mit Copy() hat nur den einen Vorteil: Er operiert auf der höchsten Abstraktionsstufe.

Freundliche Grüße


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:33 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