JNA 与 Fortran 假定大小的数组

2023-12-12

我有一个 Fortran 子例程,采用假定大小的数组:

subroutine sub(arr)
  implicit none
  double precision arr(*)
end subroutine

我使用 JNA 从 Java 进行了本机调用,Fortran 子例程被编译为共享库mylib.so:

import com.sun.jna.Library;
import com.sun.jna.Native;

public class Wrapper {
    public interface MyLib extends Library {
        public void sub_(double[] arr);
    }

    public static void main(String[] args) {
        System.setProperty("jna.library.path", ".");
        MyLib lib = (MyLib) Native.loadLibrary("mylib.so", MyLib.class);
        double[] myarr = new double[10];
        lib.sub_(myarr);
    }
}

现在,有没有一种方法可以(在 Fortran 子例程中)获取我传递到该子例程中的数组的大小,而不将实际大小(在本例中为 10)作为附加参数传递?

我尝试过(Fortran)print*, size(arr),但这会产生编译器错误:

   print*,size(arr)
              1
Error: The upper bound in the last dimension must appear in the reference to the assumed size array ‘arr’ at (1)

您需要将长度作为附加参数传递。使用假定形状的数组是行不通的,原因如下:

在大多数 Fortran 编译器采用的 ABI 中,作为参数(“虚拟参数”)的数组可以采用两种表示形式之一,具体取决于子例程/函数中使用的接口:

  • 那些通过已知尺寸或假设尺寸, like arr(n) or arr(*),通常只接收指向第一个元素的指针,并且假定元素是连续的。
  • 那些通过了假设的形状, like arr(:)收到一个数组描述符结构。这完全依赖于实现,但通常这样的结构包含指向数据第一个元素的指针plus有关每个维度的边界、步幅等的信息。

这就是为什么如果函数将其作为假定形状数组接收,则可以直接传递数组的单行或仅传递偶数索引中的元素:描述符结构对数据不一定是连续的信息进行编码,因此Fortran编译器不需要复制arr(5:2:)到内存中的临时位置。

不能使用此类工具与 Java 通信的原因是描述符结构完全不标准,是每个编译器特定 ABI 的一部分。因此,即使您以某种方式设法理解如何构建它(这将是不平凡的),编译器的下一个版本也可能带来彻底的改变。

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

JNA 与 Fortran 假定大小的数组 的相关文章

  • 打包布尔数组需要通过 int (numpy 1.8.2)

    我正在寻找更紧凑的方式来存储布尔值 numpy 内部需要 8 位来存储一个布尔值 但是np packbits允许打包 他们 这真是太酷了 问题是要打包在4e6字节数组a32e6字节我们需要首先使用的布尔值数组256e6字节将布尔数组转换为
  • 如何将 PHP 数组中的值插入到 MySQL 表中?

    我正在创建一个注册表单 其中包含姓名 电子邮件和电话号码字段 为了检查用户输入的有效性 我有一个函数validate input 返回一个数组 arr包含用户输入的输入 如果用户输入有效 arr然后传递给一个单独的函数 该函数将值插入arr
  • GO TO 语句 - Fortran 到 Matlab

    我一直在努力将此网格搜索代码从 Fortran 转换为 Matlab 但是我无法正确合并 GO TO 语句 我正在尝试使用 while 循环 但我认为我需要其他东西来结束搜索 任何帮助将不胜感激 vmax 1 0E 15 amax G 1
  • 计算向量的导数

    我有以下函数 维维亚尼曲线 Phi t cos t 2 cos t sin t sin t 只需检查它是否有效 s linspace 0 T 1000 plot3 cos s 2 cos s sin s sin s 如何推导函数Phi 可能
  • 为什么数组不可赋值? [复制]

    这个问题在这里已经有答案了 据我所知 C 标准禁止使用数组作为可修改的左值 即在赋值的左侧 int lhs 4 rhs 4 0 1 2 3 lhs rhs illegal 现在 我一直想知道为什么会这样 我可以看到上面的语句 以及写入数组的
  • 如何找到数组中存在的项目的长度/数量? [复制]

    这个问题在这里已经有答案了 可能的重复 函数参数中数组的长度 https stackoverflow com questions 8269048 length of array in function argument 我的数组大小是 5
  • 按索引偶数或奇数将数组拆分为两个数组

    我有这个数组 array array a b c d e f g 我想根据索引是偶数还是奇数将其分成两个数组 如下所示 odd array a c e g even array b d f 提前致谢 一种解决方案 使用匿名函数和array
  • JavaScript 数组 every 和 some 之间的区别

    我看到在给定的测试中两者都返回 true 或 false https developer mozilla org en US docs Web JavaScript Reference Global Objects Array some h
  • 如何使用 JQuery 提取嵌套 HTML 中的文本?

    我这里有 HTML 代码 div class actResult style border solid table tbody tr td Order Number td td 1 td tr tr td Customer Number t
  • Outlook 中用于删除重复电子邮件的宏 -

    Public Sub RemDups Dim t As Items i As Integer arr As Collection f As Folder parent As Folder target As Folder miLast As
  • std::bind2nd 和 std::bind 与二维数组和结构数组

    我知道 C 有 lambda 并且 std bind1st std bind2nd 和 std bind 已弃用 然而 从C 的基础开始 我们可以更好地理解新特性 所以 我从这个非常简单的代码开始 使用int 数组s 第一个例子 与std
  • 如何通过在切片上查找来从切片复制到数组

    我正在编写一个库来处理二进制格式 我有一个带有数组变量的结构 我想保留它以用于文档目的 我还需要从输入字节片中查找和判断 一些伪代码 type foo struct boo 5 byte coo 3 byte func main input
  • 如何比较 JavaScript 表格中的单元格并测试是否相等? indexOf 是如何工作的?

    我在 HTML 代码中创建了一个表格 它有 9 列和 13 行 它被 JavaScript 循环完全填满 该循环用几个数组中的人名填充它 但是 我想添加一个验证步骤 确保一行中没有两个单元格具有相同的值 并且每个单元格的值不会在其正下方的单
  • 如何在 Yii2 应用程序中显示多个选择下拉列表中的选定值?

    我正在研究 Yii2 我正在使用这样的自定义数组创建多个选择下拉菜单 在控制器文件中 all groups Groups find gt where group created by id gt orwhere new Expression
  • 查找整数数组中的最大/最小出现次数

    我刚刚编写完一个算法 该算法可以在输入整数数组中查找出现次数最多 最少的值 我的想法是对数组进行排序 所有出现的地方现在都按顺序排列 并使用
  • Fortran 递归分段错误

    我必须设计并实现一个 Fortran 例程来确定方格上簇的大小 并且递归地编写子例程似乎非常方便 然而 每当我的晶格大小超过某个值 大约 200 边 时 子例程就会始终出现段错误 这是我的集群检测例程 RECURSIVE SUBROUTIN
  • 如果数组包含一个或多个相同值,则合并数组

    我有一个数组数组 a 1 2 3 3 4 5 6 7 8 8 9 9 10 我想合并包含一个或多个相同值的所有数组 所以 a 1 2 3 4 5 6 7 8 9 10 我正在努力寻找一种简洁的方法来解决这个问题 有任何想法吗 我相信这是正确
  • PHP 使用主键和辅助键对多维数组进行排序[重复]

    这个问题在这里已经有答案了 如何按主键和辅助键对多维数组进行排序 例如 假设有以下数组 result array result 0 prio 1 result 0 date 2010 02 28 result 0 post February
  • 使用 numpy 在 python 中执行最大方差旋转

    我正在研究矩阵的主成分分析 我已经找到了如下所示的组件矩阵 A np array 0 73465832 0 24819766 0 32045055 0 3728976 0 58628043 0 63433607 0 72617152 0 5
  • 如何缩短 PHP if 语句?

    我有一个 if 语句 我需要将单个字符串与许多不同的选项进行比较 我在下面发布的代码非常清楚地表明了我的意思 我知道有两种方法可以做到这一点 但另一种甚至更长 那么 是否有任何函数可以以更短的方式实现类似的功能 我的要求可能看起来很愚蠢 但

随机推荐

  • Javascript - 仅返回对象数组中的唯一值

    我有一个对象数组 我只想根据对象 ID 返回唯一的对象 我尝试在现有数组中循环data然后查找该元素是否已添加到新创建的数组中arr它应该只包含唯一的值 但它对我不起作用 我相信我在这里或那里错过了一些东西 这是当前的数组 objectId
  • 积分:积分可能发散

    我正在使用一些集成到循环中integrate我发现了一个我无法理解的错误 也无法摆脱 这是我可以提取的 MWE u min 0 06911363 u max 1 011011 m 0 06990648 s 0 001092265 integ
  • 将图像/图标添加到单选按钮[重复]

    这个问题在这里已经有答案了 我需要为单选按钮组中的每个单选按钮显示图像 我见过一些自定义单选按钮和单选按钮组的示例 但它们都不起作用 有人可以指出我正确的方向吗 正确的方向 是首先看看有哪些替代方案可以帮助用户实现其目标 而不是创建自定义控
  • 我怎样才能以更好的方式编写 if else 代码检查? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心以获得指导 这是编写 if else
  • 如何将 Fuseki 与 Jena TDB 结合使用

    我有一个问题问你 我有一个三重存储 Jena TDB 我读到可以为 本地存储的 RDF 数据 特别是 我在文献中看到 Fuseki 与 Jena TDB 一起使用 我以这种方式将文件 rdf 加载到 Jena TDB 中 public vo
  • 如何使用 printf 重复一个字符?

    我想做类似的事情printf count char 重复一个字符count times 完成此操作的正确格式字符串是什么 编辑 是的 很明显我可以打电话printf 循环 但这正是我想避免的 您可以使用以下技术 printf s 5 这将打
  • 使用多语音库在 Dialogflow 中为 VUI 配置重复意图

    我正在尝试将我的 VUI 配置为在 Dialogflow 出现提示时重复句子 小背景故事 我正在帮助开发一款针对老年人的社交机器人 因此重复句子是一个非常需要的功能 我刚刚开始这个项目 之前负责这个项目的开发人员已经去世了 无法联系到 而且
  • 使用 sap.m.DatePicker 仅选择年份

    我有个约会 它是 JSONModel 中的一个字符串 例如 2016 如下所示DateTimeInput
  • Cypher 查询查找具有 3 个关系的节点

    当我寻找 2 个关系时 我想出了如何编写此查询 但不确定如何向查询添加更多关系 假设您有一个读书俱乐部数据库 其中 读者 和 书籍 作为节点 book 节点具有 genre 属性 定义该书是小说 非小说 传记 参考书等 reader 节点和
  • 使用权限创建路由

    我正在尝试使用权限和条件重定向用户 但我不知道为什么我的重定向没有按我想要的方式工作 我创建了这些类型的路线 not auth
  • iPad 版 Three20

    我需要在我的 iPad 项目中使用 Three20 我想知道 iPhone 版本的 Three20 项目是否可以直接在 iPad 上使用 还是应该等待这个时间表完成 http two20 info timeline roadmap OS 3
  • Apache Camel - IBM MQ 集成

    我有一个 Apache Camel 版本 2 18 项目 它通过 IBM MQ 客户端将文件发送到我合作伙伴的 IBM MQ 服务器 然而 我的伙伴使用messageId作为文件名 因此 我们必须将特定的文件名设置为messageId 我的
  • 我收到 'int' 对象不可下标

    我是 python 新手 我首先尝试为我的项目实现代码 我的错误代码是 int 类型的对象没有 len 这是我的代码并添加了 str 来解决问题 xored value ord Mblocks i len Mblocks ord Cbloc
  • 使用 ORMLite 准备查询的 SQL 异常

    我正在使用 ORM ORMlite 并且所有调用都进展顺利 直到出现以下错误 线程 main 中的异常org h2 jdbc JdbcSQLException SQL语句中的语法错误 SELECT FROM STORIES WHERE TI
  • 如果使用 docker 部署,为什么 MERN 应用程序无法与后端通信?

    我使用 Docker 将 MERN 应用程序部署到数字海洋 Droplet 如果我运行我的docker compose yml文件本地在我的电脑上运行良好 我有 2 个容器 1 个后端 1 个前端 如果我尝试在 Droplet 上进行组合
  • JSONDecodeError:额外数据:第 1 行第 228 列(字符 227)

    我正在使用 Ipython 进行一些数据分析 我无法加载 JSON 文件 请帮我在 IPython 中加载这个 JSON 文件 我还想跳过第一行中的相同单词以使其成为干净的格式 我希望每条记录如下所示 station id 72 num b
  • 字符串到字典字数统计

    所以我在家庭作业问题上遇到了麻烦 编写一个函数 word counter input str 它接受字符串 input str 并返回一个字典 将 input str 中的单词映射到其出现次数 所以到目前为止我的代码是 def word c
  • 如何在 Rails 中的 Chartkicks 中显示数据计数以及百分比

    Using chartkicks用于显示图表 它仅显示百分比 我想显示数量 金额以及百分比 Chartkickgem 是上面的包装Google Charts 通过使用库选项 您可以指定在legend并设置其他配置选项 所以像这样 有关更多配
  • 尝试更改 Google 云端硬盘中文件的所有者

    我尝试更改云端硬盘中文档的所有权 但收到以下错误 很抱歉 服务器发生错误 请稍等一下 然后重试 第 12 行 文件 代码 function transferFiles var files DriveApp getFiles while fi
  • JNA 与 Fortran 假定大小的数组

    我有一个 Fortran 子例程 采用假定大小的数组 subroutine sub arr implicit none double precision arr end subroutine 我使用 JNA 从 Java 进行了本机调用 F