Delphi-PRAXiS
Seite 4 von 5   « Erste     234 5      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi denkfehler; array-> dynarray (https://www.delphipraxis.net/127138-denkfehler%3B-array-dynarray.html)

vsilverlord 8. Jan 2009 14:12

Re: denkfehler; array-> dynarray
 
ich bin jetzt nochmal alles durchgegangen. Den ganzen verdammten quelltext.
Ich hab jetzt wieder alle arrays statisch zurückgebaut.
-> siehe da, es funktioniert wieder.
Wo ich wieder beim Anfang wäre...
Gibt es Mengentypen [die so funktionieren wie arrays] mit denen ich mehr als 10000 typen speichern kann?
nein?
[die frage, warum das mit den dynamischen arrays nicht funktioniert verschieb ich auf nächstes jahr]
d.h nach 10000 durchläufen bin ich gezwungen, den stapel zu leeren, abzuspeichern und einen neuen stapel aufzubauen?
na toll.
Ach ja [ das ist jetzt nicht ironisch] vielen Dank für eure Hilfe, wenigstens habt ihr es versucht, ich bin euch sehr dankbar dafür. :thumb:
...

Klaus01 8. Jan 2009 14:17

Re: denkfehler; array-> dynarray
 
..warum gehen denn nur 10000 Elemente?
Ist der Speicher (Stack)zu gering?

Grüße
Klaus

Luckie 8. Jan 2009 14:18

Re: denkfehler; array-> dynarray
 
Warum machst du aus den Viechern keine Objekte mit Eigenschaften und Methoden? Verwalten würde ich das ganze dann in einer Containerklasse: http://www.michael-puff.de/Artikel/C...rKlassen.shtml

vsilverlord 8. Jan 2009 14:23

Re: denkfehler; array-> dynarray
 
ja, stack ist zu gering.

Klaus01 8. Jan 2009 14:26

Re: denkfehler; array-> dynarray
 
Zitat:

Zitat von vsilverlord
ja, stack ist zu gering.

.. dann mache doch aus der globalen Variablen eine lokale Variable.
edit: oder nutze dynamische Listen, wir TList oder wie schon versucht dynamische Arrays.


Grüße
Klaus

HenKst 8. Jan 2009 14:27

Re: denkfehler; array-> dynarray
 
Du könntest uns mal den genauen code von der TViech declaration und der mutier function geben

Ich sehe momentan keinen unterschied zwischen dynamischen und statischen arrays der auf den code den du uns hier gegeben hast irgendeinen Einfluss hätte. (mal von setlength abgesehn)

Wie gesagt: wenn er bei einer änderung am letzten Element im selben Schritt alle anderen ändert, sieht das für mich sehr so aus als stünden in deinem array nur pointer.

Das sollte aber a: bei dynamischen und statischen arrays gleich sein, und b: sollte das überhaupt nicht so sein wenn TViech ein record ist, weil der komplette record im array steht.

guidok 8. Jan 2009 15:09

Re: denkfehler; array-> dynarray
 
Zitat:

Zitat von Luckie
Warum machst du aus den Viechern keine Objekte mit Eigenschaften und Methoden? Verwalten würde ich das ganze dann in einer Containerklasse: http://www.michael-puff.de/Artikel/C...rKlassen.shtml

Ich würde da auch objektorientiert arbeiten. Das drängt sich ja geradezu auf.

Delphi-Quellcode:

type
  TViech = class(TCollectionItem)
  private
    FLaenge: Real;
    FHaare: Real;
    //..weitere Eigenschaften
  public
    constructor Create(Collection: TCollection); override;
    procedure Mutiere;
    procedure Assign(Source: TPersistent);
    //..weitere Methoden
    property Laenge: Real read FLaenge write FLaenge;
    property Haare: Real read FHaare write FHaare;
    //..weitere Eigenschaften
  end;

constructor TViech.Create(Collection: TCollection);
begin
  inherited;
  Laenge := 1; //Startparameter für ein Viech setzen
  Haare := 1;
end;

//Die Methode Assign brauchst du um ein Viech einem anderen Viech zuweisen zu können
procedure TViech.Assign(Source: TPersistent);
begin
  if Source is TViech then begin
    FLaenge := TViech(Source).FLaenge;
    FHaare := TViech(Source).FHaare;
    //...weitere Eigenschaften
  end;
end;
Die ganzen Viecher speicherst du in einer Collection ab.

Delphi-Quellcode:
type
  TViecher = class(TCollection)
  protected
    function GetViech(Index: Integer): TViech;
    procedure SetViech(Index: Integer; Value: TViech);
  public
    function Add: TViech;
    function Insert(Index: Integer) : TViech;
    property Viech[Index: Integer]: TViech read GetViech write SetViech; default;
  end;

function TViecher.GetViech(Index: Integer): TViech;
begin
  Result := TViech(inherited GetItem(Index));
end;

procedure TViecher.SetViech(Index: Integer; Value: TViech);
begin
  inherited SetItem(Index, Value);
end;

function TViecher.Add: TViech;
begin
  Result := TViech(inherited Add);
end;

function TViecher.Insert(Index: Integer): TViech;
begin
  Result := TViech(inherited Insert(Index));
end;
Damit stehen dir alle Wege offen.

Delphi-Quellcode:

//Irgendwo im Hauptprogramm...
var BlaueViecher: TViecher;
    RoteViecher: TViecher;

BlaueViecher := TViecher.Create(TViech); //Hier wird der Collection gesagt, von welchem Typ ihre Items sind!
RoteViecher := TViecher.Create(TViech);

//Neues Viech hinzufügen
BlaueViecher.Add //Fügt ein neues Viech mit den Standardvorgaben an

//Da "Add" eine Funktion ist, geht auch das:

var tempViech: TViech;

tempViech := BlaueViecher.Add; //tempViech verweist jetzt auf das neu angefügte Viech INNERHALB der Collection
tempViech.Mutiere; //und kann damit sofort weiter bearbeitet werden

//Eigenschaft eines Vieches ändern
BlaueViecher.Viech[1].Haare := 2;

//oder einem anderen Viech zuweisen
BlaueViecher.Viech[2].Assign(BlaueViecher.Viech[1]);

//oder mutieren
BlaueViecher.Viech[2].Mutiere;

//Die Anzahl der Viecher feststellen
BlaueViecher.Count;

Luckie 8. Jan 2009 15:18

Re: denkfehler; array-> dynarray
 
Deine Add-methode kommt mir etwas komisch vor. Sollte sie nicht so aussehen:
Delphi-Quellcode:
function TBlaueViecher.Add(Item: TViech);
begin
  // hier Item der Liste hinzufügen
end;
Es kan nnatürlich auch sein, dass ich falsdch liege und die Funktionsweise von TCollection nicht verstanden haben, da ich noch nie etwas damit gemacht habe.

vsilverlord 8. Jan 2009 15:24

Re: denkfehler; array-> dynarray
 
sieht gut aus, vor allem auch eleganter. Ich werd mir das erst mal verinnerlichen bevor ich anfange, an meinem projekt rumzuschrauben^^
aber danke trotzdem

guidok 8. Jan 2009 15:26

Re: denkfehler; array-> dynarray
 
Zitat:

Zitat von Luckie
Deine Add-methode kommt mir etwas komisch vor. Sollte sie nicht so aussehen:
Delphi-Quellcode:
function TBlaueViecher.Add(Item: TViech);
begin
  // hier Item der Liste hinzufügen
end;
Es kan nnatürlich auch sein, dass ich falsdch liege und die Funktionsweise von TCollection nicht verstanden haben, da ich noch nie etwas damit gemacht habe.

Nein, das müsste schon so passen. Ich hatte im Beispiel vergessen das Create der Collection richtig aufzurufen (ist korrigiert). Hier wird angegeben, von welchem Typ die Items sind, die die Collection aufnehmen soll.


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:48 Uhr.
Seite 4 von 5   « Erste     234 5      

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