Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Recursive procedure die nicht macht was sie soll (https://www.delphipraxis.net/146747-recursive-procedure-die-nicht-macht-sie-soll.html)

gangs-taas 26. Jan 2010 15:34


Recursive procedure die nicht macht was sie soll
 
hey,
ich hab das hier geschrieben :

Delphi-Quellcode:
  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;
aber ich bekomme einen Stack-Überlauf ...
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 ...

Medium 26. Jan 2010 15:41

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

ChrisE 26. Jan 2010 15:46

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:
    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;
Der Beitrag von Medium zeigt, wie man eine Rekursion aber auch einfach auflösen kann :-)

Greez, Chris

[Edit]Rekursionsabbruch vergessen :wall: [/Edit]

gangs-taas 26. Jan 2010 16:03

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

himitsu 26. Jan 2010 16:06

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 19:00 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz