2012-02-21 3 views
2

Fortran 초보자이며 gfortran을 사용하여 컴파일 할 때 ifort 코드를 채택하려고합니다.동적 배열을 사용하는 c_loc()

내가 ifort뿐만 gfortran 컴파일과 동적 배열을 받아 들일 것 같습니다 c_loc() 기능에 문제가 오류와 함께 중지 :

Error: Argument 'septr1' to 'c_loc' at (1) must be an associated scalar POINTER

그래서 사람이 gfortran와 컴파일에 대해 다음 ifort 코드를 적용하는 방법을 알고 않습니다 ?

integer(c_int), dimension(:), pointer :: septr1=>null() 
type(c_PTR) :: septr 

allocate (septr1(10)) 
septr1 = 33 
septr = c_loc(septr1) 

답변

2

어레이의 시작 위치를 얻을 수는 함께 값 C.

일반적
septr = c_loc(septr1(1)) 

아닌지 1하지만하여 LBound (septr1)를 오프셋 0.

Metcalf, Reid 및 Cohen 또는 Fortran 표준에서 c_loc 인수에 대한 요구 사항을 참조하십시오.

--- 편집 ---

나는 포트란 2008 드래프트에서 스칼라로 포인터에 대한 요구 사항이 표시되지 않습니다,하지만 포트란 2003 책을 설명입니다. Fortran 2008에서 변경되었을 수 있습니다. gfortran 4.7에는 스칼라 포인터가 필요합니다.

EDIT2 --- --- 그것은 일반적으로 훨씬 더 길 보통 포트란 참조로 배열을 통과하지 명시 C 포인터를 생성하는 것이다

. 예를 들어 :

call some_c_function(n,A) 
는 some_c_function는 C 프로토 타입에 대한 포트란 인터페이스

interface 
    subroutine some_c_function(n,A) bind(C) 
    use iso_c_binding,only: c_int,c_float !you can use also import here 

    integer(c_int),value  :: n 
    real(c_float),dimension(n):: A 
    end subroutine some_c_function 
end interface 

을 가지고

개발자 ifort
void some_c_function(int n, float* A) //(hope so, I am not so good in C). 
+0

tnx,이 소리는 간단합니다. 이런 식으로 배열은 c 프로그램에서 올바르게 액세스 할 수 있습니까? 나는 어딘가에 웹에서 Fortran이 배열 메모리를 C와 같은 방식으로 처리하지 않는다는 것을 읽었습니다. – kodmasin

+0

액세스 할 수 있지만 인덱스의 순서는 바뀔 것입니다. http://en.wikipedia.org/wiki/Row-major_order 인접하지 않은 배열에 문제가있을 수 있습니다. 그러나 실제로는 일반적인 Fortran 방식으로 참조로 배열을 전달하고 명시 적 C 포인터를 사용하지 않는 것이 훨씬 좋습니다. 답 2 번을 참고하십시오. –

+0

@VladimirF, C 포인터를 사용하는 대신에 참조로 Fortran 배열을 전달하는 것이 왜 훨씬 좋은가? 유형 안전성과 명확성의 일부 유사점입니까? – patrickvacek

0

은 기존에 비해 그보다 제한된 사용을 포함 c_loc의 표준 준수 확인, 말 LOC()는 Fortran 표준의 조항에서 필요하지 않습니다. 현재 표준에서이 내장 함수를 유용하게 적용 할 수있는 범위가 넓고 테스트해야하는 사용 범위를 제한해야하는 필요성 때문에 대부분의 컴파일러는 비표준 사용을 거부합니다.