第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

使用 Ctypes 在 Python 程序中通過(guò)引用 c 程序調(diào)用調(diào)用

使用 Ctypes 在 Python 程序中通過(guò)引用 c 程序調(diào)用調(diào)用

溫溫醬 2022-06-22 18:39:36
我試圖在 python 程序中調(diào)用 c 交換函數(shù)。使用共享對(duì)象方法,但我堅(jiān)持傳遞 python 變量地址的地址。我是 python 語(yǔ)言的新手,使用的 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 之后但實(shí)際輸出為:在交換 val1 和 var2 為 10 和 20 之前 交換 val1 和 var2 為 10 和 20 之后
查看完整描述

1 回答

?
慕森王

TA貢獻(xiàn)1777條經(jīng)驗(yàn) 獲得超3個(gè)贊

當(dāng)您調(diào)用 時(shí)c_int(val1),您正在創(chuàng)建一個(gè)新c_int對(duì)象。此對(duì)象包含 C 風(fēng)格的整數(shù)變量。byref您可以使用函數(shù)調(diào)用輕松獲得指向它的指針。int另一方面,Python 的類型不是可變的,也不能被修改,即使你確實(shí)找到了它的地址;因此val1,var2不能交換。所以你的樣本應(yīng)該看起來(lái)更像:


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))

順便說(shuō)一下,POINTER產(chǎn)生一個(gè)指針類型,這在你的Addr_Var1和Addr_Var2. 直到您在 的參數(shù)中創(chuàng)建了它們指向不同位置的類型的值swap_addr,并且它們被立即丟棄(很可能以錯(cuò)誤的順序)。


查看完整回答
反對(duì) 回復(fù) 2022-06-22
  • 1 回答
  • 0 關(guān)注
  • 119 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)