2013-03-06 93 views
0

所以这就是我正在处理的内容。'返回'作为函数指针数组中的函数

{ 
    int Test; 
    void (*functions[5])() = { 
     return, 
     one, 
     two, 
     three, 
     four 
    }; 

    for (Test = takeInput(5);; Test = takeInput(5)){ 
     cls(); 
     Print(L"0) Abort\n"); 
     Print(L"1) One\n"); 
     Print(L"2) Two\n"); 
     Print(L"3) Three\n"); 
     Print(L"4) Four\n"); 
     Print(L"Enter Selection: "); 
     (*functions[Test])(); 
    } 
} 

这就是我想要做的要点。这是某种上下文菜单系统(和takeInput(5)),将暂停输入,停止循环,直到有人输入数字为止。

问题是,以这种方式使用返回显然是错误的。我想,看到如何(我认为)返回是一个函数,我不明白为什么它不能放入一个函数指针数组,以突破菜单。我想我可以做一个虚函数,基本上只是在被调用时返回true,然后检查(这个问题是所有其他函数返回void)。即使这样做,我宁愿有一个解决方案,就像上面的非工作示例一样自成体系。

是否有一个很好,干净,希望能做到这一点的方法比我想象的要好?

+0

'return'不是一个函数,它是一个保留字。 – gcbenison 2013-03-06 14:09:29

+0

我会用'NULL'替换函数数组中的'return',然后在执行函数之前测试null,当函数指针为NULL时返回。 – 2013-03-06 14:13:03

+0

作出答案,我会把它标记为这样。无论如何确保我没有试图将空指针作为函数调用,检查它可能是有意义的。我的问题是我看不到如何留下一个索引空白(很容易,现在你说的),以便能够跳过它。 – DanielCardin 2013-03-06 14:24:18

回答

1

我想在函数数组中使用NULL替换return,并在执行该函数之前测试null,当函数指针为NULL时返回。

3

return不是一个函数,它没有地址,因此你不能在指向函数的指针数组中使用它。

for (Test; 

(*functions[Test])(); 

如果你想打出来的for循环,你必须要么使用:

而且,当你使用它的第几次Test出现未初始化breakreturnfor(;condition;)中两个分号之间的适当条件。

函数调用不会中断循环。除非,它有点像abort(),exit()longjmp()

+0

是的,我刚刚意识到缺乏初始化。 – DanielCardin 2013-03-06 14:16:31