Входные и выходные аргументы для ctypes - PullRequest
0 голосов
/ 22 августа 2011

У меня проблема с форматированием входных и выходных аргументов с использованием ctypes в python для доступа к функции fortran в dll. Я могу получить доступ к библиотеке и функции, но пытаюсь отформатировать аргументы.

Код f90 начинается как:

subroutine DataSub (Data_input,da,db,dy)

    double precision, intent(in) :: Data_input(9)
    double precision, intent(out) :: da,db,dy

Как вы определяете входные и выходные аргументы для этого случая в ctypes?

Ответы [ 2 ]

2 голосов
/ 22 августа 2011

Примерно так:

from ctypes import *#just for brevity in this example
input = (c_double*9)()
input[0] = .....
da = c_double()
db = c_double()
dy = c_double()
dll.DataSub(byref(input), byref(da), byref(db), byref(dy))
2 голосов
/ 22 августа 2011

Скорее всего, это будет c_double, однако вам больше не следует использовать «двойную точность». Вместо этого используйте real с атрибутом kind, еще лучше используйте ISO_C_Binding в Fortran для обеспечения C-подобного интерфейса. Привязка ISO_C_Binding также позволит вам передавать аргументы по значению, а не по ссылке. Без этого вам нужно будет использовать http://docs.python.org/library/ctypes.html#passing-pointers-or-passing-parameters-by-reference

Некоторые образцы для привязки ISO_C_ предоставлены Джоном Рейдом: http://www.fortran.bcs.org/2002/interop.htm

...