![]() |
denkfehler; array-> dynarray
Hallo,
ich hab ein etwas größeres Projekt, weswegen ich nicht den ganzen quelltext reinschreiben kann. Ich werde mal versuchen zu beschreiben. Vorher hatte ich einen statischen array mit seiner anzahl als record:
Delphi-Quellcode:
tviech ist einfach ein weiterer record mit den eigenschaften des viechs.
tviechergruppe=record
viecher:array[0..10000] of tviech; viecheranzahl:integer; end; wenn ich also die anzahl der viecher erhöhen wollte, hab ich nur die viecheranzahl erhöht. Ein neues viech füge ich dann so hinzu:
Delphi-Quellcode:
(alles hat perfekt funktioniert)
var
blaueviecher:tviechergruppe; ... inc(blaueviecher.viecheranzahl); blaueviecher.viecher[blaueviecher.viecheranzahl]:=blaueviecher.viecher[blaueviecher.viecheranzahl-1] // hier sieht es so aus wie das letzte mutiere(blaueviecher.viecher[blaueviecher.viecheranzahl]) // hier wird es ein inviduum, da es mutiert Nun wollte ich das ganze mit einem dynamischen array machen, um speicher zu sparen:
Delphi-Quellcode:
zugreifen wollte ich dann so:
tviechergruppe=record
viecher:array of tviecher; viecheranzahl: integer
Delphi-Quellcode:
jetzt taucht das phänomen auf, dass ALLE viecher so aussehen wie das letzte. Ich kann mir nicht im geringsten vorstellen warum das so sein sollte. Ich such jetzt schon stunden den fehler. für mich sieht das so aus, als ob das ein delphi-fehler oder irgendein abstruser systemfehler ist.
var
blaueviecher:tviechergruppe; ... inc(blaueviecher.viecheranzahl); setlength(blaueviecher.viecher,blaueviecher.viecheranzahl+1); //der array ist 1 größer wie die benötigte anzahl blaueviecher.viecher[blaueviecher.viecheranzahl]:=blaueviecher.viecher[blaueviecher.viecheranzahl-1] // hier sieht es so aus wie das letzte mutiere(blaueviecher.viecher[blaueviecher.viecheranzahl]) // hier wird es ein inviduum, da es mutiert |
Re: denkfehler; array-> dynarray
nur durch Umstellung des Arrays? Schalte einfach mal die Bereichtsprüfung ein. Vielleicht schreibst du ja auch irgendwo drüber hinaus.
|
Re: denkfehler; array-> dynarray
Es kommt keine Fehlermeldung, es ist einfach nur so, dass alle viecher so sind wie das letzte viech.
|
Re: denkfehler; array-> dynarray
.. machst Du nicht mit dieser Zeile alle Elemete gleich?
Delphi-Quellcode:
Angenommen viecherAnzahl = 8
blaueviecher.viecher[blaueviecher.viecheranzahl]:=blaueviecher.viecher[blaueviecher.viecheranzahl-1]
Dann bekommt das Element 8 alle Datenfelder des Elementes 7 Angenommen viecherAnzahl = 9 Dann bekommt das Element 9 alle Datenfelder des Elementes 8 Nun sind schon die Element 7,8 und 9 gleich. Nur merkwürdig, dass das ganze vorher korrekt gelaufen ist? Grüße Klaus |
Re: denkfehler; array-> dynarray
ähm... möglicherweise hast du recht, aber stumpfsinnigerweise hat es vorher funktioniert. Außerdem will ich ja nur das allerletzte viech so werden lassen das allervorletze viech. Gibts da eine bessere Lösung=? [hoffnung keimt auf]
|
Re: denkfehler; array-> dynarray
.. kanst Du dazu etwas mehr Code zeigen?
Hier sieht man ja nicht einmal, ob das ganze in einer Schleife läuft oder in welcher Umgebung das ganze stattfindet. Grüße Klaus |
Re: denkfehler; array-> dynarray
da ist nur ein timer, der damit zusammen hängt:
Delphi-Quellcode:
das ist ja der witz an der sache. Das ist praktisch das wesentliche, der rest sind sachen die damit nicht zusammenhängen (labels, buttons, usw);
procedure tform1.timer1timer(sender:tobject);
begin inc(blaueviecher.viecheranzahl); setlength(blaueviecher.viecher,blaueviecher.viecheranzahl+1); //der array ist 1 größer wie die benötigte anzahl blaueviecher.viecher[blaueviecher.viecheranzahl]:=blaueviecher.viecher[blaueviecher.viecheranzahl-1] // hier sieht es so aus wie das letzte mutiere(blaueviecher.viecher[blaueviecher.viecheranzahl]) // hier wird es ein inviduum, da es mutiert end |
Re: denkfehler; array-> dynarray
.. im Prinzip kann man ja einen Timer bzw. dessen Funktion wie eine Schleife
sehen. Und dann wird dieser Code immer wieder ausgeführt.
Delphi-Quellcode:
hm, wenn ich es mir recht überlege sollte es doch funktionieren:
procedure tform1.timer1timer(sender:tobject);
begin inc(blaueviecher.viecheranzahl); setlength(blaueviecher.viecher,blaueviecher.viecheranzahl+1); //der array ist 1 größer wie die benötigte anzahl blaueviecher.viecher[blaueviecher.viecheranzahl]:=blaueviecher.viecher[blaueviecher.viecheranzahl-1] // hier sieht es so aus wie das letzte mutiere(blaueviecher.viecher[blaueviecher.viecheranzahl]) // hier wird es ein inviduum, da es mutiert end Wenn mutiere etwas an den Daten des letzten Arrayfeldes ändert hat beim nächsten Durchlauf das zweitletzte Element die gleichen Daten. Die neue letzte wird dann wieder mutiert. Kannst Du mal die Prozedur mutiere hier anfügen, kann es sein das die Daten nicht richtig in das Array zurückgeschrieben werden. Denn ein dyn.Array ist nur ein Pointer wenn Du es als Parameter an eine Prozedur übergibst. [edit], das kann es eigentlich auch nicht sein, denn es wird ja ein tviech übergeben. Bin mit meinem Latein am Ende. [edit2] hast Du den Paramter in der mutiere Prozedur als var Parameter deklariert? Grüße Klaus |
Re: denkfehler; array-> dynarray
Also wie Klaus schon sagte
eigentlich müssten immer schon alle Elemente identisch gewesen sein weil du mit
Delphi-Quellcode:
immer nur die Pointer kopierst
blaueviecher.viecher[blaueviecher.viecheranzahl]:=blaueviecher.viecher[blaueviecher.viecheranzahl-1];
Wenn du bei einem eine property änderst, änderst du sie in allen. Warum das mit nem Statischen array klappt versteh ich nicht. Richtigerweise müsstest du dir für TViech eine assign methode schreiben. Dann per
Delphi-Quellcode:
das TViech "kopieren".
blaueviecher.viecher[blaueviecher.viecheranzahl]:= TViech.Create;
blaueviecher.viecher[blaueviecher.viecheranzahl].Assign(blaueviecher.viecher[blaueviecher.viecheranzahl-1]); Dann hast du eine individuelle isntanz die du ändern kannst ohne das sich das auf die anderen auswirkt. GreeZ HenKst |
Re: denkfehler; array-> dynarray
@HenKst
das Assign muss nicht sein, denn die Array Elemente sind ja "nur" records als statisch. Das Array an sich ist dynamisch die einzelnen Felder wiederum statisch. @vsilverlord Ich denke es liegt ein Fehler in der Procedure mutiere vor, denn nur wenn hier das Array Feld (Tviech) nicht geändert wird sind alle Elemente/Felder des Arrays gleich. Grüße Klaus |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:39 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