Вызов функции Фортрана из Python с помощью ctypes - PullRequest
3 голосов
/ 26 марта 2012

Я собираюсь использовать ctypes для вызова некоторых старых библиотек фортрана, написанных моим боссом несколько лет назад.Я последовал примеру, приведенному в этом предыдущем вопросе , и получил результаты, как и ожидалось.

Однако, когда я изменяю код, чтобы немного приблизиться к ситуации, с которой я сталкиваюсь, так что

integer function addtwo(a, b)
  integer, intent(in) :: a, b
  addtwo = a + b
end function

становится

real function addtwo(a, b)
  integer, intent(in) :: a, b
  addtwo = a + b
end function

т.е. функция теперь real, а не integer, возвращаемое значение всегда 0.Кто-нибудь может объяснить, что происходит и как мне это обойти?

(PS. Я использую 64-битный компилятор gfortran на Mac OS Snow Leopard)

EDIT : функция, с которой я борюсь, выглядит следующим образом:

real function ykr(seed)

  integer, intent(in) :: seed
  real ykr0
  ykr= real(seed)
end function

Действительно, ykr вызывает другую функцию, ykr0, рекурсивно, но, поскольку я борюсь даже с этим основным аспектом, я 'Я игнорирую это сейчас.Я не вижу, что отличается между этим кодом и выше, но вызов ykr_(byref(c_int(4))) возвращает 0, а не 4, как ожидалось ...

1 Ответ

4 голосов
/ 26 марта 2012

Добавить строку

ykr_.restype = c_float

в вашем коде Python, до ykr_(byref(c_int(4))). Это устанавливает тип возвращаемого значения для функции float (или real на языке фортан).

В исходном посте это не было необходимо, поскольку int было принято по умолчанию.

...