我在这个模块中有这个功能
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;
}
我用&gt;编译它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应该是什么。
我试图立刻做太多事情。 我在使用SOFA代码并尝试将其包装在Ruby中时学习了一些C代码。 (实际上是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中尝试过这个。 我在哪里用指针离开这里因为我迷路了。 我能得到一些好的例子吗? 提前谢谢。
答案 0 :(得分:1)
由于ruby和jruby标签不确定理解你的问题,但如果你问C,那么:cfunction
是指向该函数的指针。
假设您有另一个函数f将函数指针作为参数:
void f(void (*)(int , int , double *));
您可以通过以下方式致电f
f(cfunction);
答案 1 :(得分:1)
我发现了一种方法来做我最近想要的事情。在这里,我会与你分享,如果有人想尝试这个。首先,您必须将C库编译为共享对象文件。问C程序员如何做到这一点。这就是我使用cal2jd.so的方式。
require 'ffi'
module Calendars
extend FFI::Library
ffi_lib 'cal2jd.so'
attach_function :iauCal2jd, [:int, :int, :int, :pointer, :pointer ], :int
end
mp1 = FFI::MemoryPointer.new(:double, 8)
mp2 = FFI::MemoryPointer.new(:double, 8)
cal = Calendars.iauCal2jd(2014, 4, 6, mp1, mp2 )
puts cal
puts mp1.get_double, mp2.get_double
我的输出是
0 # return result good
2400000.5
56753.0 # pretty soon we're gonna have a straight 56789 ;-)
希望这可能对某人有所帮助,并感谢大家的帮助。继续,留下更多评论或更好的答案,我们可以投票。