![]() |
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: ... |
Re: denkfehler; array-> dynarray
|
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:
![]() |
Re: denkfehler; array-> dynarray
ja, stack ist zu gering.
|
Re: denkfehler; array-> dynarray
Zitat:
edit: oder nutze dynamische Listen, wir TList oder wie schon versucht dynamische Arrays. Grüße Klaus |
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. |
Re: denkfehler; array-> dynarray
Zitat:
Delphi-Quellcode:
Die ganzen Viecher speicherst du in einer Collection ab.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;
Delphi-Quellcode:
Damit stehen dir alle Wege offen.
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;
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; |
Re: denkfehler; array-> dynarray
Deine Add-methode kommt mir etwas komisch vor. Sollte sie nicht so aussehen:
Delphi-Quellcode:
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.
function TBlaueViecher.Add(Item: TViech);
begin // hier Item der Liste hinzufügen end; |
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 |
Re: denkfehler; array-> dynarray
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:48 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