AGB  ·  Datenschutz  ·  Impressum  







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

ArraySpeicher

Ein Thema von thaflo · begonnen am 8. Jul 2004 · letzter Beitrag vom 8. Jul 2004
Antwort Antwort
thaflo

Registriert seit: 7. Jul 2004
10 Beiträge
 
#1

ArraySpeicher

  Alt 8. Jul 2004, 10:23
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.
clProgColors : Array of TColor; Nun weiß ich zu Beginn nicht, ob ich 3 oder 10 Farben brauche, darum habe ich mich für das dynamische Array entschieden.
nachdem ich weiß, wie viele Farben ich brauche, setze ich den array dementsprechende:
SetLength(clProgColors,wievieleichbrauche); 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ß.
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:
SetLength(clProgColors,0);
clProgColors:=nil;
Ich habe ein statisches Array mit 10 feldern gemacht, da lief es ohne Probleme, also *muss* der Fehler hier liegen.

Vilen dank für jegliche Hilfe und Tips.

Florian
  Mit Zitat antworten Zitat
Benutzerbild von alcaeus
alcaeus

Registriert seit: 11. Aug 2003
Ort: München
6.537 Beiträge
 
#2

Re: ArraySpeicher

  Alt 8. Jul 2004, 10:35
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
clProgColors:=nil; raus, dann sollte es funktionieren

Greetz
alcaeus
Andreas B.
Die Mutter der Dummen ist immer schwanger.
Ein Portal für Informatik-Studenten: www.infler.de
  Mit Zitat antworten Zitat
8. Jul 2004, 10:38
Dieses Thema wurde von "Luckie" von "Windows API" nach "Object-Pascal / Delphi-Language" verschoben.
Kein Windows API Problem.
Eisenherz

Registriert seit: 10. Jun 2002
Ort: Stadeln
33 Beiträge
 
Delphi 5 Professional
 
#4

Re: ArraySpeicher

  Alt 8. Jul 2004, 12:43
Zitat von alcaeus:
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.
Die drei Aufrufe
Code:
  SetLength(clProgColors,0);
  clProgColors:=nil;
  Finalize(clProgColors);
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.

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.
aloa Eisenherz
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#5

Re: ArraySpeicher

  Alt 8. Jul 2004, 14:13
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
  Mit Zitat antworten Zitat
Eisenherz

Registriert seit: 10. Jun 2002
Ort: Stadeln
33 Beiträge
 
Delphi 5 Professional
 
#6

Re: ArraySpeicher

  Alt 8. Jul 2004, 17:38
Zitat von Muetze1:
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.
Hast du ein Beispiel für ein solches Speicherleck. Ich habe in den Usergroups nach so einem Fall gesucht, aber keinen gefunden. Dafür bin ich immer wieder auf die Aussage gestoßen, dass SetLength(x,0) das gleiche wäre wie x := nil;
aloa Eisenherz
  Mit Zitat antworten Zitat
Antwort Antwort


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 00:54 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