![]() |
rekursive Programmierung - record als parameter
Hallo Experten,
ich möchte eine rekursive Funktion programmieren und als Parameter den augenblicklichen Zustand einer "Keksverteilung" übergeben.
Delphi-Quellcode:
plan_rec ist so definiert:
function verteil_kekse(plan:plan_rec):boolean;
Delphi-Quellcode:
Ich ging davon aus, daß wenn die Funktion sich noch einmal aufruft
plan_rec=record
dose:Array [0..maxQ] of integer; keks:Array [1..maxMA,0..maxQ] of byte; end;
Delphi-Quellcode:
das record auf dem Stack noch einmal neu angelegt wird. Wirds aber nicht.
i:=0;
repeat inc(i); if (i<maxMA) and (score[i,2]>0) then begin if i>1 then plan.keks[score[i-1,1],kp]:=0; //vorherigen zurücksetzen plan.keks[score[i,1],kp]:=1; //keks aktivieren Form1.ListBox1.items.add('ma '+inttostr(i)); end; until (i>maxMA) or (score[i,2]=0) or verteil_kekse(plan); Es wird immer frisch und leer übergeben. Dabei stellt sich mir auch eine grundsätzliche Frage: Wie organisiere ich beim verzweigen durch alle Möglichkeiten die augenblickliche Verteilung am besten (optimale Geschwindigkeit und Speichernutzung) Ideen dazu? |
Re: rekursive Programmierung - record als parameter
Hm, also entweder musst du zu Beginn deiner Funktion den Inhalt von plan in eine lokale Variable kopieren und mit dieser lokalen Variable in der Funktion weiterarbeiten, oder du benutzt Call by reference und änderst deinen Funktionsdeklaration wie folgt ab:
Delphi-Quellcode:
Das kommt halt drauf an was du genau damit machen willst. Im letzteren Fall würde 'plan' nach dem Funktionsaufruf einen anderen Wert enthalten als vorher. Falls du nicht willst musst du eben den ersten Weg versuchen und den Inhalt von 'plan' in eine lokale variable zu kopieren und mit diesere Variable weiterarbeiten.
function verteil_kekse(var plan:plan_rec):boolean;
Nur mal so ins blaue getippt. Gargoyl |
Re: rekursive Programmierung - record als parameter
also, bei mir legt Delphi, bei soeiner Funktionsdefinition,
Delphi-Quellcode:
beim Funktionsaufruf eine Kopie der Variable (hier plan) an.
function verteil_kekse(plan:plan_rec):boolean;
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:
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)
Delphi-Quellcode:
optimal ist es nicht gerade, wenn ein "größeres" Array/Record bei jedem Funktionsaufruf angelegt/kopiert werden muß
(optimale Geschwindigkeit und Speichernutzung)
ich sag's mal so ... in meinem ![]() 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:
[edit] ups, sizeof(plan) ist natürlich falsch ... sizeof(plan_rec) müßte es sein
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); |
Re: rekursive Programmierung - record als parameter
Vielleicht solltest du auch mal deine komplette Funktion 'verteil_kekse' zu posten, vielleicht stellst du ja noch was anderes mit der Variable 'plan' an was dein Problem verursacht.
|
Re: rekursive Programmierung - record als parameter
Vielen Dank erstmal vorweg - im besonderen himitsu. Da habe ich viele Ansätze gefunden.
Zitat:
maximal 4800 Schritte erreicht werden. Mit 30MB dürfte ich also hinkommen. (Wie schön, daß die alten Schranken aus Delphi 1 Zeiten nicht mehr existieren) Was die Übergabe eines frisch angelegten Array angeht - da habe ich einen Fehler in meinem Code gefunden - das Array wird nun richtig übergeben. Jetzt muß ich an den Regeln der Keksverteilung etwas feilen. maxQ stellt übrigens 96 Viertelstunden dar (einen Tag) und maxMA die maximale Anzahl von Keksempfängern die über den Tag verteilt nach bestimmten Regeln Kekse bekommen. Wer errät, was letztlich real dahintersteckt, bekommt einen Keks... :wink: Mit der Strategie wie die Kekse verteilt werden wird das ganze wohl auch stehen und fallen. Wenn die Berechnung sehr schnell ist würde ich auch überlegen mehr als eine Lösung zu ermitteln, aber momentan suche ich erstmal nur nach einer Lösung und breche dann ab. Deshalb ist Performance ziemlich wichtig. Danke an alle, McMichael |
Re: rekursive Programmierung - record als parameter
[info]
hatte oben einen kleinen Fehler: die eine Zeile müßte natürlich so sein (plan_rec statt plan, da ja ein Record davon kopiert werden soll)
Delphi-Quellcode:
[/info]
MoveMemory(@plan[index + 1], @plan[index], sizeof(plan_rec));
|
Re: rekursive Programmierung - record als parameter
Zitat:
Delphi-Quellcode:
Delphi führt den Move-Befehl dann wohl selbst durch.
Matrix[index+1]:=Matrix[index]
(sollte ich mir vielleich mal ansehen.. wie geht das?) |
Re: rekursive Programmierung - record als parameter
Zitat:
|
Re: rekursive Programmierung - record als parameter
Hallo,
Zitat:
Wenn du bei dem Werteparameter bleiben möchtest, dann wirst du in den Linkeroptionen die Stackgröße anpassen müssen. Allerdings lässt sich mit dem maximal möglichen Wert von 16 MByte und dem gegebenen Array die gewünschte Rekursionstiefe von 4800 nicht erreichen. Gruß Hawkeye |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:30 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-2025 by Thomas Breitkreuz