Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Default Value bei eigenen Typ (https://www.delphipraxis.net/186871-default-value-bei-eigenen-typ.html)

amoibos 8. Okt 2015 07:47

Delphi-Version: 5

Default Value bei eigenen Typ
 
Hallo,
ich habe hier ein selbstdefinierten Datentyp(dynamischer Array) als Argument einer Methode. Kann man dafür auch ein Default-Wert angeben oder muss man die Methode dann doppelt definieren?

mkinzler 8. Okt 2015 07:54

AW: Default Value bei eigenen Typ
 
Wenn Du für den Defaultwert eine Konstante deklarierst sollte es gehen.

amoibos 8. Okt 2015 08:05

AW: Default Value bei eigenen Typ
 
Das gilt doch nur für eine Auswahl von Standardtypen zmd. funktioniert [''] schon mal nicht.

Der schöne Günther 8. Okt 2015 08:47

AW: Default Value bei eigenen Typ
 
Ich verstehe das Problem nicht. Dynamisches Array? Warum nicht einfach
Delphi-Quellcode:
nil
?

Delphi-Quellcode:
type TMeinArray = array of Integer;

procedure meineMethode(arg: TMeinArray = nil);
begin
   //
end;

amoibos 8. Okt 2015 10:12

AW: Default Value bei eigenen Typ
 
Hat sich erledigt, bin von den selbsterstellten Typ zum offenen Array übergegangen.
Damit funktioniert nil natürlich nicht, mit der alten Lösung aber schon. Ist aber trotzdem hilfreich, danke.

Dennis07 22. Okt 2015 05:52

AW: Default Value bei eigenen Typ
 
Mengentypen können unter Delphi keinen Standardwert besitzen, wenn sie als Parameter einer Methode übergeben werden.

Der schöne Günther 22. Okt 2015 08:29

AW: Default Value bei eigenen Typ
 
Na klar können sie das:

Delphi-Quellcode:
{$APPTYPE CONSOLE}

type
   TItem = (uno, dos, tres);
   TItems = set of TItem;

procedure processItems(const items: TItems = []);
begin
   //
end;

begin
   processItems();
end.

himitsu 22. Okt 2015 12:04

AW: Default Value bei eigenen Typ
 
Solange das SET in einen INTEGER passt. (maximal 32 Werte)

Dennis07 24. Okt 2015 03:30

AW: Default Value bei eigenen Typ
 
Ja, okay, ich korrigiere mich:
Mengentypen außer "Small Set" können keinen Standardwert als Parameter einer Methode haben. Dies gilt aber auch für arrays.

himitsu 25. Okt 2015 08:43

AW: Default Value bei eigenen Typ
 
Wobei ich das bei Arrays nicht ganz verstehe, denn der Pointer zu einem konstanten dynamischen Array passt in den Integer rein, genauso wie bei LongStrings.
Was es bei Arrays in Delphi aber komischer Weise nicht gibt, weil man da wohl was mit der Refferenzzählung vergessen hat, die eh "defekt" ist (kein Copy-On-Write, bei Schreibzugriffen).

Dennis07 26. Okt 2015 01:27

AW: Default Value bei eigenen Typ
 
Was genau meinst du mit "Copy-on-Write"?

Luckie 26. Okt 2015 01:47

AW: Default Value bei eigenen Typ
 
Die Werte werden erst kopiert (im Speicher), wenn sie wirklich benötigt werden. Werden sie nur gelesen, wird nichts kopiert. Weil sie nicht verändert werden.

Dennis07 26. Okt 2015 01:52

AW: Default Value bei eigenen Typ
 
Ah. Also praktisch dass die Daten vom Stack in ein Register geladen werden, dieses verändert wird und dann wieder auf den Stack geschrieben wird?

Luckie 26. Okt 2015 02:00

AW: Default Value bei eigenen Typ
 
Ja. Sobald der Compiler "merkt", dass sie verändert werden und vom Code eine Kopie benötigt wird. Eigentlich programmiert man one das Wissen im Hintergrund. Ich habe mir noch nie Gedanken drüber gemacht.

himitsu 26. Okt 2015 16:00

AW: Default Value bei eigenen Typ
 
Delphi-Quellcode:
var S1, S2: string;
S1 := 'abcd';
S2 := S1;
S2[2] := 'B';
ShowMessage(S1 + sLineBreak + S2); // abcd aBcd

var B1, B2: TBytes;
B1 := (1, 2, 3, 4);
B2 := B1;
B2[1] := 22;
// Arrays ausgeben > BEIDE (1, 22, 3, 4)
Bei Strings gibt es RefCount=-1 für Konstanten.

Stevie 26. Okt 2015 17:50

AW: Default Value bei eigenen Typ
 
Zitat:

Zitat von himitsu (Beitrag 1319685)
Wobei ich das bei Arrays nicht ganz verstehe, denn der Pointer zu einem konstanten dynamischen Array passt in den Integer rein, genauso wie bei LongStrings.
Was es bei Arrays in Delphi aber komischer Weise nicht gibt, weil man da wohl was mit der Refferenzzählung vergessen hat, die eh "defekt" ist (kein Copy-On-Write, bei Schreibzugriffen).

Auf die Gefahr hin, ein Duplikat erzeugt zu haben, hab ich es mal eingetragen.

Dennis07 26. Okt 2015 18:24

AW: Default Value bei eigenen Typ
 
Ehm. Sorry wenn ich da was falsch verstanden hab, dann bitte korrigieren.
Aber um mal auf deinen Code im QC zu kommen:
Du deklarierst eine Konstante
Delphi-Quellcode:
numbers: TArray<Integer> = [1, 2, 3]
"TArray<T>" ist ja deklariert mit "array of T", also ein Array-Typ.
Allerdings initialisiert man Array-Konstanten doch mit Runden Klammern, sofern ich mich nicht irre (hab ich zumindest immer so gemacht).
Eckige Klammern sind doch soweit ich weiß für Set-Konstanten...?!

Delphi-Quellcode:
const
  MyArr: array [0..2] of Char = ('A','B','C');
  MySet = ['A','B','C'];

Stevie 26. Okt 2015 18:34

AW: Default Value bei eigenen Typ
 
http://blog.marcocantu.com/blog/2014...delphixe7.html

Dennis07 26. Okt 2015 18:52

AW: Default Value bei eigenen Typ
 
Oh, hm okay. Ja dass man das zur Laufzeit irgendwie jetzt mit [] zuweisen kann hab ich irgendwie mal gelesen.
Aber dass man jetzt dynamische Array-Konstanten deklarieren kann und diesen dann mit [] Werte zuweisen kann wusste ich nicht.
Naja, da ich eh fürs erste bei XE5 bleibe ist das eh nur nice-to-know für mich. =)


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