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

戴维·格雷森

我正在使用FFI gem,以便可以直接从Ruby程序访问C库中的函数如果C库具有一个接受函数指针参数的函数,并且它具有第二个函数,该函数在该参数中具有正确的签名,那么我如何将指向第二个函数的指针作为第一个函数的参数传递?

我尝试了什么

到目前为止,这是我尝试过的。为简化起见,我在名为的文件中编写了自己的非常简单的C库bar.c

#include <stdio.h>

typedef int bar_func();

int bar1()
{
    return 7;
}

int bar2(bar_func * f)
{
    printf("f=%p, bar2=%p\n", f, bar1);
    return f() + f();
}

我通过运行在Arch Linux下编译了它 gcc -std=gnu99 -fPIC -shared bar.c -o bar.so

我的目标是将指向的指针bar1作为参数传递给bar2我希望bar2打印两个相同的指针,然后返回14。

因此,我使用Ruby 2.2.0p0和ffi 1.9.6运行了该程序:

require 'ffi'

module Bar
  extend ::FFI::Library
  ffi_lib './bar.so'
  callback :bar_func, [], :int
  attach_function :bar1, [], :int
  attach_function :bar2, [:bar_func], :int

  puts bar2(method(:bar1))   # => 14
end

当我运行程序时,这是我得到的输出:

f=0x7f563ce46000, bar1=0x7f563af7d6e0
14

它给出正确的返回值,但是您可以看到传递到bar2函数中的函数指针显然不等于bar1,因为第一行上打印的两个函数指针是不同的。

戴维·格雷森

我在FFI :: Library文档中看到了提示它说attach_function返回一个FFI::VariadicInvoker对象。我做出了一个有根据的猜测,您可以将其传入而不是proc中,并且可以正常工作。

module Bar
  extend ::FFI::Library
  ffi_lib './bar.so'
  callback :bar_func, [], :int
  Bar1Invoker = attach_function :bar1, [], :int
  attach_function :bar2, [:bar_func], :int

  puts bar2(Bar1Invoker)   # => 14
end

我得到了期望的输出:

f=0x7f949ed7d6e0, bar1=0x7f949ed7d6e0
14

我已经编辑了FFI Wiki上的回调”页面以获取此信息。

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

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

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

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

来自分类Dev

PHP 将一个函数作为参数传递给另一个函数

来自分类Dev

将函数参数作为参数传递给python中的另一个函数

来自分类Dev

如何将参数传递给作为另一个函数参数的函数

来自分类Dev

一个函数作为参数传递给另一个函数

来自分类Dev

如何将tanh函数作为参数传递给另一个函数?

来自分类Dev

将模板化函数作为参数传递给另一个函数

来自分类Dev

如何将函数作为参数传递给 Javascript 中的另一个函数?

来自分类Dev

将函数作为参数传递给另一个函数错误

来自分类Dev

Kotlin:如何将函数作为参数传递给另一个函数?

来自分类Dev

如何将函数作为参数传递给另一个函数?

来自分类Dev

如何将泛型函数作为参数传递给另一个函数?

来自分类Dev

将匿名多行函数作为参数传递给另一个函数

来自分类Dev

将函数作为PHP中另一个函数的参数传递

来自分类Dev

将宏函数作为参数传递给另一个宏函数

来自分类Dev

将函数对象作为参数传递给另一个函数

来自分类Dev

将函数返回作为参数传递给另一个函数

来自分类Dev

将指针从一个函数传递到另一个函数

来自分类Dev

如何将一个函数作为参数传递给另一个函数?

来自分类Dev

如何将lambda从一个函数传递给另一个函数作为参数?

来自分类Dev

R-如何将一个函数作为参数传递给另一个函数?

来自分类Dev

如何将子矩阵作为指针传递给另一个函数

来自分类Java

将参数传递给另一个函数

来自分类Dev

如何将一个类的函数作为另一个类的另一个函数的参数传递

来自分类Dev

向 pthread 传递以另一个函数指针作为参数的函数指针时出现段错误

来自分类Dev

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

来自分类Dev

创建一个将另一个函数作为参数的函数

来自分类Dev

传递c ++对象作为指针,以在Rcpp中的另一个函数中重用

来自分类Python

将一个函数的所有参数传递给另一个函数

Related 相关文章

  1. 1

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

  2. 2

    PHP 将一个函数作为参数传递给另一个函数

  3. 3

    将函数参数作为参数传递给python中的另一个函数

  4. 4

    如何将参数传递给作为另一个函数参数的函数

  5. 5

    一个函数作为参数传递给另一个函数

  6. 6

    如何将tanh函数作为参数传递给另一个函数?

  7. 7

    将模板化函数作为参数传递给另一个函数

  8. 8

    如何将函数作为参数传递给 Javascript 中的另一个函数?

  9. 9

    将函数作为参数传递给另一个函数错误

  10. 10

    Kotlin:如何将函数作为参数传递给另一个函数?

  11. 11

    如何将函数作为参数传递给另一个函数?

  12. 12

    如何将泛型函数作为参数传递给另一个函数?

  13. 13

    将匿名多行函数作为参数传递给另一个函数

  14. 14

    将函数作为PHP中另一个函数的参数传递

  15. 15

    将宏函数作为参数传递给另一个宏函数

  16. 16

    将函数对象作为参数传递给另一个函数

  17. 17

    将函数返回作为参数传递给另一个函数

  18. 18

    将指针从一个函数传递到另一个函数

  19. 19

    如何将一个函数作为参数传递给另一个函数?

  20. 20

    如何将lambda从一个函数传递给另一个函数作为参数?

  21. 21

    R-如何将一个函数作为参数传递给另一个函数?

  22. 22

    如何将子矩阵作为指针传递给另一个函数

  23. 23

    将参数传递给另一个函数

  24. 24

    如何将一个类的函数作为另一个类的另一个函数的参数传递

  25. 25

    向 pthread 传递以另一个函数指针作为参数的函数指针时出现段错误

  26. 26

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

  27. 27

    创建一个将另一个函数作为参数的函数

  28. 28

    传递c ++对象作为指针,以在Rcpp中的另一个函数中重用

  29. 29

    将一个函数的所有参数传递给另一个函数

热门标签

归档