Autor Beitrag
daywalker0086
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 243


Delphi 2005 Architect
BeitragVerfasst: Mi 03.12.08 17:26 
ich schonwieder...
Wie bekomm ich es hin in einem dynamischen array alles werte 2 oder drei felder nach vorn zu schieben und hinter wieder nullwerte einzufügen?
Die ersten 2 werte der Felder gehen dabei verloren was auch gewollt ist.
Hinten müssen wieder 2 mal nullen eingefügt werden damit das array seine länge behält und nicht kürzer wird.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mi 03.12.08 17:50 
Bei einem dynamischen Array würde ich vermuten, dass du dann die Länge auch verkleinern würdest, aber wo liegt denn das Problem beim Verschieben?
An Position 0 muss Element 0 + 2, an Position 1 Element 1 + 2 usw., am Ende dann noch die Nullen.
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
procedure DelArrayLeft(var a: array of Integer; uCount: Integer);
var
  i: Integer;
begin
  for i := 0 to High(a) - uCount do
    a[i] := a[i + uCount];
  for i := Length(a) - uCount to High(a) do
    a[i] := 0;
end;
elundril
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3747
Erhaltene Danke: 123

Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
BeitragVerfasst: Mi 03.12.08 17:53 
gibts nicht so nen befehl wie copy der die erste schleife ersetzt?

lg elundril

_________________
This Signature-Space is intentionally left blank.
Bei Beschwerden, bitte den Beschwerdebutton (gekennzeichnet mit PN) verwenden.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mi 03.12.08 17:55 
Copy geht auch für Arrays, aber ich will ja nix kopieren. ;-)
(Und Slice schneidet einen Teil eines Arrays aus.)
daywalker0086 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 243


Delphi 2005 Architect
BeitragVerfasst: Mi 03.12.08 18:04 
Achso hab ich vergessen: das array ist vom typ string
also muss ich ucount auf 2 setzen damit er mir die elemente um 2 felder nach vorn verschiebt oder wie?
ich steig noch nicht ganz durch deine schleife durch
hab das jetzt so aber funzt irgendwie nicht, meckert über zugriffsverletzungen:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
 
ucount:= 3;
           for i := 0 to High(daten) - uCount do
           Daten[i] := Daten[i + uCount];
           for i := Length(Daten) - uCount to High(Daten) do
           Daten[i] := '0000';
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mi 03.12.08 18:10 
Das einzige was du ändern musst ist der Typ des Arrays, dann kannst du die Prozedur normal aufrufen, in der Prozedur musst du gar nix ändern, der Wert uCount wird ja als Parameter übergeben.
ausblenden Delphi-Quelltext
1:
procedure DelArrayLeft(var a: array of String; uCount: Integer);					
daywalker0086 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 243


Delphi 2005 Architect
BeitragVerfasst: Mi 03.12.08 18:16 
und was für einen wert soll ich für ucount übergeben?
es kommt immer die meldung ... ist kein gültiger integerwert
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mi 03.12.08 18:25 
2 in deinem Fall.
ausblenden Delphi-Quelltext
1:
DelArrayLeft(DeinArray, 2);					
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mi 03.12.08 23:09 
Man könnte auch, die letzten zwei Elemente auf das erst und zweite Element kopieren und dann die letzte beiden Elemente mit nullen / leeren Strings füllen. Natürlich geht dabei die Sortierung verloren ofern vorhanden. Aber ein neu Sortieren mit einem effektiven Algorithmus ist bestimmt effektiver, als alle Elemente zu kopieren.

Man könnte auch das Array durch eine verkettete Liste ersetzen und dann die Zeiger alle entsprechend umbiegen.

Oder man nimmt eine T(Object)List und speichert in dieser die Strings.
Boldar
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1555
Erhaltene Danke: 70

Win7 Enterprise 64bit, Win XP SP2
Turbo Delphi
BeitragVerfasst: Mi 03.12.08 23:13 
oder man macht das array als pointer, reserviert da ausreichend speicher und biegt den Pointer dann um.
delfiphan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: Mi 03.12.08 23:26 
Die ersten zwei Elemente mit Finalize freigeben. n-2 Elemente mit move verschieben. Die letzten beiden Elemente mit FillChar oder ZeroMemory auf 0 setzen.

PS: Je nach Typ (z.B. Integer) wird der Finalize Aufruf ignoriert, was aber nicht stört. FillChar oder Move sollte nicht ersetzt werden durch eine For-Schleife mit Zuweisungen, sonst gibt's Probleme bei referenzgezählten Typen. Wenn, dann beide durch For-Schleifen ersetzen. Dann leidet aber die Performance darunter.