* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project
Download Pointers to Functions - CS
Recursion (computer science) wikipedia , lookup
Program optimization wikipedia , lookup
Falcon (programming language) wikipedia , lookup
Selection algorithm wikipedia , lookup
Name mangling wikipedia , lookup
Dirac delta function wikipedia , lookup
Error detection and correction wikipedia , lookup
Control table wikipedia , lookup
One-pass compiler wikipedia , lookup
APL syntax and symbols wikipedia , lookup
Buffer overflow protection wikipedia , lookup
C Sharp (programming language) wikipedia , lookup
Interpreter (computing) wikipedia , lookup
Go (programming language) wikipedia , lookup
Corecursion wikipedia , lookup
Pointers to functions Debugging . Logistics Mid-term exam: 18/11 Closed books List of topics – see web page Some you have to read by yourself! Reminder: one person per exercise Copying will be severely punished Make sure your PLAB directory is not readable for other people Pointers to Functions C/C++ allow to have a pointer to a function int foo(int x) {…} main() { int (*func)(int); // func is a pointer to a function func = &foo; func = foo; // same int x = (*func)(7); // same as x = foo(7) } Example: Numerical Integrator b 1 f a (i ) a f (x )dx 2 i 1 k a a a 2 b a k a k b Example: Numerical Integrator double numericalIntegration( double a, double b, double (*func)(double), int k ) { double delta = (b - a)/k; double Sum = 0; for( double x = a+0.5*delta; x < b; x+= delta ) Sum += (*func)(x); return Sum*delta; } See NumericalIntergator.c Example Suppose we implement an interface of a list of ints IntList.h: struct IntList; // intListNew() // Allocates a new list IntList* intListNew(); … Example typedef void (*funcInt)( int x, void* Data ); // intListMAPCAR(List, Func, Data ) // // Apply Func to each element of the list // void intListMAPCAR( IntList* List, funcInt Func, void* Data ); Using MAPCAR See UseList.c “Generic” interface MAPCAR is a uniform way of performing computations over list elements The given function provides the different functional element Pointers to functions provide a way to write code that receives functions as arguments Example: qsort Library procedure: qsort( void *base, size_t n, size_t size, int (*compare)(void const*, void const *) ); – start of an array n – number of elements size – size of each element compare – comparison function base Using qsort int compareInt(void const *p, void const *q) { int a = *(int const*)p; int b = *(int const*)q; if( a < b ) return -1; return a > b; } … int array[10] = { … }; qsort( array, 10, sizeof(int), compareInt ); Testing Important aspect of programming Careful testing of each module, reduce further bugs later on. Automatic retesting, allow to ensure changes in code do not introduce new “features” How can we test our code? Testing “Interpreter” A generic code for interactive/batch test int testCmdLine( TestCmdLineCommand const*Commands, void* Data ) Arguments: Commands – list of commands Data – data shared by commands Testing Interpreter enum TestCmdLineReturnCode { e_TestCmdLineOK, e_TestCmdLineQuit, e_TestCmdLineAbort }; typedef TestCmdLineReturnCode (*TestCmdLineFunc)(void* Data, char const* const* ArgV ); struct TestCmdLineCommand { char* m_Name; char* m_Desc; int m_ArgNum; TestCmdLineFunc m_Func; }; // // // // Command Name One line description # of arguments Function to call Building a test program See TestIntList.c To do Read man pages FILE I/O: fopen, fclose, fprintf, fgetchar, fflush Sorting & Searching: qsort, heapsort, bsearch Compile program supplied with this class Run them in DDD (or gdb) set breakpoints step through program force an assert, and see what happens Debugging 101 1. 2. 3. 4. Divide & Conquer “Define” the bug --- reproduce it Use tools: debugger & more Don’t panic --- think! Define the bug Spend the time to find out What is wrong? Minimal settings that lead to the error? Reproduce the wrong behavior! Preferably on a small example Divide & Conquer Consider possible points of failure check each one of them separately Use Debugger Debugger Allow to monitor run time behavior Check where the program crashes Put breakpoints on specific events Trace execution of the program Debugger Debugger can save a lot of time Find why the program crash Understand the context (call tree, value of variables, etc.) But… Don’t be trapped into using debuggers all the time Other tools Intermediate printouts self-checking code asserts Memory allocation & leaks (Tirgul) Don’t Panic There a sensible explanation to the bug Always! Don’t rush to blame the compiler/OS Don’t attribute bugs to mysterious forces Do not try random changes to see if they resolve the program This will only introduce more bugs!