-
Forum: Object-Pascal / Delphi-Language
Delphi
by sirius,
12. Jan 2007
:gruebel: Bist du sicher, dass das klappt. Was ist, wenn das Netz hinter nicht gleich wieder zusammengeht, sondern erst noch ein paar andere Elemnte kommen...
-
Forum: Object-Pascal / Delphi-Language
Delphi
by sirius,
12. Jan 2007
:warn: Man sollte halt immer vor dem Programmieren über das Konzept nachdenken. Aber ich programmiere auch häufig nur drauf los. Grade, wenn man nur etwas üben oder lernen möchte. Und wenn man eben nur lernt, sich vorher ein vollständiges Konzept zu erarbeiten. :coder2: :roteyes:
Mit deinem Programmaufbau fällt mir auf Anhieb nicht viel ein. Du könntest einfach im nachhinein Duplikate...
-
Forum: Object-Pascal / Delphi-Language
Delphi
by sirius,
11. Jan 2007
Und ich hab einfach nicht kapiert, was du mit dieser funktion willst. Aber jetzt sieht es schon etwas klarer aus.
-
Forum: Object-Pascal / Delphi-Language
Delphi
by sirius,
11. Jan 2007
Doch, doch, doch, doch! :duck: :spin:
p ist der dritte parameter. Also wird er zu MyResult im zweiten aufruf. In diesem zweiten Aufruf wird myresult geändert, damit wird p geändert, wenn die Funktion aus Rekursiv (2. Ebene) wieder zurückspringt nach Rekursiv1
geh nochmal gedanklich, dass durch, was ich dir in Post #19 geschrieben habe.
-
Forum: Object-Pascal / Delphi-Language
Delphi
by sirius,
11. Jan 2007
ok anders,
folgender Code:
procedure dummy(var x:integer);
begin
x:=5;
end;
-
Forum: Object-Pascal / Delphi-Language
Delphi
by sirius,
11. Jan 2007
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:
procedure Rekursiv2(p: PBauteil; Search: string; var MyResult: PBauteil);
var i: integer;
begin
if p...
-
Forum: Object-Pascal / Delphi-Language
Delphi
by sirius,
11. Jan 2007
Das ist definitv so. Rekursiv zu programmiern, ist leider immer etwas um die Ecke denken und zu beschreiben ist es ganz kompliziert
Angenommen rekursiv wird das erste mal gestartet:
-in p^.next sind zwei Elemente drin
-->die Schleife wird zweimal durchlaufen (soweit ist sicherlich klar)
1. Schleifendurchlauf (denk drann, dein p ist ein var-parameter wird also zurückgegeben)
( p zeigt auf...
-
Forum: Object-Pascal / Delphi-Language
Delphi
by sirius,
11. Jan 2007
Ich hab mal kurz durchgesucht. Also bis jetzt war für mich auf Anhieb nicht zu erkennen, was du mit was und wo bezweckst. Das ist jetzt vielleicht auch nicht wichtig.
Ich hab mal deinen Fehler eingegrenzt, er passiert hier:
if p^.Next <> nil
then
for i := low(p^.next) to high(p^.next) do
Rekursiv(p^.next,Search,p);
1. (Hat nicht direkt...
-
Forum: Object-Pascal / Delphi-Language
Delphi
by sirius,
11. Jan 2007
1. Du hast wahrscheinlich vergessen FRoot^.next auf nil zu setzen (in Create)
2. Result als Variable zu deklarieren ist gefährlich, da es ein reserviertes Wort für Funktionsergebnisse ist. Vielleicht liegts daran. (Ich glaub, jetzt hab ich dich über die Verwendung von Result verwirrt :drunken: )
-
Forum: Object-Pascal / Delphi-Language
Delphi
by sirius,
11. Jan 2007
Das bezog sich auf die nested procedure. :evil:
Also nochmal zusammengefasst:
function TBauteilListe.GetLines: TStringlist;
procedure Rekursiv(p: PBauteil; const Lst: TStringlist);
var i: integer;
begin
-
Forum: Object-Pascal / Delphi-Language
Delphi
by sirius,
11. Jan 2007
Schmeiss das Lst ganz raus und benutze nur Result (ist ne ganz normale Variable, die nicht definiert werden muss), oder wozu brauchst du zwei Listen?
und mach mal daraus
procedure Rekursiv(p: PBauteil; var Lst: TStringlist);
dass hier
procedure Rekursiv(p: PBauteil; const Lst: TStringlist);
-
Forum: Object-Pascal / Delphi-Language
Delphi
by sirius,
11. Jan 2007
@Klaus
Wie du an meinem Post siehst, dein Gedanke ist meinem gleich. Aber deine Lösung funktioniert so nicht, da du von Result auch mal mit den Constructer aufrufen solltest. :zwinker:
-
Forum: Object-Pascal / Delphi-Language
Delphi
by sirius,
11. Jan 2007
1. Gib mal den Pointer der Tstringlist mit const (statt var) über. Ich bin mir zwar nicht sicher, ob das wirklich einen Unterschied macht. Ich finds besser.
2. Stell dir vor du erstellst die Liste an Adresse A.
Dann übergibst du diese Adresse an Result (also steht in Result A drinn). Soweit ist alles klar. Jetzt löschst du die liste mit lst.free. Result zeigt immer noch auf A, aber dort steht...