О, мое слово, я дурак. Я просто опускал второй и третий аргументы при вызове функции.Как дурак.Потому что это то, что я есть.Ниже следует оригинальный глупый вопрос:
Похоже, это очень распространенная вещь, но я не могу найти соответствующий учебник, и я слишком неосведомлен о Numpy
и ctypes
, чтобы понятьЯ сам.
У меня есть функция C в файле ctest.c
.
#include <stdio.h>
void cfun(const void * indatav, int rowcount, int colcount, void * outdatav) {
//void cfun(const double * indata, int rowcount, int colcount, double * outdata) {
const double * indata = (double *) indatav;
double * outdata = (double *) outdatav;
int i;
puts("Here we go!");
for (i = 0; i < rowcount * colcount; ++i) {
outdata[i] = indata[i] * 2;
}
puts("Done!");
}
(Как вы можете догадаться, у меня изначально были аргументы как double *, а не void *, ноя не могу понять, что делать на стороне Python. Я бы с удовольствием поменял их обратно, но я не привередлив, если это работает.)
Я делаю из этого общую библиотеку,gcc -fPIC -shared -o ctest.so ctest.c
Затем в Python у меня есть пара массивов numpy, и я хотел бы передать их в функцию C, один для ввода и один для вывода.
indata = numpy.ones((5,6), dtype=numpy.double)
outdata = numpy.zeros((5,6), dtype=numpy.double)
lib = ctypes.cdll.LoadLibrary('./ctest.so')
fun = lib.cfun
# Here comes the fool part.
fun(ctypes.c_void_p(indata.ctypes.data), ctypes.c_void_p(outdata.ctypes.data))
print 'indata: %s' % indata
print 'outdata: %s' % outdata
Это не сообщает об ошибках, но выводит на печать
>>> Here we go!
Done!
indata: [[ 1. 1. 1. 1. 1. 1.]
[ 1. 1. 1. 1. 1. 1.]
[ 1. 1. 1. 1. 1. 1.]
[ 1. 1. 1. 1. 1. 1.]
[ 1. 1. 1. 1. 1. 1.]]
outdata: [[ 0. 0. 0. 0. 0. 0.]
[ 0. 0. 0. 0. 0. 0.]
[ 0. 0. 0. 0. 0. 0.]
[ 0. 0. 0. 0. 0. 0.]
[ 0. 0. 0. 0. 0. 0.]]
Массив outdata не изменяется.И на самом деле, если я вызову функцию снова, я получу ошибку.Что меня не удивляет - я действительно не знаю, что я здесь делаю.Кто-нибудь может указать мне правильное направление?