我正在为Matlab的动态库开发Python包装类,以便在Python中读取Matlab的MAT文件,我遇到了一个奇怪的行为,我无法从ctypes接口中解释。
C语言的函数签名看起来像这样。
const mwSize *mxGetDimensions(const mxArray *);
这里,mwSize
是一个重命名的size_t
,而mxArray*
是一个不透明的指针。这个函数返回Matlab数组的 "形状"。返回的指针指向size_t数组,该数组内部存储在mxArray对象中,是not空终止(其大小通过另一个函数获得)。
为了从Python中调用这个函数,我对库的设置如下。
libmx = ctypes.cdll.LoadLibrary('libmx.dll')
libmx.mxGetDimensions.restype = ctypes.POINTER(ctypes.c_size_t)
libmx.mxGetDimensions.argtypes = [ctypes.c_void_p]
并在获得mxArray*
中的VAR
后,我打电话给。
dims = libmx.mxGetDimensions(VAR)
print(dims[0],dims[1])
VAR
已知是二维的,形状是(1, 13)
(用C程序验证),但是我的Python代码在c_ulonglong中返回(55834574849 0)
。在测试MAT文件中存储的所有变量中,结果是一致的垃圾。
我做错了什么?使用 VAR 的其他库调用似乎工作正常,因此 VAR 指向了有效对象。如上所述,在 C 语言程序中调用 mxGetDimensions() 可以正常工作。
如有任何意见,敬请指教。谢谢