Tutorial
Callback-Funktionen
von Stueber | Seite 1 von 1 |
Für dieses Tutorial musst du bereits wissen, was Funktionen sind und wie man Zeiger benutzt.
Was ist eine Callback-Funktion?
Eine Callback-Funktion (zu Deutsch: Rückruffunktion) ist eine Funktion, die dynamisch vom Programm aufgerufen wird, ohne dass dies explizit im Quelltext steht. So wird einerseits das Programm dynamischer und andererseits können dir Callback-Funktionen, wenn du sie richtig benutzt, viel Denkaufwand abnehmen. Dieses Tutorial zeigt, wie du in FreeBASIC mit Callback-Funktionen arbeitest.
Allgemeine Informationen zu Callback-Funktionen finden sich übrigens auch im Wikipedia-Artikel zu Rückruffunktionen.
Wie benutzt man eine Callback-Funktion?
Variablen (=> Daten) liegen im Arbeitsspeicher, das weißt du sicher schon. Aber auch Funktionen (=> Programm) liegen im Arbeitsspeicher. Für einen Aufruf einer Funktion brauchst du nur einen Zeiger auf sie. Zeiger hast du bisher wahrscheinlich nur mit Variablen benutzt. Du kannst aber auch ganz leicht einen Zeiger auf ein Sub erstellen. Du benutzt ganz normal DIM und benutzt als Datentyp "sub()". Wenn deine Callback-Funktionen Parameter haben, musst du diese zwischen den Klammern angeben. So könnte ein Funktionszeiger also aussehen:
dim as sub() callback
Hier wird ein Funktionszeiger mit dem Namen callback erzeugt.
An den Zeiger einer Funktion kommst du über den Namen mit einem vorangestelltem "@" (siehe Pointer).
Beispiel
Ein einfaches, aber nicht sehr sinnvolles Beispiel, wäre ein kleiner Taschenrechner. Sicher hast du dich schon mal an einem Taschenrechner versucht.
sub plus (byval o1 as integer, byval o2 as integer)
print o1 + o2
end sub
sub minus (byval o1 as integer, byval o2 as integer)
print o1-o2
end sub
sub mul (byval o1 as integer, byval o2 as integer)
print o1*o2
end sub
sub div (byval o1 as integer, byval o2 as integer)
print o1/o2
end sub
dim as sub(byval o1 as integer, byval o2 as integer) callback
dim as integer mode = 0
do
print "1. Plus"
print "2. Minus"
print "3. Mal"
print "4. Geteilt"
do
mode = val(inkey)
loop until mode > 0 and mode < 5
cls
if mode = 1 then callback = @plus
if mode = 2 then callback = @minus
if mode = 3 then callback = @mul
if mode = 4 then callback = @div
dim as integer o1,o2
input "Operant 1: ",o1
input "Operant 2: ",o2
callback(o1,o2)
sleep
cls
loop
Das Beispiel zeigt nur, wie man Callback-Funktionen benutzt; das enorme Potenzial von ihnen wird hier nicht sichtbar, da man bei so einem Taschenrechner auch normale Subs nehmen könnte.
Anwendungen
Wenn du vorhast, ein Programm mit einer echten Oberfläche (TUI/GUI) zu erstellen, wirst du nicht um Callback-Funktionen herumkommen. Alle großen GUI-Bibliotheken benutzen Callbacks oder ähnliches für das Auswerten von Benutzereingaben. Sinnvolle Einsatzzwecke von Callback-Funktionen sind:
- Plugins
- Event-gesteuerte Oberflächen (siehe auch Eventsystem)
- Sparen von Denkaufwand
- Signal-Slot-Konzept (siehe Wikipedia-Artikel)
Gefahren
Es sollte immer (wirklich immer!), bevor eine Funktion über einen Funktionszeiger aufgerufen wird, überprüft werden, ob der Zeiger 0 enthält. Ist das der Fall wird dein Programm normalerweise abstürzen. Im Beispiel von weiter oben sähe diese Sicherheitsüberprüfung so aus:
if callback <> 0 then callback(o1,o2)
Zusätzliche Informationen und Funktionen | |||||||
---|---|---|---|---|---|---|---|
|