Penguin
Diff: CastingPointerToFunction
EditPageHistoryDiffInfoLikePages

Differences between version 10 and revision by previous author of CastingPointerToFunction.

Other diffs: Previous Major Revision, Previous Revision, or view the Annotated Edit History

Newer page: version 10 Last edited on Thursday, December 4, 2003 9:29:41 am by JohnMcPherson Revert
Older page: version 6 Last edited on Wednesday, July 16, 2003 2:17:23 pm by JosephPawletko Revert
@@ -27,12 +27,14 @@
 * Jon was using it to "compile" something then jump to it in C, by casting an array as a function, then calling it. 
  
 * I use it frequently to do things like have a lookup table of name to function. For example in ircu, there is a function called "parse" which takes a line from a user, splits it up into a function and it's arguments, then scans through a table of functions and their names, when it finds one that matches that command, it calls the function with the arguments it parsed earlier. Nice 'n zippy. 
  
-* Some functions take another function as an argument . See the example below
+* A library back-end may provide functionality that should behave differently for different front ends . For example, a library that wants to print out diagnostic messages uses a function pointer, and then a console app can pass a pointer to a function that prints out to the terminal (or stdout(3) or stderr(3)) while a graphical app can create a callback function that pops up a [GUI] window or something
  
+* Some functions take another function as an argument. Probably the most well-known example is qsort(3) the quick sort algorithm -- you need to pass it an array and a function for comparing array elements. Also see the example below.  
  
-from atexit(1 ): 
+  
+ from atexit(3 ): 
  #include <stdlib.h> 
  int atexit(void (*function)(void)); 
  
 you can specify functions to be executed after main() finishes. 
@@ -46,4 +48,7 @@
  source.cpp:227: void value not ignored as it ought to be 
  
 The trick is to cast the pointer to a function pointer of the required type: 
  atexit( (void(*)())endwin ); 
+  
+----  
+It is worth noticing that in languages where functions are first class objects (such as [LISP] and [Scheme]), passing around pointers to functions is entirely normal (and type safe); even in [Java] and [Python] [Introspection] allows type safe access to such functionality.