I have the following C code which I would use from a python script.
This is just an excerpt of an auto-generated huge library which I'm not able to change, unfortunately. Here I just wanted to print the structure elements to a console to demonstrate what is going wrong.
// CFunc.h
#include <stdio.h>
typedef struct
{
int npar;
struct
{
int id;
int value;
} params[10];
} Data_t;
void Cfunc( const Data_t * d);
// CFunc.c
#include "CFunc.h"
void Cfunc( const Data_t * d)
{
int inpar = 0;
int maxnpar = 0;
printf("%d:\n", d->npar);
maxnpar = d->npar;
inpar=0;
while (maxnpar > inpar)
{
printf(" %d: %08x %08x\n", inpar, d->params[inpar].id, *(int*)&d->params[inpar].value);
inpar++;
}
}
It is compiled and linked to a share library with:
gcc -fPIC -c CFunc.c -o CFunc.o
gcc -shared -lrt -Wl,-soname,libCFunc.so.1 -o libCFunc.so CFunc.o
So I did the following implementation using ctypes:
from ctypes import *
lib = CDLL('./libCFunc.so')
class Data_2(Structure):
pass
class Data_t(Structure):
def __init__(self, list):
self.npar = len(list)
self.params = (Data_2 * self.npar)(*list)
Data_2._fields_ = [
('id', c_int),
('value', c_int),
]
Data_t._fields_ = [
('npar', c_int),
('params', POINTER(Data_2)),
]
def pyFunc(d):
lib.Cfunc.argtypes = (POINTER(Data_t),)
lib.Cfunc(byref(d))
return
So I'm initializing the structure out of a list of given tuples, in this case just 2 and calling the C-function to see its output.
paramlist = (
( 0x050000000, 0x00000000 ),
( 0x050000001, 0x447a0000 ) )
temp = Data_t(paramlist)
pyFunc(temp)
Unfortunately the output is not as expected:
2:
0: 00000000 79948ef0
1: 00007fe5 00000000
Any thoughts what I am missing ?
typedef struct { int npar; struct { int id; int value; } params[10]; } Data_t;1) always use a 'tag' name on every struct as that is what most debuggers use to be able to access the individual fields in the struct. 2) for flexibility, separate the definition if the struct from thetypedeffor the struct