使用ISO C99进行咖喱/装订

马丁·乌丁

假设我想用纯C实现数字积分例程。它将看起来像这样:

double integrate(double (*f)(double), double lower, double upper, double step));

我经常发现实际上依赖于多个变量的函数,并且我想在第一个变量上进行集成。说我想整合这个:

double func(double x, double z);

关于x我无法通过funcintegrate因为它的签名错误。现在,我知道以下变通方法,当我们修读数字课程时,我们采用了以下变通方法:

  • 使用C ++

    我只是使用C ++和iststd::bind来创建可以传递给集成例程的函子(函数对象)。现在,我只需要使用lambda函数来完成它。

  • 使用GCC扩展功能

    使用GCC,您可以在函数中声明一个函数。所以一个人可以做

    // z is set to some value in this function scope here.
    double inner(double x) {
        return func(x, z);
    }
    

    并将其传递innerintegrate函数。那是非标准的,感觉不太好。

  • 使用全局变量

    的值z可以存储在全局变量中。这将要求该函数func是可编辑的,以便z从全局变量而不是参数中使用。那可能是不可能的。然后,它也破坏了并发性,并且通常是不好的。

在纯C中是否存在不破坏某些内容的方法?

五边形

解决此问题的一种常见方法是将设计更改为:

double integrate(double (*f)(double, void*), void*,
                      double lower, double upper, double step);

在这里,您将附加传递void *integrate,并将其传递回f这可以用来传递任意数据,在这种情况下,您将传递一个指针z,在函数内,f您将把指针强制转换回其原始类型并恢复该值z这种模式在C库中无处不在,例如,这是pthread_create的原型

int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
                      void *(*start_routine) (void *), void *arg);

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

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

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用ISO C99进行咖喱/装订

来自分类Dev

使用ISO C99进行咖喱/装订

来自分类Dev

使用C99的Netbeans C GCC

来自分类Dev

使用-std = c99进行编译时,be64toh未链接或被声明

来自分类Dev

c99中不赞成使用getresuid吗?

来自分类Dev

在Linux上使用c99截断

来自分类Dev

在C99中的宏中使用对与错

来自分类Dev

仅使用ISO 646,三字母组合体就需要在C99中编写换行符吗?

来自分类Dev

使用C99之前的编译器构建C迭代器宏

来自分类Dev

不使用_Generic(C11),C99如何键入通用宏?

来自分类Dev

当我使用-std = c99时未声明套接字[c]

来自分类Dev

使用C99之前的编译器构建C迭代器宏

来自分类Dev

不使用_Generic(C11),C99如何键入通用宏?

来自分类Dev

在C99中使用和不使用&打印指针之间的区别

来自分类Dev

在CMake中强制C99(以使用“ for”循环初始声明)

来自分类Dev

如何在没有警告的情况下在C99中使用ftruncate

来自分类Dev

C99是否允许标识符中使用通用字符名称?

来自分类Dev

对C99可变长度数组(VLA)使用限制限定符

来自分类Dev

在C99中的复合文字中使用后缀/前缀增量运算符

来自分类Dev

使用C99编译问题是否在每个if周围都有一个范围?

来自分类Dev

我仅在使用-std = c99时才得到隐式声明错误

来自分类Dev

在C99中使用静态变量初始化静态变量

来自分类Dev

C99 是否要求始终使用 `int64_t` 类型?

来自分类Dev

警告:仅在使用 -std=c99 时隐式声明函数

来自分类Dev

如何使用Respin进行当前安装的.iso?

来自分类Dev

无法使用Ubuntu 17.10 ISO映像进行安装

来自分类Dev

为什么新的C ++标准使用“ ISO / IEC 14882:2015”?

来自分类Dev

警告:ISO C禁止使用空的翻译单位

来自分类Dev

从使用GRUB / NASM / C构建的内核中生成iso

Related 相关文章

  1. 1

    使用ISO C99进行咖喱/装订

  2. 2

    使用ISO C99进行咖喱/装订

  3. 3

    使用C99的Netbeans C GCC

  4. 4

    使用-std = c99进行编译时,be64toh未链接或被声明

  5. 5

    c99中不赞成使用getresuid吗?

  6. 6

    在Linux上使用c99截断

  7. 7

    在C99中的宏中使用对与错

  8. 8

    仅使用ISO 646,三字母组合体就需要在C99中编写换行符吗?

  9. 9

    使用C99之前的编译器构建C迭代器宏

  10. 10

    不使用_Generic(C11),C99如何键入通用宏?

  11. 11

    当我使用-std = c99时未声明套接字[c]

  12. 12

    使用C99之前的编译器构建C迭代器宏

  13. 13

    不使用_Generic(C11),C99如何键入通用宏?

  14. 14

    在C99中使用和不使用&打印指针之间的区别

  15. 15

    在CMake中强制C99(以使用“ for”循环初始声明)

  16. 16

    如何在没有警告的情况下在C99中使用ftruncate

  17. 17

    C99是否允许标识符中使用通用字符名称?

  18. 18

    对C99可变长度数组(VLA)使用限制限定符

  19. 19

    在C99中的复合文字中使用后缀/前缀增量运算符

  20. 20

    使用C99编译问题是否在每个if周围都有一个范围?

  21. 21

    我仅在使用-std = c99时才得到隐式声明错误

  22. 22

    在C99中使用静态变量初始化静态变量

  23. 23

    C99 是否要求始终使用 `int64_t` 类型?

  24. 24

    警告:仅在使用 -std=c99 时隐式声明函数

  25. 25

    如何使用Respin进行当前安装的.iso?

  26. 26

    无法使用Ubuntu 17.10 ISO映像进行安装

  27. 27

    为什么新的C ++标准使用“ ISO / IEC 14882:2015”?

  28. 28

    警告:ISO C禁止使用空的翻译单位

  29. 29

    从使用GRUB / NASM / C构建的内核中生成iso

热门标签

归档