AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

denkfehler; array-> dynarray

Ein Thema von vsilverlord · begonnen am 8. Jan 2009 · letzter Beitrag vom 11. Jan 2009
Antwort Antwort
Seite 2 von 5     12 34     Letzte »    
nahpets
(Gast)

n/a Beiträge
 
#11

Re: denkfehler; array-> dynarray

  Alt 8. Jan 2009, 12:51
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  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?
  Mit Zitat antworten Zitat
Benutzerbild von vsilverlord
vsilverlord

Registriert seit: 7. Jan 2008
Ort: Baden Württemberg- Hohenlohekreis
174 Beiträge
 
RAD-Studio 2009 Arc
 
#12

Re: denkfehler; array-> dynarray

  Alt 8. Jan 2009, 13:00
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


@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?]
Volker
~beware
Wizards First Rule:
People are stupid; given proper motivation, almost anyone will believe almost anything. Because people are stupid, they will believe a lie because they want to believe it’s true, or because they are afraid it might be true
  Mit Zitat antworten Zitat
HenKst

Registriert seit: 7. Jul 2008
113 Beiträge
 
#13

Re: denkfehler; array-> dynarray

  Alt 8. Jan 2009, 13:00
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

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.
narf - not a real function
  Mit Zitat antworten Zitat
Benutzerbild von vsilverlord
vsilverlord

Registriert seit: 7. Jan 2008
Ort: Baden Württemberg- Hohenlohekreis
174 Beiträge
 
RAD-Studio 2009 Arc
 
#14

Re: denkfehler; array-> dynarray

  Alt 8. Jan 2009, 13:07
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;
Volker
~beware
Wizards First Rule:
People are stupid; given proper motivation, almost anyone will believe almost anything. Because people are stupid, they will believe a lie because they want to believe it’s true, or because they are afraid it might be true
  Mit Zitat antworten Zitat
Benutzerbild von vsilverlord
vsilverlord

Registriert seit: 7. Jan 2008
Ort: Baden Württemberg- Hohenlohekreis
174 Beiträge
 
RAD-Studio 2009 Arc
 
#15

Re: denkfehler; array-> dynarray

  Alt 8. Jan 2009, 13:09
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]
Volker
~beware
Wizards First Rule:
People are stupid; given proper motivation, almost anyone will believe almost anything. Because people are stupid, they will believe a lie because they want to believe it’s true, or because they are afraid it might be true
  Mit Zitat antworten Zitat
HenKst

Registriert seit: 7. Jul 2008
113 Beiträge
 
#16

Re: denkfehler; array-> dynarray

  Alt 8. Jan 2009, 13:13
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.
narf - not a real function
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.475 Beiträge
 
Delphi 12 Athens
 
#17

Re: denkfehler; array-> dynarray

  Alt 8. Jan 2009, 13:16
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!
Uwe Raabe
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#18

Re: denkfehler; array-> dynarray

  Alt 8. Jan 2009, 13:19
Hallo,
kann sein, dass ich vollkommen daneben liege: (bitte nicht hauen )

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.
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.771 Beiträge
 
Delphi 10.4 Sydney
 
#19

Re: denkfehler; array-> dynarray

  Alt 8. Jan 2009, 13:20
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
Klaus
  Mit Zitat antworten Zitat
HenKst

Registriert seit: 7. Jul 2008
113 Beiträge
 
#20

Re: denkfehler; array-> dynarray

  Alt 8. Jan 2009, 13:24
Zitat von Klaus01:
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.
narf - not a real function
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 5     12 34     Letzte »    


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:43 Uhr.
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