AGB  ·  Datenschutz  ·  Impressum  







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

Array Zeile löschen

Ein Thema von VkPenguin · begonnen am 2. Mär 2012 · letzter Beitrag vom 7. Mär 2012
Antwort Antwort
Benutzerbild von himitsu
himitsu

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

AW: Array Zeile löschen

  Alt 5. Mär 2012, 20:02
Nein. Listen sind zudem viel schneller und komfortabler als dynamische Arrays. Du musst nur darauf achten, den reservierten Speicher wieder freizugeben, ansonsten entsteht ein Speicherleck.
Schneller nicht. Ordentlioch implementiert ist Beides etwa gleich schnell.

Aber Komfortabler auf jedenfall.

Nja, es wäre ja zu praktisch, wenn die Fragesteller ihre Delphi-Version mal verrraten würden.
Ab Delphi 2009 könnte man z.B. den Generics und einer generischen TList den Komfort nochmal wesentlich erhöhen.

Und was die Speicherlecks angeht:
Eine TObjectList, bzw. einer generischen TObjektList und mit OwnsObjects=True, würde man nochmal etweas mehr Sicherheit und Kompfort rausholen.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.659 Beiträge
 
Delphi 12 Athens
 
#2

AW: Array Zeile löschen

  Alt 6. Mär 2012, 07:24
Eine TObjectList, bzw. einer generischen TObjektList und mit OwnsObjects=True, würde man nochmal etweas mehr Sicherheit und Kompfort rausholen.
Dazu müsste man aus den Records aber erst Klassen machen
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.487 Beiträge
 
Delphi 12 Athens
 
#3

AW: Array Zeile löschen

  Alt 6. Mär 2012, 08:32
Zum ursprünglichen Problem:
Delphi-Quellcode:
for i := Gegneranzahl downto 1 do
begin
  if not Gegner[i].alive then
  Begin
    if i < Gegneranzahl then
      Gegner[I] := Gegner[Gegneranzahl];
 
    Dec(Gegneranzahl);
  end;
end;
Die Umstellung von Records und Arrays auf Objekte und Objektlisten scheint hier sinnvoll. Der Aufwand dürfte sich in Grenzen halten.
Die Alternative mit TList und Pointern zu arbeiten, erfordert mindestens den selben Aufwand und ist nicht so komfortabel.

Geändert von Blup ( 6. Mär 2012 um 08:35 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Array Zeile löschen

  Alt 6. Mär 2012, 08:53
Dazu müsste man aus den Records aber erst Klassen machen
Jupp.

Die generische TList ist leider nur für die haltung von statischen Records, deren Daten man nicht ändert, bzw. die man nur im ganzen ändert.
Das Ändern einzelner Werte eines Records ist nicht (sehr unpraktsich) änderbar.
Und da sich hier ja bestimmte mindestens Werte wie PosX und PosY ändern werden...

Ich hatte mir damit beholfen, daß ich die TList<> erweiterte und ein Items einführte, welches den Pointer auf den Record und nicht eine Kopie Records zurückliefert.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#5

AW: Array Zeile löschen

  Alt 6. Mär 2012, 09:20
Da Ganze ist ein Dilemma. Mit Array zu arbeiten ist für Anfänger einfacher, da man die Vorgänge logisch nachvollziehen kann. Oft wollte man am Anfang auch nur eine Kleinigkeit und plötzlich hat meine ein mächtiges Array-Record an der Backe. Die Verwaltung ist aber dann etwas komplexer. Eine Klasse ist von der Arbeit am Anfang ähnlich, bringt später unheimlich Vorteile, für einen Anfänger evtl. noch schwer nachvollziehbar.
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.659 Beiträge
 
Delphi 12 Athens
 
#6

AW: Array Zeile löschen

  Alt 6. Mär 2012, 09:27
Mit Array zu arbeiten ist für Anfänger einfacher, da man die Vorgänge logisch nachvollziehen kann.
Bei dynamischen Arrays würde ich das aber nicht unterschreiben, da spielen Listen IMO alle Trümpfe aus (Add, Delete etc. gegenüber SetLength, Move usw.).
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Breager

Registriert seit: 18. Feb 2012
40 Beiträge
 
#7

AW: Array Zeile löschen

  Alt 6. Mär 2012, 19:09
Zitat von himitsu:
Das Ändern einzelner Werte eines Records ist nicht (sehr unpraktsich) änderbar.
Was spricht gegen folgendes?
Delphi-Quellcode:
begin
...
TGegnerRecord(Gegnerliste[i]^).Name:='Neuer Gegner';
TGegnerRecord(Gegnerliste[i]^).PosX:=10;
...
end;
Die Klasse muss man auch wieder sauber freigeben. Habe mal im Netz ein Beispiel (als Empfehlung) gefunden, mit einem wunderschönen Speicherleck. Leider weiss ich nicht mehr wo.
  Mit Zitat antworten Zitat
VkPenguin

Registriert seit: 23. Dez 2011
150 Beiträge
 
Delphi XE7 Architect
 
#8

AW: Array Zeile löschen

  Alt 7. Mär 2012, 14:28
Hallo,
habe leider bisher keine Zeit gefunden, alle Beiträge zu lesen und zu überdenken; nur kurz als Antwort: Meine Version ist Delphi 2009, entschuldigt, wusste nicht, dass das wichtig ist
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Array Zeile löschen

  Alt 7. Mär 2012, 15:11
Hast du schonmal mit den Generics gearbeitet?

GegnerListe[0] liefert dort den Record, genauer eine Kopie des Records und keinen Zeiger.

Delphi-Quellcode:
type
  TGegnerRecord = record
   Name:AnsiString;
   PosX:Integer;
   PosY:Integer;
   {...}
  end;

var
  Gegner: TGegnerRecord;
  GegnerListe: TList<TGegnerRecord>;

GegnerListe := TList<TGegnerRecord>.Create;


Gegner.Name := 'ich';
Gegner.PosX := 123;
...
GegnerListe.Add(Gegner);


Label1.Caption := GegnerListe[0].Name:


GegnerListe[0].PosX := 456; // geht nicht, auch wenn der Compiler, in älteren Delphi-Versionen, keine Warnung/Fehlermeldung anzeigt


GegnerListe.Free;
Vorteil ist zwar, daß hier delphi die komplette Speicherverwaltung übernimmt, innerhalb der Liste und auch für die Einzelrecords.
Ein Therapeut entspricht 1024 Gigapeut.
  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 03:26 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