![]() |
Re: denkfehler; array-> dynarray
Hallo,
ohne jetzt voreilig sein zu wollen, aber liegt der Fehler nicht in der 5. Zeile?
Delphi-Quellcode:
muss dass nicht
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
Delphi-Quellcode:
heißen.
blaueviecher.viecher[blaueviecher.viecheranzahl]:=blaueviecher.viecher[blaueviecher.viecheranzahl] // hier sieht es so aus wie das letzte
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? |
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?] |
Re: denkfehler; array-> dynarray
Zitat:
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. |
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; |
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] |
Re: denkfehler; array-> dynarray
Delphi-Quellcode:
mutiere(blaueviecher.viecher[blaueviecher.viecheranzahl])
Delphi-Quellcode:
erm... procedure|result?
procedure mutiere(viech:tviech):tviech;
begin result.länge:=viech.länge+random(5); result.haare:=viech.haare+random(5); end; 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. |
Re: denkfehler; array-> dynarray
Zitat:
|
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:
Was passiert hier mit dem zweiten Viech, bleibt das leer?
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 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. |
Re: denkfehler; array-> dynarray
Zitat:
Grüße Klaus |
Re: denkfehler; array-> dynarray
Zitat:
Oder ist result in procedure ein pseudonym für den ersten var parameter? (könnte ja sein :) )
Delphi-Quellcode:
sollte klappen
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; oder hallte tatsächlich
Delphi-Quellcode:
dann könnte man auch neue viecher direkt als mutationen von alten viechern erzeugen.
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]); |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:29 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