【问题标题】:changing input function before passing it on in C在 C 中传递之前更改输入函数
【发布时间】:2015-07-17 18:19:06
【问题描述】:

对不起,如果这听起来有点过于具体,但我的问题的答案将是一个更广泛的问题的答案。所以这是我的问题的背景:

在Abstract Data Types excersize 中,我在两个ADT(调度程序和堆)之间构建了一个“粘合层”,称为容器。调度程序为它提供了一个比较函数,它应该将一个函数传递给堆,该函数返回该比较函数对任何输入的否定结果。 这样做的原因是Heap是一个最大堆,但是Scheduler要求绘制一个最小元素。 我不允许将堆更改为最小堆或根本不更改。很可能,我不允许更改调度程序的比较函数以返回它通常返回的负数,或者再次返回。由 Container 来反转函数并将其提供给 Heap。 问题是它到底是怎么做到的?!

我使用的类型是:

typedef void* Data;
typedef int (*DataCompareFunc)(const Data data1,const Data data2);

调度器调用函数:

Container* ContainerCreate(DataCompareFunc compFunc)

HeapCreate 的签名是:

Heap* HeapCreate(DataCompareFunc compFunc);

ContainerCreate 可以通过什么方式将取反函数转入HeapCreate

【问题讨论】:

  • 能不能把Scheduler的比较函数包裹在另一个函数中,对结果取反?
  • 您应该查看 lambda 函数和闭包,但是在 C 中实现它们可能仅限于 GCC
  • 我一定遗漏了一些东西,直到最后一句,你的问题的写作方式,你想要的东西与你目前被允许使用的东西完全相反,但不能改变任何东西。我们可以再试一次吗? 你可以改变什么?
  • Heap* HeapCreate (CoontainerCreate (DataCompareFunc (compFunc)); 会更有意义

标签: c abstract-data-type


【解决方案1】:

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

C++11 支持 Lambda 和闭包,但即使在旧式 C++ 中,您也可以编写 Functors

C 更难,但是 GCC 有一些 support

在闭包中用匿名函数编写取反函数是(在伪代码中)

function negate(f) { 
   return function(){ not f(); }
}

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

【讨论】:

  • "我不允许将堆更改为最小堆,或者根本不允许。" +“很可能,我不允许更改调度程序的比较函数以返回它通常返回的负数,或者再次,完全没有。” - 我不得不假设这包括实现你想要梦想的那个功能的任何风格。要么是那个,要么是问题写错了。
  • 嗯.. 我在阅读这个问题时要求提供工厂模式的功能,但我同意这个问题的措辞令人困惑
  • 我尝试按照 Soren 建议的方式创建一个函数,使用:'DataCompFunc negate(DataCompFunc compFunc){ return -compFunc;}' 但 gcc 声称这是“一元运算符的无效输入”。顺便说一句,对于我的问题所涉及的令人困惑的规则,我很抱歉,但这些都是要求。最初我通过在调度程序的比较函数的返回行中添加一个减号来解决它,但他们我们的老师特别说这是不允许的。现在,我看到的唯一解决方案是将我的堆升级为带有另一个二进制参数的最小或最大堆,但这不是所要求的。
  • 您的示例不遵循example on the wikipedia 页面中给出的语法,即( { return_type anonymous_functions_name (parameters) { function_body } anonymous_functions_name; } ) - 但是您必须使用它,因为它只能用作宏,因为真正的闭包是不受支持,因此您无法在 C 中返回新函数
  • 我得出一个结论,我的老师没有考虑到我们必须遵守的 C89 标准。他确认函子是显而易见的解决方案,我们会想办法解决的。无论如何,感谢您的思考:)
猜你喜欢
  • 1970-01-01
  • 2019-01-28
  • 1970-01-01
  • 1970-01-01
  • 2022-12-29
  • 1970-01-01
  • 1970-01-01
  • 2012-08-04
相关资源
最近更新 更多