Autor Beitrag
Delphi-Laie Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1531
Erhaltene Danke: 214


Delphi 2 - RAD-Studio 10.1 Berlin
BeitragVerfasst: Fr 10.03.17 20:34 
So, liebe Leute, die Sache ist jetzt soweit abgeschlossen, daß dieser Algorithmus nach Pascal übersetzt ist, von Delphi compiliert wird und in mein Lieblingsprogramm eingearbeitet ist. Dieser Algorithmus war schon eine ziemlich heftige Angelegenheit, eine meiner aufwendigsten Implementierungen (auch ablesbar an der massiven Hilfe, um die ich das Forum "anschnorrte").

Nochmals mein herzlicher Dank, vor allem an Horst_H und in allerster Linie an Frühlingsrolle, auch für diese Vorarbeit!

Erstmal muß ich mich jetzt erholen. Jedoch werde ich recht bald die Properties versuchen, unterschwellig kribbelt es schon wieder... denn Properties machen den Quellcode kompakter. Da ich gerade bei diesem Thema bin: Ich liebe funktionell und optisch komprimierte Quellcodes, weil ich ungern scrolle und diese Quellcodes ja nicht wie einen Text lese. Also nicht wundern, falls ihn sich jemand anschaut.

Edit: Natürlich wünsche ich Euch ein schönes Früh-Frühlingswochenende!
Delphi-Laie Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1531
Erhaltene Danke: 214


Delphi 2 - RAD-Studio 10.1 Berlin
BeitragVerfasst: Sa 11.03.17 12:12 
Hallo Frühlingsrolle und die anderen, entschuldigt bitte, daß ich nochmal störe, aber ich habe noch einen "Nachschlagbedarf", bitte.

Beide Klassen, die TLeonardo und auch die TSequence, haben je zwei Konstruktoren (einen "einfachen" und einen mit Parameter) und nur der zweite Destruktur. Nur TSequence hat einen "expliziten" Destruktor, der optional - vor inherited bzw. inherited destroy - Speicher freigibt.

Müßte nicht konsequenterweise der Destruktor der TLeonardo-Klasse (den es explizit noch gar nicht gibt, wird also nur der einer Vorfahrenklasse aufgerufen) ebenfalls mit "[irgendetwas].Free" vor inherited optional beanspruchten Speicherplatz optional auch wieder freiräumen? Falls ja, bin ich mir jetzt nicht schlüssig, welche Datenstruktur dann freigegeben werden müßte.

Mit seinem jetzigen Stand scheint das implementierte Smoothsort noch leicht "speicherleck" zu sein. Ich habe aber darauf geachtet, jedem Konstruktor auch einen Destruktor zuzuordnen, deshalb schätze ich, daß sich am Destruktor der TLeonardo-Klasse noch etwas verbessern läßt.

Danke und Gruß

Delphi-Laie


Zuletzt bearbeitet von Delphi-Laie am Sa 11.03.17 13:47, insgesamt 1-mal bearbeitet
Frühlingsrolle
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2068
Erhaltene Danke: 377

[Win NT] 5.1 x86 6.1 x64
[Delphi] 7 PE, 2006, 10.1 Starter, Lazarus - [C#] VS Exp 2012 - [Android API 15] VS Com 2015, Eclipse, AIDE - [C++] Builder 10.1
BeitragVerfasst: Sa 11.03.17 12:33 
Die Klasse TLeonardo benötigt keinen (überschriebenen) Destruktor, da in der Klasse schonmal keine Objekte erzeugt werden, ergo wenn nichts erzeugt wird, braucht auch nichts freigegeben werden.

Die Klasse TSequence braucht wohl einen Destruktor, da im Konstruktor ein Objekt vom TLeoanrdo (TObject) erzeugt wird:
ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
// 1:1 Version:
type
  TSequence = class
  private
    m_lSize: TLeonardo;
    procedure setSize(lSize: TLeonardo);

constructor TSequence.Create(sSize: TSequence);
begin
  inherited Create();
  setSize(TLeonardo.Create(sSize.getSize())); // <--
end;

destructor TSequence.Destroy;
begin
  m_lSize.Free();
  inherited;
end;

// ERSTE Version
type
  TSequence = class
  private
    FLSize: TLeonardo; // m_lSize

constructor TSequence.Create(sSize: TSequence);
begin
  inherited Create();
  LSize := TLeonardo.Create(sSize.LSize); // <--
end;

destructor TSequence.Destroy;
begin
  LSize.Free;
  inherited;
end;


Mir wurden bei Memoryleak Tests keine leaks angegeben.
Kannst du jene Stelle lokalisieren?

Die andere nennenswerte Stelle wäre:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
function TSequence.length(): Integer;
var
  iLength: Integer;
  s: TSequence;
begin
  iLength := size();
  s := TSequence.Create(self);  // <--
  try
    while (not s.empty()) do
    begin
      s.upToPrevious();
      iLength := iLength + s.size();
    end;
  finally
    s.Free;                     // <--
  end;
  result := iLength;
end;

_________________
„Politicians are put there to give you the idea that you have freedom of choice. You don’t. You have no choice. You have owners. They own you. They own everything." (George Denis Patrick Carlin)

Für diesen Beitrag haben gedankt: Delphi-Laie
Delphi-Laie Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1531
Erhaltene Danke: 214


Delphi 2 - RAD-Studio 10.1 Berlin
BeitragVerfasst: Sa 11.03.17 13:45 
Das leuchtet ein, vielen Dank!

Nun, dann werde ich mal weiter nach dem Speicherleck fahnden....

Ergänzung: Meine allererste Fragen in dieser Diskussion "Wo ist der Destruktor" ziehe ich übrigens zurück. Java hat ja eine automatische Speicherbereinigung, das war mir zu dem Zeitpunkt nicht bewußt.
Horst_H
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1623
Erhaltene Danke: 225

WIN7,PuppyLinux
FreePascal,Lazarus,TurboDelphi
BeitragVerfasst: Mi 29.11.17 21:13 
Hallo,

lang ist es her.Aber ich habe doch damals eine tolle slide-show zu smooth sort gesehen:
Bilder sagen mehr als 1000+ Worte und 112 noch mehr :-)
de.slideshare.net/habib_786/smooth-sort

Gruß Horst

Für diesen Beitrag haben gedankt: Delphi-Laie
Delphi-Laie Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1531
Erhaltene Danke: 214


Delphi 2 - RAD-Studio 10.1 Berlin
BeitragVerfasst: Mi 29.11.17 22:55 
Danke, die kannte ich schon - woher, weiß ich nicht mehr.

Meine Englischkenntnisse sind hochgradig "intermediate", aber soweit ich diese Formulierung

Zitat:
an alternative for sorting in situ


verstehe, wird mit ihr Smoothsort als Alternative für das (=zu dem) In-Situ-Sortieren angeboten, bennant, beworben, was auch immer.

Das ist es jedoch nicht, sondern ein (alternatives) In-Situ-Sortieren.

Aber Englisch ist als Wissenschaftssprache ja soooo geeignet.
Frühlingsrolle
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2068
Erhaltene Danke: 377

[Win NT] 5.1 x86 6.1 x64
[Delphi] 7 PE, 2006, 10.1 Starter, Lazarus - [C#] VS Exp 2012 - [Android API 15] VS Com 2015, Eclipse, AIDE - [C++] Builder 10.1
BeitragVerfasst: Do 30.11.17 03:00 
Zumindest fallen im Englischen die Artikel weg (mal abgesehen vom "the"). Das rundet das Lesen ein wenig ab und macht die Sätze wesentlich kürzer.
Was mit "in situ" (an der Stelle) gemeint ist:

Zitat:
Ein Algorithmus, der nur den Speicherplatz benötigt, der von den Elementen sowieso schon benutzt wird; die Elemente werden also im vorhandenen Speicher bearbeitet und nicht in einen neuen umkopiert

Näheres dazu hier.

Was die Folien darstellen, macht der übersetzte Code sinngemäß so.

_________________
„Politicians are put there to give you the idea that you have freedom of choice. You don’t. You have no choice. You have owners. They own you. They own everything." (George Denis Patrick Carlin)

Für diesen Beitrag haben gedankt: Delphi-Laie