2017-12-05 20 views
0

현재 문자열을 Fortran 라이브러리에 전달하려고합니다. 이 라이브러리의 다른 함수를 사용하기 위해이 함수를 사용했지만이 함수는 함수에 대한 인수로 전달 된 문자열을 원한다는 점에서 고유 한 것처럼 보입니다. 소스 코드를 보면ctypes를 사용하여 Fortran 서브 루틴에 문자열 전달

, 함수는 세 개의 인수

SUBROUTINE EZVOLLIB(VOLEQI,DBHOB,HTTOT,VOL) 

을 필요로하며 인수가 정의되어

IMPLICIT NONE 

    CHARACTER*(*) VOLEQI 
    CHARACTER*10 VOLEQ 
    REAL DBHOB,HTTOT,TOPD, VOL(15), MHT 
    INTEGER REGN,ERRFLG 

파이썬에서 함수에 내 전화가

from ctypes import * 

mylib = cdll.LoadLibrary('/home/bryce/Programming/opencompile/libvollib.so') 

dbhob = c_float(42.2) 
vol = (c_float * 15)() 
voleqi = c_char_p("101DVEW119 ") 

mylib.ezvollib_(voleqi, dbhob, vol) 
처럼 보인다

세그먼트 화 오류없이 실행되지만 변수 012를 "채우지 않는 것"에는 원하는 15 개의 부동 소수점 값이 있습니다.

volEZVOLLIB 함수에서 반환되는 값을 검색하는 방법이 있습니까?

+0

15 개의 부동 소수점 값은 무엇입니까? – martineau

+1

* 함수는 3 개의 인자를 필요로합니다. * ...'EZVOLLIB (VOLEQI, DBHOB, HTTOT, VOL)'?? –

답변

0

여기에도 비슷한 질문이 많이 있지만 정확한 중복을 찾기가 어렵습니다. 다양한 보편적 인 정확성과 이식성으로 여러 가지 가능한 방법이 있습니다.

가장 올바른 방법은 fortran77, iso_c_binding and c string에 설명 된대로 현대적인 Fortran - C 상호 운용성을 사용하는 것이므로 더 많은 포트란 배치 코드를 작성해야합니다.

더 이상 포트란을 작성하는 것에 대해 엄격히 반대하는 사람들이 있지만, 이것이 유일한 휴대용 솔루션이기는하지만. 이 경우 컴파일러에서 Fortran 문자열에 대한 실제 호출 규칙이 무엇인지 찾아야합니다. 보통 문자열 길이를 갖는 숨겨진 정수 인수가 서브 루틴으로 전달됩니다. gftran의 경우 https://gcc.gnu.org/onlinedocs/gfortran/Argument-passing-conventions.html

ctypes 인터페이스는 이러한 컴파일러 관련 호출 규칙을 사용할 수 있지만 인터페이스는 컴파일러와 관련이 있습니다. 그러나 당신은 이미 특정 이름을 맹 글링 ezvollib_에 의존하고 있으며 이것은 컴파일러와 관련된 것입니다. 여기에 사람들이 그 것에 의존하여 물린 곳에서 예제를 찾을 수 있습니다.

High Performance Mark에 명시된 것처럼 해당 서브 루틴에는 EZVOLLIB(VOLEQI,DBHOB,HTTOT,VOL)의 세 가지 인수가 아니라 네 개의 인수가 있습니다. mylib.ezvollib_(voleqi, dbhob, vol) 에서처럼 세 번만 호출하면 오류가 발생합니다. HTTOT 인수가 누락되었습니다.