AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Algorithmen, Datenstrukturen und Klassendesign TObjectList sauber an function übergeben und wieder zurück
Thema durchsuchen
Ansicht
Themen-Optionen

TObjectList sauber an function übergeben und wieder zurück

Ein Thema von norwegen60 · begonnen am 9. Jul 2020 · letzter Beitrag vom 11. Jul 2020
Antwort Antwort
norwegen60

Registriert seit: 23. Dez 2007
Ort: Schwarzwald
511 Beiträge
 
Delphi 12 Athens
 
#1

AW: TObjectList sauber an function übergeben und wieder zurück

  Alt 10. Jul 2020, 09:20
Wo soll das Funktionsergebnis (also die Instanz) denn herkommen, wenn sie nicht innerhalb der Funktion erzeugt wird? Was spricht denn dagegen, beide Instanzen in der aufrufenden Routine zu erzeugen und als Konstanten-Parameter zu übergeben?
Es spricht nichts dagegen. Es geht mir ums Verständnis. Und da frage ich mich, wie das Konstrukt aussehen müsste, wenn man die Liste als function zurück gibt.

Doch ein kleines Problem habe ich doch. Wie muss das dann aussehen?
Delphi-Quellcode:
procedure TuAlles(const SourList, DestList:TTestList);
begin
  TuWas1(SourceList, DestList);
  // Wie gehe ich vor, dass mit dem nächsten Aufruf die vorige DestList als SourceList übergeben wird
  TuWas2(SourceList, DestList);
end;

// Das hier funktioniert nicht mehr, da ja als const hereingegeben und damit die Zuweisung DestList := lTempList; fehl schlägt

procedure TuAlles(const SourList, DestList:TTestList);
var
  lTempList:TTestList;
begin
  PrepareDestList(SourceList, DestList);

  lTempList:=TTestList.Create;
  PrepareDestList(SourceList, lTempList);

  if TuWas1(DestList, lTempList)then
  begin
    DestList.Free; // Jetzt muss ich die ja freigeben um danach meine neue Ergebnisse dran zu hängen
    DestList := lTempList;
    lTempList:= nil;
  end;
    
  lTempList:=TTestList.Create;
  PrepareDestList(SourceList, lTempList);

  if TuWas2(DestList, lTempList)then
  begin
    DestList.Free;
    DestList := lTempList;
    lTempList:= nil;
  end;
end;

Geändert von norwegen60 (10. Jul 2020 um 09:37 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.656 Beiträge
 
Delphi 12 Athens
 
#2

AW: TObjectList sauber an function übergeben und wieder zurück

  Alt 10. Jul 2020, 09:53
Ich würde ohne Grund nicht an den Instanzen herumspielen, sondern nur an den enthaltenen Daten.
Delphi-Quellcode:
procedure Tuwas(sonst Src, Dest: TSomeList);
begin
  // Mit den Daten der Listen arbeiten
end;

procedure TuAlles;
var
  List1: TSomeList;
  List2: TSomeList;
  List3: TSomeList;
begin
  List3 := nil;
  List2 := nil;
  List1 := TSomeList.Create;
  try
    List2 := TSomeList.Create;
    TuWas(List1, List2);
    List3 := TSomeList.Create;
    TuWas(List2, List3);
  finally
    List1.Free;
    List2.Free;
    List3.Free;
  end;
end;
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
norwegen60

Registriert seit: 23. Dez 2007
Ort: Schwarzwald
511 Beiträge
 
Delphi 12 Athens
 
#3

AW: TObjectList sauber an function übergeben und wieder zurück

  Alt 10. Jul 2020, 10:17
In der Art hatte ich es ursprünglich. Da die Berechnungen zum Teil aufwändig sind, führe ich sie nur noch aus, wenn sie auch benötigt wird
Delphi-Quellcode:
  if FlagTuWas1 then
    TuWas1(List1, List2);

  if FlagTuWas2 then
    TuWas2(List2, List3);
was so dann natürlich nicht geht. Wenn TuWas1 nicht ausgeführt würde müsste ich List1 statt List2 in TuWas2 eingeben

Und der Ansatz
Delphi-Quellcode:
var
  lTempList:TTempList;
begin
  PrepareDestList(SourceList, DestList);

  lTempList:= TAbsBaseList.Create(true);
  try
    // -------------------------------------------------------------------------------------------------------------------------------------
    if FlagTuWas1 then
      if TuWas1(DestList, lTempList) then // Wenn erfolgreich ausgeführt
        PrepareDestList(lTempList, DestList); // Ergebnis in Weitergabe-/Rückgabeliste kopieren

    // -------------------------------------------------------------------------------------------------------------------------------------
    if FlagTuWas2 then
      if TuWas2(DestList, lTempList) then
        PrepareDestList(lTempList, DestList); // Ergebnis in Weitergabe-/Rückgabeliste kopieren
  finally
    lTempList.Free;
  end;
end;
erscheint mir aufwändig, da das neue Ergbnis immer wieder in lTempList kopiert wird um es dann wieder dem nächsten Aufruf übergeben zu können

Geändert von norwegen60 (10. Jul 2020 um 10:42 Uhr) Grund: Hatte die Lsiten vertauscht
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.656 Beiträge
 
Delphi 12 Athens
 
#4

AW: TObjectList sauber an function übergeben und wieder zurück

  Alt 10. Jul 2020, 11:47
Benötigst Du denn wirklich mehrere Instanzen? Was genau hast Du eigentlich vor?
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
norwegen60

Registriert seit: 23. Dez 2007
Ort: Schwarzwald
511 Beiträge
 
Delphi 12 Athens
 
#5

AW: TObjectList sauber an function übergeben und wieder zurück

  Alt 10. Jul 2020, 14:41
Ich weiß keinen Weg, wie ich um 3 Instanzen rum komme
Was ich machen muss sind diverse Rechenschritte Wie z.B.
  1. Korrektur um einen zu berechnenden Wert
  2. Averaging über die X rechts und links liegenden Werte in der Liste
  3. Ableitung nach Savitzky/Golay
Instanz 1 enthält die Ausgangsdaten die nicht verändert werden sollen
Instanz 2 enthält die zuletzt berechneten Werte
Instanz 3 enthält die aktuell berechneten Werte

Bei 1. ist es keine Problem zu sagen Instanz2[i].Value := Instanz2[i].Value + 6 (hier reichen 2 Instanzen)
Bei 2. und 3. gibt es aber das Problem, dass ich z.B. sage Instanz3[i].Value := (Instanz2[i-1].Value + Instanz2[i].Value + Instanz2[i+1].Value)/3 (Mittelwert über drei Werte)

Würde ich nur mit Instanz2 arbeiten, wäre der Wert Instanz2[i-1] im vorigen Loop schon geändert.
Instanz1 funktioniert auch nicht, da Instanz2 in Berechnung 1. schon geändert wurde somit auf Instanz2 weitergemachet werden muss
Ich hoffe es ist jetzt etwas klarer

Geändert von norwegen60 (10. Jul 2020 um 14:44 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.042 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#6

AW: TObjectList sauber an function übergeben und wieder zurück

  Alt 10. Jul 2020, 15:39
Und deshalb mag ich interface basierte Collections so - da braucht man sich um so Zeugs gar nicht kümmern:

Delphi-Quellcode:
{$APPTYPE CONSOLE}

uses
  Spring.Collections,
  SysUtils;

type
  TTest = class
  private
    FValue: Double;
  public
    property Value: Double read FValue write FValue;
  end;

  ITestList = IList<TTest>;

function CopyTestList(const SourceList: ITestList): ITestList;
var
  i: Integer;
  lTest: TTest;
begin
  Result := TCollections.CreateObjectList<TTest>(True);

  for i := 0 to SourceList.Count - 1 do
  begin
    lTest := TTest.Create;
    lTest.Value := SourceList[i].Value;
    Result.Add(lTest);
  end;
end;

function DoAdding(const SourceList: ITestList): ITestList;
var
  i: Integer;
begin
  Result := CopyTestList(SourceList);

  for i := 0 to Result.Count - 1 do
    Result[i].Value := Result[i].Value + 5;
end;

function DoMultiplicate(const SourceList: ITestList): ITestList;
var
  i: Integer;
begin
  Result := CopyTestList(SourceList);

  for i := 0 to Result.Count - 1 do
    Result[i].Value := Result[i].Value * 5;
end;

var
  FlagAddieren: Boolean;
  FlagMultiplicate: Boolean;

function DoCalculations(const SourceList: ITestList): ITestList;
var
  temp: ITestList;
begin
  temp := SourceList;

  if FlagAddieren then
    temp := DoAdding(temp);

  if FlagMultiplicate then
    temp := DoMultiplicate(temp);

  Result := temp;
end;

procedure Start;
var
  i: Integer;
  lStartList, lResultList: ITestList;
  lTest: TTest;
begin
  lStartList := TCollections.CreateObjectList<TTest>(true);

  for i := 1 to 5 do
  begin
    lTest := TTest.Create;
    lStartList.Add(lTest);
    lTest.Value := i;
  end;

  FlagAddieren := True;
  FlagMultiplicate := True;
  lResultList := DoCalculations(lStartList);

  for lTest in lResultList do
    Writeln(lTest.Value.ToString);
end;

begin
  try
    Start;
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
  Readln;
end.
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
norwegen60

Registriert seit: 23. Dez 2007
Ort: Schwarzwald
511 Beiträge
 
Delphi 12 Athens
 
#7

AW: TObjectList sauber an function übergeben und wieder zurück

  Alt 10. Jul 2020, 18:58
Und deshalb mag ich interface basierte Collections so - da braucht man sich um so Zeugs gar nicht kümmern:
WOW, jetzt sind wir ganz nah dort wie ich es mir mit functions vorgestellt habe. Einziges Problem. Ich habe noch nie mit Interfaces gearbeitet. Eigenlich sieht es ja sehr ähnlich aus.

Kurz zusammengafasst:
  • lStartList wird in Start erzeugt
  • Alle anderen Listen werden in CopyTestList erzeugt
  • Aber wer kümmert sich um das Free. Denn wenn ich durch bin, sind drei Listen erzeugt, arbeiten tu ich aber letztlich nur mit lStartList und lResultList. Und wenn ich mit der fertig bin, was mach ich mit der? Auch lResultList.Free; Und die Elemente in der lResultList sind dann auch all freigegeben? Und was ist mit der Liste, die in DoAdding erzeugt wurde?

Normale TObjectList funktionieren ja auch ohne Free. Ich muss mich dann nur nicht wundern wenn irgenwann der Speicher voll ist. Wer also kümmert sich hier um das Free?
  Mit Zitat antworten Zitat
Antwort Antwort


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 14:29 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 by Thomas Breitkreuz