【问题标题】:Functions as parameters in CC语言中作为参数的函数
【发布时间】:2015-04-09 21:24:46
【问题描述】:

我目前正在从事介绍 C 类的项目,我们基本上是在 C 中创建一个哈希表实现,但我目前的问题与某个函数是如何在我的教授提供的代码框架中编写的有关。这里是create方法的头部定义:

     Table* create(long (*hash)(void* key),
          bool (*equals)(void* key1, void* key2),
          void (*print)(void* key1, void* key2));

这似乎是指向函数作为参数的指针?我什至不知道如何调用它,或者调用它时会发生什么。我什至不确定这些方法(hash、equals 和 print)是从哪里来的。任何帮助将不胜感激。谢谢

【问题讨论】:

  • 当你有一个指向函数或数组的指针时,当你有选择的时候总是使用 typedef。在这种情况下您可能不会,但请记住,下次您看到这样的混乱时。

标签: c function pointers parameters


【解决方案1】:

这似乎是指向函数作为参数的指针?

是的。

我什至不知道怎么称呼它

要调用函数create,请传递一些具有正确类型的函数的地址以调用create

create(&f1, &f2, &f3);

或者当它被调用时会发生什么。

create 主体中的任何位置,其中(*)指向的函数被调用,实际函数(例如f1)最终会使用提供的参数调用。它可能是(*equals)(k1, k2); 作为一个虚构的例子,它可能发生在create 内部。

(*) 或者,在这种情况下,另一个函数将从 create 分配的结构中获取函数指针,它将存储它们


事实上,C 允许你在第一种情况下写create(f1, f2, f3);,在第二种情况下写equals(k1, k2);,但这只是为了方便。

【讨论】:

  • 是的,谢谢,这更有意义。这个语法看起来很奇怪,我不知道如何处理它,甚至不知道如何查找它
  • @DanielMoody 函数指针在 C 中 很奇怪,因为它们会在两个方向上自动转换。我不知道我是否应该告诉你这一点,但请看 cs.berkeley.edu/~necula/cil/cil016.html 中的示例 4。无论如何,只需在create(&f1…/ (*equals)(k1…create(f1…/ equals(k1… 之间选择一种你觉得舒服的风格并尝试坚持下去,但如果你忘记&* 时没有收到编译器警告,请不要感到惊讶用于函数或函数指针。
【解决方案2】:

是的,这是一个将三个函数指针作为参数并返回一个指向表的指针的函数。要使用它,您必须定义三个满足给定条件的函数:

long my_hash(void *key) { ... }
bool my_equals(void *key1, void *key2) { ... }
void my_print(void *key1, void *key2) { ... }

然后用它们调用函数:

t = create(my_hash, my_equals, my_print);

这看起来像是要创建一个哈希表,你必须给它一个哈希函数和比较函数。打印功能可能只是为了调试。

【讨论】:

    【解决方案3】:

    这似乎是指向函数作为参数的指针?

    是的。没错。

    我什至不知道如何调用它,或者调用它时会发生什么。

    您需要使用符合签名的函数 使用这些函数调用create。示例:

    long myHashFunction(void* key) {...}
    bool myEqualsFunction(void* key1, void* key2) {...}
    void myPrintFunction(void* key1, void* key2)) {...}
    
    
    Table* table = create(myHashFunction, myEqualsFunction, myPrintFunction);
    

    create 对这些函数的作用取决于只能猜测。我不知道它对它们有什么作用。

    【讨论】:

      【解决方案4】:

      这应该是一条评论——太饶舌了,不适合

      Those are function pointers:
                long (*hash)(void* key),  <- returns a long, uses a void * as input
                bool (*equals)(void* key1, void* key2), <- return 0 or 1            (True/False)
                void (*print)(void* key1, void* key2)); <- no return
      

      因为这些是指针,所以实际的函数名称是您创建的名称(或者教授可能已经为您创建了任何名称,包括哈希、等于和打印)。

      但是“hash”返回一个偏移量到一个哈希表(可能是一个数组)。 "equals" 测试两个输入值是否是相同的散列 - 相同性可能纯粹是主观的。问你的教授。 print 显示一个散列条目,这意味着我想它会找到该条目并在散列数组或对象中打印键值的信息。查找“关联数组”以了解我的意思。

      【讨论】:

      • 评论通常不应该作为答案发布,但这并不是一个糟糕的答案,所以我没有标记或投反对票。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-10
      • 2011-10-12
      相关资源
      最近更新 更多