【发布时间】:2015-11-04 22:39:21
【问题描述】:
我正在 python 软件(也是 64 位)中加载 64 位 c++ 库。我注意到的第一个问题是通过以下协议传递给库的一些整数大小不合适:
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 的指针吗?我应该对双打同样小心吗?
当我从 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 类型?
【问题讨论】: