我目前正在从intro C类开发一个项目,我们基本上是在C中创建一个哈希表实现,但我当前的问题是关于如何在我的教授提供的代码框架中编写某个函数。以下是create方法的标头定义:
Table* create(long (*hash)(void* key),
bool (*equals)(void* key1, void* key2),
void (*print)(void* key1, void* key2));
这似乎是函数作为参数的指针?我不知道如何调用它,或者调用它时会发生什么。我甚至不确定这些方法(哈希,等于和打印)的来源。任何帮助将不胜感激。感谢
答案 0 :(得分:2)
是的,这是一个函数,它将三个函数指针作为参数并返回一个指向Table的指针。要使用它,您必须定义三个符合给定条件的函数:
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);
这看起来像是要创建一个哈希表,你必须给它一个哈希函数和比较函数。打印功能可能仅用于调试。
答案 1 :(得分:2)
这似乎是函数作为参数的指针?
是
我不知道怎么称呼这个
要调用函数create
,请使用正确类型的某些函数的地址来调用create
:
create(&f1, &f2, &f3);
或调用时会发生什么。
create
体中的任何位置,其中(*)调用了指向函数,实际函数(例如f1
)最终被提供的参数调用。它可能是(*equals)(k1, k2);
作为可能在create
内发生的虚构示例。
(*)或者,在这种情况下,另一个函数将从create
分配的结构中获取函数指针,它将存储它们
事实上,C允许你在第一种情况下写create(f1, f2, f3);
,在第二种情况下写equals(k1, k2);
,但这只是方便。
答案 2 :(得分:1)
这似乎是函数作为参数的指针?
是。这是对的。
我不确定如何调用它,或者在调用它时会发生什么。
您需要使用符合signat的功能
参数的ures并使用这些函数调用create
。例如:
long myHashFunction(void* key) {...}
bool myEqualsFunction(void* key1, void* key2) {...}
void myPrintFunction(void* key1, void* key2)) {...}
Table* table = create(myHashFunction, myEqualsFunction, myPrintFunction);
create
对这些功能的影响取决于只能被猜到。我不知道它对它们的作用。
答案 3 :(得分:1)
这应该是一个评论 - 太适合
了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)。
但&#34;哈希&#34;将偏移量返回到哈希表(可能是数组)。 &#34;等于&#34;测试两个输入值是否是相同的散列 - 相同可能纯粹是主观的。问你的教授。 print显示一个哈希条目,这意味着我想,它会找到该条目并在哈希数组或对象中打印关键值的信息。查找关联数组&#39;看看我的意思。