猿问

使用 Ctypes 在 Python 程序中通过引用 c 程序调用调用

我试图在 python 程序中调用 c 交换函数。使用共享对象方法,但我坚持传递 python 变量地址的地址。


我是 python 语言的新手,使用的 Python 版本是 2.7。


C程序:

void swap_addr(int *num1, int *num2) {

int temp = *num1;

*num1 = *num2;

*num2 * temp;

}

蟒蛇程序:

from ctypes import *


val1 = 10 ;

var2 = 20 ;


lib = cdll.LoadLibrary('./swaplib.so');

lib.swap_addr.argtypes = [c_void_p, c_void_p] ;


Addr_Var1 = POINTER(c_int);

Addr_Var2 = POINTER(c_int);


print ("Before swap val1 and var2 is " + str(var1) + " & " + str(var2))


lib.swap_addr( Addr_Var1(c_int(var1)), Addr_Var2(c_int(var2)) )


print ("After swap val1 and var2 is " + str(var1) + " & " + str(var2))

我希望输出为:在交换 val1 和 var2 之前是 10 和 20 在交换 val1 和 var2 是 20 和 10 之后


但实际输出为:在交换 val1 和 var2 为 10 和 20 之前 交换 val1 和 var2 为 10 和 20 之后


温温酱
浏览 119回答 1
1回答

慕森王

当您调用 时c_int(val1),您正在创建一个新c_int对象。此对象包含 C 风格的整数变量。byref您可以使用函数调用轻松获得指向它的指针。int另一方面,Python 的类型不是可变的,也不能被修改,即使你确实找到了它的地址;因此val1,var2不能交换。所以你的样本应该看起来更像:from ctypes import *var1 = c_int(10)var2 = c_int(20)lib = cdll.LoadLibrary('./swaplib.so')lib.swap_addr.argtypes = [c_void_p, c_void_p]print ("Before swap var1 and var2 is " + str(var1.value) + " & " + str(var2.value))lib.swap_addr( byref(var1), byref(var2) )print ("After swap var1 and var2 is " + str(var1.value) + " & " + str(var2.value))顺便说一下,POINTER产生一个指针类型,这在你的Addr_Var1和Addr_Var2. 直到您在 的参数中创建了它们指向不同位置的类型的值swap_addr,并且它们被立即丢弃(很可能以错误的顺序)。
随时随地看视频慕课网APP

相关分类

Python
我要回答