Ctypes在python中构造数组

ctypes structure arrays in python

本文关键字:数组 python Ctypes      更新时间:2023-10-16

我试图有一个指针创建到嵌套结构数组。但是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))] 

我试着创建一个main类的对象,并将指针转换为数组对象..

object = mainStru()
object.Second = cast((nestedStru * 2)(), POINTER(nestedStru)) 

欢迎提出任何建议。提前感谢!

您使用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, %dn", 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
>