У меня есть код Fortrran, который должен вывести массив, размер которого зависит от переменной в модуле. Нет проблем при компиляции этих файлов для генерации файла .so. Однако, когда я вызываю подпрограмму в python, она получит ошибку. Далее приведен упрощенный код, используемый для объяснения моих вопросов
!fortran code: mod.f90
module constant
implicit none
integer(kind=4),parameter :: typenum=8,intype=4
integer(kind=4) :: cutnum
end module
subroutine test(n,m,a,b)
use constant
implicit none
integer(kind=intype) :: n,m,i,j
real(kind=typenum) :: b(cutnum,m)
real(kind=typenum) :: a(n,m)
!f2py integer,intent(aux) :: cutnum
!f2py intent(in) :: n,m
!f2py intent(in) :: a
!f2py intent(out) :: b
do j=1,m
do i=1,n
a(i,j)=(i+j)*1D0
end do
end do
b=n-a
return
end subroutine
subroutine init_pes(n)
use constant
implicit none
integer(kind=4) :: n
!f2py integer,intent(in) :: n
cutnum=n
return
end subroutine
Соберите следующую директиву:
f2py mod.f90 -m f2 -h f2.pyf --overwrite-signature
f2py -c --debug-capi f2.pyf mod.f90
И код python:
#python file : test.py
import numpy as np
import f2
print(f2.test.__doc__)
n=5
m=6
# set value of f2.constant.cutnum
f2.init_pes(n)
a = np.zeros((n, m), dtype=np.float64, order='f')
b = np.zeros((n, m), dtype=np.float64)
b = f2.test(a)
print(b)
Если я запускаю test.py, получим ошибку сегментации и пустой массив ** Согласно моему тесту, если выходной массив представляет собой вектор одного измерения или его измерение не зависит от переменной в модуле, код можно запустить обычно. в противном случае он сломается. **