使用Fortran的JNA假定大小为

时间:2016-06-08 18:44:41

标签: arrays fortran jna

我有一个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)

1 个答案:

答案 0 :(得分:7)

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

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

  • 通过已知大小或假设大小传递的那些,如arr(n)arr(*),通常只接收指向第一个元素的指针,假设元素是连续的。 / LI>
  • 假定形状一起传递的那些<{1}}接收数组描述符结构。这完全取决于实现,但通常这样的结构包含指向数据的第一个元素的指针加上关于每个维度的边界,步幅等的信息。

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

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