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 sx2008
sx2008

Registriert seit: 15. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#1

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

  Alt 25. Feb 2014, 09:39
... dass ich gerne eine Kollektion (wie eine Liste) hätte
Collections braucht man in Delphi nur, wenn man die Collection im Objektinspektor editieren möchte (oder den Persistenzmechanismus von Delphi ausnützen möchte).
Damit ist das Anwendungsgebiet von Collections die Komponentenentwicklung.

Um eine hohe Anzahl von Booleans speichersparend zu verwalten eignet sich die Klasse TBits.
fork me on Github
  Mit Zitat antworten Zitat
Der schöne Günther

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

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

  Alt 25. Feb 2014, 13:23
Ich habe weder eine "hohe Anzahl", noch muss ich dringend Speicher sparen. Ist doch nicht verboten, seine Booleans in eine Liste zu packen?
  Mit Zitat antworten Zitat
Furtbichler
(Gast)

n/a Beiträge
 
#3

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

  Alt 25. Feb 2014, 15:18
Delphi-Quellcode:
Const
  MyList : Array [0..4] Of Boolean = (false,true,false,true,false);
Ist zwar nur ein Array, aber immerhin.
  Mit Zitat antworten Zitat
Benutzerbild von Jonas Shinaniganz
Jonas Shinaniganz

Registriert seit: 30. Aug 2011
249 Beiträge
 
Delphi XE5 Ultimate
 
#4

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

  Alt 25. Feb 2014, 15:51
Zitat:
Ich hätte jetzt gerne eine Art TArray<Integer>.Create(elementCount: Integer) .
Dann schreib dir doch so einen Klasse.

Delphi-Quellcode:
uses System.Generics.Collections;

TMyList<T> = class TList<T>
...
constructor Create(T...; Elements : Integer)


begin
    inherited Create(T...);
    
    for itemNo := 0 to Pred(Elements) do
       Add(X);
end;
??
Die Leiter der Entwicklungsabteilung dreht total am Mausrad!
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

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

  Alt 3. Mär 2020, 11: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.174 Beiträge
 
Delphi 12 Athens
 
#6

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

  Alt 3. Mär 2020, 11: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.199 Beiträge
 
Delphi 10 Seattle Enterprise
 
#7

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

  Alt 3. Mär 2020, 12: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.372 Beiträge
 
Delphi 12 Athens
 
#8

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

  Alt 3. Mär 2020, 13: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 13: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 18:58 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