【发布时间】:2011-08-17 07:14:34
【问题描述】:
哦,我的话我是个傻瓜。 我只是在调用函数时省略了第二个和第三个参数。 像个傻瓜。 因为我就是这样。 原来的愚蠢问题如下:
这似乎是一件很常见的事情,但是我找不到相关的教程,我对Numpy和ctypes太无知了,无法自己弄清楚。
我在文件 ctest.c 中有一个 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 数组未修改。事实上,如果我再次调用该函数,我会得到一个段错误。这并不让我感到惊讶——我真的不知道我在这里做什么。谁能指出我正确的方向?
【问题讨论】:
-
我没有在 C 中调用函数。我需要吗?
-
对不起。看来您正在混合
C和python,我不知道它是如何工作的。调用C中的puts的事实表明它是从python代码调用的。但我怀疑您传递给C函数的内容会导致问题。