Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi Move innerhalb von TBytes (https://www.delphipraxis.net/205776-move-innerhalb-von-tbytes.html)

Benmik 15. Okt 2020 12:55

Move innerhalb von TBytes
 
Folgende Situation:
TB:TBytes mit 1000 Bytes. Jetzt dieser Code:
Delphi-Quellcode:
Move(TB[200],TB[0],800;
SetLength(TB,800);
Funktionieren tut es. Ist das sinnvoll? Sollte man über eine Temp-Variable gehen? Wobei wird am wenigsten Aufwand betrieben (umkopieren etc.)?

Uwe Raabe 15. Okt 2020 13:05

AW: Move innerhalb von TBytes
 
Würde ich mir jetzt keine Gedanken machen und einfach Delete aufrufen. Das funktioniert auch mit anderen Array-Typen.

Delphi-Quellcode:
  Delete(TB, 0, 200);

Benmik 15. Okt 2020 13:16

AW: Move innerhalb von TBytes
 
Tatsächlich so einfach? Ich hatte schwer rumgesucht und war unter anderem auf diesen Beitrag gestoßen (OK, FreePascal, aber immerhin von 2017; geht das in Delphi und in FreePascal nicht?).
Egal, das ist ja schön, danke.

himitsu 15. Okt 2020 14:11

AW: Move innerhalb von TBytes
 
Joar, aber erschreckender Weise wurden diese string-like Array-Operatoren erst im Delphi 10.1 eingeführt, wenn ich mich nicht irre.
+ , Insert und Delete ... Copy ging schon vorher

http://docwiki.embarcadero.com/RADSt...pport_Routines
https://www.embarcadero.com/products/delphi/whats-new
https://www.delphipraxis.net/198002-...-loeschen.html


Über die Record-Operatoren könnte man sich sowas aber auch schon früher selbst bauen.

Rollo62 15. Okt 2020 15:01

AW: Move innerhalb von TBytes
 
Ich benutze noch teilweise selbstgebaute, mit Move und Pointern ...
aber möchte auch generell auf die "Neuen" umstelllen.

Gibt es vielleicht irgendwo einen Benchmark zu den String-Like Funktionen ?
Wäre gut mal zu sehen wie performant die wirklich sind.
(Bei Delphi hatte ich schon öfters mal zu hohe Erwartungen :stupid:)

Benmik 15. Okt 2020 15:26

AW: Move innerhalb von TBytes
 
Zitat:

Zitat von himitsu (Beitrag 1475554)

Delphi-Quellcode:
string.Join
?! Ich glaub's nicht.

himitsu 15. Okt 2020 15:30

AW: Move innerhalb von TBytes
 
Zu cool um wahr zu sein?

http://docwiki.embarcadero.com/Libra...Helper_Methods


Und nee, nicht getestet.
Aber bis auf Ausnahmen versuche ich die Standardfunktionen zu verwenden, bevor ich eigenes Einbau. (weniger eigener Code = theoretisch weniger Fehler)

Uwe Raabe 15. Okt 2020 15:56

AW: Move innerhalb von TBytes
 
Zitat:

Zitat von Rollo62 (Beitrag 1475555)
Gibt es vielleicht irgendwo einen Benchmark zu den String-Like Funktionen ?
Wäre gut mal zu sehen wie performant die wirklich sind.

Wegen des generellen Overheads, den diese Funktionen ja haben müssen, um alle Anwendungsfälle abzudecken, ist die Performance im vorliegenden Fall sicher nicht besser als das gezeigte Move und SetLength. Am Ende tut die interne Routine auch nichts anderes. (Wer sich das selbst ansehen möchte wird bei _DynArrayDelete in System.pas fündig)

Ich finde aber, hier überwiegt Lesbarkeit und Wartbarkeit. Sollte es wirklich zu Performance-Problemen kommen, kann man ja immer noch auf den nativen Ansatz zurückgreifen. Aber eben auch nur dann.

Benmik 15. Okt 2020 16:21

AW: Move innerhalb von TBytes
 
Zitat:

Zitat von himitsu (Beitrag 1475557)

Hab ich erst vor zwei Tagen durchgesehen und Join völlig übersehen. Wo wir dabei sind, was ist eigentlich der Unterschied zwischen Parse und ToInteger?
Zitat:

Zitat von Uwe Raabe (Beitrag 1475558)
Wer sich das selbst ansehen möchte wird bei _DynArrayDelete in System.pas fündig

Hatte ich nicht lokalisieren können. Sind ja mehr als 2 Zeilen, aber deine Sicht ist sicher richtig. Ich hatte in meinem Code noch eigens einen Kommentar dazu geschrieben, was da eigentlich geschieht, weil das Move deutlich unübersichtlicher war als im gezeigten Beispiel; das kann ich mir jetzt sparen und das allein ist es schon wert.

Uwe Raabe 15. Okt 2020 16:58

AW: Move innerhalb von TBytes
 
Zitat:

Zitat von Benmik (Beitrag 1475559)
was ist eigentlich der Unterschied zwischen Parse und ToInteger?

Funktionell offenbar keiner. Existiert vielleicht nur aus Symmetriegründen.

himitsu 15. Okt 2020 20:38

AW: Move innerhalb von TBytes
 
Zitat:

Zitat von Benmik (Beitrag 1475559)
Wo wir dabei sind, was ist eigentlich der Unterschied zwischen Parse und ToInteger?

Da hat jemand bei C# abgeguckt und von da die Bezeichner übernommen.
https://docs.microsoft.com/de-de/dot...ng-to-a-number

Daher sind auch Einige der neuen Funktionen in den Record-Helper bissl delphi-untypisch/unhandlich.

Benmik 15. Okt 2020 20:57

AW: Move innerhalb von TBytes
 
Jetzt lese ich deinen Link durch und denke: "Ja, und warum haben sie dann nicht auch
Delphi-Quellcode:
TryParse
implementiert, das wäre doch mal vernünftig!" Vorsichtshalber suche ich mal und tatsächlich, das gibt es, und wo? In System.SysUtils.TIntegerHelper! Ja, klar, wenn ich einen String konvertieren möchte, dann suche ich doch bei Integer.

Hab's mal probiert:
Delphi-Quellcode:
var i:integer;
begin
  If i.TryParse('1',i)
    then ...
Welcher Logik folgt sowas?

himitsu 15. Okt 2020 20:59

AW: Move innerhalb von TBytes
 
Damit es nicht auffällt, dass auch Anderes fehlt. :lol:

Uwe Raabe 15. Okt 2020 21:40

AW: Move innerhalb von TBytes
 
Zitat:

Zitat von Benmik (Beitrag 1475584)
Ja, klar, wenn ich einen String konvertieren möchte, dann suche ich doch bei Integer.

Hab's mal probiert:
Delphi-Quellcode:
var i:integer;
begin
  If i.TryParse('1',i)
    then ...
Welcher Logik folgt sowas?

Naja, das kann man schon so machen, aber gemeint ist es anders. Da TryParse eine Klassenfunktion ist, wäre der folgende Ansatz etwas geradliniger:

Delphi-Quellcode:
var i:integer;
begin
  If Integer.TryParse('1',i)
    then ...
Deutlicher wird es ohne das Try:
Delphi-Quellcode:
var i:integer;
begin
  i := Integer.Parse('1')

Benmik 15. Okt 2020 23:10

AW: Move innerhalb von TBytes
 
Ja, verstehe. Trotzdem empfinde ich das als irgendwie unpassend. Allenfalls bei deinem zweiten Beispiel stellt sich so etwas wie eine Logik ein. Naja, egal. Man ist versucht zu sagen: CodeInsight geht nicht, aber für sowas hamse Zeit.

himitsu 15. Okt 2020 23:27

AW: Move innerhalb von TBytes
 
Diese Operatoren kannst auch selbst erweitern, wenn dir was fehlt oder etwas besseres einfällt. (es wäre nur einfacher, wenn die "vererbung" nicht so unglücklich gelöst wäre)

Rollo62 16. Okt 2020 07:37

AW: Move innerhalb von TBytes
 
Ich nehme immer noch gerne TryStrToInt oder StrToIntDef.
Weil letzendlich die Parse und TryParse Funktionen diese auch benutzen, welche aber nicht inline sind.

Am Ende der Kette wird bei Ganzzahlen wohl immer Val() benutzt, auch das könnte mal Sinn machen, benutze ich aber auch nicht direkt.

Delphi-Quellcode:
function TryStrToInt(const S: string; out Value: Integer): Boolean;
var
  E: Integer;
begin
  Val(S, Value, E);
  Result := E = 0;
end;

himitsu 16. Okt 2020 09:23

AW: Move innerhalb von TBytes
 
Jo, Delphi-Referenz durchsuchenVal zu nutzen bringt nur was, wenn man auch das Result (E) auswertet. (zu oft schon gesehn, dass das nicht gemacht wird)

Wobei Val anstelle von TryStrToInt, hat nur dann einen Vorteil hat, wenn man wirklich mal die Fehlerposition wissen möchte ... ansonsten schleppt man nur sinnlos die ungenutzte Variable mit sich rum.
Delphi-Quellcode:
S := Edit1.Text;
Val(S, i, E);
if i > 0 then begin
  Edit1.SetFocus;
  Edit1.SelStart := E;
  Edit1.SelLength := 9999;
  raise Exception.Create('ungültige Zahl');
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:58 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