AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi (String)List als Rückgabetyp vermeiden - wie denn nu?

(String)List als Rückgabetyp vermeiden - wie denn nu?

Ein Thema von Meflin · begonnen am 4. Jul 2009 · letzter Beitrag vom 4. Jul 2009
Antwort Antwort
Benutzerbild von Meflin
Meflin

Registriert seit: 21. Aug 2003
4.856 Beiträge
 
#1

(String)List als Rückgabetyp vermeiden - wie denn nu?

  Alt 4. Jul 2009, 13:57
Moin!

Im Zuge meiner Prüfungsvorbereitung implementier ich grad allerlei Soriteralgorithmen... Und bin jetze bei Mergesort mal wieder auf das Problem gestoßen, dass ich eigentlich eine Liste als Rückgabetyp brauche - das gehört ja aber zu den Dingen, die man hier neben gotos u.Ä. als böse eingetrichtert bekommt

Der Code ist in etwa so:
Delphi-Quellcode:
class method MergeSort.MergeSort<T>(aList: List<T>; aComparison: TComparison<T>): List<T>;
var
    Left, Right: List<T>;
begin
    if aList.Count >= 1 then begin
       Left := aList.GetRange(0, aList.Count / 2);
       Right := aList.GetRange(aList.Count / 2, aList.Count / 2);
       Result := Merge<T>(MergeSort<T>(Left, aComparison), MergeSort<T>(Right, aComparison), aComparison);
    end;
end;
So, die Frage ist jetzt: wie macht mans denn nun richtig (bei der Merge-Funktion ergibt sich ja selbiges Problem)?
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#2

Re: (String)List als Rückgabetyp vermeiden - wie denn nu?

  Alt 4. Jul 2009, 14:00
Wenn du sowieso einen Garbage Collector hast, gibt es keinen Grund, keine Objekte zurückzugeben (sofern sie nicht IDisposable implementieren - dann ergibt sich das selbe Problem wie in Delphi Win32).
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#3

Re: (String)List als Rückgabetyp vermeiden - wie denn nu?

  Alt 4. Jul 2009, 14:05
Hi,

Du könntest die zu sortierende Liste als var-Parameter übergeben und das ganze als procedure deklarieren.. Das wäre jetzt noch ne Möglichkeit die mir einfällt...

Gruß
Neutral General
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.139 Beiträge
 
Delphi 12 Athens
 
#4

Re: (String)List als Rückgabetyp vermeiden - wie denn nu?

  Alt 4. Jul 2009, 14:12
Das mit dem Parameter wollte ich auch grad vorschlagen, allerdings nicht als VAR ... die Liste würde dann extern erstellt und auch da wieder freigegeben und intern nur noch befüllt.

Ansonsten gingen noch Interfaces, aber da es dort wohl einen GC gibt, käme dieses etwa auf's Gleiche raus.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PosEx im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Benutzerbild von Meflin
Meflin

Registriert seit: 21. Aug 2003
4.856 Beiträge
 
#5

Re: (String)List als Rückgabetyp vermeiden - wie denn nu?

  Alt 4. Jul 2009, 14:22
Zitat von himitsu:
Ansonsten gingen noch Interfaces, aber da es dort wohl einen GC gibt, käme dieses etwa auf's Gleiche raus.
Speziell diese Lösung würde mich mal interessieren - ich komm nicht so recht dahinter, wie das funktionieren soll
  Mit Zitat antworten Zitat
Benutzerbild von mschaefer
mschaefer

Registriert seit: 4. Feb 2003
Ort: Hannover
2.032 Beiträge
 
Delphi 12 Athens
 
#6

Re: (String)List als Rückgabetyp vermeiden - wie denn nu?

  Alt 4. Jul 2009, 14:39
Also am elegantesten ist dies wohl wie Neutral General das schon angedeutet hat:

- Liste extern Create
- Liste per procedure übergeben (var geht hier nicht, da hier ehedem nur der Zeiger übergeben wird)
- Liste sortieren
- Liste extern Destroy

Oder man greift zur Pattexmethode
und übergibt die Daten als String und führt sie mit Stringlist.Text in die Liste und wieder heraus.


Grüße in die Runde // Martin
Martin Schaefer
Phaeno
  Mit Zitat antworten Zitat
Dax
(Gast)

n/a Beiträge
 
#7

Re: (String)List als Rückgabetyp vermeiden - wie denn nu?

  Alt 4. Jul 2009, 15:16
Nicht vergessen, hier geht es um Prism List<T> als Rückgabetyp darfst du gerne machen. Und selbst wenn T IDisposable implementiert, läufst du in der Regel nicht mit offenen Armen in ein Speicherleck (weil solche Klassen auch ihre Finalizer überschreiben und dort Dispose aufrufen), aber man sollte sich dann nicht darauf verlassen, dass der GC alles zeitig abräumt.
  Mit Zitat antworten Zitat
Benutzerbild von Meflin
Meflin

Registriert seit: 21. Aug 2003
4.856 Beiträge
 
#8

Re: (String)List als Rückgabetyp vermeiden - wie denn nu?

  Alt 4. Jul 2009, 16:03
Zitat von Dax:
Nicht vergessen, hier geht es um Prism List<T> als Rückgabetyp darfst du gerne machen.
Jo find ich schonmal gut

Allerdings würden mich schon auch Lösungen für W32 interessieren - und da bin ich eben schon öfter über die angedeutet Interface-Lösung gestoßenolpert. Nur noch nie über eine implementation
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#9

Re: (String)List als Rückgabetyp vermeiden - wie denn nu?

  Alt 4. Jul 2009, 16:11
Normalerweise sollte man aufgrund der unklaren Besitzverhältnisse keine Objekte zurückgeben - dem Aufrufer ist sonst nicht direkt klar, ob er das Objekt selbst freigeben muss. Wenn du aber ein Interface zurückgibst, erfolgt durch die Referenzzählung die Freigabe automatisch. Du kannst also beispielsweise ein Interface mit den wichtigsten Methoden von TStrings definieren und das dann zurückgeben.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  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 23:33 Uhr.
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