C:是否可能有一个将函数指针数组作为其参数之一的递归函数?

冰人

这是更长的版本。(TL; DR版本在我的帖子标题中。)

让我们考虑一个quick_sort当前设置如下的递归函数:(i)它接受一个参数-链表,(ii)以升序对元素进行排序,并且(iii)返回排序后的链表。以下是说明性代码(我可以根据要求发布实际代码-更长的时间)。

#include "list.h"  /*our linked-list implementation which includes definitions
                     for `concatenate`, which we use below*/

typedef int (*ordinal(int referenceValue, int currentValue));

int smaller(int referenceValue, int currentValue)
{
  return currentValue <= referenceValue ? 1 : 0;
}

int larger(int referenceValue, int currentValue)
{
  return currentValue > referenceValue ? 1 : 0;
}

List *getElements(List *fullList, ordinal compare)  /*let's assume this function exists*/
  /*implementation of getElements*/

List* quickSort(List* originalList)
{
  /*code to handle the two base cases, i.e., the cases
    in which the input list has either 0 or 1 elements */

  List *pivotElement = List_create();
  List_push(pivotElement, originalList->first->value);

  /*we're simply using the first element in the list as the pivot-point*/

  List *prePivotElements = quickSort( getElements(originalList, smaller) );
  List *postPivotElements = quickSort ( getElements(originalList, larger) );
  List *newList = concatenate(prePivotElements, pivotElement, postPivotElements);

  return newList;
}

现在,我们要修改quick_sort函数,使其具有两个参数:一个链表和一个函数指针数组。想法是使用第二个参数(即,函数指针的数组)指定排序顺序。函数调用的语法如下所示:quick_sort(linked_list, increasing[])quick_sort(linked_list, decreasing[])

我应该提到的是,我的重点是了解递归传递函数指针数组的可行性/正确语法,而不是算法效率等。换句话说,让我们尝试忽略可怕的效率/内存管理方面快速排序的这个特殊实现的内容:)

为了进行quick_sort如上所述的修改,我认为以下代码可能会起作用...

#include "list.h" 

typedef int (*ordinal(int referenceValue, int currentValue));

int smaller(int referenceValue, int currentValue)
{
  return currentValue <= referenceValue ? 1 : 0;
}

int larger(int referenceValue, int currentValue)
{
  return currentValue > referenceValue ? 1 : 0;
}

/*two new global arrays of function pointers*/
int (*increasing[2]) (int referenceValue, int currentValue) = {smaller, larger};
int (*decreasing[2]) (int referenceValue, int currentValue) = {larger, smaller};

List *getElements(List *fullList, ordinal compare)
  /*implementation of getElements*/

/*updated argument list*/
List* quickSort(List* originalList, ordinal compare[])
{
  /*base cases*/
  List *pivotElement = List_create();
  List_push(pivotElement, originalList->first->value);

  /*updated recursive function call*/
  List *prePivotElements = 
              quickSort( getElements(originalList, compare[0]), compare );
  List *postPivotElements = 
              quickSort ( getElements(originalList, compare[1]), compare );
  List *newList = concatenate(prePivotElements, pivotElement, postPivotElements);

  return newList;
}

...但是会导致以下错误:

error: declaration of ‘compare’ as array of functions
   List* quickSort(List* originalList, ordinal compare[])
                                               ^
error: type of formal parameter 2 is incomplete
   List *prePivotElements = quickSort( getElements(originalList, compare[0]), compare );
   ^
error: type of formal parameter 2 is incomplete
   List *postPivotElements = quickSort ( getElements(originalList, compare[1]), compare );
   ^

概括一下我的问题:C是否允许我们将函数指针数组传递给其他函数?递归执行该怎么办?如果允许,正确的语法是什么?

请原谅,我相信你们中的一位资深人士会更加简洁!

(关于SO规则,all posted code must compile在这种情况下我认为坚持使用与概念相关的代码是有意义的。但是,如果人们愿意,我可以发布完整的.c文件和.h文件。)

更新:根据要求,这里是的工作版本的相关文件quick_sort我还包括了shell输出,包括用于编译/链接的命令。仅供参考,键盘给出了一些毫无意义的怪异错误(例如,在具有正确/可编译函数头的行上,声称我缺少括号):

扬·胡德克(Jan Hudec)
typedef int (*ordinal(int referenceValue, int currentValue));

是不正确的。它在语法上是有效的,但是括号没有作用,它仅定义函数类型而不是函数指针。正确定义函数指针的正确方法是

typedef int (*ordinal)(int, int);

括号是* 唯一的标识符(并且参数名称无关)。

并且使用该typedef更好地声明函数数组,而不是重复定义。

ordinal increasing[2] = {smaller, larger};

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Java

它是不可能有一个@RequestParam作为一个列表?

来自分类Dev

如何定义一个函数,该函数接收一个指针作为参数并返回一个指向该参数的子代之一的指针?

来自分类Dev

一个Go二进制文件中可能有多个lambda函数吗?

来自分类Dev

可能有一个新函数在Golang中分配文件描述符

来自分类Dev

在Dart中,是否可能有一个const闭包映射?

来自分类Dev

Angular Material工具提示中是否可能有一个列表?

来自分类Dev

如何制作一个将任意函数指针作为参数的函数?

来自分类Dev

可以通过仅以一个指针作为参数的函数内部的c数组运行吗?

来自分类Dev

有可能有一个表函数返回空行?

来自分类Dev

一个信号可能有多个陷阱

来自分类Dev

为什么在python中不可能有一个object方法返回一个元组作为新对象__init__方法中的参数?

来自分类Dev

为什么在python中不可能有一个object方法返回一个元组作为新对象__init__方法中的参数?

来自分类Dev

Swift中是否可能有一个包含通用协议的属性?

来自分类Dev

在C中可能有一个带条件中断语句的宏

来自分类Dev

编写一个函数,该函数将指向任何函数的指针作为参数

来自分类Dev

一个类中是否可能有多个具有相同名称但参数不同的方法?

来自分类Dev

在Java中的不可变映射中,是否可能有一个不可变的列表作为value字段?

来自分类Dev

一个占位符中是否可能有多种文本颜色?

来自分类Dev

将指向一个C函数的指针作为另一个函数的参数传递

来自分类Dev

可能有一个函数接受设定长度的char数组吗?

来自分类Dev

帮助,我可能有一个Rootkit

来自分类Dev

可能有一个专门用于异常处理的类C#

来自分类Dev

如果我有一个调用其他实例之一的重载函数,它是否被视为递归函数?

来自分类Dev

修改函数内的指针(将另一个指针作为参数传递)

来自分类Dev

在 DAML 中是否有可能有一个通用参数来选择,而模板本身不是通用的?

来自分类Dev

执行一个可能有一些参数为空的查询

来自分类Dev

是否有可能有一个没有下拉箭头的 SelectInput?

来自分类Dev

如何在 C++ 中声明一个通过引用将数组作为参数的函数?

来自分类Dev

编写一个将 AbstractVector 作为其参数的函数

Related 相关文章

  1. 1

    它是不可能有一个@RequestParam作为一个列表?

  2. 2

    如何定义一个函数,该函数接收一个指针作为参数并返回一个指向该参数的子代之一的指针?

  3. 3

    一个Go二进制文件中可能有多个lambda函数吗?

  4. 4

    可能有一个新函数在Golang中分配文件描述符

  5. 5

    在Dart中,是否可能有一个const闭包映射?

  6. 6

    Angular Material工具提示中是否可能有一个列表?

  7. 7

    如何制作一个将任意函数指针作为参数的函数?

  8. 8

    可以通过仅以一个指针作为参数的函数内部的c数组运行吗?

  9. 9

    有可能有一个表函数返回空行?

  10. 10

    一个信号可能有多个陷阱

  11. 11

    为什么在python中不可能有一个object方法返回一个元组作为新对象__init__方法中的参数?

  12. 12

    为什么在python中不可能有一个object方法返回一个元组作为新对象__init__方法中的参数?

  13. 13

    Swift中是否可能有一个包含通用协议的属性?

  14. 14

    在C中可能有一个带条件中断语句的宏

  15. 15

    编写一个函数,该函数将指向任何函数的指针作为参数

  16. 16

    一个类中是否可能有多个具有相同名称但参数不同的方法?

  17. 17

    在Java中的不可变映射中,是否可能有一个不可变的列表作为value字段?

  18. 18

    一个占位符中是否可能有多种文本颜色?

  19. 19

    将指向一个C函数的指针作为另一个函数的参数传递

  20. 20

    可能有一个函数接受设定长度的char数组吗?

  21. 21

    帮助,我可能有一个Rootkit

  22. 22

    可能有一个专门用于异常处理的类C#

  23. 23

    如果我有一个调用其他实例之一的重载函数,它是否被视为递归函数?

  24. 24

    修改函数内的指针(将另一个指针作为参数传递)

  25. 25

    在 DAML 中是否有可能有一个通用参数来选择,而模板本身不是通用的?

  26. 26

    执行一个可能有一些参数为空的查询

  27. 27

    是否有可能有一个没有下拉箭头的 SelectInput?

  28. 28

    如何在 C++ 中声明一个通过引用将数组作为参数的函数?

  29. 29

    编写一个将 AbstractVector 作为其参数的函数

热门标签

归档