You use c_uint8
, which is 8-bit, while your structure uses int
, in ctypes c_int
, usually 32-bit.
Your structures should be:
class nestedStru(Structure):
_fields_ = [
("One", c_int),
("Two", c_int)
]
class mainStru(Structure):
_fields_ = [
("First", c_int),
("Poniter", POINTER(nestedStru))
]
This is a test library:
#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 client:
#!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)
now it works fine:
> gcc -Wall lib.c -o lib.dll -shared
> python file.py
1, 11
2, 22
3, 33
>