我正在 python 软件(也是 64 位)中加载 64 位 C++ 库。我注意到的第一个问题是通过以下协议(protocol)传递给库的一些整数大小不正确:
Python 方面:
c_int = c_int64
polynomialFittingDLL.loadComputationFromPython.restype = None
polynomialFittingDLL.loadComputationFromPython.argtypes = [c_void_p,POINTER(c_int),POINTER(c_int),c_int,c_int,c_int,c_bool,POINTER(c_double),POINTER(c_double),POINTER(c_double)]
self.polynomialFittingDLL.loadComputationFromPython(self.dll,
self.btuplesDllFlat.ctypes.data_as(POINTER(c_int)),
self.bterm.ctypes.data_as(POINTER(c_int)),
len(self.bterm),
sum(self.bterm),
len(self.rangeX),
baseType,
self.coefficients.ctypes.data_as(POINTER(c_double)),
self.rangeX.ctypes.data_as(POINTER(c_double)),
self.minX.ctypes.data_as(POINTER(c_double)))
C++ 方面:
#ifdef _MSC_VER
typedef __int64 int64_t;
#else
#include <stdint.h>
#endif
DLL_EXPORT void loadComputationFromPython(PolynomialCurve* curve,__int64 *_btuple,
int *_bterm, int _btermSize,
int _Nvalidbtuple,int _Nparams,bool _polynomial,
double *_coefficients,
double *_rangeX,double *_minX)
{
curve->loadComputationFromPython(_btuple,_bterm,_btermSize,_Nvalidbtuple,_Nparams,_polynomial,_coefficients,_rangeX,_minX);
}
void PolynomialCurve::loadComputationFromPython(__int64 *_btuple,
int *_bterm, int _btermSize,
int _Nvalidbtuple,int _Nparams,bool _polynomial,
double *_coefficients,
double *_rangeX,double *_minX)
{
btermSize = _btermSize;
Nparams = _Nparams;
btuple = new int*[btermSize];
for (int i=0;i<btermSize;++i) {
btuple[i] = new int[Nparams];
for (int j=0;j<Nparams;++j) {
btuple[i][j] = _btuple[i*Nparams+j];
}
}
bterm = _bterm;
NvalidBtuple = _Nvalidbtuple;
polynomial = _polynomial;
coefficients = _coefficients;
rangeX = _rangeX;
minX = _minX;
}
我必须使用 __int64 类型才能为 _btuple
提供正确的整数类型。但是其他 int 指针似乎仍然无法处理整数大小......
我的问题是,我如何才能在 C++ 代码中连贯一致,使所有 int 属性始终具有相同的位大小?我希望哪个大小与 python 中的 c_int 大小一致。 __int64 类型是否足以解决我的问题?我可以定义 __int64 的指针吗?我应该同样小心 double 吗?
当我从 32 位编译更改为 64 位时,出现了这些问题。 谢谢
编辑: 进一步观察到的是:
从 python 到 c++:python 整数是 64 字节整数,我必须在 C++ 中指定接收到的整数是 64 字节(使用 __int64 类型)
从 C++ 到 Python:C++ 中的 int 类型是 32 字节整数,当我在 Python 中接收整数时,我必须使用 c_int32 类型指定它的大小:
addrBtuples = self.polynomialFittingDLL.getBtuples(self.dll)
self.btuplesDllFlat = np.ctypeslib.as_array((c_int32 * self.btuplesSize).from_address(addrBtuples))
因此,为了尽可能便携:我应该将 python int 转换为 32 字节吗?还是我应该强制 C++ 库使用 __int64 类型?
最佳答案
我不确定我是否理解你的问题,但你不应该用 c_int64
“隐藏” c_int
: c_int
类型是在 64 位上仍然是 4 个字节
>>> import platform
>>> platform.architecture()
('64bit', 'WindowsPE')
>>> import ctypes
>>> ctypes.sizeof(ctypes.c_int)
4
第二个参数应该是一个POINTER(ctypes.c_int64)
:
# c_int = c_int64
polynomialFittingDLL.loadComputationFromPython.restype = None
polynomialFittingDLL.loadComputationFromPython.argtypes = [c_void_p,POINTER(ctypes.c_int64),POINTER(c_int),c_int,c_int,c_int,c_bool,POINTER(c_double),POINTER(c_double),POINTER(c_double)]
此外,指针保持相同的大小,无论它们指向什么类型。
关于python 将整数传递给 C++ 64 位库 : varying sizes,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33519007/