Deutsch
Wünsche und Anregungen

Wunsch: "Infinite" Rekursion auch für Funktionen

 
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.
KompilierenMarkierenSeparieren
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 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


976 kB
Hochgeladen:13.02.2008
Ladeanzahl148
Herunterladen
 
13.02.2008  
 




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
 
Windows XP, XProfan/Profan² 4.5 bis 11
Profan2Cpp-Homepage:  [...] 
Alte Profan²-Seite:  [...] 
13.02.2008  
 



Ich verstehe - und es ist sehr schade.

Zur 32: Erlaubte da Roland nicht eine deutlich höhere Rekursionstiefe?
 
13.02.2008  
 




Sebastian
König
iF
Ich verstehe - und es ist sehr schade.

Zur 32: Erlaubte da Roland nicht eine deutlich höhere Rekursionstiefe?


Da bin ich mir jetzt nicht sicher... ich dachte, ich hätte mich bei der Zahl an XProfan orientiert...

Die Einschränkung gibt es übrigens noch garnicht so lange, sondern erst seit ich festgestellt habe, dass es für den Parameter-Stack einen Unterschied macht, ob eine Prozedur als Befehl oder als Funktion aufgerufen wird. In dem Zusammenhang noch der Hinweis, dass die Grenze nur für die Funktions-Variante gilt - als Befehl ist die erlaubte Tiefe tatsächlich unendlich. EDIT: Also genau wie in XProfan, wie ich gerade sehe - mein Nachbau ist offenbar wirklich gut...

MfG

Sebastian
 
Windows XP, XProfan/Profan² 4.5 bis 11
Profan2Cpp-Homepage:  [...] 
Alte Profan²-Seite:  [...] 
13.02.2008  
 



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.

977 kB
Hochgeladen:13.02.2008
Ladeanzahl155
Herunterladen
 
13.02.2008  
 




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
 
Windows XP, XProfan/Profan² 4.5 bis 11
Profan2Cpp-Homepage:  [...] 
Alte Profan²-Seite:  [...] 
13.02.2008  
 




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....
 
Windows XP, XProfan/Profan² 4.5 bis 11
Profan2Cpp-Homepage:  [...] 
Alte Profan²-Seite:  [...] 
13.02.2008  
 



Antworten


Thementitel, max. 100 Zeichen.
 

Systemprofile:

Kein Systemprofil angelegt. [anlegen]

XProfan:

 Beitrag  Schrift  Smilies  ▼ 

Bitte anmelden um einen Beitrag zu verfassen.
 

Themenoptionen

4.243 Betrachtungen

Unbenanntvor 0 min.
Jörg Sellmeyer12.05.2018

Themeninformationen

Dieses Thema hat 2 Teilnehmer:

Sebastian König (4x)
iF (3x)


Admins  |  AGB  |  Anwendungen  |  Autoren  |  Chat  |  Datenschutz  |  Download  |  Eingangshalle  |  Hilfe  |  Händlerportal  |  Impressum  |  Mart  |  Schnittstellen  |  SDK  |  Services  |  Spiele  |  Suche  |  Support

Ein Projekt aller XProfaner, die es gibt!


Mein XProfan
Private Nachrichten
Eigenes Ablageforum
Themen-Merkliste
Eigene Beiträge
Eigene Themen
Zwischenablage
Abmelden
 Deutsch English Français Español Italia
Übersetzungen

Datenschutz


Wir verwenden Cookies nur als Session-Cookies wegen der technischen Notwendigkeit und bei uns gibt es keine Cookies von Drittanbietern.

Wenn du hier auf unsere Webseite klickst oder navigierst, stimmst du unserer Erfassung von Informationen in unseren Cookies auf XProfan.Net zu.

Weitere Informationen zu unseren Cookies und dazu, wie du die Kontrolle darüber behältst, findest du in unserer nachfolgenden Datenschutzerklärung.


einverstandenDatenschutzerklärung
Ich möchte keinen Cookie