Это продолжение вопроса, который я задал здесь ... Как мне выделить входные массивы с помощью f2py?
Я переработал вопрос в ответ на комментарии. Первоначальный вопрос был неясным и слишком длинным. См. Комментарий 1 ниже.
Я пытаюсь использовать f2py для обертывания различных подпрограмм / функций fortran для чтения вывода данных из различных кодов атомной физики, написанных на fortran 77. Я использую дистрибутив Python Anaconda (python 3.4 64 бит) на Ubuntu 14.04 (64 бит) с набором компиляторов GNU (gcc, gfortran и т. д.)
У меня возникают проблемы с предварительным распределением массивов в python. Мой первоначальный вопрос касался выделения массива символов. Оказывается, у меня была неправильная форма. Я исправил это (я думаю) и теперь имею дело с ошибкой сегментации. Я скомпилировал подпрограмму fortran с помощью f2py, используя флаг --debug-capi
, чтобы включить подробный отчет об ошибках.
Вот соответствующая часть вывода терминала, которую я получаю, когда запускаю свой скрипт python.
debug-capi:Python C/API function adf04_2py.xxdata_04(iunit,titled,iz,iz0,iz1,bwno,npl,bwnoa,lbseta,prtwta,cprta,il,qdorb,lqdorb,qdn,iorb,ia,cstrga,isa,ila,xja,wa,cpla,npla,ipla,zpla,nv,scef,itran,maxlev,tcode,i1a,i2a,aval,scom,beth,iadftyp,lprn,lcpl,lorb,lbeth,letyp,lptyp,lrtyp,lhtyp,lityp,lstyp,lltyp,itieactn,ltied,ndlev=len(ia),ndtrn=shape(tcode,0),ndmet=len(bwnoa),ndqdn=len(qdn),nvmax=len(scef))
debug-capi:int lltyp=:input,required,scalar
debug-capi:lltyp=0
####### omitted ##########
debug-capi:int ndmet=len(bwnoa):input,optional,scalar
debug-capi:ndmet=1
debug-capi:Checking `len(bwnoa)>=ndmet'
debug-capi:int ndqdn=len(qdn):input,optional,scalar
debug-capi:ndqdn=1
debug-capi:Checking `len(qdn)>=ndqdn'
debug-capi:int ndlev=len(ia):input,optional,scalar
debug-capi:ndlev=1
debug-capi:Checking `len(ia)>=ndlev'
debug-capi:int lqdorb=:input,required,array,dims((ndqdn*(ndqdn+1))/2|(ndqdn*(ndqdn+1))/2)
debug-capi:string cprta=:input,required,array,string array,dims(ndmet|ndmet,9|9)
debug-capi:double prtwta=:input,required,array,dims(ndmet|ndmet)
debug-capi:double beth=:input,required,array,dims(ndtrn|ndtrn)
debug-capi:string cstrga=:input,required,array,string array,dims(ndlev|ndlev,(*)|(*))
debug-capi:double zpla=:input,required,array,dims(ndmet|ndmet,ndlev|ndlev)
debug-capi:int ltied=:input,required,array,dims(ndlev|ndlev)
debug-capi:int npla=:input,required,array,dims(ndlev|ndlev)
debug-capi:int i2a=:input,required,array,dims(ndtrn|ndtrn)
debug-capi:int lbseta=:input,required,array,dims(ndmet|ndmet)
debug-capi:int i1a=:input,required,array,dims(ndtrn|ndtrn)
debug-capi:int ila=:input,required,array,dims(ndlev|ndlev)
debug-capi:double scom=:input,required,array,dims(nvmax|nvmax,ndtrn|ndtrn)
debug-capi:double qdorb=:input,required,array,dims((ndqdn*(ndqdn+1))/2|(ndqdn*(ndqdn+1))/2)
debug-capi:string cpla=:input,required,array,string array,dims(ndlev|ndlev,1|1)
debug-capi:int isa=:input,required,array,dims(ndlev|ndlev)
debug-capi:double wa=:input,required,array,dims(ndlev|ndlev)
debug-capi:int ipla=:input,required,array,dims(ndmet|ndmet,ndlev|ndlev)
debug-capi:double xja=:input,required,array,dims(ndlev|ndlev)
debug-capi:Fortran subroutine `xxdata_04(&iunit,&ndlev,&ndtrn,&ndmet,&ndqdn,&nvmax,titled,&iz,&iz0,&iz1,&bwno,&npl,bwnoa,lbseta,prtwta,cprta,&il,qdorb,lqdorb,qdn,&iorb,ia,cstrga,isa,ila,xja,wa,cpla,npla,ipla,zpla,&nv,scef,&itran,&maxlev,tcode,i1a,i2a,aval,scom,beth,&iadftyp,&lprn,&lcpl,&lorb,&lbeth,&letyp,&lptyp,&lrtyp,&lhtyp,&lityp,&lstyp,&lltyp,&itieactn,ltied,slen(titled),flen(cstrga))'
Segmentation fault (core dumped)
Мой первый вопрос такой. Можно ли по выводам отладки точно определить, что произошло с segfaс? Не понимаю как.
В качестве второго вопроса, если вы посмотрите на начало вывода отладки, вы увидите что-то похожее на вызов функции, который, как я считаю, является вызовом функции из общего объекта python. В конце отладочного вывода вы видите что-то почти идентичное, но помеченное как «подпрограмма fortran». Порядок переменных в подпрограмме fortran отличается от порядка в функции python. Общий объект был автоматически создан f2py из исходного кода fortran. Кто-нибудь знает, почему эти переменные находятся в другом порядке?
заранее спасибо