Delphi-PRAXiS
Seite 2 von 5     12 34     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   array als var-Parameter (https://www.delphipraxis.net/185698-array-als-var-parameter.html)

bernau 30. Jun 2015 10:40

AW: array als var-Parameter
 
Das geht hier aber auch schnell mit den Antworten.:-D

TRomano 30. Jun 2015 10:47

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 ...

Sir Rufo 30. Jun 2015 10:53

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;

bernau 30. Jun 2015 11:00

AW: array als var-Parameter
 
Zitat:

Zitat von Sir Rufo (Beitrag 1307181)
Dann bau dir halt einen Wrapper

:shock:

Ich wollte eigendlich nur ein paar Variablen auf 0 setzen. :o

Bei deinen Antworten bin ich immer wieder erstaunt.

Sir Rufo 30. Jun 2015 11:06

AW: array als var-Parameter
 
Zitat:

Zitat von bernau (Beitrag 1307182)
Zitat:

Zitat von Sir Rufo (Beitrag 1307181)
Dann bau dir halt einen Wrapper

:shock:

Ich wollte eigendlich nur ein paar Variablen auf 0 setzen. :o

Bei deinen Antworten bin ich immer wieder erstaunt.

Der Sinn und Zweck beim Programmieren ist es doch auch Code zu schreiben, der wiederverwendbar ist und vor allem einfach in der Handhabung ist.

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 ;)

Popov 30. Jun 2015 11:26

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:
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;
Oder so:
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;

Neutral General 30. Jun 2015 11:29

AW: array als var-Parameter
 
Zitat:

Zitat von Popov (Beitrag 1307189)
Also ich mache das seit Jahren so (siehe unten). Entweder ich mache es falsch oder ich habe hier einige Posts nicht verstanden.


Du hast es falsch verstanden (siehe Post von Sir Rufo).

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.

Popov 30. Jun 2015 11:30

AW: array als var-Parameter
 
Achso, ok.

BUG 30. Jun 2015 11:45

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...);
}
Ausführen!

bernau 30. Jun 2015 11:53

AW: array als var-Parameter
 
Zitat:

Zitat von Sir Rufo (Beitrag 1307184)
Der Sinn und Zweck beim Programmieren ist es doch auch Code zu schreiben, der wiederverwendbar ist und vor allem einfach in der Handhabung ist.

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 ;)


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 14:53 Uhr.
Seite 2 von 5     12 34     Letzte »    

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