Delphi-PRAXiS
Seite 2 von 5     12 34     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)

nahpets 8. Jan 2009 11:51

Re: denkfehler; array-> dynarray
 
Hallo,

ohne jetzt voreilig sein zu wollen, aber liegt der Fehler nicht in der 5. Zeile?

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
muss dass nicht
Delphi-Quellcode:
  blaueviecher.viecher[blaueviecher.viecheranzahl]:=blaueviecher.viecher[blaueviecher.viecheranzahl] // hier sieht es so aus wie das letzte
heißen.
Am Beginn der Procedure befindet sich das letzte Viech im letzten Eintrag des Array. Das Array wird um einen Eintrag vergrößert. Nun ist das ursprünglich letzte Viech im vorletzten Eintrag des Arrays. Wenn die Größe des Arrays blaueviecher.viecheranzahl + 1 ist, müsste das letzte Viech doch in blaueviecher.viecheranzahl stehen und nicht in blaueviecher.viecheranzahl - 1. Oder täusche ich mich da jetzt?

vsilverlord 8. Jan 2009 12:00

Re: denkfehler; array-> dynarray
 
ich bin mit meinem latein auch am ende. der fehler ist so verrückt, ich glaube ich bekomm gleich en krampf im hirn.
das ergebnis ist das, dass ALLE so sind wie das letzte, mutierte viech.
Dieses viech ist nachweißlich anders als die anderen. Ich hab hier ein paar zahlenbeispiele:
viech1:
länge:1
haare:2
-- neuer timer durchgang
viech1:
länge:3
haare:5
viech2:
länge:3
haare:5
-- neuer timer durchgang
viech1:
länge:8
haare:1
viech2:
länge:8
haare:1
viech3:
länge:8
haare:1
So. Was sagt man dazu? der fehler muss in der zuweisung des arrays liegen, warum auch immer.
so sollte übrigens das ergebnis aussehen (nach 2 timer durchgängen):
viech1:
länge:1
haare:2
viech2:
länge:3
haare:5
viech3:
länge:8
haare:1

:pale:
@nahpets: ohne jetzt anmaßend klingend zu wollen, aber dann wäre der ganze array leer.
blaueviecher.viecher[blaueviecher.viecheranzahl]:=blaueviecher.viecher[blaueviecher.viecheranzahl]
ist das gleiche wie: 0:=0
das ist so, weil vorher die anzahl erhöht wird. [oder liege ich falsch?]

HenKst 8. Jan 2009 12:00

Re: denkfehler; array-> dynarray
 
Zitat:

Zitat von Klaus01
@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.

Achso ich hatte überlesen das TViech ein record ist :shock:

Dann schliesse ich mich dir mal an und hätte gerne mal den mutiercode gesehn ;)

@stephan
zu dem Zeitpunkt hat das array viecherzahl+1 viele Elemente
in [viecherzahl] steht also das letzte und := [viecherzahl-1] kopiert das vorletzte
Soweit ich das verstanden habe ist das genau was er will.

vsilverlord 8. Jan 2009 12:07

Re: denkfehler; array-> dynarray
 
ach ja, die funktion mutiere hat ja nur den parameter tviech: [vereinfacht, aber im prinzip das gleiche]
Delphi-Quellcode:
procedure mutiere(viech:tviech):tviech;
begin
result.länge:=viech.länge+random(5);
result.haare:=viech.haare+random(5);
end;

vsilverlord 8. Jan 2009 12:09

Re: denkfehler; array-> dynarray
 
vllt hängt das problem auch irgendwie mit setlength und dem array zusammen.
vllt kann ich aus dem tviech ein object bauen und es dann in eine tobjetlist stecken.[wobei das ergebnis theoretisch dasselbe sein sollte]

HenKst 8. Jan 2009 12:13

Re: denkfehler; array-> dynarray
 
Delphi-Quellcode:
mutiere(blaueviecher.viecher[blaueviecher.viecheranzahl])
Delphi-Quellcode:
procedure mutiere(viech:tviech):tviech;
begin
result.länge:=viech.länge+random(5);
result.haare:=viech.haare+random(5);
end;
erm... procedure|result?

aber fällt dir was auf?^^

Du änderst nur das result, weisst dieses aber nicht zu.

Wobei ich immernoch nicht verstehe wie das mit nem statischen array funktioniert haben soll.

Uwe Raabe 8. Jan 2009 12:16

Re: denkfehler; array-> dynarray
 
Zitat:

Zitat von vsilverlord
ach ja, die funktion mutiere hat ja nur den parameter tviech: [vereinfacht, aber im prinzip das gleiche]
Delphi-Quellcode:
procedure mutiere(viech:tviech):tviech;
begin
result.länge:=viech.länge+random(5);
result.haare:=viech.haare+random(5);
end;

Jetzt hast du aber gemogelt: eine procedure hat normalerweise keinen Rückgabewert!

nahpets 8. Jan 2009 12:19

Re: denkfehler; array-> dynarray
 
Hallo,
kann sein, dass ich vollkommen daneben liege: (bitte nicht hauen :wink:)

Gehen wir davon aus, dass vor dem ersten Timerausruf blaueviecher.viecheranzahl = 0 sei.

Delphi-Quellcode:
procedure tform1.timer1timer(sender:tobject);
begin
  inc(blaueviecher.viecheranzahl); // = 1
  setlength(blaueviecher.viecher,blaueviecher.viecheranzahl+1); // Array hat 2 Elemente
  [blaueviecher.viecheranzahl]:=blaueviecher.viecher[blaueviecher.viecheranzahl-1] // das 0. Element
  mutiere(blaueviecher.viecher[blaueviecher.viecheranzahl]) // Das erste Element enthält das mutierte 0. Element.
end
Was passiert hier mit dem zweiten Viech, bleibt das leer?

Andererseits: Wenn nach einer Mutation alle gleich sind, dann könnte HenKst mit seiner Pointer-Vermutung ja durchaus doch recht haben. Auch, das ist doch irgendwie komisch.

Klaus01 8. Jan 2009 12:20

Re: denkfehler; array-> dynarray
 
Zitat:

Zitat von vsilverlord
ach ja, die funktion mutiere hat ja nur den parameter tviech: [vereinfacht, aber im prinzip das gleiche]
Delphi-Quellcode:
procedure mutiere(var viech:tviech);
begin
  result.länge:=viech.länge+random(5);
  result.haare:=viech.haare+random(5);
end;

So ^ sollte es gehen.

Grüße
Klaus

HenKst 8. Jan 2009 12:24

Re: denkfehler; array-> dynarray
 
Zitat:

Zitat von Klaus01
Zitat:

Zitat von vsilverlord
ach ja, die funktion mutiere hat ja nur den parameter tviech: [vereinfacht, aber im prinzip das gleiche]
Delphi-Quellcode:
procedure mutiere(var viech:tviech);
begin
  result.länge:=viech.länge+random(5);
  result.haare:=viech.haare+random(5);
end;

So ^ sollte es gehen.

Grüße
Klaus

Ändert doch immernoch nichts am übergebenen TViech.
Oder ist result in procedure ein pseudonym für den ersten var parameter? (könnte ja sein :) )
Delphi-Quellcode:
procedure mutiere(var viech:tviech);
begin
  viech.länge:=viech.länge+random(5); //oder inc(viech.länge, random(5) wenns kurz sein soll:)
  viech.haare:=viech.haare+random(5);
end;
sollte klappen

oder hallte tatsächlich

Delphi-Quellcode:
Function mutiere(var viech:tviech): TViech
begin
  result.länge:=viech.länge+random(5);
  result.haare:=viech.haare+random(5);
end;

blaueviecher.viecher[blaueviecher.viecheranzahl]:= mutiere(blaueviecher.viecher[blaueviecher.viecheranzahl]);
dann könnte man auch neue viecher direkt als mutationen von alten viechern erzeugen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:47 Uhr.
Seite 2 von 5     12 34     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