F2Py: Работа с размещаемыми массивами в Fortran, вызываемыми через Python - PullRequest
2 голосов
/ 13 декабря 2011

Используя F2Py для компиляции Fortran подпрограмм, пригодных для использования в Python, следующий фрагмент кода успешно скомпилирован, сконфигурированный gfortran в качестве компилятора, однако при использовании F2Py, однако, во время вызова в Python возникает ошибка во время выполнения!
Любые комментарии и решения?

function select(x) result(y)
   implicit none
   integer,intent(in):: x(:) 
   integer:: i,j,temp(size(x))
   integer,allocatable:: y(:)
   j = 0
   do i=1,size(x)
      if (x(i)/=0) then
         j = j+1
         temp(j) = x(i)
      endif
   enddo
   allocate(y(j))
   y = temp(:j)
end function select

Похожий пост StackOverflow можно найти здесь .

Ответы [ 2 ]

0 голосов
/ 13 марта 2014

Ваша функция должна быть объявлена:

function select(n,x) result(y)
   implicit none
   integer,intent(in) :: n
   integer,intent(in) :: x(n) 
   integer :: y(n) ! in maximizing the size of y
   ...

Действительно, Python написан на C, и ваша подпрограмма на Фортране должна следовать правилам Iso_C_binding.В частности, предполагаемые массивы форм запрещены.

В любом случае я бы предпочел подпрограмму:

  subroutine select(nx,y,ny,y)
     implicit none
     integer,intent(in) :: nx,x(nx)
     integer,intent(out) :: ny,y(nx)

ny - это размер, действительно используемый для y (ny <= nx) </p>

0 голосов
/ 15 декабря 2011

Взгляните на эту статью http://www.shocksolution.com/2009/09/f2py-binding-fortran-python/, особенно на пример и значение

!f2py depend(len_a) a, bar

Однако автор не затрагивает проблему создания массива другого размера.

...