在C中传递输入函数之前更改输入函数

在C中传递输入函数之前更改输入函数,c,abstract-data-type,C,Abstract Data Type,抱歉,如果这听起来有点太具体,但我的问题的答案将是一个更广泛的问题的答案。下面是我的问题的背景: 在一个抽象数据类型练习中,我正在两个ADT调度程序和堆容器之间构建一个“粘合层”。调度器为它提供了一个比较函数,它应该将一个函数传递到堆中,该函数为任何输入返回该比较函数的负结果。 原因是Heap是一个最大堆,但调度器需要绘制一个最小元素。 我不允许将堆更改为最小堆,或者根本不允许。很可能,我不允许更改调度器的比较函数来返回它通常返回的负数,或者再次,根本不允许。由容器反转函数并将其提供给堆。 问题

抱歉,如果这听起来有点太具体,但我的问题的答案将是一个更广泛的问题的答案。下面是我的问题的背景:

在一个抽象数据类型练习中,我正在两个ADT调度程序和堆容器之间构建一个“粘合层”。调度器为它提供了一个比较函数,它应该将一个函数传递到堆中,该函数为任何输入返回该比较函数的负结果。 原因是Heap是一个最大堆,但调度器需要绘制一个最小元素。 我不允许将堆更改为最小堆,或者根本不允许。很可能,我不允许更改调度器的比较函数来返回它通常返回的负数,或者再次,根本不允许。由容器反转函数并将其提供给堆。 问题是它怎么能做到

我使用的类型有:

typedef void* Data;
typedef int (*DataCompareFunc)(const Data data1,const Data data2);
调度器调用以下函数:

Container* ContainerCreate(DataCompareFunc compFunc)
HeapCreate的签名是:

Heap* HeapCreate(DataCompareFunc compFunc);

ContainerCreate
以何种方式将被否定的函数转换为
HeapCreate

通常,此类功能是使用Lambda和Closure函数创建的

lambda和闭包在C++ 11中支持,但是即使在旧的C++中,也可以写< /p> 对于

C
来说更难,但是GCC有一些

在闭包中使用匿名函数编写否定函数是(在伪代码中)


其中
negate(somefunction)
将返回一个函数,当
somefunction
返回
false
等时,该函数将返回
true

通常使用Lambda和闭包函数创建此类功能

lambda和闭包在C++ 11中支持,但是即使在旧的C++中,也可以写< /p> 对于

C
来说更难,但是GCC有一些

在闭包中使用匿名函数编写否定函数是(在伪代码中)



其中
negate(somefunction)
将返回一个函数,当
somefunction
返回
false
等时,该函数将返回
true

您能否将调度程序的比较函数包装在另一个函数中并对结果求反?您应该查看lambda函数和闭包,然而,在C语言中,你可能会被限制为“我一定是遗漏了什么”,你的问题,直到最后一句,被写出来的方式,你想要的是与你现在允许使用的完全相反的东西,但不能改变任何东西。我们可以再试一次吗。允许您更改什么?这将更有意义,因为
Heap*HeapCreate(CoontainerCreate(DataCompareFunc(compFunc))
您能将调度程序的比较函数包装在另一个函数中并否定结果吗?您应该看看lambda函数和闭包,但是在C中实现这一点时,您可能会被限制为我肯定遗漏了一些东西,您的问题直到最后一句都是这样写的,您想要的东西与wh完全相反至少,您当前被允许使用,但无法更改任何内容。我们可以再试一次吗。您可以更改什么?这将更有意义,因为
Heap*HeapCreate(CoontainerCreate(DataCompareFunc(compFunc));
不允许将堆更改为最小堆或根本不允许更改堆。“+“很可能,我不允许更改调度器的比较函数以返回它通常返回的负数,或者根本不允许。"-我必须假设这包括了你想要实现的功能的任何风格。要么是这样,要么问题写得不正确。嗯..我把这个问题理解为要求功能的工厂模式,但我确实同意问题的措辞令人困惑。我试着按照索伦建议的方式创建功能ts,带有:“DataCompFunc否定(DataCompFunc compFunc){return-compFunc;}”,但gcc声称这是“一元运算符的无效输入”.btw,对于我的问题中涉及的混乱规则,我很抱歉,但这就是要求。最初我通过在调度程序的比较函数的返回行中添加负号来解决它,但我们的老师明确表示不允许。现在,我看到的唯一解决方案是使用另一个二进制参数b将堆升级为最小或最大堆您的示例没有遵循页面中给出的语法,即
({return\u type anonymous\u functions\u name(parameters){function\u body}anonymous\u functions\u name;})
--但是,您必须使用它,因为它只能作为宏使用,因为不支持真正的闭包,所以您无法在CI中返回新函数。我们得出了一个结论,我的老师在我们必须遵守的C89标准中没有考虑到这一点。他确认函子是显而易见的解决方案,我们会解决问题。无论如何,感谢您的考虑:)“我不允许将堆更改为最小堆或根本不允许。”+“很可能,我不允许更改调度程序的比较函数以返回其正常返回的负数,或者根本不允许。”-我必须假设这包括了你想要实现的功能的任何风格。要么是这样,要么问题写得不正确。嗯..我把这个问题理解为要求功能的工厂模式,但我确实同意问题的措辞令人困惑。我试着按照索伦建议的方式创建功能ts,带有:“DataCompFunc否定(DataCompFunc compFunc){return-compFunc;}”,但gcc声称这是“一元运算符的无效输入”.btw,对于我的问题中涉及的混乱规则,我很抱歉,但这就是要求。最初我通过在调度程序的比较函数的返回行中添加负号来解决它,但我们的老师明确表示不允许。现在,我看到的唯一解决方案是使用另一个二进制参数b将堆升级为最小或最大堆但这不是要求的。您的示例没有遵循syn
function negate(f) { 
   return function(){ not f(); }
}