I have an array of structs. The struct has two function pointers. Each element of the array needs the function pointers to point to different functions, so that the function corresponding to a particular element can be called without knowing the specific function name. Being new to function pointers, it seems to me that what I'm doing is not going to work, but I'm not sure how to do it correctly. An example of how to call one of the functions being pointed to would also be appreciated.
Here are the prototypes of the functions I'm trying to reference:
int edit_translate_concise(struct ged *gedp, const union edit_cmd * const cmd);
int edit_translate_add_arg(union edit_cmd * const cmd, struct edit_arg * const arg);
The struct and the array of that struct are as follows:
struct edit_cmd_tab {
char *name;
char *opt_global;
char *usage;
char *help;
int (*exec_concise)(struct ged *gedp, const union edit_cmd *const cmd);
int (*add_arg)(union edit_cmd *const cmd, struct edit_arg *const arg);
};
static const struct edit_cmd_tab edit_cmds[] = {
...
{"translate", (char *)NULL,
"[FROM] TO OBJECT ...",
"[[-n] -k {FROM_OBJECT | FROM_POS}]\n"
"[-n] [-a | -r] {TO_OBJECT | TO_POS} OBJECT ...",
&edit_translate_concise,
&edit_translate_add_arg
},
...
};
So, the functions I need to point to take the same arguments and return the same type as the function pointer members of the struct.
I'm getting these warnings, referring to the last two lines of the first struct:
/home/bhinesley/brlcad-trunk/src/libged/edit.c:866:55: warning: ‘union edit_cmd’ declared inside parameter list [enabled by default]
/home/bhinesley/brlcad-trunk/src/libged/edit.c:866:55: warning: its scope is only this definition or declaration, which is probably not what you want [enabled by default]
/home/bhinesley/brlcad-trunk/src/libged/edit.c:867:54: warning: ‘union edit_cmd’ declared inside parameter list [enabled by default]
And these warnings referring to the last two lines of the array:
/home/bhinesley/brlcad-trunk/src/libged/edit.c:1188:2: warning: initialization from incompatible pointer type [enabled by default]
/home/bhinesley/brlcad-trunk/src/libged/edit.c:1188:2: warning: (near initialization for ‘edit_cmds[1].exec_concise’) [enabled by default]
/home/bhinesley/brlcad-trunk/src/libged/edit.c:1190:5: warning: initialization from incompatible pointer type [enabled by default]
/home/bhinesley/brlcad-trunk/src/libged/edit.c:1190:5: warning: (near initialization for ‘edit_cmds[1].add_arg’) [enabled by default]
union edit_cmdtype somewhere in your code?consts aren't really useful. It shouldn't cause errors, but it might mean you should look intocdecl(cdecl.ridiculousfish.com) to make sure theconstis where you intend it to be. (Of particular concern isunion edit_cmd *constas a function argument.)