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

2024-03-30

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

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/cal2jd.c我需要知道如何访问这些地址指针。 验证测试在这里http://www.iausofa.org/2013_1202_C/sofa/t_sofa_c.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 with:

f(cfunction);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • 具有不同大小结构的结构数组的 malloc()

    如果每个结构都包含一个大小不同的字符串数组 那么如何正确地 malloc 一个结构数组 因此每个结构可能有不同的大小 并且不可能 realloc 结构体数量 sizeof 结构体名称 after malloc 初始大小 sizeof 结构名
  • Subversion 和 Visual Studio 项目的最佳实践

    我最近开始在 Visual Studio 中处理各种 C 项目 作为大型系统计划的一部分 该系统将用于替换我们当前的系统 该系统是由用 C 和 Perl 编写的各种程序和脚本拼凑而成的 我现在正在进行的项目已经达到了颠覆的临界点 我想知道什
  • 将字节数组转换为托管结构

    更新 这个问题的答案帮助我编写了开源项目GitHub 上的 AlicanC 现代战争 2 工具 https github com AlicanC AlicanC s Modern Warfare 2 Tool 你可以看到我是如何阅读这些数据
  • ASP.NET Core 与现有的 IoC 容器和环境?

    我想运行ASP NET 核心网络堆栈以及MVC在已托管现有应用程序的 Windows 服务环境中 以便为其提供前端 该应用程序使用 Autofac 来处理 DI 问题 这很好 因为它已经有一个扩展Microsoft Extensions D
  • 为什么Apache MPM prefork.c 使用互斥体来保护accept()?

    我坐下来读书Apache 的 MPM prefork c http code metager de source xref apache httpd server mpm prefork prefork c这段代码使用了一个名为accept
  • 在 C# 中生成 HMAC-SHA1

    我正在尝试使用 C 来使用 REST API API 创建者提供了以下用于 hmac 创建的伪代码 var key1 sha1 body var key2 key1 SECRET KEY var key3 sha1 key2 var sig
  • 在 C++ 中将成对向量转换为两个独立向量的最快方法

    假设我有一个vector of pair
  • (const T v) 在 C 中从来都不是必需的,对吗?

    例如 void func const int i 在这里 const是不必要的 因为所有参数都是按值传递的 包括指针 真的吗 C 中的所有参数确实都是按值传递 这意味着无论您是否包含该参数 实际参数都不会改变const or not 然而
  • 从 C 结构生成 C# 结构

    我有几十个 C 结构 我需要在 C 中使用它们 典型的 C 结构如下所示 typedef struct UM EVENT ULONG32 Id ULONG32 Orgin ULONG32 OperationType ULONG32 Size
  • HttpWebRequest vs Webclient(特殊场景)

    我知道这个问题之前已经回答过thread https stackoverflow com questions 1694388 webclient vs httpwebrequest httpwebresponse 但我似乎找不到详细信息 在
  • 将带有 glut 的点击坐标添加到向量链接列表中

    我想创建一个向量链接列表 并在 GLUT 库的帮助下获取点击的位置并将它们附加到链接列表中 这些是我写的结构 typedef struct vector int x int y Vector typedef struct VectorLis
  • 两种类型的回发事件

    1 我发现了两篇文章 每篇文章对两种类型的回发事件的分类都略有不同 一位资源说两种类型的回发事件是Changed事件 其中控件实现 IPostbackDataHandler 当数据在回发之间更改时触发 然后Raised事件 其中控件实现 I
  • C++ 插件的“最适合”动态类型匹配

    我有一个几乎所有东西都是插件的架构 该架构以图形用户界面为基础 其中每个插件都由一个 表面 即用户可以通过其与插件交互的 UI 控件 表示 这些表面也是插件 每当添加新插件时 瘦主机都会自动确定哪个可用表面与其最匹配的 UI 如何在 C 中
  • 为什么具有相同名称但不同签名的多个继承函数不会被视为重载函数?

    以下代码片段在编译期间产生 对 foo 的调用不明确 错误 我想知道是否有任何方法可以解决此问题而不完全限定对 foo 的调用 include
  • C++11 动态线程池

    最近 我一直在尝试寻找一个用于线程并发任务的库 理想情况下 是一个在线程上调用函数的简单接口 任何时候都有 n 个线程 有些线程比其他线程完成得更快 并且到达的时间不同 首先我尝试了 Rx 它在 C 中非常棒 我还研究了 Blocks 和
  • tabcontrol selectedindex 更改事件未被触发 C#

    嘿伙计们 我有一个很小的问题 请参阅下面的代码 this is main load private void Form1 Load object sender EventArgs e tabAddRemoveOperator Selecte
  • 0-1背包算法

    以下 0 1 背包问题是否可解 浮动 正值和 浮动 权重 可以是正数或负数 背包的 浮动 容量 gt 0 我平均有 这是一个相对简单的二进制程序 我建议用蛮力进行修剪 如果任何时候你超过了允许的重量 你不需要尝试其他物品的组合 你可以丢弃整
  • C语言声明数组没有初始大小

    编写一个程序来操纵温度详细信息 如下所示 输入要计算的天数 主功能 输入摄氏度温度 输入功能 将温度从摄氏度转换为华氏度 独立功能 查找华氏度的平均温度 我怎样才能在没有数组初始大小的情况下制作这个程序 include
  • C++、三元运算符、std::cout

    如何使用 C 用三元运算符编写以下条件 int condition1 condition2 condition3 int double result int or double std cout lt lt condition1 resul
  • 服务器响应 PASV 命令返回的地址与建立 FTP 连接的地址不同

    System Net WebException 服务器响应 PASV 命令返回的地址与建立 FTP 连接的地址不同 在 System Net FtpWebRequest CheckError 在 System Net FtpWebReque

随机推荐