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