Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi funktion explode? (https://www.delphipraxis.net/147996-funktion-explode.html)

paulus11 20. Feb 2010 11:56


funktion explode?
 
Hallo liebe Delphi-Prax'ler:)

ich hätte einmal eine Frage zu der Funktion "explode" mit diesem Quelltext:

Delphi-Quellcode:
Function explode(const Separator,S: string;Limit:Integer = 6):TStringDynArray;
var SepLen: Integer;
F, P:PChar;
ALen, Index: Integer;
Begin
  SetLength(result,0);
  If (S='') or(Limit<0) then Exit;
  If Separator=''Then
  Begin
    SetLength(Result,1);
    Result[0]:=S;
    Exit;
  End;
  SepLen:=Length(Separator);
  Alen:=Limit;
  SetLength(Result,Alen);
  Index:=0;
  P:=PChar(S);
  While P^ <> #0 do Begin
    F:=P;
    P:=AnsiStrPos(P,PChar(Separator));
    If (P=nil) or ((Limit>0) and (Index=Limit -1)) Then P:=strend(F);
    If Index>=Alen Then
    begin
      Inc(Alen,5);
      Setlength(Result,Alen);
    end;
    SetString(Result[Index],F,P-F);
    Inc(Index);
    if p^ <>#0 then inc(p, seplen);
    end;
    if index < Alen Then Setlength(Result,Index);
End;
Ein Freund hatte mir gesagt, das dabei Zeichenketten in ein dynamisches String-Array aufgeteilt werden.

Doch was heißt das jetzt genau? Was macht die Funktion im Allgemeinen?

Ich weiß nicht ob ihr dafür Zeit habt,
aber würde mir jemand vielleicht sogar erklären was in jeder Zeile bzw. in den jeweiligen Abschnitten so ungefähr abläuft?

Das würde mir wirklich sehr weiterhelfen.
Ich hoffe es findet sich jemand, der so nett ist.

Liebe Grüße

[edit=mkinzler]Code-Tag durch Delphi-Tag ersetzt Mfg, mkinzler[/edit]

himitsu 20. Feb 2010 12:16

Re: funktion explode?
 
Wenn man den Anfangskommentar der Funktion nicht gelöscht hätte, dann sollte man eigentlich rausbekommen, was diese Funktion macht.
siehe: http://www.delphipraxis.net/internal...ect.php?t=3816

Zitat:

Delphi-Quellcode:
function Explode(const Separator, S: string; Limit: Integer = 0): TStringDynArray;
Explode trennt S in die durch Separator getrennten Elemente auf.
Und was in jeder Zeile passiert ... ich dachte das erkennt man, wenn man sich den jeweiligen Befehl ansieht und weiß was er macht? (notfalls steht dieses auch nochmals in der OH)

rollstuhlfahrer 21. Feb 2010 00:02

Re: funktion explode?
 
statisches Array: Feste Größe, kann in der Größe nicht verändert werden. Anfangs- und Endindizes können manuell eingestellt werden
Dynamisches Array: Variable/Dynamische Größe, kann verändert werden. (Als Beispiel können hier Strings angeführt werden). Anfangsindex: 0, Endindex: Größe -1

Bernhard

PS: Der Code verwendet für eine schnellere Ausführzeit Pointer-Typen. Somit ist diese Funktion gar nicht auf ein Anfänger-Level runterbrechbar.

himitsu 21. Feb 2010 06:08

Re: funktion explode?
 
Mit dem einem PChar wird hier aber auch sehr sanft umgegangen und es gibt keine wilden/unüberschaubaren Berechnungen oder Kopieraktionen ala Delphi-Referenz durchsuchenMove/Delphi-Referenz durchsuchenMoveMemory damit.

Ein sehr großer Teil dieser Funktion läßt sich eigentlich gut selbererklären und mit F1 sollten sich viele Unklarheiten ausgelöschen lassen.

Wenn jemand bei einem der Befehle/Codezeilen Probleme hat, dann kann derjenige/diejenige auch gern geziehlt danach fragen, aber eine alle Befehler/Zeilen einer einfachen Funktion zu kommentieren, abgesehn davon, daß es unübersichtlich wird ... dafür hab ich dann auch nicht wirklich Lust und Zeit (tut mir ja auch etwas Leid, aber ein bissl Eigeninitiative darf ich doch vor voraussetzen können)


- PChar ist ein Zeiger auf ein Zeichen, z.B. innerhalb eines Strings
- meißten wird auf das erste Zeichen gezeigt, was dann sozusagen einen Zeiger auf den ganzen String ergibt
- das Zeichen #0 ist bei PChar das Ende-Zeichen

- ja und hier wird der Zeiger jeweils auf den Stringanfang und von Delphi-Referenz durchsuchenAnsiStrPos auf das erste Zeichen eines dem Suchmusters entsprechenden Textteiles gesetzt.


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