【问题标题】:How to input function to run when you have many options当您有很多选项时如何输入要运行的函数
【发布时间】:2017-10-16 00:14:00
【问题描述】:

首先假设你有函数

void foo1 (...)
{...}
void foo2 (...)
{...}
void foo3 (...)
{...}
void foo4 (...)
{...}
void foo5 (...)
{...}

现在我知道我们可以使用其中任何一个来选择一个函数

void pickFunction1(char input[])
{
    if (strcmp(input, "foo1") == 0) foo1(...);
    else if (strcmp(input, "foo2") == 0) foo2(...);
    else if (strcmp(input, "foo3") == 0) foo3(...);
    else if (strcmp(input, "foo4") == 0) foo4(...);
    else if (strcmp(input, "foo5") == 0) foo5(...);
}

void pickFunction2(char input[])
{
    switch(input) {
        case 'foo1' :
            foo1(... );
            break;
        case 'foo2' :
            foo2(... );
            break;
        case 'foo3' :
            foo3(... );
            break;
        case 'foo4' :
            foo4(... );
            break;
        case 'foo5' :
            foo5(... );
            break;
}

现在我的问题是当您有更多选项时会发生什么,假设您有foo1(), foo2(),....foo10000(),那么前两个pickFunctions 将随着数量线性增长(O(N),其中 N 是选项的数量)可用的选项。有没有办法让函数选择的这种线性增长变成更恒定的增长函数选择?像类似于(funcall input)in LISP 的东西?

【问题讨论】:

  • "当你有更多选择时会发生什么,假设你有 foo1(), foo2(),....foo10000()" ...嗯...你...退出你的工作....
  • 参考此页面以更好地理解stackoverflow.com/questions/252748/…
  • @krpra,嗯,原来是这个词,我不知道。但是,这不是只适用于具有相同类型和数量的参数的函数吗?
  • 不要忘记调用只发生一次,所以你有相同的参数进入,所以是的,函数应该严格具有相同的原型。 C 就是这样,您可能能够阻止某种子集,其中一些函数具有相同的起始原型但实际参数较少(例如参数 1 和 2 相同,但有些缺少 3 和 4)并转换它们当您初始化数组时。虽然我认为只有 CDECL 会以这种方式工作。

标签: c if-statement input switch-statement


【解决方案1】:

看看array of function pointer 这是一个数组,其中数组的每个单元都存储了函数的地址。可以循环填充,用法一样。

【讨论】:

  • 这样只能用函数填充单元格吗?还是您也可以将参数添加到单元格中?
  • 你用函数名填充单元格,当你调用指向函数的单元格时,你添加参数。在 stackoverflow 上找到的示例:int sum(int a, int b); int (*p[1]) (int x, int y); int main(void) { int result; p[0] = sum; 当你调用它时:result = (*p[0]) (3, 4);
  • @FelipeSantana 如果您在编译时添加参数,那么您是在谈论常量吗?如果是这样,您可能需要一个包含函数和任何已知参数的结构数组。你可以从那里建立你的电话。
  • 对不起语法,看起来不太好。sum 是执行a + b 的函数
  • @LoztInSpace 这样的函数指针数组,而不是函数让它们成为结构?
猜你喜欢
  • 2011-07-13
  • 1970-01-01
  • 2017-09-23
  • 2021-12-17
  • 1970-01-01
  • 1970-01-01
  • 2023-03-24
  • 2022-01-26
  • 2022-01-17
相关资源
最近更新 更多