![]() |
ArraySpeicher
Hallo!
Ich weiß, das Thema Array ist immer und immer wieder aufgetaucht, aber die bisherigen Themen (ja ich habe die Hilfe benutzt) konnten mir nicht helfen. Ich habe ein Spiel, das zu Beginn einen dynamischen Array aus Farben hat.
Delphi-Quellcode:
Nun weiß ich zu Beginn nicht, ob ich 3 oder 10 Farben brauche, darum habe ich mich für das dynamische Array entschieden.
clProgColors : Array of TColor;
nachdem ich weiß, wie viele Farben ich brauche, setze ich den array dementsprechende:
Delphi-Quellcode:
Nun wird das Spiel neu gestartet, das heißt, ich muss den array löschen und warten, bis ich die neue anzahl der farben weiß.
SetLength(clProgColors,wievieleichbrauche);
Bei folgenden Lösungsversuchen bekommen ich trotzdem eine EAccessViolation, nicht nach dem ersten Mal, aber nach dem 2 oder 3 versuch, das spiel neu zu starten.
Delphi-Quellcode:
Ich habe ein statisches Array mit 10 feldern gemacht, da lief es ohne Probleme, also *muss* der Fehler hier liegen.
SetLength(clProgColors,0);
clProgColors:=nil; Vilen dank für jegliche Hilfe und Tips. Florian |
Re: ArraySpeicher
Ein Array ist eigentlich nur ein Pointer, der auf die Anfangsadresse der Elementreihe zeigt. Du setzt den Pointer auf nil. Wird nun danach nochmals SetLength aufgerufen oder auf das Array zuggriffen, so kriegst du eine ZV, da das Array irgendwo im Nirvana rumschwirrt. Schmeiß mal das
Delphi-Quellcode:
raus, dann sollte es funktionieren
clProgColors:=nil;
Greetz alcaeus |
DP-Maintenance
Dieses Thema wurde von "Luckie" von "Windows API" nach "Object-Pascal / Delphi-Language" verschoben.
Kein Windows API Problem. |
Re: ArraySpeicher
Zitat:
Code:
machen letztendlich alle das Gleiche. Wenn man nil zuweist, dann wird nicht der Pointer auf nil gesetzt. Der Compiler weiß, dass es sich hier um ein dynamisches Array handelt und macht nichts weiter als den Code einzusetzen, der das dynamische Array leert.
SetLength(clProgColors,0);
clProgColors:=nil; Finalize(clProgColors); Wenn man es im CPU-Fenster debuggt, dann landet man bei allen drei Methoden irgendwann in der Funktion @DynArrayClear. Dann sieht man auch, dass die Variante mit dem nil zuweisen, die schnellste ist. |
Re: ArraySpeicher
Moin!
Die Methode mit der Nil Zuweisung hinterlässt Speicherlecks - die habe ich mal bei einem Projekt auf Arbeit gesucht und bei der Zuweisung gefunden. SetLength(, 0); macht das sauber. MfG Muetze1 |
Re: ArraySpeicher
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:26 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