Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

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

Re: rekursive Programmierung - record als parameter

  Alt 26. Mai 2009, 21:27
also, bei mir legt Delphi, bei soeiner Funktionsdefinition,
function verteil_kekse(plan:plan_rec):boolean; beim Funktionsaufruf eine Kopie der Variable (hier plan) an.

und diese sieht inhaltlich genauso aus, wie die der Funktion übergebene Variable aus.

bist du sicher, daß vorher was in die zu übergebende Variable ein eingetragen wurde?

Zitat:
Ich ging davon aus, daß wenn die Funktion sich noch einmal aufruft das record auf dem Stack noch einmal neu angelegt wird. Wirds aber nicht. Es wird immer frisch und leer übergeben.
also dem ist auch so.


aber dennoch ....
- welche Delphiversion nutzt du?
- wie groß sind maxQ und maxMA?
- und die Array's in plan_rec sind wirklich statische Arrays?
(also das in den []-Klammern ist nicht nur zur Veranschaulichung des Aufbaues nur im Post so einhalten)

(optimale Geschwindigkeit und Speichernutzung) optimal ist es nicht gerade, wenn ein "größeres" Array/Record bei jedem Funktionsaufruf angelegt/kopiert werden muß

ich sag's mal so ... in meinem Hier im Forum suchenhimXML hatte ich die Performance einer oft genutzten Prozedur nur dadurch um über 900% raufgesetzt, indem ich in der Funktion einen lokalen Record mit 1025 Strings und einigem anderem hatte ... oder anders gesagt, nur durch Auslagerung des Arrays sank die Laufzeit der Prozedur auf 10% der vorherigen Zeit.

und nur weil Delphi beim Aufruf de Funktion eine schöne Schleife aus unzähligen "PUSH 0" durchführte, um das Array zu initialisieren.

Tipp: falls plan_rec etwas größer ist:
leg ein "globlales" Array[..] of plan_rec an, übergib der Funktion verteil_kekse nur den Index des zugehörigen plan_rec's und übernimm das kopieren selber

Delphi-Quellcode:
type plan_array = array[0..{100}] of plan_rec;

function verteil_kekse(var plan:plan_array; index:integer):boolean;
begin

  if index >= high(plan) then {fehler};
  MoveMemory(@plan[index + 1], @plan[index], sizeof(plan_rec));
  verteil_kekse(index + 1);

end;

// start
verteil_kekse(plan, 0);
[edit] ups, sizeof(plan) ist natürlich falsch ... sizeof(plan_rec) müßte es sein
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat