I have following codes: void fun1(unsigned char *msg); void fun2() { fun1("ssss"); } void fun3() { } code void (*func_array[])()={fun2, fun3}; void fun1( unsigned char *msg) { (*func_array[1])(); } void main() { (*fun_array[0])(); } when compiling, i got the following message *** WARNING L13: RECURSIVE CALL TO SEGMENT SEGMENT: ?CO?HELLO Could you please tell me how to solve it? Thanks a lot!
If you dynamically update the function pointer table, then there is no way for the static call tree analysis to help you. So, you'll be in for a lot of work with the OVERLAY directive, or else a lot of code bloat from the reentrant declaration. Unless you're doing extremely dynamic things like creating code to execute on the fly, you probably know the range of possible results, and can use an index into a table of fixed pointers. "Call func 3" works about as well as "Call func *p" in most cases. It's perhaps worth noting that a switch statement such as the one Dan posted generally compiles into a jump table anyway. You don't have to explicitly code a function pointer table to get a table of function pointers. I often get a recursive call to segment warning from code with structure like this:
char const code * code StringTable[] = { "Name1", "Name2" } void f1 (int i) { printf (StringTable[i]); } void f2 (int i) { PerformWonders(i); } const code FuncTableEntry FuncTable[2] = { f1, f2 }; void Dispatcher (void) { FuncTable(i); }
Dan: "... codify the function pointer array at the cost of an additional pushed return address." Drew: "It's perhaps worth noting that a switch statement such as the one Dan posted generally compiles into a jump table anyway." And when it compiles into a jump table, it does not cost an additional pushed return address.