python 将整数传递给 C++ 64 位库 : varying sizes

标签 python c++ int ctypes

我正在 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/

相关文章:

c++ - 将 boost async API 与多个线程一起使用

java - Java 简介 - 出了什么问题?

python - 我的数据清理脚本很慢,有什么改进的想法吗?

python - 在哪里可以找到 matplotlib 中用于自定义的所有属性?

python - Pycharm 无法解析某些 Python 标准库,例如 time 和 sys

python - 列出所有可能的 'Shortest' 路径

c++ - 使用 g++ mac 包括 GLEW、glfw3 和 glm

c++ - 可以在不调用 memset 的情况下从构造函数初始化程序列表中将成员结构设为零吗?

Java 将字符串转换为十进制(ASCII)?

添加 int 时 JavaScript 函数停止工作