![]() |
Delphi-Version: XE2
Array of Record Speicher/Finalization Problem
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 |
AW: Array of Record Speicher/Finalization Problem
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:
sollte der Teil keinen Ärger machen.
-- bei mir gerne so
SetLength(Lines_points ,High(Lines_points)+2); Lines_points[High(Lines_points)] := Du musst hier auch keine Variable freigeben, darum kümmert sich Delphi, wie bei Strings. |
AW: Array of Record Speicher/Finalization Problem
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 ? |
AW: Array of Record Speicher/Finalization Problem
High() gibt bei einem leeren Array -1 zurück, ein High() von 0 entspricht ja einem Element.
|
AW: Array of Record Speicher/Finalization Problem
Delphi-Quellcode:
und ich bin heute wahrscheinlich begriffsstutzig, ich weiß immer noch nicht was Du vorhast ....
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; |
AW: Array of Record Speicher/Finalization Problem
Delphi-Quellcode:
finde ich persönlich verständlicher.
SetLength(a, Length(a) + 1);
|
AW: Array of Record Speicher/Finalization Problem
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. |
AW: Array of Record Speicher/Finalization Problem
Der Verständlichkeit halber würde ich den Record wohl so deklarieren:
Delphi-Quellcode:
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.
type
TLine = record StartPoint, EndPoint: TPoint; end; |
AW: Array of Record Speicher/Finalization Problem
Warum nicht gleich ein Array of Tpoint, die Linen ergeben sich immer aus Point[x] und Point[x-1] für x>0
|
AW: Array of Record Speicher/Finalization Problem
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. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:14 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