[英]Mutate an integer array using ctypes
目前我正在将我的python代码中的性能瓶颈转移到c,以研究性能影响。 此代码将运行模拟,并通过ctypes将结果报告给python。 但是,我在让我的类型正确匹配时遇到问题。
虽然我正在寻求解决这个特殊问题,但我也在寻找有关使用ctypes的更一般的建议,因为文档和程序看起来有点薄。
我有以下c函数:
extern "C" {
void f( int* array, int arraylen ) {
for(int i = 0; i < arraylen; i++) {
array[i] = g() // mutate the value array[i];
}
}
}
以下是python中的代码:
import ctypes
plib = ctypes.cdll.LoadLibrary('./mylib.so')
_f = plib.f
_f.restype = None
_f.argtypes = [ ctypes.POINTER(ctypes.c_int), ctypes.c_int ]
seqlen = 50
buffer = ctypes.c_int * seqlen
_f( buffer, seqlen )
但是,此代码段会因以下回溯而死亡:
Traceback (most recent call last):
File "particle.py", line 9, in <module>
_f( buffer, seqlen )
ctypes.ArgumentError: argument 1: <type 'exceptions.TypeError'>: expected LP_c_int instance instead of _ctypes.ArrayType
看起来你想要演员功能 :
cast函数可用于将ctypes实例强制转换为指向不同ctypes数据类型的指针。 cast接受两个参数,一个是或者可以转换为某种指针的ctypes对象,以及一个ctypes指针类型。 它返回第二个参数的实例,它引用与第一个参数相同的内存块:
>>> a = (c_byte * 4)()
>>> a
<__main__.c_byte_Array_4 object at 0xb7da2df4>
>>> cast(a, POINTER(c_int))
<ctypes.LP_c_long object at ...>
>>>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.