如何在当前上下文中定义函数指针?

时间:2014-10-14 06:44:33

标签: c linked-list function-pointers

嘿,如果给出以下defs,我对如何定义函数指针感到有点困惑:

struct menu_item
{
    char name[ITEM_NAME_LEN+1];
    BOOLEAN (*func)(struct vm*);

};

我使用函数menu_init使用以下内容定义了menu_item包含的初始变量的方式。该函数假定定义菜单项数组的每个成员。

void menu_init(struct menu_item * menu)
{
    strcpy(menu[0].name, "\t1. Display Items");
    menu[0].func = (*void)&print_list(struct vm_node node); //print list is suppose to print the entire linked list past to the function print_list. Though i am unsure if this is correct. 

    strcpy(menu[1].name,"\t2. Purchase Items");
    strcpy(menu[2].name,"\t3. Save and Exit");
    strcpy(menu[3].name, "\t4. Add Item");
    strcpy(menu[4].name,"\t5. Remove Item");
    strcpy(menu[5].name,"\t6. Display Coins");
    strcpy(menu[6].name, "\t7. Reset Stock");
    strcpy(menu[7].name,"\t8. Reset Coins");
    strcpy(menu[8].name,"\t9. Abort Program");

  /* The UNUSED() function is designed to prevent warnings while your 
     * code is only partially complete. Delete this function call once 
     * you are using vm in your own code */
}

print_list的声明如下。

void print_list(struct vm_node  *root);

非常感谢任何帮助。

3 个答案:

答案 0 :(得分:4)

你的语法错了。

最简单的解决方法是通过将函数更改为具有与函数指针匹配的正确类型来摆脱强制转换:

BOOLEAN print_list(struct vm_node *root);

然后你可以这样做:

menu[0].func = print_list;

请注意,这更有意义,因为通过func函数指针调用的代码将期望BOOLEAN返回值,因此强制它使用并调用铸造不匹配的功能不是一个好主意。

答案 1 :(得分:0)

如果您有一个struct menu_item变量

struct menu_item m ;
m.func = you_function_name ;

这是语法,在你的情况下是:

void menu_init(struct menu_item * menu)
{
    strcpy(menu[0].name, "\t1. Display Items");
    menu[0].func = print_list;
    ....

你称它为任何其他功能:

menu[0].func( node) ;

答案 2 :(得分:-2)

这是一个创建和分配(在同一行中......)函数指针

的示例
int g(int y){return y;}

int main()
{
    int (*f)(int x) = &g; // initializing f with the address of g. f is a pointer to a function that returns int, and has 1 int parameter
    printf("%d",f(1)); // calling g, using the pointer f
    return 0;
}

现在,函数指针可能被滥用,因此f = g而不是f = &g也会起作用,还有一些方法可以实现相同的结果。

关于您的代码,您可以像我在上面的示例中那样分配menu[0].func = print_list;,如果print_list是布尔返回函数。相反,您将其定义为void返回函数。