gpt4 book ai didi

arrays - 带有 Fortran 假定大小数组的 JNA

转载 作者:行者123 更新时间:2023-12-04 23:40:56 26 4
gpt4 key购买 nike

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

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

我使用 JNA 从 Java 进行了 native 调用,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 中,数组作为参数(“虚拟参数”)可以采用两种表示形式之一,具体取决于子例程/函数中使用的接口(interface):

  • 那些以已知尺寸或假定尺寸通过的,如 arr(n)arr(*) ,通常只接收指向第一个元素的指针,其中元素假定是连续的。
  • 那些以假定的形状通过的,如 arr(:)接收一个数组描述符结构。这完全取决于实现,但通常这样的结构包含指向数据第一个元素的指针以及每个维度的边界、步幅等信息。

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

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

    关于arrays - 带有 Fortran 假定大小数组的 JNA,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37710480/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com