【发布时间】:2022-01-08 14:30:06
【问题描述】:
我有以下 C 函数:
int c_sum(const int *a, int len) {
int c = 0;
for (int i=0; i<len; i++){
c += a[i];
}
return c;
}
使用以下内容创建共享库后:
cc -fPIC -shared -o c_sum.so c_sum.c
我在 Jupyter notebook 中运行以下 Python 代码
import numpy as np
import time
from ctypes import *
lib = cdll.LoadLibrary("c_sum.so")
c_sum = lib.c_sum
c_sum.restype = c_int
a = np.random.randint(1,5,6)
print(a)
c = c_sum(c_void_p(a.ctypes.data), c_int(len(a)))
print(c)
它打印以下内容:
[1 4 3 1 2 2]
8
这里可能有什么问题?它打印前 3 个数字的总和。我尝试了不同长度的随机数组,结果发现代码总是对数组中数字的前半部分求和。谢谢。
【问题讨论】:
-
是的,我发现问题是 Python int 是 4 个字节,而 C int 是 2 个字节,当我将数组的类型从 int 更改为 long 时,它起作用了。但这似乎是一个临时解决方案,我需要找到一种更好的方法来处理这种情况。
-
您的评论(至少是第一句话)再错误不过了。我在我提到的只是你应该为你的函数指定 argtypes 和 restype。
-
您需要更改数组的 int 类型。试试
a.astype(np.int32)(或者np.int16,如果你的C int真的是16位的话)。 -
@CristiFati 我不是指您的评论。我指的是:是的,这是一个与 C 中为整数类型分配的字节数有关的问题。