2016-11-20 42 views
1

我正在使用Python调用由f2py绑定的Fortran函数。当我明确维度数组我的总和调用返回所希望的结果,但是当我使用假定形状返回0将数组传递给假定形状

! foo.f95 
function sum_test(arr) 
    IMPLICIT NONE 
    integer(8), dimension(:), intent(in) :: arr 
    integer(8) :: sum_test 
    sum_test = sum(arr) 
end function sum_test 

Python端:

import foo 
foo.sum_test([1,2,3]) 
0L 

如果我在Fortran的明确尺寸:

! foo.f95 
function sum_test(arr) 
    IMPLICIT NONE 
    integer(8), dimension(3), intent(in) :: arr 
    integer(8) :: sum_test 
    sum_test = sum(arr) 
end function sum_test 

Python端:

import foo 
foo.sum_test([1,2,3]) 
6L 

需要注意的是,如果我打印出我的价值在假设形状的版本,像这样:

write(*,*) arr 

我可以看到数组中的值。

我很明显错过了一些关键的作品!

+0

嗨,欢迎光临。尽量保持你的帖子收敛,避免冗长的介绍,谢谢和问候。你的名字已经在帖子下面了,不需要重复。使用标签[标签:fortran]并添加一个特定的版本,如果你有这样做的理由(不在这里)。更多的人遵循更通用的标签,所以你更有可能得到答案。此外,应该使用大写字母(I,Fortran,Python)是很好的,否则对某些人来说可能会显得“懒惰”。 –

+0

也可以报告您使用的软件版本和您使用的编译器标志。 –

回答

0

假设形状的数组需要调用者传递关于数组边界以及数据地址的信息。这样做的机制与实现有关,并不是所有的实现都记录了它们的方法。你的Python代码只是传递数据地址,但Fortran期望(通常)一个“描述符”数据结构。 (Fortran 2015指定了执行此操作的标准方法,作为“进一步C互操作性”的一部分。)

我建议的是Fortran调用“可调整数组”,将范围作为单独参数传递。

+0

谢谢你的解释! –

+0

在f77中称为可调整数组的函数称为自f90以来的假定大小。正如史蒂夫所说,这可能是你希望进行跨语言调用,这样可以使用f2003风格的C互操作性,而不依赖于提供描述符。 – tim18

+0

我不确定你的答案。我认为假定形状数组应该被f2py支持。当然,f2py必须使用正确编译器的正确调用约定,但应该支持它。 –