C задействованных кодов:
...
typedef union
{
struct { int R[9], T[3];} s;
int a[12];
}
T_RTMx;
...
...
typedef struct
{
int nList;
T_RTMx *ListSeitzMx;
}
T_SgInfo;
...
int AreSymEquivalent_hkl(const T_SgInfo *SgInfo, int h1, int k1, int l1,
int h2, int k2, int l2)
...
Затем python кодов:
from ctypes import *
lib = cdll.LoadLibrary('./libsginfo.dylib')
class s(Structure):
_fields_ = [("R", c_int * 9),
("T", c_int * 3)]
class T_SgInfo(Structure):
_fields_ = [("nList", c_int),
("ListSeitzMx", POINTER(T_RTMx)]
class T_RTMx(Union):
_fields_ = [("s", s),
("a", c_int * 12)]
def AreSymEquivalent_hkl(Sginfo, h1, k1, l1, h2, k2, l2):
lib.AreSymEquivalent_hkl.argtypes = [POINTER(T_SgInfo), c_int, c_int, \
c_int, c_int, c_int, c_int]
lib.AreSymEquivalent_hkl.restype = c_int
return .AreSymEquivalent_hkl(pointer(Sginfo), h1, k1, l1, h2, k2, l2)
A_s_x = s()
A_RTMx_x = T_RTMx()
...
A_s_x.R = R_x # 9 int array
A_s_x.T = T_x # 3 int array
A_RTMx_x.s = A_s_x # s_type structure
A_RTMx_x.a = a_x # 12 int array
A = T_SgInfo()
A.nList = 3
A.ListSeitzMx = pointer(A_RTMx_x)
B = AreSymEquivalent_hkl(A, -2, 0, 0, 2, 0, 0)
print(B)
На самом деле этот код работает без ошибок, но окончательный результат неверен. Я проверил внутреннюю часть C -функции "AreSym .." и не нашел ничего плохого. Таким образом, я не уверен, есть ли ошибки в вызывающей части. Проблема biggist - это «указатель» в C, я знаю, что параметр «pointer ()» является атрибутом, а параметр «POINTER ()» является c_type. Поэтому при просмотре
typedef struct
{
...
T_RTMx *ListSeitzMx;
}
T_SgInfo;
я изменил его на
class T_SgInfo(Structure):
_fields_ = [...
("ListSeitzMx", POINTER(T_RTMx)]
Это хорошо?