5

我正在使用 ctypes 并将 ndarray 传递给 c 函数。它给了我一个奇怪的输出行为。继承人一些代码:

C-功能:

int foo(int * foo,int N){
for(int i=0;i<N;i++){
    cout << "i " << i  << " "<< foo[i]  << endl;
    }
return 0;
}

Python:

from ctypes import *
import numpy as np
bar = cdll.LoadLibrary(".../libtest.so")
N = c_int(10)
check = np.ones(10, dtype=int)
print check
bar.foo(c_int(check.ctypes.data),N)

输出:

[1 1 1 1 1 1 1 1 1 1]
i:0 out:1
i:1 out:0
i:2 out:1
i:3 out:0
i:4 out:1
i:5 out:0
i:6 out:1
i:7 out:0
i:8 out:1
i:9 out:0

应该都是对的吗?:)

我正在编译

g++ -g -c -fPIC -O0  pythagoras.cpp 
g++ -shared -Wl,-soname=libtest.so -o libtest.so  pythagoras.o 

有人有什么想法吗?我现在正在搜索失败至少 1 小时,但我不知道解决方案是什么(可能是愚蠢的)

提前致谢!

4

1 回答 1

4

将 设置dtype为 Pythonint将使用 C long。如果您使用的是 64 位平台(Windows 除外),那是 64 位数据类型,它解释了交错的 0。您可以通过设置dtype=np.int32vs来检查这一点dtype=np.int64

其次,是一个代表 C指针check.ctypes.data的 Python 。传递它是不正确的。至少,使用和定义:intvoid *c_intc_void_pargtypes

from ctypes import *
import numpy as np

bar = CDLL('.../libtest.so')
bar.foo.argtypes = [c_void_p, c_int]

check.ctypes定义_as_parameter_ctypes 钩子,它返回一个实例c_void_p

N = 10
check = np.ones(N, dtype=np.int32)
print check
bar.foo(check.ctypes, N)

您可以使用 更具体check.ctypes.data_as,或者使用 定义类型np.ctypeslib.ndpointer

顺便说一句,foo是一个 C++ 函数,而不是 C。你一定用过extern "C". 否则导出的名称将被破坏。

于 2013-09-13T22:16:23.777 回答