我正在尝试为嵌套结构数组创建一个指针。但是对于c ++,只传递了第一个结构元素......
C ++代码:
typedef structure
{
int One;
int Two;
}nestedStru;
typedef structure
{
int First;
nestedStru* Poniter; //Pointer to nested structure array
}mainStru;
等效的python代码:
class nestedStru(Structure)
_fields_ = [("One",c_uint8),
("Two",c_uint8)]
class mainStru(Structure):
_fields_ = [("First",c_uint8),
("PointerToNested",POINTER(nestedStru))]
我尝试创建主类的对象并将指针强制转换为数组对象。
object = mainStru()
object.Second = cast((nestedStru * 2)(), POINTER(nestedStru))
欢迎任何建议。提前谢谢!
答案 0 :(得分:2)
你使用c_uint8
,这是8位,而你的结构使用int
,在ctypes c_int
中,通常是32位。
你的结构应该是:
class nestedStru(Structure):
_fields_ = [
("One", c_int),
("Two", c_int)
]
class mainStru(Structure):
_fields_ = [
("First", c_int),
("Poniter", POINTER(nestedStru))
]
这是一个测试库:
#include <stdio.h>
#include <stdlib.h>
typedef struct
{
int One;
int Two;
} nestedStru;
typedef struct
{
int First;
nestedStru* Poniter; // Pointer to nested structure array
} mainStru;
void
func(const mainStru *obj, size_t s)
{
size_t i;
for( i = 0 ; i < s ; i++ )
{
printf("%d, %d\n", obj->Poniter[i].One, obj->Poniter[i].Two);
}
}
Python客户端:
#!python
from ctypes import *
class nestedStru(Structure):
_fields_ = [
("One", c_int),
("Two", c_int)
]
class mainStru(Structure):
_fields_ = [
("First", c_int),
("Poniter", POINTER(nestedStru))
]
if __name__ == '__main__':
obj = mainStru()
obj.First = 0
obj.Poniter = (nestedStru * 3)((1, 11), (2, 22), (3, 33))
func = CDLL('./lib.dll').func
func.argtypes = [POINTER(mainStru), c_size_t]
func.restype = None
func(obj, 3)
现在它运作良好:
> gcc -Wall lib.c -o lib.dll -shared
> python file.py
1, 11
2, 22
3, 33
>