Delphi-PRAXiS
Seite 1 von 5  1 23     Letzte »    

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 10:33


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:
tviechergruppe=record
viecher:array[0..10000] of tviech;
viecheranzahl:integer;
end;
tviech ist einfach ein weiterer record mit den eigenschaften des viechs.
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:
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
(alles hat perfekt funktioniert)
Nun wollte ich das ganze mit einem dynamischen array machen, um speicher zu sparen:
Delphi-Quellcode:
tviechergruppe=record
viecher:array of tviecher;
viecheranzahl: integer
zugreifen wollte ich dann so:
Delphi-Quellcode:
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
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.

SirThornberry 8. Jan 2009 10:40

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.

vsilverlord 8. Jan 2009 10:46

Re: denkfehler; array-> dynarray
 
Es kommt keine Fehlermeldung, es ist einfach nur so, dass alle viecher so sind wie das letzte viech.

Klaus01 8. Jan 2009 10:55

Re: denkfehler; array-> dynarray
 
.. machst Du nicht mit dieser Zeile alle Elemete gleich?

Delphi-Quellcode:
blaueviecher.viecher[blaueviecher.viecheranzahl]:=blaueviecher.viecher[blaueviecher.viecheranzahl-1]
Angenommen viecherAnzahl = 8
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

vsilverlord 8. Jan 2009 11:03

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]

Klaus01 8. Jan 2009 11:09

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

vsilverlord 8. Jan 2009 11:22

Re: denkfehler; array-> dynarray
 
da ist nur ein timer, der damit zusammen hängt:
Delphi-Quellcode:
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
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);

Klaus01 8. Jan 2009 11:29

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:
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
hm, wenn ich es mir recht überlege sollte es doch funktionieren:

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

HenKst 8. Jan 2009 11:43

Re: denkfehler; array-> dynarray
 
Also wie Klaus schon sagte

eigentlich müssten immer schon alle Elemente identisch gewesen sein weil du mit
Delphi-Quellcode:
blaueviecher.viecher[blaueviecher.viecheranzahl]:=blaueviecher.viecher[blaueviecher.viecheranzahl-1];
immer nur die Pointer kopierst

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:
blaueviecher.viecher[blaueviecher.viecheranzahl]:= TViech.Create;
blaueviecher.viecher[blaueviecher.viecheranzahl].Assign(blaueviecher.viecher[blaueviecher.viecheranzahl-1]);
das TViech "kopieren".
Dann hast du eine individuelle isntanz die du ändern kannst ohne das sich das auf die anderen auswirkt.

GreeZ HenKst

Klaus01 8. Jan 2009 11:49

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 12:22 Uhr.
Seite 1 von 5  1 23     Letzte »    

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz