AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Aus Dynamischen Array Hersusschneiden.
Thema durchsuchen
Ansicht
Themen-Optionen

Aus Dynamischen Array Hersusschneiden.

Ein Thema von shifter · begonnen am 3. Sep 2006 · letzter Beitrag vom 3. Sep 2006
Antwort Antwort
Seite 1 von 2  1 2      
shifter

Registriert seit: 2. Jan 2005
175 Beiträge
 
Delphi 2007 Enterprise
 
#1

Aus Dynamischen Array Hersusschneiden.

  Alt 3. Sep 2006, 07:33


Wie kann ich ein Teil aus dem Dynamischen Array Heraus schneiden und den Rest nachrücken ??

Delphi-Quellcode:
Var
  a : Array of irgen ein Record
  b : Byte;
Begin
  SetLength( a, 5 );
  For b:=0 To 4 Do a[b]:=b
So und jetzt möchte ich den wert aus der Position Nr. 2 Herausschneiden
und das Ergebnis Soll So Aussehen

0,2,3,4



Danke

gruss
seba
  Mit Zitat antworten Zitat
fwsp
(Gast)

n/a Beiträge
 
#2

Re: Aus Dynamischen Array Hersusschneiden.

  Alt 3. Sep 2006, 07:35
ich würde ein temporäres array zu hilfe nehmen, die werte darin zwischenspeichern und dann wieder ins original array packen.
  Mit Zitat antworten Zitat
shifter

Registriert seit: 2. Jan 2005
175 Beiträge
 
Delphi 2007 Enterprise
 
#3

Re: Aus Dynamischen Array Hersusschneiden.

  Alt 3. Sep 2006, 07:51
Hi,

da dran habe ich auch überlegt, aber es könnte vieleich viel zu Zeitaufwendig sein bei grösseren sachen.

Ich dachte vieleicht bibts es eine einfachere metode.

gruss
seba
  Mit Zitat antworten Zitat
Benutzerbild von Daniel B
Daniel B

Registriert seit: 27. Okt 2005
Ort: Dachau
453 Beiträge
 
Delphi 2007 Professional
 
#4

Re: Aus Dynamischen Array Hersusschneiden.

  Alt 3. Sep 2006, 09:10
Kannst die Daten ja nachrücken ohne extriges Array.

Wenn du z.B. 1, 2, 3, 4, 5, hast und löscht 2 und 3, dann kopierst du 4 nach zwei, 5 nach drei und kürzt dann das Array um zwei.
Servus...
  Mit Zitat antworten Zitat
shifter

Registriert seit: 2. Jan 2005
175 Beiträge
 
Delphi 2007 Enterprise
 
#5

Re: Aus Dynamischen Array Hersusschneiden.

  Alt 3. Sep 2006, 10:11
Ja das werde ich jetzt versuchen

danke
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#6

Re: Aus Dynamischen Array Hersusschneiden.

  Alt 3. Sep 2006, 10:26
Delphi-Quellcode:
Procedure DeleteFromArray (anArray : Array Of <MyType>; anIndex : Integer);
Var
  BytesPerElement,
  TotalBytesToMove : Integer;

Begin
  BytesPerElement := Sizeof (anArray [0]);
  TotalBytesToMove := (Length (anArray) - anIndex + 1)* BytesPerElement;
  If TotalBytesToMove > 0 Then
    Move (anArray [anIndex + 1], anArray [anIndex], TotalBytsToMove);
End;
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Hawkeye219

Registriert seit: 18. Feb 2006
Ort: Stolberg
2.227 Beiträge
 
Delphi 2010 Professional
 
#7

Re: Aus Dynamischen Array Hersusschneiden.

  Alt 3. Sep 2006, 10:45
Hallo alzaimar,

du bist zu schnell, ich war mit meinem Code doch noch gar nicht fertig

Drei Korrekturen:
- das Array sollte noch mit SetLength() verkürzt werden
- wg. SetLength muß anArray als VAR-Parameter übergeben werden
- bei der Berechnung von TotalBytesToMove muß die 1 subtrahiert werden

Hier mein Code (hoffentlich fehlerfrei):

Delphi-Quellcode:
type
  TMyRec = record
    x, y : Integer;
    s : string;
  end;

  TDynMyRecArray = array of TMyRec;

// Entfernt aCount Elemente ab Index aStart aus dem dynamischen Feld aArray
procedure RemoveItem (var aArray: TDynMyRecArray; aStart: Integer; aCount: Integer = 1);
begin
  // Startindex auf Gültigkeit prüfen
  if (aStart >= 0) and (aStart <= High(aArray)) then
    begin
      // Anzahl prüfen und ggf. korrigieren
      if (aStart + aCount > Length(aArray)) then
        aCount := Length(aArray) - aStart;
      // Elemente hinter zu löschendem Bereich nach vorne schieben
      if (aStart + aCount < Length(aArray)) then
        Move (aArray[aStart + aCount], aArray[aStart],
              (Length(aArray) - (aStart + aCount)) * SizeOf(aArray[0]));
      // Arraylänge anpassen
      SetLength (aArray, Length(aArray) - aCount);
    end;
end;

procedure Test;
var
  A : TDynMyRecArray;
begin
  SetLength (A, 5);
  ...
  RemoveItem (A, 2); // entfernt das Element A[2]
  RemoveItem (A, 0, 2); // entfernt die Elemente A[0] und A[1]
end;
Noch ein Hinweis: wenn der Record Referenzen auf Objekte enthält, müssen diese vor dem Aufruf von RemoveItem manuell freigegeben werden. Für Interfaces oder dynamische Strukturen erledigt dies die Prozedur SetLength.

Gruß Hawkeye
  Mit Zitat antworten Zitat
shifter

Registriert seit: 2. Jan 2005
175 Beiträge
 
Delphi 2007 Enterprise
 
#8

Re: Aus Dynamischen Array Hersusschneiden.

  Alt 3. Sep 2006, 12:42
Danke für Eure Antworten,
das hat alles ganz schön funktioniert.

Aber mal andere frage die eingentlich auch hier gehören könnte.

Wenn ich jetzt ein Dyn.Array habe wie z.B.
Delphi-Quellcode:
Var
  a : Array of MyRecord;
...
und diesen beenden möchte mit :
Delphi-Quellcode:
  Finalize( a , Length( a ));
  SetLength( a, 0 );
Bekomme ich eine Speicher verletztung !

Wenn ich es mit  a := nil; Wird mein Reservierte Speicher nicht freigegeben.

Also wie soll ich es Beenden ?

Gruss
  Mit Zitat antworten Zitat
Hawkeye219

Registriert seit: 18. Feb 2006
Ort: Stolberg
2.227 Beiträge
 
Delphi 2010 Professional
 
#9

Re: Aus Dynamischen Array Hersusschneiden.

  Alt 3. Sep 2006, 13:00
Hallo shifter,

bei einem Verkleinern dynamischer Arrays durch SetLength wird automatisch für die freigegebenen Elemente ein Finalize durchgeführt. Wenn du es trotzdem aufrufen möchtest, dann so:

Finalize (a[0], Length(a)); Auch das Löschen dynamischer Arrays über eine Zuweisung von NIL führt zu einem Finalize-Aufruf. Dabei werden aber immer nur dynamische Strings oder Arrays sowie Interface-Zeiger behandelt. Objekte, zu denen du Referenzen im Record abgelegt hat, muß du selbst durch einen Aufruf ihrer Free-Methode freigeben.

Gruß Hawkeye
  Mit Zitat antworten Zitat
shifter

Registriert seit: 2. Jan 2005
175 Beiträge
 
Delphi 2007 Enterprise
 
#10

Re: Aus Dynamischen Array Hersusschneiden.

  Alt 3. Sep 2006, 13:47
Ja ,
jetzt sieht es viell besser aus.

Aber trotz dem wenn ich mir mit dem TaskManager den Speicher verbrauch mal angucke vor dem
ich den Dyn.Array erstelle und nach dem ich Ihm auflöse bekomme ich nicht mehr den alten wert.

Also wenn ich die Aktion ein paar mal wiederhole verbraucht mein Proggi immer mehr Speicher.

Vieleich mal zu den Record,
er besteht aus ein paar Integers, und TBitmaps.

Die TBitmaps werden am Ende mit Free freigegeben 8und am Ende habe ich so gemach wie Du mir das
geschrieben hast also mit
  Finalize ( a[0], Length(a)); Warum bekomme ich nicht den alten zustand wieder her ?

gruss
seba
  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 04:34 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