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

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

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文件,并在其底部添加了main函数.

#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(cfunction);
点赞