AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

TArray - Alternative zu SetLength(..) ?

Ein Thema von Der schöne Günther · begonnen am 24. Feb 2014 · letzter Beitrag vom 3. Mär 2020
Antwort Antwort
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.326 Beiträge
 
Delphi 12 Athens
 
#1

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

  Alt 3. Mär 2020, 12:16
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.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Rollo62

Registriert seit: 15. Mär 2007
4.164 Beiträge
 
Delphi 12 Athens
 
#2

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

  Alt 3. Mär 2020, 12:39
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;
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.191 Beiträge
 
Delphi 10 Seattle Enterprise
 
#3

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

  Alt 3. Mär 2020, 13:10
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 😉
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.326 Beiträge
 
Delphi 12 Athens
 
#4

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

  Alt 3. Mär 2020, 14:22
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 SetLength(a, 100); for i := 0 to High(a) do a[i] := 10.0;
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu ( 3. Mär 2020 um 14:28 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:15 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 by Thomas Breitkreuz