| |
|
|
| Seit XProfan-ohne-Grenzen ist es möglich eine schier unendliche Prozedurrekursion zur Abarbeitung zu bewegen.
Leider trifft das nicht auf eigene Funktionen zu, sondern nur auf Prozeduren.
Hierbei ist die Schreibweise entscheidend. KompilierenMarkierenSeparieren stürzt beispielsweise sehr schnell ab wogegen KompilierenMarkierenSeparierenunendlich (grenzenFrei wie versprochen) abgearbeitet wird.
Ich kann mir vorstellen das Prf2CPP-Nutzer sowieso schon immer eine unendliche Prozedur/Funktionsrekursion abarbeiten lassen können. @Sebastian: Ist dem so?
Büdde verbessern Roland.
Hier noch ein sehr anschauliches und einfaches Beispiel für eine Füll-Funktion welche die Rekursion nutzt als Speicher. KompilierenMarkierenSeparierenCLS
USEPEN 0,0,0
RECTANGLE 1,1 - WIDTH(%HWND)-10,HEIGHT(%HWND)-10
LINE 10,10 - 200,20
LINE 200,20 - 50,300
LINE 50,300 - 100,50
LINE 100,50 - 10,10
ELLIPSE 300,200 - 500,400
F 120,100,GETPIXEL(120,100)
F 400,300,GETPIXEL(300,200)
PRINT bingo
WAITINPUT
proc F
PARAMETERS X&,Y&,TOFILL&
SETPIXEL X&,Y&,0
IF GETPIXEL(X&+1,Y&)=TOFILL&
F X&+1,Y&,TOFILL&
ENDIF
IF GETPIXEL(X&,Y&+1)=TOFILL&
F X&,Y&+1,TOFILL&
ENDIF
IF GETPIXEL(X&-1,Y&)=TOFILL&
F X&-1,Y&,TOFILL&
ENDIF
IF GETPIXEL(X&,Y&-1)=TOFILL&
F X&,Y&-1,TOFILL&
ENDIF
endproc
|
|
|
| |
|
|
|
Sebastian König | iF
Ich kann mir vorstellen das Prf2CPP-Nutzer sowieso schon immer eine unendliche Prozedur/Funktionsrekursion abarbeiten lassen können. @Sebastian: Ist dem so?
Nein, leider nicht - die Aufruftiefe ist momentan auf 32 begrenzt. Das hat mit dem Speicher-Management für den Paramter-Stack zu tun...
MfG
Sebastian |
|
|
| |
|
|
|
| Ich verstehe - und es ist sehr schade.
Zur 32: Erlaubte da Roland nicht eine deutlich höhere Rekursionstiefe? |
|
|
| |
|
|
|
Sebastian König | |
|
| |
|
|
|
| Dieser Testcode gibt eine gewisse Auskunft: (unten die exe) KompilierenMarkierenSeparieren//Version:0.0.3
{$cleq}
randomize
long i
cls
usepen 0,0,0
rectangle 1,1 - width(hwnd)-10,height(hwnd)-10
line 10,10 - 200,20
line 200,20 - 50,300
line 50,300 - 100,50
line 100,50 - 10,10
ellipse 300,200 - 500,400
f 400,300,getpixel(400,300)
f 120,100,getpixel(120,100)
f 400,300,getpixel(300,200)
print bingo
waitinput
end
f(long x,y,tofill){
i+
locate 1,20
print i
setpixel x,y,0
case getpixel(x+1,y)==tofill : f(x+1,y,tofill)
case getpixel(x,y+1)==tofill : f(x,y+1,tofill)
case getpixel(x-1,y)==tofill : f(x-1,y,tofill)
case getpixel(x,y-1)==tofill : f(x,y-1,tofill)
i-
}
EDIT: Code und EXE überarbeitet, es fehlte i- am Ende der Funktion f.
Mit dem neuen Code wird mir max 4.380 für i angezeigt. |
|
|
| |
|
|
|
Sebastian König | Ok, die Zahl kann ich bestätigen. Tatsächlich finde ich in der XProfan-Hilfe Angabe für die maximale Aufruf-Verschachtelung, die 32 habe ich also wohl selbst gewählt... Schien mir irgendwie ein ganz guter Kompromiss zwischen Performance und Speicher-Verbrauch zu sein. Technisch wäre es kein allzu großes Problem, die Grenze abzuschaffen - ich muss nur mal schauen, ob und wie sehr die Geschwindigkeit darunter leiden würde...
MfG
Sebastian |
|
|
| |
|
|
|
Sebastian König | Noch ein Nachtrag...
Beim Betrachten meines eigenen Codes sehe ich gerade, dass die erlaubte Tiefe im Prinzip in Profan2Cpp doch unendlich ist. Ab der 33. Ebene verhält sich der Stack bei einem Aufruf als Funktion allerdings dann genauso wie bei einem Aufruf als Befehl. Soll heißen: der übergeordnete Stack wird dann weiter benutzt.... |
|
|
| |
|
|