Rekusifer Auruf von einer Funktion

Für Fehler in Lazarus, um diese von anderen verifizieren zu lassen.
Antworten
pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Rekusifer Auruf von einer Funktion

Beitrag von pluto »

Hallo,
könntet mit einer von euch bitte mal erklären warum dies nur als Procedure klappt:

Code: Alles auswählen

procedure TPlutoEditor.GetNexRightChar(var f:Integer);
const
  noChar = ['[',']',' ','.',':',',','-','_'];
var
  x,z,l,m:Integer;
  c:Char;
begin
  z:=0;
  l:=Rows.Rows[Rows.CursorY].fitems.Count-1;
  if Rows.CursorX+1 <= l then  m:=1 else m:=0;
 // writeln('OK:',random(100));
  writeln(Rows.CursorX,'\',m,'\',l);
  for x:=Rows.CursorX+m to l do begin
    if Rows.Rows[Rows.CursorY].Items[x].C <> '' then begin
      c:=Rows.Rows[Rows.CursorY].Items[x].C[1];
      if (c =' ') or (x >= l) then begin
        if (x >=l) then
          z:=x+2
        else
          z:=x;
        break;
      end;
    end;
  end;
 
  if z = 0 then begin
    if Rows.CursorY+1 <=Rows.fRows.Count-1 then begin
      Rows.DrawLine(Rows.CursorY,True);
      Rows.CursorY:=Rows.CursorY+1;
      Rows.CursorX:=0;
      writeln('-- OK --');
      GetNexRightChar(z); // Auf diese Zeile kommt es mir an
    end;
  end;
  f:=z;
end;
Wie ihr seht rufe ich GetNexRightChar(z) noch einmal auf. Wenn ich GetNexRightChar(z) als Funktion Defniere geht das nicht. der Rückgabe wert ist dann ein langer - wert.
Mache ich aber daraus eine Procedure geht es so wie gewollt.

Ist das ein BUG? ist das Ein Denkfehler von mir ?
Wenn ja welcher ?

Wie gesagt als Procedure geht es prima. so wie es soll.
MFG
Michael Springwald

shokwave
Beiträge: 475
Registriert: Do 15. Nov 2007, 16:58
OS, Lazarus, FPC: Win11/Ubuntu Budgie (L 3.0 FPC 3.2.2)
CPU-Target: i386, x64
Wohnort: Gera

Beitrag von shokwave »

Fällt mir schwer da etwas nachzuvollziehen. Was würdest du denn zurückgebe wollen? Oder besser: Wie würde denn deine Funktion aussehen?

Ingo
mfg Ingo

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Beitrag von pluto »

In Etwa so:

Code: Alles auswählen

function TPlutoEditor.GetNexRightChar:Integer;
const
  noChar = ['[',']',' ','.',':',',','-','_'];
var
  x,z,l,m:Integer;
  c:Char;
begin
  z:=0;
  l:=Rows.Rows[Rows.CursorY].fitems.Count-1;
  if Rows.CursorX+1 <= l then  m:=1 else m:=0;
  for x:=Rows.CursorX+m to l do begin
    if Rows.Rows[Rows.CursorY].Items[x].C <> '' then begin
      c:=Rows.Rows[Rows.CursorY].Items[x].C[1];
      if (c =' ') or (x >= l) then begin
        if (x >=l) then
          z:=x+2
        else
          z:=x;
        break;
      end;
    end;
  end;
 
  if z = 0 then begin
    if Rows.CursorY+1 <=Rows.fRows.Count-1 then begin
      Rows.DrawLine(Rows.CursorY,True);
      Rows.CursorY:=Rows.CursorY+1;
      Rows.CursorX:=0;
      writeln('-- OK --');
      z:=GetNexRightChar; // Auf diese Zeile kommt es mir an
    end;
  end;
 result:=z
end;
Aber da bekomme ich bei der besagten Zeile keine Positive zahl rauß. Ich glaube sogar das die Funktion gar nicht erst aufgerufen wird, wobei das OK Kommt in der Ausgabe,
Wenn ich mir jetzt z zurück gebe dann steht da eine lange - zahl drin, also wird z gar nicht installisiert, was aber unmöglich ist, da z am Anfang der funktion den wert 0 zugewiesen bekommt.
MFG
Michael Springwald

shokwave
Beiträge: 475
Registriert: Do 15. Nov 2007, 16:58
OS, Lazarus, FPC: Win11/Ubuntu Budgie (L 3.0 FPC 3.2.2)
CPU-Target: i386, x64
Wohnort: Gera

Beitrag von shokwave »

Einen entscheidenden Unterschied seh ich da nicht. Da hilft wohl nur debuggen. Schön step-bystep...
mfg Ingo

Euklid
Lazarusforum e. V.
Beiträge: 2808
Registriert: Fr 22. Sep 2006, 10:38
OS, Lazarus, FPC: Lazarus v2.0.10, FPC 3.2.0
Wohnort: Hessen
Kontaktdaten:

Beitrag von Euklid »

pluto hat geschrieben: Aber da bekomme ich bei der besagten Zeile keine Positive zahl rauß.
Vielleicht, weil möglicherweise Rows.CursorX+m negativ ist, und du in dem Fall in obiger Zeile 18 dem z eine negative Zahl zuweißt, wenn c=' ' erfüllt ist?

Euklid

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Beitrag von pluto »

Wie meinst du das Euklid ich kann dir nicht so ganz folgen.
Achso du meinst Rows.CursorX+m das bei Zeile 10 ?


Also die Funktion wird garnicht erst aufgerufen. Obwohl er bis zum writeln('--ok--') kommt.
Das ist ja das seltsame. Also die Meldung --ok-- erscheint, aber das wenn ich am Anfang ein writeln in der Funktion setzte kommt die Meldung nicht. Nur das --ok-- aber nicht der Text am Anfang.

shokwave ich lasse es einfach als Procedure so geht es ja. Auch wenn mir eine Funktion lieber
währe. Aber man kann nicht alles haben.
Ich finde das seltsam. Evlt. baue ich mal ein kleines test Projekt, wo ich versuche den Fehler nach zu vollziehen. Kann ja sein das es sich nur im einen einfachen Denk Fehler handelt.

Wobei ich habe noch nicht oft versucht eine Rekursive Funktion zu schreiben.
MFG
Michael Springwald

shokwave
Beiträge: 475
Registriert: Do 15. Nov 2007, 16:58
OS, Lazarus, FPC: Win11/Ubuntu Budgie (L 3.0 FPC 3.2.2)
CPU-Target: i386, x64
Wohnort: Gera

Beitrag von shokwave »

Also ein Bug isses schonmal nicht, denn das:

Code: Alles auswählen

function TForm1.XhochY(X,Y:Integer; First:Boolean):Integer;
begin
  if First and (Y=0) then
  begin
    Result:=1;
  end else
  begin
    if Y=0 then
    begin
      Result:=0;
    end else
    begin
      Result:=X*XhochY(X, Y-1, False);
    end;
  end;
end;
 
 
procedure TForm1.Button1Click(Sender: TObject);
var X, Y:Integer;
begin
  X:=StrToInt(Edit1.Text);
  Y:=StrToInt(Edit2.Text);
  Lab_Erg.Caption:=IntToStr(XhochY(X, Y, True));
end;
funktioniert! :lol:

mfg Ingo
mfg Ingo

Euklid
Lazarusforum e. V.
Beiträge: 2808
Registriert: Fr 22. Sep 2006, 10:38
OS, Lazarus, FPC: Lazarus v2.0.10, FPC 3.2.0
Wohnort: Hessen
Kontaktdaten:

Beitrag von Euklid »

pluto hat geschrieben:Wie meinst du das Euklid ich kann dir nicht so ganz folgen.
Achso du meinst Rows.CursorX+m das bei Zeile 10 ?
Zeile 11 ist es bei mir - aber ich glaube, wir meinen dasselbe! Ja.

shockwave hat geschrieben:Also ein Bug isses schonmal nicht, denn das: [...] unktioniert! :lol:

... das beweist natürlich alles ;)
Bei mir ist auch noch kein solcher Bug in Erscheinung getreten in Verbindung mit rekursiven Funktionen.

shokwave
Beiträge: 475
Registriert: Do 15. Nov 2007, 16:58
OS, Lazarus, FPC: Win11/Ubuntu Budgie (L 3.0 FPC 3.2.2)
CPU-Target: i386, x64
Wohnort: Gera

Beitrag von shokwave »

Hajo, wollts ja nur mal gesagt haben. Und wenn der restliche Code identisch ist, dürfte es auch als Procedure nich funktionieren, Zeile 11 hin oder her.
mfg Ingo

Antworten