Topic : Online-Hilfe zu Omikron.Basic 5 Author : Karsten Lüdersen @ HH Version : OM-Basic-Hilfe 0.60 Subject : Programmieren/Basic Nodes : 1054 Index Size : 29270 HCP-Version : 4 Compiled on : Atari @charset : atarist @lang : @default : @help : Hilfe @options : +g -i +y +z -t4 -d24 @width : 75 View Ref-FileZeiger auf Funktionen Omikron.Basic Der Adreß-Operator "&" ermittelt die Adresse eines Objekts (Variable, Feld oder Funktion). Der Ausdruck: "Ptr_Str_Cmp=&FN Cmp(A$, B$)" speichert in der Variable "Ptr_Str_Cmp" einen Zeiger auf die Funktion "FN Cmp(,)" (also deren Adresse) ab. Mit diesem Zeiger kann die Funktion nun indirekt aufgerufen werden: "PRINT FN *Ptr_Str_Cmp("A","B")" Solche Funktions-Zeiger können ebenso wie Zeiger auf ein Feld an Prozeduren übergeben werden. Mit oberem Beispiel wäre eine "Sortier-Prozedur" denkbar, die zum String-Vergleich lediglich einen Funktionszeiger übergeben bekommt. Abhängig von der Vergleichsfunktion wird nach ganz unterschiedlichen Kriterien sortiert (z.B. aufsteigend, absteigend oder groß=klein ...) Beispiel: Ptr=&FN Sin2#(X#) PRINT "Wertetabelle von Sinusquadrat:" Werte_Tab Ptr,0#,1#,.1# PRINT "Wertetabelle von Cosinusquadrat:" Werte_Tab &FN Cos2#(X#),0#,1#,.1# ' A$= INPUT$(1) END ' DEF FN Sin2#(X#)= SIN(X#)* SIN(X#) DEF FN Cos2#(X#)= COS(X#)* COS(X#) ' DEF PROC Werte_Tab(Ptr_To_Df_Fn,Von#,Bis#,Schritt#) LOCAL X#=Von# ' WHILE X#<=Bis# PRINT X#,FN *Ptr_To_Df_Fn#(X#)' Vorsicht: X#=X#+Schritt#' hier kann compilert keine Typprüfung WEND' mehr durchgeführt werden RETURN Wichtig: Wenn Sie auch den Compiler verwenden, achten Sie auf genaue Übereinstimmung der Parameterlisten der über Zeiger aufgerufenen Funktionen. Das Compilat kann zur Laufzeit keine Typanpassung vornehmen, da nicht bekannt ist auf welche Funktion der Zeiger gerade verweist. Im oberen Beispiel dürfen Sie "FN *Ptr_To_Df_Fn" nur mit einem Double-Float als Parameter aufrufen (hier X#). Die normalerweise notwendige Konvertierung von integer nach double-float kann nicht automatisch erfolgen, der Integer-Parameter wird falsch übergeben.