![]() |
Re: denkfehler; array-> dynarray
Zitat:
Ich gebe mal zu bedenken: wenn du uns hier "bereinigten" Code zeigst, kann es sein, daß du den Fehler "wegbereinigst". |
Re: denkfehler; array-> dynarray
Zitat:
Delphi-Quellcode:
procedure mutiere(var viech:tviech);
begin viech.länge+random(5); viech.haare+random(5); end; |
Re: denkfehler; array-> dynarray
Zitat:
Da fehlt ne Zuweisung oder? Wir sind nicht in C und haben soweit ich weiss keinen += operator :D ...warum funktionieren bei meinen delphicodes die highlights nich... |
Re: denkfehler; array-> dynarray
Zitat:
Delphi-Quellcode:
und mein Delphi mag auch keine Umlaute.
procedure mutiere(var viech:tviech);
begin viech.laenge:=viech.laenge+random(5); viech.haare:=viech.haare+random(5); end; Danke und Grüße Klaus |
Re: denkfehler; array-> dynarray
Zitat:
Leider ist das gar nicht das Problem, es besteht immer noch. Das problem bei dem array war sowieso, dass er maximal 10000 viecher aufnehmen konnte. Wieviel viecher kann ich mit tobjectlist aufnehmen? Ich brauch es ja erst gar nicht versuchen, wenn da weniger reinpassen. Kann es sein, dass setlength alle vorhandenen felder um eins nach vorne verschiebt, sodass das feld 0 frei wird? so könnte ich mir vorstellen, dass das problem entsteht. [wäre aber trotzdem nicht logisch] Gib es noch andere Mengentypen, die Sinn machen? grüße, hoffnungslos frustriert |
Re: denkfehler; array-> dynarray
Zitat:
hmm das wäre genau was passiert wenn du nur pointer durch die Gegend schieben würdest... Sicher das TViech ein record ist?:D hab mir auch grade ein testprojekt gebaut und deinen code kopiert. TViech als record mit laenge und haare als integer declariert funktioniert roblemlos(abgesehen davon das inc(viecheranzahl) und setlengh mit viecheranzahl+1 beim ersten durchlauf 2 elemente kreiert aber das hab ich vermutlich falsch initialisiert)... |
Re: denkfehler; array-> dynarray
Zitat:
@vsilverlord gib' mal den Inhalt des Arrays vor und nach dem SetLength aus, dann müsstest Du doch sehen können, ob da verstrubbelt wird und wenn Du dann diese beiden Ausgaben neben die nach der Mutation legst, müsstest Du sehen können, wann der Inhalt durcheinanderkommt, bzw. hier ja unerwartet vereinheitlicht wird. |
Re: denkfehler; array-> dynarray
Ich hab jetzt als Initialisierung setlength mit 1 gemacht aber die viecheranzahl auf 0 gelassen, damit funktionierts wunderprächtig
Delphi-Quellcode:
TViech = record
laenge: integer; haare: integer; end; TViecherGruppe = record viecheranzahl: integer; viecher: array of TViech; end; var Form2: TForm2; blaueviecher: TViecherGruppe; implementation {$R *.dfm} Function mutiere(var viech:tviech): TViech; begin result.laenge:=viech.laenge+random(5); result.haare:=viech.haare+random(5); end; procedure TForm2.Button1Click(Sender: TObject); var i: integer; begin blaueviecher.viecheranzahl:= 0; for i := 0 to 10000 do begin inc(blaueviecher.viecheranzahl); setlength(blaueviecher.viecher,blaueviecher.viecheranzahl+1); //der array ist 1 größer !!!ALS!!!^^ die benötigte anzahl blaueviecher.viecher[blaueviecher.viecheranzahl]:= blaueviecher.viecher[blaueviecher.viecheranzahl-1]; // hier sieht es so aus wie das letzte blaueviecher.viecher[blaueviecher.viecheranzahl]:= mutiere(blaueviecher.viecher[blaueviecher.viecheranzahl]) // hier wird es ein inviduum, da es mutiert end; end; procedure TForm2.FormCreate(Sender: TObject); begin randomize; blaueviecher.viecheranzahl:= 0; setlength(blaueviecher.viecher, 1); blaueviecher.viecher[0].haare:= 0; blaueviecher.viecher[0].laenge:= 1; end; |
Re: denkfehler; array-> dynarray
Ich hab mir das jetzt noch einmal mit test-echos durchgeschaut, und ihr hattet irgendwie recht.
in
Delphi-Quellcode:
geht er Alle felder des arrays durch und mutiert alle gleichzeitig. Bloß warum??? Wie kann ich das machen, dass er nur das eine, letzte Feld mutiert?
blaueviecher.viecher[blaueviecher.viecheranzahl]:= mutiere(blaueviecher.viecher[blaueviecher.viecheranzahl]);
|
Re: denkfehler; array-> dynarray
Also, mal ein kleines Prog draus gemacht, dass funzt:
Delphi-Quellcode:
Ergebnisse nach dem Durchlauf:
Program Project1;
Uses sysutils; Type tviech = Record laenge: Real; haare: Real; End; tblaueviecher = Record Viecher: Array of tviech; End; Var blaueviecher: tblaueviecher; i: integer; Procedure mutiere(Var viech: tviech); Begin viech.laenge := viech.laenge + random(5); viech.haare := viech.haare + random(5); End; Begin Randomize; For i := 1 To 3 Do Begin setlength(blaueviecher.viecher, succ(length(blaueviecher.viecher))); //der array ist 1 größer wie die benötigte anzahl If length(blaueviecher.viecher) > 1 Then blaueviecher.viecher[high(blaueviecher.viecher)] := blaueviecher.viecher[high(blaueviecher.viecher)-1]; // hier sieht es so aus wie das letzte mutiere(blaueviecher.viecher[high(blaueviecher.viecher)]) // hier wird es ein inviduum, da es mutiert End; End. blaueviecher.viecher[high(blaueviecher.viecher)]: (laenge:5; haare:3) blaueviecher.viecher: ((laenge:0; haare:2), (laenge:2; haare:3), (laenge:5; haare:3)) Also denke ich, wird es nicht an Pointern liegen... edit: Die Posts haben sich Überschnitten, bei mir funzt auch Dein Prog ohne die Initialisierung. Hast Du mal probiert in den Projektoptionen 'Optimierung' und 'Ausgerichtete Rekord-Felder' auszuschalten? |
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