![]() |
AW: array als var-Parameter
Das geht hier aber auch schnell mit den Antworten.:-D
|
AW: array als var-Parameter
Okay, mir war aus deinem Post nicht ganz klar, dass Du "nur" die Variablen auf 0 setzen wolltest. Ich bin von einem Array ausgegangen ...
|
AW: array als var-Parameter
Dann bau dir halt einen Wrapper
Delphi-Quellcode:
type
TPIntArray = array of PInteger; TIntValueSetter = record private FValues: TPIntArray; public function AddVar( var Value: Integer ): TIntValueSetter; procedure SetValue( Value: Integer ); end; TValueSetter = record class function Int: TIntValueSetter; static; end; { TValueSetter } class function TValueSetter.Int: TIntValueSetter; begin SetLength( Result.FValues, 0 ); end; { TIntValueSetter } function TIntValueSetter.AddVar( var Value: Integer ): TIntValueSetter; var LValues: TPIntArray; LIdx: Integer; begin SetLength( LValues, Length( FValues ) + 1 ); for LIdx := low( FValues ) to high( FValues ) do LValues[ LIdx ] := FValues[ LIdx ]; LValues[ high( LValues ) ] := @Value; Result.FValues := LValues; end; procedure TIntValueSetter.SetValue( Value: Integer ); var LIdx: Integer; begin for LIdx := low( FValues ) to high( FValues ) do FValues[ LIdx ]^ := Value; end; procedure SetValue( Values: array of Integer; Value: Integer = 0 ); var LIdx: Integer; begin for LIdx := low( Values ) to high( Values ) do Values[ LIdx ] := Value; end; procedure Test; var Val1, Val2, Val3: Integer; TargetValue: Integer; Set1, Set2, Set3: TIntValueSetter; begin Val1 := 42; Val2 := 84; Val3 := 34; TargetValue := 0; TValueSetter.Int.AddVar( Val1 ).AddVar( Val2 ).AddVar( Val3 ).SetValue( TargetValue ); Assert( ( Val1 = TargetValue ) and ( Val2 = TargetValue ), 'Mist, hat nicht funktioniert' ); Set1 := TValueSetter.Int.AddVar( Val1 ).AddVar( Val2 ); Set2 := TValueSetter.Int.AddVar( Val2 ).AddVar( Val3 ); Set3 := TValueSetter.Int.AddVar( Val1 ).AddVar( Val2 ).AddVar( Val3 ); WriteLn( 'Set1.SetValue( 1 )' ); Set1.SetValue( 1 ); WriteLn( 'Val1: ', Val1, ' Val2: ', Val2, ' Val3: ', Val3 ); WriteLn; WriteLn( 'Set2.SetValue( 2 )' ); Set2.SetValue( 2 ); WriteLn( 'Val1: ', Val1, ' Val2: ', Val2, ' Val3: ', Val3 ); WriteLn; WriteLn( 'Set3.SetValue( 3 )' ); Set3.SetValue( 3 ); WriteLn( 'Val1: ', Val1, ' Val2: ', Val2, ' Val3: ', Val3 ); end; |
AW: array als var-Parameter
Zitat:
Ich wollte eigendlich nur ein paar Variablen auf 0 setzen. :o Bei deinen Antworten bin ich immer wieder erstaunt. |
AW: array als var-Parameter
Zitat:
Und wenn ich an mehr als einer Stelle die Werte setzen muss, dann ist so ein Wrapper doch etwas Feines und wandert in die hauseigene Bibliothek. Dann brauchst man nur noch die Unit einbinden und benutzt es. Das ist allemal besser als in jedem Programm immer wieder das Gleiche zu schreiben ;) |
AW: array als var-Parameter
Also ich mache das seit Jahren so (siehe unten). Entweder ich mache es falsch oder ich habe hier einige Posts nicht verstanden.
Delphi-Quellcode:
Oder so:
type
TTest = array of Integer; procedure Abc(var ATest: TTest); begin ATest[0] := 10; ATest[1] := 20; end; procedure TForm1.Button1Click(Sender: TObject); var Test: TTest; begin SetLength(Test, 2); Test[0] := 1; Test[1] := 2; Abc(Test); ShowMessage(IntToStr(Test[0] + Test[1])); end;
Delphi-Quellcode:
type
TTest = array[0..1] of Integer; procedure Abc(var ATest: TTest); begin ATest[0] := 10; ATest[1] := 20; end; procedure TForm1.Button1Click(Sender: TObject); var Test: TTest; begin Test[0] := 1; Test[1] := 2; Abc(Test); ShowMessage(IntToStr(Test[0] + Test[1])); end; |
AW: array als var-Parameter
Zitat:
Du hast es falsch verstanden (siehe ![]() Nicht die Werte im Array sollen auf 0 gesetzt werden sondern die Variablen über die die Werte an das Array übergeben werden sollen auf 0 gesetzt werden. |
AW: array als var-Parameter
Achso, ok.
|
AW: array als var-Parameter
Nur mal so zum neidisch sein :stupid:
Code:
inline void zeroVars() {}
template<class Arg, class... Args> inline void zeroVars(Arg& arg, Args&... args) { arg = 0; zeroVars(args...); } ![]() |
AW: array als var-Parameter
Zitat:
Du hast vollkommen recht. War auch nicht negativ gemeint. Dennoch musste ich erst zwei mal schauen. Bei näherem hinsehen allergings ne tolle Lösung. :thumb: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:24 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