我需要在Python中构造以下数据类型以传递给C函数:
struct {
unsigned a,b,c;
char data[8];
};
但是,我需要实际将指向数据字段的指针传递给函数,而不是指向结构的指针,我无法弄清楚如何执行此操作。
这是我到目前为止所做的:
from ctypes import *
class MyStruct(Structure):
_fields_ = [("a",c_uint), ("b",c_uint), ("c",c_uint), ("data",c_char*8)]
mystruct = MyStruct(0,1,8,"ABCDEFGH")
external_c_function(mystruct.data)
现在在C中我有这个功能:
int external_c_function(char *data) {
int a = ((unsigned *)data)[-1];
int b = ((unsigned *)data)[-2];
int c = ((unsigned *)data)[-3];
...
}
问题是,当函数被调用时,“data”正确地指向“ABCDEFGH”,但是当我尝试获取其前面的其余结构数据时,它就是垃圾。我究竟做错了什么? mystruct不是像真正的C结构那样在内存中按顺序存在吗?我怀疑阵列发生了一些有趣的事情:我实际上是在做这样傻事吗?
struct {
unsigned a,b,c;
char *data; // -> char[8]
};
如果是的话,我该怎么做呢?
答案 0 :(得分:5)
使用元素的偏移量,通过引用将指针传递给结构的元素:
external_c_function(byref(mystruct,MyStruct.data.offset))
答案 1 :(得分:2)
当您引用mystruct.data
时,似乎会制作一份数据副本。我这样说是因为python命令type(mystruct.data)
返回str
,而不是C类型。
我认为您无法修改external_c_function
以接受结构开头的指针,因为这将是最明显的解决方案。因此,您需要以某种方式在python中执行C样式指针算法 - 即获取mystruct
的地址(可能使用ctypes.pointer
),然后找出一种方法来将此指针递增适当的字节数。
我不知道你如何在python中做这样的指针算法,或者甚至可以以任何健壮的方式做。但是,您始终可以将external_c_function
包装在另一个执行必要指针运算的C函数中。
修改强>
马克的答案整齐地解决了这个问题。我对错误发生原因的评论仍然是正确的。