c - 我熟悉 Ruby/DL,但不确定如何使用具有返回参数指针的 C 函数调用

标签 c pointers jruby ffi rubydl

我在这个模块中有这个功能

require 'dl'
require 'dl/import'

module LibCalendars
  extend DL::Importer
  dlload './cal2jd.o'

  extern 'int iauCal2jd(int, int, int, double *, double *)'
end

如何在模块中进行设置以访问指针?

里面有我需要的部分吗?我只是不确定。这是如何正确完成的? 确切的代码在 http://www.iausofa.org/2013_1202_C/sofa/cal2jd.c 我需要知道如何访问这些地址指针。 验证测试在这里 http://www.iausofa.org/2013_1202_C/sofa/t_sofa_c.c

几乎等效的主 C 看起来像下一个代码。 我刚刚复制了 cal2jd.c 文件并将主要功能添加到它的底部。

#include <stdio.h>
int
main()
{
 int y = 2003, m = 6, d = 1;
 int j;
 double djm0, djm;
 double *pdjm0 = &djm0;
 double *pdjm  = &djm;  

 printf("values are: y == %d, m == %d, d == %d\n", y, m, d);

 j = iauCal2jd(y, m, d, &djm0, &djm);

 printf("j == %d\n", j);
 printf("address of &djm0 == %p, size of pointer == %d\n", &djm0, sizeof(*pdjm0));
 printf("address of &djm  == %p, size of pointer == %d\n", &djm, sizeof(*pdjm0));
 printf("value from &djm0 == %.20g, size of djm0 == %d\n", *pdjm0, sizeof(djm0));
 printf("value from &djm  == %.20g, size of djm  == %d\n", *pdjm, sizeof(djm));
 printf("value from &djm0 == %.3f\n", (float)*pdjm0);
 printf("value from &djm  == %.3f\n", (float)*pdjm);

 return 0;
 }

我用 > gcc -o cal2jd cal2jd.c 编译它

这是我的输出

$ cal2jd
values are: y == 2003, m == 6, d == 1
j == 0
address of &djm0 == 0022FF30, size of pointer == 8
address of &djm  == 0022FF28, size of pointer == 8
value from &djm0 == 2400000.5, size of djm0 == 8
value from &djm  == 52791, size of djm  == 8
value from &djm0 == 2400000.500
value from &djm  == 52791.000

状态良好,djm0被头文件sofam.h中的一个常量设置为2400000.5 你可以从源文件中的注释中看到它应该总是那样。 您可以从验证测试文件中看到 djm 应该是什么。

我试图一次做太多。 我正在学习一些 C 代码,同时使用 SOFA 代码并尝试将其包装在 Ruby 中。 (实际上是 JRuby)所以我会回答 C 部分、DL 或 FFI 或一些好的引用链接。

我也在考虑 ffi 方法。 这是一个开始。

require 'ffi'

module MyLibrary
  extend FFI::Library
  ffi_lib "cal2jd.so"
  attach_function :iauCal2jd, [:int, :int, :int, :pointer, :pointer], :int
end

我真的在 JRuby 中尝试这个。 因为我迷路了,所以我从这里去哪里? 我能得到一些很好的例子吗? 提前致谢。

最佳答案

由于 ruby​​ 和 jruby 标签,不确定是否理解您的问题,但如果您询问的是 C,则:cfunction 是指向该函数的指针。

假设您有另一个函数 f,将函数指针作为参数:

void f(void (*)(int , int , double *));

你可以调用f:

f(cfunction);

关于c - 我熟悉 Ruby/DL,但不确定如何使用具有返回参数指针的 C 函数调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22822185/

相关文章:

c++ - C/C++如何调用外部程序并获取多个返回值?

c - 函数 ptrs 数组上的 realloc() 导致 SIGABRT

c - 这个C代码段有什么问题?当我不分配 t 它工作正常

interface - JRuby:带有 Ruby block 的 Java 命令模式:为什么它有效?

c - 为什么它们必须在同一行: (c = getchar()) ! = EOF)

c - 如果存在先前的静态声明,为什么隐式 extern 声明无效?

c++ - Visual C++ : Migrating traditional C and C++ string code to a Unicode world

c - 在包含字符串的 typedef 结构中使用指针

ruby-on-rails-3 - Neo4j ActiveRecord 支持使用 Ruby 作为解释器

ruby - 无法使用 rackup 和 jRuby 启动简单的 Sinatra 应用程序(网络服务器无响应)