Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Array aufteilen (https://www.delphipraxis.net/65698-array-aufteilen.html)

Luckie 20. Mär 2006 11:11


Array aufteilen
 
Ich habe ein dynamisches Array, dieses müsste ich in 'Sub'-Arrays zerlegen. Wie mache ich das am günstigsten?
Beispiel:
Delphi-Quellcode:
var
  Range            : TStringArray;
  SubRange         : array of TStringArray;

begin
  setlength(SubRange, MAXTHREADS);
  for i := 0 to MAXTHREADS - 1 do
  begin
    SubRange[i] := ???
  end;
Range ist das dynamische Array welches ich in die Arrays SubRange zerlegen will.

himitsu 20. Mär 2006 11:39

Re: Array aufteilen
 
Wenn Range danach leere Strings enthalten darf, dann könntest du ja einfach die "Pointer" per Move rübercopieren und natürlich Range per FillChar auf 0 setzen, da es ja sonst nette Probleme der StringReferenzierung gibt ._.
(falls ja, könnte ich auch schnell mal 'nen winzigen DemoCode zusammenstellen)

marabu 20. Mär 2006 11:41

Re: Array aufteilen
 
Hallo Michael,

du hast kein Zerlegungskriterium angegeben, aber Copy() könnte dir behilflich sein:

Delphi-Quellcode:
procedure TDemoForm.ButtonClick(Sender: TObject);
var
  range: TStringDynArray;
  subRanges: array of TStringDynArray;
  i: Integer;
begin
  SetLength(range, 12);
  for i := Low(range) to High(range) do
    range[i] := 'Test-' + RandomStr(2);

  SetLength(subRanges, 4);
  for i := Low(SubRanges) to High(subRanges) do
    subRanges[i] := Copy(range, i * 3, 3);
end;
Grüße vom marabu

himitsu 20. Mär 2006 11:44

Re: Array aufteilen
 
:shock: stimmt ja, COPY ging ja auch bei Arrays ... warum vergeß ich dat ständig nur :wall:

Luckie 20. Mär 2006 11:50

Re: Array aufteilen
 
Es gibt kein, bis auf die Tatsache, dass die Reihenfolge erhaklten bleiben sollte.

@marabu: Warum wird i ausgerechnet mit 3 multipliziert und warum die Länge 3?

@himitsu: Ja, ich glaube, das ist es. Besten Dank.

Grml. Warum fehtl der Code aufeinmal in himitsus Posting? :gruebel:

himitsu 20. Mär 2006 11:53

Re: Array aufteilen
 
:wall: hatte erst mabarus Code falsch verstanden, und weil unsere Codes sich ja "fast" glaichen meinen dann wieder gelöscht ^_^

Delphi-Quellcode:
SetLength(subRanges, (Length(Ranges) - 1) div MaxRange + 1);
for i := 0 to High(subRanges) do
  subRanges[i] := Copy(Range, i * MaxRange, MaxRange);

Luckie 20. Mär 2006 12:41

Re: Array aufteilen
 
So muss es heißen:
Delphi-Quellcode:
setlength(SubRange, MAXTHREADS);
len := (length(Range)-1) div MAXTHREADS + 1;
for i := 0 to MAXTHREADS - 1 do
begin
  setlength(SubRange[i], len);
  SubRange[i] := copy(Range, i * len, len);
  New(ThreadParams);
  SetLength(ThreadParams.Range, length(SubRange[i]));
  ThreadParams.Range := SubRange[i];
  CloseHandle(BeginThread(nil, 0, @PingThread, ThreadParams, 0, ThreadID));
end;

himitsu 20. Mär 2006 12:57

Re: Array aufteilen
 
Nicht so?
Delphi-Quellcode:
len := (Length(Range) - 1) div MAXTHREADS + 1;
for i := 0 to (Length(Range) - 1) div len do
begin
  New(ThreadParams);
  ThreadParams^.Range := Copy(Range, i * len, len);
  CloseHandle(BeginThread(nil, 0, @PingThread, ThreadParams, 0, ThreadID));
end;

marabu 20. Mär 2006 13:02

Re: Array aufteilen
 
Zitat:

Zitat von Luckie
Warum wird i ausgerechnet mit 3 multipliziert und warum die Länge 3?

Weil ich kein Zerlegungskriterium hatte, habe ich den range einfach in 4 gleich große Teile zerlegt. Ich hoffte, du würdest den Code an deine Bedürfnisse anpassen können. Es sollte ja nur die ordnungserhaltende Zerlegung demonstriert werden.

marabu

Luckie 20. Mär 2006 13:04

Re: Array aufteilen
 
Ja, es hatte mich nur etwas verwirrt, warum ausgerecht gerade die drei. ;)


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