次のような C 構造体があります。
typedef struct {
my_domain_type_t type;
my_domain_union_t u;
my_domain_int32_list_t list;
} my_domain_value_t;
typedef struct {
int32_t min;
int32_t max;
} my_domain_int32_range_t;
ctypes から呼び出したい C 関数:
int64_t myData::get_min(const my_domain_value_t &value)
{
int min_value = 0;
my_domain_type_t dt = value.type;
if (dt == 0)
{
my_domain_int32_range_t range = value.u.range;
min_value = range.min;
printf("min_value=%d\n", min_value);
}
return min_value;
}
ctypes の定義:
class myDomainInt32RangeT(Structure):
_fields_ = [ ('min', c_long),
('max', c_long) ]
class myDomainUnionT(Union):
_fields_ = [ ('range', myDomainInt32RangeT ) ]
class myDomainValueT(Structure):
_fields_ = [ ('type', c_int ),
('u', myDomainUnionT ),
('list', myDomainInt32ListT ) ]
class myData(object):
def __init__(self):
self.object = myDataX.myData_new()
def get_min(self, arg1):
myDataX.myData_get_min.argtypes = [ c_void_p, POINTER(myDomainValueT) ]
myDataX.myData_get_min.restype = c_longlong
return myDataX.mydata_get_min(self.object, arg1)
Python コード:
mydataY = myData()
domainRange = myDomainInt32RangeT()
domainRange.min = c_long(3)
domainRange.max = c_long(5)
domainUnion = myDomainUnionT()
domainUnion.range = domainRange
domainValue = myDomainValueT()
domainValue.type = 0
domainValue.u = domainUnion
domainValue.list = myDomainInt32ListT()
b = mydataY.get_min( byref(domainValue) )
print(b)
min_value に 3 の値を期待していますが、0 を取得し続けます。C コードも 0 を出力します。ユニオンが正しくセットアップ/転送されないようです。
私は何を間違えましたか?
ティア、
ジョン