AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Array zuweisungen

Ein Thema von TurboMagic · begonnen am 13. Jan 2019 · letzter Beitrag vom 15. Jan 2019
Antwort Antwort
TurboMagic

Registriert seit: 28. Feb 2016
Ort: Nordost Baden-Württemberg
125 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#1

Array zuweisungen

  Alt 13. Jan 2019, 14:47
Hallo,

mal eine "blöde" Frage. Was ist der Unterschied zwischen diesen beiden Code Fragmenten:

Delphi-Quellcode:
function TMyClass.DecodeBytes(const Source: TBytes): TBytes;
begin
  Result := Source;
  if Length(Result) > 0 then
    Decode(Source[0], Result[0], Length(Source));
und

Delphi-Quellcode:
function TMyClass.DecodeBytes(const Source: TBytes): TBytes;
begin
  SetLength(Result, Length(Source));
  if Length(Result) > 0 then
    Decode(Source[0], Result[0], Length(Source));
Vor allem in Bezug auf Speicherallokation und den Fall, wo jemand
das Funtionsergebnis weiterhin benutzt, obwohl der Aufrufer den
Parameter Source schon wieder freigegeben/anderweitig benutzt hat.

Kopiert die Wertzuweisung des ersten Falls die Daten um, so wie es
Move auch täte nur dass bei der Zuweisung Result vorher noch sauber
dimentioniert wird oder wird da Result nur auf die Adresse von Source
gesetzt? (eher unwahrscheinlich für mich, aber ich will das verstehen)
  Mit Zitat antworten Zitat
Redeemer

Registriert seit: 19. Jan 2009
Ort: Kirchlinteln (LK Verden)
434 Beiträge
 
Delphi 2009 Professional
 
#2

AW: Array zuweisungen

  Alt 13. Jan 2019, 16:48
Source und Result sind beides Zeiger. Die Zuweisung im ersten Ausschnitt setzt den Zeiger also so, dass Source und Result auf dasselbe Array zeigen. Man könnte auch das hier schreiben:
Delphi-Quellcode:
procedure TMyClass.DecodeBytes(var Source: TBytes);
begin
  if Length(Source) > 0 then
    Decode(Source[0], Source[0], Length(Source));
In der Regel wird man Delphi-Referenz durchsuchenSystem.Copy verwenden wollen, wenn man Arrayvariablen etwas zuweist.
Janni
2005 PE, 2009 PA, XE2 PA
  Mit Zitat antworten Zitat
peterbelow

Registriert seit: 12. Jan 2019
Ort: Hessen
12 Beiträge
 
Delphi 10.3 Rio
 
#3

AW: Array zuweisungen

  Alt 14. Jan 2019, 12:46
TBytes ist ein reference type (d. h. eine Variable dieses Typs enthält einen Pointer auf den Speicher, der die eigentlichen Daten enthält). Das erste Konstrukt verändert direkt den Inhalt des übergebenen TBytes arrays, ohne irgendwelchen neuen Speicher zu allokieren. Das sieht auf den ersten Blick seltsam aus, da der Parameter ja als Const deklariert ist. Wieso kann man ihn also modifizieren? Das geht aber bei allen reference types, da der Compiler nur den übergebenen Pointer als Const behandelt und nicht den Speicher, auf den der Pointer verweist. Trotzdem ist das Konstrukt etwas "anrüchig", weil die Deklaration ja auf den ersten Blick so aussieht, als wenn die Methode den übergebenen Parameter nicht ändern wird. Sollte man vermeiden, die Methode hat so einen nicht direkt ersichtlichen side effect.

Das zweite Konstrukt macht es richtig, es allokiert einen neuen, separaten array und liest nur aus dem übergebenen array; Decode speichert das Resultat seiner Arbeit in diesem neuen Array. Das Verhalten der Methode stimmt also mit den Erwartungen des Programmieres überein, der nur die Deklaration der Methode kennt und sich nicht deren Implementierung angesehen hat. Dafür zahlt man einen geringen Aufpreis in erhöhtem Aufwand für die Speicherverwaltung, aber das ist gut angelegtes Kapital.
Peter Below
  Mit Zitat antworten Zitat
TurboMagic

Registriert seit: 28. Feb 2016
Ort: Nordost Baden-Württemberg
125 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#4

AW: Array zuweisungen

  Alt 15. Jan 2019, 19:49
Vielen Dank an euch beide für die Erklärungen!
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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:29 Uhr.
Powered by vBulletin® Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2019 by Daniel R. Wolf