AGB  ·  Datenschutz  ·  Impressum  







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

Array of Record Speicher/Finalization Problem

Ein Thema von Kampfheizung · begonnen am 6. Jul 2012 · letzter Beitrag vom 7. Jul 2012
Antwort Antwort
Seite 1 von 2  1 2      
Kampfheizung

Registriert seit: 6. Jul 2012
8 Beiträge
 
#1

Array of Record Speicher/Finalization Problem

  Alt 6. Jul 2012, 16:08
Delphi-Version: XE2
Moin Moin,

ich hab da ein kleines/großes Problem bei meiner Seminar-Aufgabe.

Ich habe mir ein Record gemacht der wiefolgt aussieht :

type
Lines = record
x : array [0..1] of integer;
y : array [0..1] of integer;
end;

und dieser Record wird jetzt einer Variable zugewiesen

var Lines_points : array of Lines;

ich möchte mehrere Linien haben mit Anfangspunkt[0] und Endpunkt[1] die ich dann später auf Collision usw. überprüfen kann.

Problem ist :

Immer wenn ich meinen Spieler nach oben bewege und x/y drücke zählt er Anz_Lines um 1 hoch
und setzt dann die Länge meiner Variable Lines_points auf Anz_Lines und speichert dann zuerst den Anfangspunkt
und dann wenn eine andere Pfeiltaste gedrückt wurde den Endpunkt und zählt danach wieder Anz_Lines hoch
weil ja wieder eine neue Pfeiltaste gedrückt wurde und er ja eine neue Linie beginnt.

So speichere ich zurzeit meine Koordinaten - wenn da schon Fehler sind gleich mir auf die Finger haun.

Nun gehts dann weiter und er zeichnet bei jedem OnPaint-Ereignis meiner Paintbox das Spielfeld ( mit samt der Linien ) neu :

procedure TMain.P_Spielfeld();
var
i : integer;
begin

°
°
°
for I := low(lines_points) to high(lines_points) do
begin
Anzeigeflaeche.canvas.MoveTo(Lines_points[anz_lines].x[0], Lines_points[anz_lines].y[0]);
Anzeigeflaeche.Canvas.LineTo(Lines_points[anz_lines].x[1], Lines_points[anz_lines].y[1]);
end;

end;

das funktioniert schon nicht so wie ich haben möchte - weil er zeichnet i-wie immer nur so ganz lütte Striche
obwohl ich jetzt vom obersten Rand bis zum Untersten Rand zeichne und wenn ich das Fenster minimiere und wieder aufrufe
habe ich dann nur ein einzigen langen Strich der immer vom 0 Punkt bis zu dem letzten gezeichneten Punkt geht.

Das ist aber gerade nicht mein "großes" Problem, sondern das wieder freigeben meiner Variable :

finalize(lines_points);

ich hab überall gesucht und so genaue Eingebungen kamen da nicht - viele meinten das der Garbage-Collector alles
brav bereinigt und der Speicher wieder frei ist andere - das man die Länge wieder auf 0 setzen würde damit alles nil
ist (was aber eigentlich finalize macht(?) ).

Und immer wenn ich dann mein Programm schließe bekomme ich immer schön tausende an Speicher-Errors weil er den
Speicher nicht freibekommt.

Danke schonmal für die Hilfe
Mit freundlichen Grüßen
Marcel
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#2

AW: Array of Record Speicher/Finalization Problem

  Alt 6. Jul 2012, 16:25
mir ist nicht ganz klar was die Anfangs- und Endpunkte der Linien sein sollen, aber wurscht

Wenn Dir klar ist dass nach SetLength(Lines_points,anz) auf Lines_points[anz-1] als höchster Index zugegriffen werden muss
Delphi-Quellcode:
-- bei mir gerne so
SetLength(Lines_points ,High(Lines_points)+2);
Lines_points[High(Lines_points)] :=
sollte der Teil keinen Ärger machen.

Du musst hier auch keine Variable freigeben, darum kümmert sich Delphi, wie bei Strings.
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
Kampfheizung

Registriert seit: 6. Jul 2012
8 Beiträge
 
#3

AW: Array of Record Speicher/Finalization Problem

  Alt 6. Jul 2012, 16:37
Anfangs und Endpunkte wären :

X-gedrückt und Links-Gedrückt : Spieler_x und y_position gleich Anfangspunkt

x-gedrückt und NICHT mehr Links-Gedrückt dafür andere Pfeiltaste : Spieler_x und y_position gleich Endpunkt



Also wenn ich die Taste X oder Y drücke und ich nach links drücke
wird bevor die Koordinaten addiert werden entsprechend der Taste
die Anz_Lines inkrementiert und die Länge auf die Anz_Lines gesetzt ( also bei der ersten Linie := 1 )
und nun wartet er so lange bis er zum Beispiel nach unten drückt
wieder das gleiche Spiel mit einer kleinen Abwandlung
bevor er die neuen Koordinaten bekommt setzt er
auf Lines_points[anz_lines].x[1] und y[1] den Endpunkt wo er gerade eine andere Taste gedrückt hat
( Anz_lines ist immer noch 1).

Eine Frage - warum setzt du High(Lines_points) auf +2 - high wäre doch bei keinem Eintrag = 0 oder irre ich mich da ?
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.542 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Array of Record Speicher/Finalization Problem

  Alt 6. Jul 2012, 16:40
High() gibt bei einem leeren Array -1 zurück, ein High() von 0 entspricht ja einem Element.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#5

AW: Array of Record Speicher/Finalization Problem

  Alt 6. Jul 2012, 16:44
Delphi-Quellcode:
Var
 a:Array of integer;
begin
  Showmessage(intToStr(High(a)));
  SetLength(a,High(a)+2);
  a[High(a)] := 7;
  Showmessage(Format('High: %d Wert: %d',[High(a),a[0]]));
end;
und ich bin heute wahrscheinlich begriffsstutzig, ich weiß immer noch nicht was Du vorhast ....
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.542 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Array of Record Speicher/Finalization Problem

  Alt 6. Jul 2012, 16:48
SetLength(a, Length(a) + 1); finde ich persönlich verständlicher.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Kampfheizung

Registriert seit: 6. Jul 2012
8 Beiträge
 
#7

AW: Array of Record Speicher/Finalization Problem

  Alt 6. Jul 2012, 17:16
Also ich protokoliere mal kurz die Stelle um es verständlicher zu gestalten :

Vorweg noch einmal :

Ich habe eine Paintbox die zeichnet ein Spielfeld - was am Anfang nur die Hintergrundfarbe
und die Linienfarbe beinhaltet - außen auf den Linien darf der Spieler sich frei bewegen
mit den Pfeiltasten - wenn er x oder y drückt darf er sich auch im Spielfeld bewegen
und zeichnet eine Linie hinter sich her die auf der Paintbox gezeichnet werden muss
ansonsten verschwindet sie ja immer wieder.

Da wo der Spieler auf dem Rand reingeht ins Spielfeld ist der Anfangspunkt
und dort wo er dann seine Lauf-Richtung ändert ist der Endpunkt

also soll eine Linie vom Anfangspunkt bis zum Endpunkt gezeichnet werden
also moveto Anfangspunkt lineto Endpunkt.

Diese Linien könnte ich ja ganz einfach so zeichnen blos ich brauche die x und y Koordinaten
von den einzelnen Linien weil ich einen Gegner habe in der Mitte der sich im Spielfeld
bewegt und mit mir Kollidieren will. Darum muss ich überprüfen ob er eine bestimmte Linie getroffen hat
oder nicht.

PS : Hab ich ganz vergessen zu erwähnen es geht um das Spiel Qix - dann wird das sicherlich verständlicher.


Und ich hab den Speicher-Fehler rausbekommen - ich habe versucht immer auf ein Element zuzugreifen was noch gar nicht erstellt/vorhanden war.
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.542 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: Array of Record Speicher/Finalization Problem

  Alt 6. Jul 2012, 17:22
Der Verständlichkeit halber würde ich den Record wohl so deklarieren:
Delphi-Quellcode:
type
  TLine = record
    StartPoint,
    EndPoint: TPoint;
  end;
Wenn Du nun die Richtung wechselst, erweiterst Du Dein Array um ein Element und setzt EndPoint des vorher letzten Elements und StartPoint des nun letzten auf die aktuelle Position relativ zur Paintbox. Nach meinem Dafürhalten sollte das eigentlich funkionieren.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#9

AW: Array of Record Speicher/Finalization Problem

  Alt 6. Jul 2012, 17:37
Warum nicht gleich ein Array of Tpoint, die Linen ergeben sich immer aus Point[x] und Point[x-1] für x>0
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
Kampfheizung

Registriert seit: 6. Jul 2012
8 Beiträge
 
#10

AW: Array of Record Speicher/Finalization Problem

  Alt 6. Jul 2012, 18:24
Habe ich jetzt auch genommen ( TPoint).

Ich merke selber das ich wegen der Zeitfrist bisschen in Druck gerate
und die Modularisierung des Programmes dadurch flach fällt.

Aber ich bedanke mich schonmal das ihr mir da aus der Patsche geholfen habt
ich war da so ziemlich am verzweifeln bei dem Kram.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      

 

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 11:40 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