python中的ctypes结构数组

时间:2014-03-22 20:00:34

标签: python c++ pointers ctypes

我正在尝试为嵌套结构数组创建一个指针。但是对于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)) 

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

1 个答案:

答案 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
>