python-tail-recursion.jpg22 Кб, 420x340
F2PY и Fortran: аргумент процедуры - массив, зависящий от глобальной переменной Windows 7: New Opera 3566938 В конец треда | Веб
Пишу расширение для Питона. На Фортране с помощью F2PY, да. Пишу функцию, которая должна принимать кучу аргументов, в т.ч. массив. Как написано в руководстве, и как я всегда делал:


module yoba
contains
subroutine ff(N,AR)
!f2py depend(N) AR
integer,intent(in) :: N
real(4),dimension(0:N-1),intent(in) :: AR
! Какой-то код
end subroutine
end module


Но аргументов у функции при таком подходе будет штук 10, неудобно. Плюс функция будет вызываться тысячи раз за время исполнения основной программы, а часть аргументов меняться не будет. Поэтому хочется их инициализировать один раз, сохранив данные в пространстве памяти модуля на Фортране в переменных модуля, а потом постоянно дергать из моей функции. Например, хочется так:


module yoba
integer,public :: N
contains
subroutine init(x)
integer :: x
N=x
end subroutine
subroutine ff(AR)
!f2py depend(N) AR
real(4),dimension(0:N-1),intent(in) :: AR
! Какой-то код
end subroutine
end module


GNU Fortran съедает этот код легко и непринуждённо, и позволяет использовать в тестовой программе на Фортране же. А вот F2PY - нет, он орёт, что переменная N не объявлена.

Можно ли заставить F2PY использовать переменные модуля таким образом, или надо обязательно таскать в каждой функции стопяцот аргументов?
Linux: Firefox based 2 3567013
>>3566938 (OP)
Тебе не то чтобы в /pr/. Тебе даже на двач теперь ходить не надо ради такой ерунды.
Windows 7: New Opera 3 3567066
>>013
За руководство спасибо. Нюанс в том, что массив AR в функции

subroutine ff(AR)
!f2py depend(N) AR
real(4),dimension(0:N-1),intent(in) :: AR
! Какой-то код
end subroutine

создаётся в питонокоде и приезжает из него в фортранокод. AR большой и в каждом вызове ff новый, так что тратить на его копирование процессорное время жалко. AR приходится использовать как аргумент ff, а вот N и другие подобные переменные, описывающие размер передаваемых и отдаваемых массивов хочется вынести в COMMON BLOCK

А можно ли в питонокоде присваивать ссылку на массив указателю в COMMON BLOCK, а потом в фортранокоде использовать массив по ссылке?
Windows 7: New Opera 4 3567068
>>013

>Тебе не то чтобы в /pr/. Тебе даже на двач теперь ходить не надо ради такой ерунды.



Что поделать, мне не дают зарегистрироваться на StackOverflow, чтобы там вопрошать
Обновить тред
« /s/В начало тредаВеб-версияНастройки
/a//b//mu//s//vg/Все доски

Скачать тред только с превьюс превью и прикрепленными файлами

Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах.Подробнее