AGB  ·  Datenschutz  ·  Impressum  







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

Dynamisches Array verkleinern

Ein Thema von dominikkv · begonnen am 27. Aug 2007 · letzter Beitrag vom 27. Aug 2007
Antwort Antwort
dominikkv

Registriert seit: 30. Sep 2006
Ort: Gundelfingen
1.109 Beiträge
 
Delphi 2007 Professional
 
#1

Dynamisches Array verkleinern

  Alt 27. Aug 2007, 16:29
Hi

ich hab ein dynamisches Array:
var DynArray: Array of Integer; Um Werte reinzuschreiben muss ich erst einmal eine Länge setzen:
SetLength(DynArray, 20); Wenn ich das Array vergrößern will rufe ich einfach nochmal SetLength auf:
SetLength(DynArray, 35); Ich habe bisher, um das Array wieder zu verkleinern, wieder SetLength aufgerufen, mit einem kleineren Wert.
Nun lese ich:
Zitat von Markt&Technik: Jetzt lerne ich Delphi:
Um das Array zu verkleinern, muss jedoch die Copy-Funktion benutzt werden...
Um das Array zu verkleiner müsste ich nun folgendes machen:
DynArray := Copy(DynArray, 0, 10); Und nun zu meiner Frage:
Kann ich das auch mit SetLength machen oder hab ich dann ein Speicher-Leak?
Ich müsste dann nämlich alle bisherigen Projekte umschreiben^^

mfg.Dominik
Dominik
Wer anderen eine Grube gräbt, hat ein Gruben-Grab-Gerät!
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#2

Re: Dynamisches Array verkleinern

  Alt 27. Aug 2007, 16:38
Hallo Dominik,

du wirst das eventuell untersuchen müssen, denn Borland schreibt zum Thema dynamische Arrays etwas anderes:

... Um ein dynamisches Array abzuschneiden, übergeben Sie es an SetLength oder Copy und weisen das Ergebnis wieder der Array-Variablen zu. Die Prozedur SetLength ist normalerweise schneller. ...

Vergrößern geht nur mit SetLength(), verkleinern auch mit Copy() und automatischer Freigabe des Originals.

Grüße vom marabu
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#3

Re: Dynamisches Array verkleinern

  Alt 27. Aug 2007, 16:39
Ist mir auch.

Intern wird Reallocmem aufgerufen und damit dürften keine Speicherprobleme auftreten.
Auch ein Blick ins CPU-Fenster bei einem Test zeigt, dass der Memorymanager eingreift und das Array kürzt.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
pstruh
(Gast)

n/a Beiträge
 
#4

Re: Dynamisches Array verkleinern

  Alt 27. Aug 2007, 16:44
Hallo Dominik,
ich verwende in meinen Programmen immer (und ohne Probleme)...
 SetLength(MyArray,High(MyArray)+2) zum vergrößern, und
SetLength(MyArray,High(MyArray) zum verkleinern.

Aber nun auch von mir eine Frage, die meine Unkenntnis der tieferen Vorgänge in Delphi offenbart: Ist es notwendig am Programmende das dynamische Array mit
MyArray:=nil wieder zu dereferenzieren - oder ist das völlig überflüssig, da das Programm mit seiner Beendigung (automatisch) alles aus dem Speicher entfernt?
Gruß
  Mit Zitat antworten Zitat
dominikkv

Registriert seit: 30. Sep 2006
Ort: Gundelfingen
1.109 Beiträge
 
Delphi 2007 Professional
 
#5

Re: Dynamisches Array verkleinern

  Alt 27. Aug 2007, 17:18
Ok, Danke für eure Antworten

Dann ist SetLength ja sogar besser als Copy...
Da kommt mir so manches ein bisschen komisch vor was in diesem Buch steht^^

Zitat von pstruh:
Aber nun auch von mir eine Frage, die meine Unkenntnis der tieferen Vorgänge in Delphi offenbart: Ist es notwendig am Programmende das dynamische Array mit
MyArray:=nil wieder zu dereferenzieren - oder ist das völlig überflüssig, da das Programm mit seiner Beendigung (automatisch) alles aus dem Speicher entfernt?
Gruß
Wenn du das Programm komplett beendest wird eh der ganze Speicher wieder freigegeben...
Und wenn du den Speicher zur Laufzeit freigeben willst einfach (wie wir grad gelernt haben^^) Setlength(MyArray, 0); aufrufen.
Dominik
Wer anderen eine Grube gräbt, hat ein Gruben-Grab-Gerät!
  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 12:49 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