Проблема с вызовом C функций в python - PullRequest
0 голосов
/ 31 января 2020

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)]

Это хорошо?

...