![]() |
Recursive procedure die nicht macht was sie soll
hey,
ich hab das hier geschrieben :
Delphi-Quellcode:
aber ich bekomme einen Stack-Überlauf ...
procedure Nur_Wichtige_Termine(Datum : TDateTime; var W_T_Array : Array of TStringlist; Var Termine : TStringlist);
procedure ErsterTagDerWoche(var Datum : TDateTime); var i : integer ; begin I := DayOfTheWeek(Datum); If i <> 1 Then begin IncDay(Datum,-1); // <= hier Fehler ErsterTagDerWoche(Datum) end; end; begin ErsterTagDerWoche(Datum); end; wenn ich mit Breakpoints da durch Steppe merke ich auch woran es liegt aber ich versteh nicht wieso : in der Zeile wo er das Datum um eins reduzieren soll macht er das nicht ... aber ich versteh nicht warum nicht ? der müsste doch eigl. machen was ich ihm da sag oder nicht ? warum tut er das nicht... Die Ursache für den Fehler ist, dass i nie 1 wird... aber ich verstehe nicht waurm nicht ... |
Re: problem mit rocedure
Das gesamte Problem lässt sich viel einfacher lösen. Ein TDateTime ist ein Float-Wert, und der Vorkommaanteil gibt die Anzahl der Tage seit einem Datum an (welches genau weiss ich grad nicht, ist auch unwichtig hier für).
Also: DateOfFirstDayOfTheWeek := TestDate - DayOfTheWeek(TestDate) + 1; Edit: Was ist eigentlich eine "rocedure"? :P |
Re: problem mit rocedure
Hallo gangs-taas,
das Problem liegt in der Rekursion selber. Du veränderst einen var Parameter innerhalb einer Rekursion. Eine Rekursion braucht aber immer ihren eigenen kleinen "Arbeitsbereich". Das ganze lässt sich damit so lösen:
Delphi-Quellcode:
Der Beitrag von Medium zeigt, wie man eine Rekursion aber auch einfach auflösen kann :-)
function ErsterTagDerWoche(Datum : TDateTime): TDateTime;
var i : integer ; begin i := DayOfTheWeek(Datum); If i <> 1 Then begin result := ErsterTagDerWoche(IncDay(Datum,-1)); end else begin // Rekursionsabbruch vergessen :-( result := Datum; end; end; Greez, Chris [Edit]Rekursionsabbruch vergessen :wall: [/Edit] |
Re: problem mit rocedure
vielen dank
das mit dem Arbeitsbereich wusste ich nicht :) eine rocedure ist eine viel coolere procedure das sieht man daran, dass sie zu cool ist um alle buchstaben zu benutzen :D |
Re: problem mit rocedure
Das rocedure kannst'e ja im ersten Post noch editieren
und dabei auch gleich einen "aussagekräftigeren" Titel wählen. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:39 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