AGB  ·  Datenschutz  ·  Impressum  







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

Array Inhalt versetzen?

Ein Thema von MicMic · begonnen am 7. Mai 2020 · letzter Beitrag vom 10. Mai 2020
Antwort Antwort
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.433 Beiträge
 
Delphi 12 Athens
 
#1

AW: Array Inhalt versetzen?

  Alt 8. Mai 2020, 08:46
in diesem besonderen Fall gäbe es sogar TStringlist als eigenen Typen
Auch Insert und Delete funktionieren nun endlich auch mit Arrays. (auch wenn CodeInsight das schon seit Jahrzehnten behauptete es aber nie funktionierte)

Delphi-Quellcode:
SetLength(A, 3);
A[0] := 'Auto';
A[1] := 'Fahrrad';
A[2] := 'Flugzeug';

Insert(A[2], A, 1);
Delete(A, 3, 1);
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
MicMic

Registriert seit: 26. Mai 2018
296 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#2

AW: Array Inhalt versetzen?

  Alt 8. Mai 2020, 14:19
Danke für die vielen Antworten.
Ich will es noch mit meinem "TArray<String>" probieren. Trotzdem Danke @Medium für die Info TList.

Ich habe jetzt "nach links verschoben" getestet und es geht:
Code:
 Insert(A[0], A, Length(A));
 Delete(A,0,1);

 // oder auch so:

 SetLength(A,Length(A)+1);
 A[Length(A)-1] := A[0];
 Delete(A,0,1);
Die andere Richtung (nach rechts) habe ich so gemacht:
Code:
 SetLength(A,Length(A)+1);
 Insert(A[Length(A)-1], A, 0);
 Delete(A,Length(A)-1,1);
 SetLength(A,Length(A)-1); // *
* Verstehe ich nicht so ganz. Davor habe ich ja ein Delete. Also ich lösche den letzten Inhalt. Aber da wird wohl die Array-Länge nicht gekürzt. Wobei das mit dem obigen Code (nach links verschieben) dann geht. Dort habe ich kein "SetLength" nach dem "Delete". Auch geht der erste Code (nach links verschieben; der erste Teil) ganz ohne SetLength. Ein Code (nach rechts) ohne "SetLength" habe ich nicht hinbekommen. Wobei ich dachte, "Delete" kürz die Array-Länge und "Insert" macht die Array-Länge automatisch größer. Scheint aber wohl damit zusammenzuhängen, wo man etwas einfügt, sprich am Anfang oder am Ende.

Jedenfalls muss ich hier mit "Length" arbeiten, da das Array ja nicht immer nur 3 Inhalte hat. Kann auch al mehr sein. Aber dann nicht hundert/tausend... vielleicht max. bis 20. Getestet habe ich es gerade mit 9 Inhalten.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.433 Beiträge
 
Delphi 12 Athens
 
#3

AW: Array Inhalt versetzen?

  Alt 8. Mai 2020, 15:36
* Verstehe ich nicht so ganz.
Du machst da auch am Anfang ein SetLength+1, also ist am Ende natürlich auch ein SetLength-1 nötig, oder du lässt die SetLength in diesem Fall komplett weg.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
MicMic

Registriert seit: 26. Mai 2018
296 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#4

AW: Array Inhalt versetzen?

  Alt 8. Mai 2020, 16:05
* Verstehe ich nicht so ganz.
Du machst da auch am Anfang ein SetLength+1, also ist am Ende natürlich auch ein SetLength-1 nötig, oder du lässt die SetLength in diesem Fall komplett weg.
Hmm, in der 2. Variante von "nach links verschieben" habe ich auch SetLength+1 aber kein SetLength-1. Aber das geht so.
Wenn ich für "nach rechts verschieben" die beiden SetLength's rausmache, dann verschiebt er aber nicht richtig die Inhalte.

Aber mal zur Info: Ich habe ein String "Dies,Das,Auto,Flugzeug,irgendwas" und mein Array fülle ich dann mit "a:=stringvariable.Split([','])".
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.433 Beiträge
 
Delphi 12 Athens
 
#5

AW: Array Inhalt versetzen?

  Alt 8. Mai 2020, 16:55
Ja, aber dort entspricht das SetLength zusammen mit dem := einem Insert.

Hier hast du Insert+Delete und die SetLength (ohne eine Zuweisung).




Da man leider an dynamische Arrays (noch) keine Record-Helper hägen kann, um sich direkt solche Funktionen nachzurüsten
und da es unmöglich ist bestehende Record-Helper zu erweitern,
hab ich mir einen Record genommen, dort ein TArray<string> reingebaut, alles noch schön mit impliziten Casts und paar Methoden aufbemotzt
und mir somit eine Art TStringList gebaut, die sich von der Speicherverwaltung wie ein Array verhält, aber solche netten Methoden wie z.B. Insert, Delete und Move enthält.
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu ( 8. Mai 2020 um 17:00 Uhr)
  Mit Zitat antworten Zitat
DieDolly

Registriert seit: 22. Jun 2018
2.175 Beiträge
 
#6

AW: Array Inhalt versetzen?

  Alt 8. Mai 2020, 17:21
Zitat:
Ist halt nicht so einfach auf variable Arraylängen anpassbar.
Verstehe das Problem nicht. Das ist ein einfacher Switch über ein string array.
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.688 Beiträge
 
Delphi 2007 Enterprise
 
#7

AW: Array Inhalt versetzen?

  Alt 8. Mai 2020, 18:09
Zitat:
Ist halt nicht so einfach auf variable Arraylängen anpassbar.
Verstehe das Problem nicht. Das ist ein einfacher Switch über ein string array.
Nein. Der Fragesteller möchte nicht 2 Elemente tauschen, sondern das erste zum letzten machen, und alle nach dem ersten sollen um einen Indext nach unten rutschen. (Und auch den umgekehrten Weg.) Hatte mich bei deiner ersten Antwort schon gewundert, was das mit dem Problem des TE zu tun hat - außer man rauscht ein Mal kräftig auf "komplizierte" Weise durch das ganze Array.
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
MicMic

Registriert seit: 26. Mai 2018
296 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#8

AW: Array Inhalt versetzen?

  Alt 9. Mai 2020, 08:03
Die eine Richtung mit:
Code:
 SetLength(A,Length(A)+1);
 Insert(A[Length(A)-1], A, 0);
 Delete(A,Length(A)-1,1);
 SetLength(A,Length(A)-1);
die nur mit "SetLength+1" und "SetLength-1" geht, habe ich geändert.

Nur ein:
Code:
 Insert(A[Length(A)-1], A, 0);
 Delete(A,Length(A)-1,1);
reicht aber hier nicht. Er setzt hier den vorletzten Eintrag an den Anfang. Auf den letzten Eintrag im Array habe ich gar keinen Zugriff. Das lieg wohl am Aufbau von "Insert" (wegen "Length(A)-1").

Ich habe mir jedenfalls entsprechende Prozeduren gemacht (für beide Richtungen):
Code:
 Procedure TabToLeft(Var A:TArray<String>);
 Begin
   Insert(A[0], A, Length(A));
   Delete(A,0,1);
 End;

 Procedure TabToRight(Var A:TArray<String>);
 Var S : String;
 Begin
  S := A[Length(A)-1];
  Insert(S, Splitted, 0);
  Delete(A,Length(A)-1,1);
 End;
So geht's dann komplett ohne "SetLength".

Danke für die Hilfe meiner Problemlösung.

Gruß Micha
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.433 Beiträge
 
Delphi 12 Athens
 
#9

AW: Array Inhalt versetzen?

  Alt 9. Mai 2020, 14:40
Ohh, eigentlich sollte der Wert vorher kopiert und als Parameter übergeben werden,
aber könnte wirklich sein, dass hier die Compilermagic und Codeoptimierung durchschlägt, da Insert und Delete nicht wirklich so richtige "normale" Prozeduren sind.

Über die Record-Operatoren hast hier dann mehr Glück, weil die komplett extrem unoptimierbar sind.


Nja, direkt ist es so eigentlich auch nicht optimal, denn hier wird ja zwei mal die Länge des Arrays geändert und im extremfall auch alles bis zu zwei Mal komplett umkopiert.
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu ( 9. Mai 2020 um 14:42 Uhr)
  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 21:10 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