Funktionszeiger?

Übersicht Sonstiges Smalltalk

Neue Antwort erstellen

Dusselchen14

Betreff: Funktionszeiger?

BeitragSo, März 27, 2011 20:51
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,
Irgendwie hab ich das Gefühl, dass das Ganze so ein bisschen an der falschen Stelle ist. Falls dem so sein sollte bitte nicht schimpfen! Rolling Eyes Embarassed
Gut. Nun meine Frage:
Ich lese ständig irgendwo was über Funktionszeiger aber verstehe nur Bahnhof.
Was genau sind Funktionszeiger? Wofür verwendet man die in einem Programm?
Vielen Dank

mpmxyz

BeitragSo, März 27, 2011 21:33
Antworten mit Zitat
Benutzer-Profile anzeigen
Funktionszeiger sind so etwas wie Variablen für Funktionen.
Ich nehme mal BlitzMax als Beispiel:
BlitzMax: [AUSKLAPPEN]
Local func:Int() 'Das ist eine Deklaration für einen Funktionszeiger
func=func1 'Die Wertzuweisung funktioniert wie bei anderen Variablen.
'Man kann die Funktion, auf die der Funktionszeiger zeigt, dann wie gewohnt aufrufen:
Print func() 'gibt "1" aus

func=func2
Print func() 'gibt "42" aus

Function func1:Int()
Return 1
EndFunction
Function func2:Int()
Return 42
EndFunction

Funktionszeiger kann man für verschiedenste Dinge verwenden.
Eine Anwendung wäre die GUI-Programmierung:
So könnte man einem Button einfach eine Funktion geben, welche aufgerufen wird und dann etwas macht:
BlitzMax: [AUSKLAPPEN]
Type TButton
Field OnPressed(button:TButton)
Method Update()
'If 'Der Button wurde betätigt.
If OnPressed 'wurde eine Funktion zugewiesen?
OnPressed(Self)
EndIf
'EndIf
EndMethod
EndType

Local button:TButton=New TButton
button.OnPressed=Test

button.Update()

Function Test(button:TButton)
Print "Der Button wurde gedrückt!"
EndFunction

Man kann diese auch verwenden, um anpassbare Algorithmen zu entwickeln.
So kann man die Suche des nächsten Punktes sowohl für den euklidischen Abstand als auch für die Manhattan-Distanz programmieren:
BlitzMax: [AUSKLAPPEN]
Function FindNearest:Int[](points:Int[][],base:Int[],distance:Float(point1:Int[],point2:Int[]))
Local nearest:Int[]
Local minDist:Float
For Local i:Int=0 Until points.length
Local newDist:Float=distance(points[i],base)
If newDist<minDist Or nearest=Null
nearest=points[i]
minDist=newDist
EndIf
Next
Return nearest
EndFunction

Function Manhattan:Float(point1:Int[],point2:Int[])
Local dist:Float=0.0
For Local d:Int=0 Until point1.length
dist:+Abs(point1[d]-point2[d])
Next
Return dist
EndFunction
Function Euklid:Float(point1:Int[],point2:Int[])
Local dist:Float=0.0
For Local d:Int=0 Until point1.length
dist:+(point1[d]-point2[d])^2
Next
Return dist
EndFunction

'Test
Local points:Int[][]=[ [3,0],[2,2] ]
Local nearest:Int[]=FindNearest(points,[0,0],Manhattan)
Print nearest[0]+","+nearest[1] '3,0
nearest=FindNearest(points,[0,0],Euklid)
Print nearest[0]+","+nearest[1] '2,2

mfG
mpmxyz
PS: Wenn du Fragen hast: Nur her damit!
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer

Dusselchen14

BeitragSo, März 27, 2011 22:45
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke für die Infos!

Code: [AUSKLAPPEN]

func=func2
Print func()


d.h. func2 kann jede beliebige Funktion sein? z.b. Left oder Right uswß

Und dann ist Print func() einfach nur Print Right(...)?

Ist ja praktisch Exclamation

Silver_Knee

BeitragSo, März 27, 2011 23:06
Antworten mit Zitat
Benutzer-Profile anzeigen
Die Funktionen müssen dabei aber die gleichen Parameter haben.

Neue Antwort erstellen


Übersicht Sonstiges Smalltalk

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group