【发布时间】:2020-05-17 09:51:32
【问题描述】:
我使 hoge 尽可能简单,但仍然会出现错误。 请告诉我有什么问题。
这是我的 Fortran 子程序代码。
subroutine hoge(d)
complex(kind(0d0)), intent(out):: d(5,10,15) ! 5 10 15 does not have special meanings..
! these two lines works..
! integer, parameter :: dp = kind(0d0)
! complex(dp), intent(out) :: d(5,10,15)
do i=1,15
do j=1,10
do k=1,5
d(k,j,i)=0
enddo
enddo
enddo
! instead
! d(1:5,1:10,1:15)=0 or
! d(:,:,:)=0 also brings the error.
!
print*,'returning'
return
end subroutine hoge
我想使用 Fortran 子例程。我编译如下
python -m numpy.f2py -c hoge.f90 -m hoge
并如下使用
import hoge
hoge.hoge()
那么结果就是下面的三行:
Returning
double free or corruption (out)
Aborted (core dumped)
我完全不知道...请告诉我有什么问题。
当线路发生如下变化时
do j=1,10 -> do j=1,5
错误不会发生...(供您参考..) 1..6带来了错误。
【问题讨论】:
-
看起来你在 pythonn 中调用了没有参数的函数,并且在 fortran 子例程中你期望一个数组(指令
intent(out)只是说内容应该/将在子例程中设置)。仍然是一条奇怪的消息,但可能是一个指针。 -
使用 d=hoge.hoge() 运行会带来相同的信息..
-
d是一个参数,而不是子例程的返回值。在 C 语言中,子程序是一个 void 函数。 -
我也意识到,如果我做一个小小的改变......它会起作用。我更新了问题。
-
你的更新版本是要走的路。查看
print(hoge.hoge.__doc__)的输出,您会看到f2py 将您的原始声明解释为具有默认浮点数d : rank-3 array('F') with bounds (5,10,15)的复杂。但是,替代声明给出了所需的双重结果d : rank-3 array('D') with bounds (5,10,15)。