Delphi-PRAXiS
Seite 3 von 5     123 45      

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)

Uwe Raabe 8. Jan 2009 12:25

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.

Jetzt kennt der Compiler aber kein "result"!

Ich gebe mal zu bedenken: wenn du uns hier "bereinigten" Code zeigst, kann es sein, daß du den Fehler "wegbereinigst".

Klaus01 8. Jan 2009 12:31

Re: denkfehler; array-> dynarray
 
Zitat:

Zitat von Uwe Raabe
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.

Jetzt kennt der Compiler aber kein "result"!

Ich gebe mal zu bedenken: wenn du uns hier "bereinigten" Code zeigst, kann es sein, daß du den Fehler "wegbereinigst".

Das kommt davon, copy und paste, und nicht darauf achten was denn kopiert wurde:

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

HenKst 8. Jan 2009 12:34

Re: denkfehler; array-> dynarray
 
Zitat:

Zitat von Klaus01

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

örm, erzeugt das überhaupt code?
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...

Klaus01 8. Jan 2009 12:38

Re: denkfehler; array-> dynarray
 
Zitat:

Zitat von HenKst
Zitat:

Zitat von Klaus01

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

örm, erzeugt das überhaupt code?
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...

ich sollte nach Hause gehen, bin sowas von daneben heute...

Delphi-Quellcode:
procedure mutiere(var viech:tviech);
begin
  viech.laenge:=viech.laenge+random(5);
  viech.haare:=viech.haare+random(5);
end;
und mein Delphi mag auch keine Umlaute.

Danke und Grüße
Klaus

vsilverlord 8. Jan 2009 12:47

Re: denkfehler; array-> dynarray
 
Zitat:

Delphi-Quellcode:
blaueviecher.viecher[blaueviecher.viecheranzahl]:= mutiere(blaueviecher.viecher[blaueviecher.viecheranzahl]);

Tut mir leid, ich habs falsch geschrieben. So wie oben sieht es aus.
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

HenKst 8. Jan 2009 13:15

Re: denkfehler; array-> dynarray
 
Zitat:

Zitat von vsilverlord
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

huch den hab ich ja noch garnich gesehn^^


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)...

nahpets 8. Jan 2009 13:24

Re: denkfehler; array-> dynarray
 
Zitat:

Zitat von HenKst
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)...

ne, dass ist genau das, wo ich eine mögliche Fehlerursache vermute, aber Deine Pointertheorie ist nicht von der Hand zu weisen.

@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.

HenKst 8. Jan 2009 13:32

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;

vsilverlord 8. Jan 2009 13:35

Re: denkfehler; array-> dynarray
 
Ich hab mir das jetzt noch einmal mit test-echos durchgeschaut, und ihr hattet irgendwie recht.
in
Delphi-Quellcode:
blaueviecher.viecher[blaueviecher.viecheranzahl]:= mutiere(blaueviecher.viecher[blaueviecher.viecheranzahl]);
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?

Bomberbb 8. Jan 2009 13:35

Re: denkfehler; array-> dynarray
 
Also, mal ein kleines Prog draus gemacht, dass funzt:
Delphi-Quellcode:
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.
Ergebnisse nach dem Durchlauf:
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 22:50 Uhr.
Seite 3 von 5     123 45      

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