基本上有两种方法可以将数组传递给Fortran 90/95中的子程序:
PROGRAM ARRAY
INTEGER, ALLOCATABLE :: A(:,:)
INTEGER :: N
ALLOCATE(A(N,N))
CALL ARRAY_EXPLICIT(A,N)
! or
CALL ARRAY_ASSUMED(A)
END PROGRAM ARRAY
SUBROUTINE ARRAY_EXPLICIT(A,N)
INTEGER :: N
INTEGER :: A(N,N)
! bla bla
END SUBROUTINE ARRAY_EXPLICIT
SUBROUTINE ARRAY_ASSUMED(A)
INTEGER, ALLOCATABLE :: A(:,:)
N=SIZE(A,1)
! bla bla
END SUBROUTINE ARRAY_ASSUMED
Run Code Online (Sandbox Code Playgroud)
您需要第二个显式接口,通常是通过使用模块.
从FORTRAN77开始,我习惯了第一种选择,如果你传递整个数组,我认为这也是最有效的.
显式形状的好处是我也可以调用子例程并将数组视为向量而不是矩阵:
SUBROUTINE ARRAY_EXPLICIT(A,N)
INTEGER :: N
INTEGER :: A(N**2)
! bla bla
END SUBROUTINE ARRAY_EXPLICIT
Run Code Online (Sandbox Code Playgroud)
我想知道是否有一种很好的方法来使用第二个假定的形状界面来做这种事情而不复制它.
我想知道最简单的方法是实现一个在运行时指定排名的数组.
我正在处理的示例存储了格点的布尔值数组,我希望用户能够选择模型在运行时使用的空间维数.
我查看了Array.newInstance()方法:
dimensionOfSpace = userInputValue; // this value comes from GUI or whatever
int latticeLength = 5; // square lattice for simplicity
int[] dimensions = new int[dimensionOfSpace];
for(int i = 0; i < l.length; i++) l[i] = length;
Object lattice = Array.newInstance(boolean.class, dimensions);
Run Code Online (Sandbox Code Playgroud)
但是以任何方式访问这些值似乎需要非常慢的方法,例如递归使用Array.get,直到返回的值不再是数组,即使用isArray().
我在这里错过了一个明显的解决方案 我希望能够以类似于foo [i] [j] [k]的方式访问这些值.