2016-06-08 1 views
3

가정 : 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) 

답변

5

합니다. 대부분의 Fortran 컴파일러가 사용하는 ABI에서 매개 변수 ("더미 인수")로 사용되는 배열은 서브 루틴에서 사용되는 인터페이스에 따라 두 가지 표현 중 하나를 취할 수 있습니다./기능 : 소자가 연속 인 것으로 가정 알려진 크기 나 함께 전달

  • 들은, arr(n) 또는 arr(*) 같은 보통 첫 번째 요소 단지 포인터를 수신 크기를 가정.
  • 으로 전달 된 것들은 arr(:)과 같은 모양이 인 것으로 가정하고 배열 설명자 구조를받습니다. 이것은 완전히 구현에 의존하지만, 일반적으로 이러한 구조는 이유는 데이터 플러스 각 차원, 보폭의 경계에 정보의 첫 번째 요소에 대한 포인터 등

을 포함 왜 당신이 할 수있는 함수가 배열을 가정 된 배열로 받아 들인 경우 배열의 단일 행 또는 짝수 인덱스의 요소 만 직접 전달합니다. 설명자 구조는 데이터가 반드시 인접하지 않아서 Fortran 컴파일러가 필요하지 않음을 인코딩합니다 arr(5:2:)을 메모리의 임시 위치에 복사하십시오.

Java와 통신하는 데 이러한 기능을 사용할 수없는 이유는 설명자 구조가 각 컴파일러의 특정 ABI의 일부인 완전히 비표준 적이기 때문입니다. 따라서 어떻게 든 빌드하는 방법을 이해 했더라도 컴파일러의 다음 버전이 완전히 변경 될 수 있습니다.

+0

설명을 주셔서 감사합니다. 합리적인 소리입니다. –

+0

실제로, 설명자의 주요 부분은 이제 Fortran 2015의 일부가 될 TS에서 표준화되었습니다. Cm에서 가정용 배열을 사용하기위한 표준 헤더도 있지만, 어떤 컴파일러가 실제로 그것들을 선적했는지 안다. 안타깝게도 gfortran의 설명자는 다른 컴파일러와 달리 여전히 매우 다릅니다. –

+1

@VladimirF F2015에서 표준화 된 문제는 대부분의 컴파일러가 F2008의 전체 기능을 구현하지 못한다는 것입니다. 일부 기능을 표준 호환 방식으로 "보편적으로 사용할 수있는"것으로 간주하려면 상당한 지연이 발생할 수 있습니다 (10 년 쉽게). 예를 들어, Intel Fortran 12.0 (2011?)은 Fortran 2003에서'ALLOCATE (x, SOURCE = y) '문을 구현하지 않았습니다. –