2011-08-22 2 views
0

python의 ctypes를 사용하여 입력 및 출력 인수의 형식을 지정하는 데 문제가있어 dll의 fortran 함수에 액세스합니다. 라이브러리와 함수에 액세스 할 수 있지만 인수를 형식화하는 방법에 어려움을 겪고 있습니다.ctypes에 대한 입력 및 출력 인수

subroutine DataSub (Data_input,da,db,dy) 

    double precision, intent(in) :: Data_input(9) 
    double precision, intent(out) :: da,db,dy 

은 어떻게하는 ctypes에서이 사건에 대한 입력 및 출력 인수를 정의합니까 :로

F90 코드는 시작?

답변

2

뭔가 :

+0

출력 중 하나가 배열이면 유사한 것입니까? da (FORTRAN에서) 길이가 2 인 경우 파이썬에서의 호출은 "da = (c_double * 2)()"가 되겠습니까? – Chris

+0

예 chris가 맞습니다. ctypes 튜토리얼을 읽으십시오. 아주 좋습니다. –

+0

예. 감사합니다. 나는 그것을 읽었으나 이것과 같은 부분에서는 모호하거나 혼란 스럽다. 귀하의 회신에 감사드립니다! – Chris

2

이들 중 대부분는 c_double이지만 더 이상 "배정 밀도"를 사용하면 안됩니다. kind 속성 대신 real을 사용하십시오. C와 비슷한 인터페이스를 제공하기 위해 Fortran에서 ISO_C_Binding을 사용하는 것이 더 좋습니다. ISO_C_Binding을 사용하면 참조 대신 값으로 인수를 전달할 수도 있습니다. 그것없이 당신은 존 리드에서 제공하는 http://docs.python.org/library/ctypes.html#passing-pointers-or-passing-parameters-by-reference

ISO_C_Binding에 대한 몇 가지 샘플을 사용해야합니다 같은 http://www.fortran.bcs.org/2002/interop.htm

+0

하는 ctypes 참 잘 참조로 전달할 수

from ctypes import *#just for brevity in this example input = (c_double*9)() input[0] = ..... da = c_double() db = c_double() dy = c_double() dll.DataSub(byref(input), byref(da), byref(db), byref(dy)) 
가 필요 out 매개 변수에 대해 그렇게하십시오 –

+0

사실, ISO_C_Binding 없이는 모든 매개 변수가 의도와 관계없이 byref 여야한다고 생각합니다. 또한 바인딩을 사용하지 않는다면 심볼에 컴파일러에 의해 추가 된 "_"을 알아야합니다. 따라서 필자 의견으로는 Fortran 측에 인터페이스 정의를 도입하는 것이 좋다. C 동작을 더 자세히 흉내 내면 더 나은 이식성과 파이썬 측면에 대한 궁금증을 줄일 수 있습니다. – haraldkl

관련 문제