Delphi-PRAXiS
Seite 3 von 3     123   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi TArray - Alternative zu SetLength(..) ? (https://www.delphipraxis.net/179284-tarray-alternative-zu-setlength.html)

Stevie 26. Feb 2014 12:46

AW: TArray - Alternative zu SetLength(..) ?
 
Als Liste sehe ich hier auch keinen Nutzen. Was eher irgendwo mal nützlich sein könnte, wäre sowas, wie Enumerable.Repeat oder Enumerable.Range.
Beides werde ich evtl noch bei
Delphi-Quellcode:
Spring.Collections.TCollections
hinzufügen.

Der schöne Günther 26. Feb 2014 12:59

AW: TArray - Alternative zu SetLength(..) ?
 
Zitat:

Enumerable.Repeat<T>(T wert, int Count)
Exakt, ganz genau das ist, was ich wollte und im Endeffekt ja auch mache. Da es in den Spring4D-Collections ja noch nicht drinsteckt, wollte ich halt im Konstruktor einfach so ein Array reinstecken.

Tue ich ja auch. Ich bin glücklich. Und trotzdem kommen alle, und wollen mich in die Zwangsjacke stecken :-(

Mavarik 26. Feb 2014 14:34

AW: TArray - Alternative zu SetLength(..) ?
 
Zitat:

Zitat von Der schöne Günther (Beitrag 1249716)
Und trotzdem kommen alle, und wollen mich in die Zwangsjacke stecken :-(

Ja klar, weil Du es nicht geschafft hast ein einziges mal uns eine Anwendung dafür zu nennen! Oder ist das ein Geheimnis?

QuickAndDirty 3. Mär 2020 10:03

AW: TArray - Alternative zu SetLength(..) ?
 
Zitat:

Zitat von Mavarik (Beitrag 1249724)
Zitat:

Zitat von Der schöne Günther (Beitrag 1249716)
Und trotzdem kommen alle, und wollen mich in die Zwangsjacke stecken :-(

Ja klar, weil Du es nicht geschafft hast ein einziges mal uns eine Anwendung dafür zu nennen! Oder ist das ein Geheimnis?

Ich meine, wenn er sagt was er gerne hätte, dann ist doch total egal ob er dazu auch eine Anwendung nennt oder ob er sie Geheimhält.
Wieso, wenn man die Lösung weiß, diese verschweigen, nur weil man keinen überzeugenden Verwendungszweck genannt bekommt?
Sehr verwirrend.
Zitat:

Zitat von Der schöne Günther (Beitrag 1249716)
Und trotzdem kommen alle, und wollen mich in die Zwangsjacke stecken :-(

Hast du dir mal deinen Nickname angeschaut? :)

Der schöne Günther 3. Mär 2020 10:11

AW: TArray - Alternative zu SetLength(..) ?
 
Viele Jahre sind seitdem vergangen, und ich blicke zurück auf mein TArray.Construct<T>(..) das ich mir nach dieser feurigen Diskussion hier wohl gebaut haben muss. Anwendungsfälle hatte ich in der Zwischenzeit viele, insbesondere für Tests.

Ich bereue nichts.

himitsu 3. Mär 2020 11:16

AW: TArray - Alternative zu SetLength(..) ?
 
Zitat:

Zitat von Der schöne Günther (Beitrag 1249527)
Ich habe weder eine "hohe Anzahl", noch muss ich dringend Speicher sparen. Ist doch nicht verboten, seine Booleans in eine Liste zu packen?

Nja, im Grunde hat eine TList<T> intern auch nur ein TArray<T> drinnen, auf das man mit deren Funktionen (Add/Insert/Delete/...) zugreifen kann.

Gut, wenn man anfängt mittendrin Booleans einzufügen oder rauszulöschen, ohne einen Zusammenhang zu irgendwas, oder der Zusammenhang zu einer anderen unabhängigen Liste, dann würde mit eher der Gedanke zu sowas die einem TDictionary<Irgendwas,Boolean> schwelgen.

PS: Delphi-Referenz durchsuchenTBits ... das ist eine Liste von Bits, also 1-Bit-Boleans. :stupid:

Rollo62 3. Mär 2020 11:39

AW: TArray - Alternative zu SetLength(..) ?
 
Was genau Du willst kann ich leider auch nicht nachvollziehen, aber vielleicht geht das hier in deine Richtung.
Man könnte solche Initialisierungen evtl. so machen, und die eigentlichen Settings damit separat kapseln.

Delphi-Quellcode:
var
  LVar1 : TWasAuchImmer;
  LVar2 : TWasAuchImmer;
  LVar3 : TWasAuchImmer;

  Init_FuerAufgabe1( LVar1 );
  Init_FuerAufgabe2( LVar2 );
  Init_FuerAufgabe3( LVar1 );
...


procedure Init_FuerAufgabe1( var AVar : TWasAuchImmer);
begin
    if not Assigned( AVar ) then
        AVar := TWasAuchImmer.Create;

    AVar.Items.Clear;
    AVar.Items.Add( false );
    AVar.Items.Add( true );
    AVar.Items.Add( false );
    AVar.Items.Add( false );
    AVar.Items.Add( false );
end;



procedure Init_FuerAufgabe2( var AVar : TWasAuchImmer);
begin
    if not Assigned( AVar ) then
        AVar := TWasAuchImmer.Create;

    AVar.Items.Clear;
    AVar.Items.Add( false );
    AVar.Items.Add( true );
    AVar.Items.Add( false );
    AVar.Items.Add( true);
    AVar.Items.Add( false );
end;


procedure Init_FuerAufgabe3( var AVar : TWasAuchImmer);
begin
    if not Assigned( AVar ) then
        AVar := TWasAuchImmer.Create;

    AVar.Items.Clear;
    AVar.Items.Add( true );
    AVar.Items.Add( true );
    AVar.Items.Add( false );
    AVar.Items.Add( false );
    AVar.Items.Add( false );
end;

Der schöne Günther 3. Mär 2020 12:10

AW: TArray - Alternative zu SetLength(..) ?
 
Ich gebe nochmal ein Beispiel.

Ganz klassisch:

Delphi-Quellcode:
procedure p();
var
   a, b: TArray<Single>;
   arrayIndex: Integer;
begin
   SetLength(a, 100);
   for arrayIndex := Low(a) to High(a) do
      a[arrayIndex] := 10.0;
   
   SetLength(b, 50);
   for arrayIndex := Low(b) to High(b) do
      b[arrayIndex] := 20.0;
      
   ProcessData(a, b);
end;
Mir war das zu lang. Ich wollte lieber so etwas haben:
Delphi-Quellcode:
procedure p()
begin
   ProcessData(
      TArray.Construct<Single>(100, 10.0),
      TArray.Construct<Single>(50, 20.0)
   );
end;

Ich bekam es. Und sah dass es gut war. Ende 😉

himitsu 3. Mär 2020 13:22

AW: TArray - Alternative zu SetLength(..) ?
 
Ja, im Grunde wäre es zu praktisch, wenn der Array-Helper im Delphi bereits eine Create-Methode hätte, wo man eine Länge mit optionaler Initialisierung angeben könnte.


Nach SetLength ist der neue Speicher mit 0 initialisiert,
beim Boolean-Array macht ein FillChar mit 1 bzw. mit Ord(True) ganz viele True daraus.

Delphi-Quellcode:
uses
  AnsiStrings;

procedure TForm1.FormCreate(Sender: TObject);
var
  a: TArray<Single>;
begin
  //SetLength(a, 100);
  //for i := Low(a) to High(a) do
  //  a[i] := 10.0;

  SetLength(a, 100);
  Move(PAnsiChar(DupeString(#0#0' A', 100))^, a[0], 100*4); // oder FillChar für ByteTypen
oder
Delphi-Quellcode:
SetLength(a, 100); for i := 0 to High(a) do a[i] := 10.0;
:stupid:


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:37 Uhr.
Seite 3 von 3     123   

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