gpt4 book ai didi

python - ctypes 如何推断传递的整数类型?

转载 作者:行者123 更新时间:2023-12-01 00:26:52 25 4
gpt4 key购买 nike

我正在连接此 C 代码:

extern "C" void print_int(short a, int b, long c, long long d)
{
printf("%hi %i %li %lli", a, b, c, d);
}

使用以下 Python 代码:

from ctypes import *
lib=cdll.LoadLibrary("./libtest.so")
lib.print_int(1,2,3,4)

即使我没有在 print_int 代码中转换参数,它们也会正确传递,并且我得到:

1 2 3 4
正如预期的那样。为什么 ctypes不能做同样形式的 float ?以下片段:

extern "C" void print_float(float a, double b, long double c)
{
printf("%f %lf %Lf", a, b, c);
}

需要从ctypes进行显式转换,否则会引发异常。

lib.print_float(c_float(1.0), c_double(2.0), c_longdouble(3.0))

我正在 Unix 中工作,如果重要的话,使用 cdecl 调用约定进行编译。

最佳答案

因为默认值和堆栈大小。如果您未指定类型,ctypes 假定为 c_int。在 64 位系统上,堆栈是 64 位的,因此短整型、整数、长整型、长整型都经过符号扩展并使用 64 位堆栈槽。 long long 在 32 位系统上会崩溃。 float 是一种完全不同的二进制格式,与 c_int 不兼容。

可以使用.argtypes指定参数类型,然后正常传值。另外 .restype 指定返回值:

lib.print_float.argtypes = c_float,c_double,c_longdouble
lib.print_float.restype = None
lib.print_float(1,2,3)

关于python - ctypes 如何推断传递的整数类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58512405/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com