Doch, ich habs ja mit dem Debugger durchlaufen lassen.
Denk immer daran, die Funktion ist Rekursiv, ruft sich also selber wieder auf. Und das kann n-mal passieren (bis der Stack voll ist)
In unserem Fall reichen zwei Ebenen. Also angenommen es gibt rekursiv1 und rekursiv2:
Delphi-Quellcode:
procedure Rekursiv2(p: PBauteil; Search: string; var MyResult: PBauteil);
var i: integer;
begin
if p <> nil
then
if p^.ID = Search
then
MyResult := p //hier veränderst du MyResult und damit p in Rekursiv1
else
if length(p^.Next) > 0
then
for i := low(p^.next) to high(p^.next) do
Rekursiv3(p^.next[i],Search,p);
end;
Delphi-Quellcode:
procedure Rekursiv1(p: PBauteil; Search: string; var MyResult: PBauteil);
var i: integer;
begin
if p <> nil
then
if p^.ID = Search
then
MyResult := p
else
if length(p^.Next) > 0
then
for i := low(p^.next) to high(p^.next) do
Rekursiv2(p^.next[i],Search,p); //<--- hier ist der Absturz beim 2. Schleifendurchlauf
end;
Versuch jetzt mal gedanklich durch den Code durchzusteigen. Das Problem liegt innerhalb von Rekursiv1, und zwar beim Aufruf von Rekursiv2.
Ob nun Rekursiv 1, sich selber oder Rekursiv2 aufruft, ist dabei egal. Man programmiert natürlich so, dass er sich selber aufruft. Darum nennt man es ja auch rekursiv.
Der Start der Rekursion erfolgt mit
Rekursiv1(FRoot,ID,FPBauteil);
Edit: Leider habe ich nicht erkannt, was aus dieser Funktion, das Ergebnis sein soll, deswegen kann ich es dir auch nicht umschreiben.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.