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 1 von 5  1 23     Letzte »    
Benutzerbild von vsilverlord
vsilverlord

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

denkfehler; array-> dynarray

  Alt 8. Jan 2009, 10:33
Hallo,
ich hab ein etwas größeres Projekt, weswegen ich nicht den ganzen quelltext reinschreiben kann.
Ich werde mal versuchen zu beschreiben. Vorher hatte ich einen statischen array mit seiner anzahl als record:
Delphi-Quellcode:
tviechergruppe=record
viecher:array[0..10000] of tviech;
viecheranzahl:integer;
end;
tviech ist einfach ein weiterer record mit den eigenschaften des viechs.
wenn ich also die anzahl der viecher erhöhen wollte, hab ich nur die viecheranzahl erhöht. Ein neues viech füge ich dann so hinzu:
Delphi-Quellcode:
var
blaueviecher:tviechergruppe;
...
inc(blaueviecher.viecheranzahl);
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
(alles hat perfekt funktioniert)
Nun wollte ich das ganze mit einem dynamischen array machen, um speicher zu sparen:
Delphi-Quellcode:
tviechergruppe=record
viecher:array of tviecher;
viecheranzahl: integer
zugreifen wollte ich dann so:
Delphi-Quellcode:
var
blaueviecher:tviechergruppe;
...
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
jetzt taucht das phänomen auf, dass ALLE viecher so aussehen wie das letzte. Ich kann mir nicht im geringsten vorstellen warum das so sein sollte. Ich such jetzt schon stunden den fehler. für mich sieht das so aus, als ob das ein delphi-fehler oder irgendein abstruser systemfehler ist.
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 SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#2

Re: denkfehler; array-> dynarray

  Alt 8. Jan 2009, 10:40
nur durch Umstellung des Arrays? Schalte einfach mal die Bereichtsprüfung ein. Vielleicht schreibst du ja auch irgendwo drüber hinaus.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  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
 
#3

Re: denkfehler; array-> dynarray

  Alt 8. Jan 2009, 10:46
Es kommt keine Fehlermeldung, es ist einfach nur so, dass alle viecher so sind wie das letzte viech.
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
Klaus01
Online

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

Re: denkfehler; array-> dynarray

  Alt 8. Jan 2009, 10:55
.. machst Du nicht mit dieser Zeile alle Elemete gleich?

blaueviecher.viecher[blaueviecher.viecheranzahl]:=blaueviecher.viecher[blaueviecher.viecheranzahl-1] Angenommen viecherAnzahl = 8
Dann bekommt das Element 8 alle Datenfelder des Elementes 7
Angenommen viecherAnzahl = 9
Dann bekommt das Element 9 alle Datenfelder des Elementes 8

Nun sind schon die Element 7,8 und 9 gleich.

Nur merkwürdig, dass das ganze vorher korrekt gelaufen ist?

Grüße
Klaus
Klaus
  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
 
#5

Re: denkfehler; array-> dynarray

  Alt 8. Jan 2009, 11:03
ähm... möglicherweise hast du recht, aber stumpfsinnigerweise hat es vorher funktioniert. Außerdem will ich ja nur das allerletzte viech so werden lassen das allervorletze viech. Gibts da eine bessere Lösung=? [hoffnung keimt auf]
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
Klaus01
Online

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

Re: denkfehler; array-> dynarray

  Alt 8. Jan 2009, 11:09
.. kanst Du dazu etwas mehr Code zeigen?

Hier sieht man ja nicht einmal, ob das ganze in einer Schleife läuft
oder in welcher Umgebung das ganze stattfindet.

Grüße
Klaus
Klaus
  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
 
#7

Re: denkfehler; array-> dynarray

  Alt 8. Jan 2009, 11:22
da ist nur ein timer, der damit zusammen hängt:
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
das ist ja der witz an der sache. Das ist praktisch das wesentliche, der rest sind sachen die damit nicht zusammenhängen (labels, buttons, usw);
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
Klaus01
Online

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

Re: denkfehler; array-> dynarray

  Alt 8. Jan 2009, 11:29
.. im Prinzip kann man ja einen Timer bzw. dessen Funktion wie eine Schleife
sehen.

Und dann wird dieser Code immer wieder ausgeführt.

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
hm, wenn ich es mir recht überlege sollte es doch funktionieren:

Wenn mutiere etwas an den Daten des letzten Arrayfeldes ändert hat beim nächsten Durchlauf
das zweitletzte Element die gleichen Daten.
Die neue letzte wird dann wieder mutiert.

Kannst Du mal die Prozedur mutiere hier anfügen,
kann es sein das die Daten nicht richtig in das Array zurückgeschrieben werden.
Denn ein dyn.Array ist nur ein Pointer wenn Du es als Parameter an eine Prozedur übergibst.

[edit], das kann es eigentlich auch nicht sein, denn es wird ja ein tviech übergeben.
Bin mit meinem Latein am Ende.

[edit2] hast Du den Paramter in der mutiere Prozedur als var Parameter deklariert?

Grüße
Klaus
Klaus
  Mit Zitat antworten Zitat
HenKst

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

Re: denkfehler; array-> dynarray

  Alt 8. Jan 2009, 11:43
Also wie Klaus schon sagte

eigentlich müssten immer schon alle Elemente identisch gewesen sein weil du mit
blaueviecher.viecher[blaueviecher.viecheranzahl]:=blaueviecher.viecher[blaueviecher.viecheranzahl-1]; immer nur die Pointer kopierst

Wenn du bei einem eine property änderst, änderst du sie in allen.
Warum das mit nem Statischen array klappt versteh ich nicht.

Richtigerweise müsstest du dir für TViech eine assign methode schreiben.
Dann per
Delphi-Quellcode:
blaueviecher.viecher[blaueviecher.viecheranzahl]:= TViech.Create;
blaueviecher.viecher[blaueviecher.viecheranzahl].Assign(blaueviecher.viecher[blaueviecher.viecheranzahl-1]);
das TViech "kopieren".
Dann hast du eine individuelle isntanz die du ändern kannst ohne das sich das auf die anderen auswirkt.

GreeZ HenKst
narf - not a real function
  Mit Zitat antworten Zitat
Klaus01
Online

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

Re: denkfehler; array-> dynarray

  Alt 8. Jan 2009, 11:49
@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.

@vsilverlord
Ich denke es liegt ein Fehler in der Procedure mutiere vor,
denn nur wenn hier das Array Feld (Tviech) nicht geändert wird
sind alle Elemente/Felder des Arrays gleich.

Grüße
Klaus
Klaus
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 5  1 23     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 09:26 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