가정 : JNA 내가 포트란 서브 루틴을 가정 한 크기 배열 복용이 크기 배열
subroutine sub(arr)
implicit none
double precision arr(*)
end subroutine
내가 JNA를 사용하여 Java에서 네이티브 호출을 한을, 포트란 서브 루틴은 공유 라이브러리
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);
}
}
이제 실제 크기 (이 경우 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 2015의 일부가 될 TS에서 표준화되었습니다. Cm에서 가정용 배열을 사용하기위한 표준 헤더도 있지만, 어떤 컴파일러가 실제로 그것들을 선적했는지 안다. 안타깝게도 gfortran의 설명자는 다른 컴파일러와 달리 여전히 매우 다릅니다. –
@VladimirF F2015에서 표준화 된 문제는 대부분의 컴파일러가 F2008의 전체 기능을 구현하지 못한다는 것입니다. 일부 기능을 표준 호환 방식으로 "보편적으로 사용할 수있는"것으로 간주하려면 상당한 지연이 발생할 수 있습니다 (10 년 쉽게). 예를 들어, Intel Fortran 12.0 (2011?)은 Fortran 2003에서'ALLOCATE (x, SOURCE = y) '문을 구현하지 않았습니다. –