首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python c_types .dll函数(pari库)

Python c_types .dll函数(pari库)
EN

Stack Overflow用户
提问于 2010-03-27 08:44:14
回答 1查看 816关注 0票数 2

好的,我决定试着为a couple days ago库写一个原始的包装器。从那时起,我就开始使用ctypes库来加载动态链接库,并使用类似于以下代码的代码访问所包含的函数:

代码语言:javascript
复制
from ctypes import *
libcyg=CDLL("<path/cygwin1.dll") #It needs cygwin to be loaded. Not sure why.
pari=CDLL("<path>/libpari-gmp-2.4.dll")

print pari.fibo #fibonacci function
#prints something like "<_FuncPtr object at 0x00BA5828>"

因此,这些函数已经存在,它们可能会被访问,但无论我如何尝试,我都会收到访问冲突。例如:

代码语言:javascript
复制
pari.fibo(5) #access violation
pari.fibo(c_int(5)) #access violation

pari.fibo.argtypes = [c_long] #setting arguments manually
pari.fibo.restype = long #set the return type

pari.fibo(byref(c_int(5))) #access violation reading 0x04 consistently

Pari .dll是用C语言编写的,库中的斐波那契函数的语法是GEN fibo(long x)

会不会是返回类型导致了这些错误,因为它不是标准的intlong,而是PARI库所特有的GEN类型?任何帮助都将不胜感激。如果有人能够成功地加载这个库并在python中使用任何函数,请告诉我;我已经在这方面做了几个小时了。

在快速pari.pari_init(4000000,500000)之后,它停止了错误。现在我的问题在于它返回了一个GEN对象;这很好,但是每当我尝试引用它所指向的地址时,它总是33554435,我认为它仍然是一个地址。我正在尝试进一步的命令,如果我成功地获得了正确的值,我会更新的。

EN

回答 1

Stack Overflow用户

发布于 2010-03-28 00:10:58

这里有两个问题,一个是给fibo提供正确的返回类型,另一个是将GEN返回类型转换为您想要的值。

浏览一下源代码,您会发现GEN被定义为一个指向long的指针。此外,at看起来像是库提供了一些转换/打印GENs。我将重点放在GENtostr上,因为对于所有的pari函数来说,它可能更安全。

代码语言:javascript
复制
import cytpes
pari = ctypes.CDLL("./libpari.so.2.3.5") #I did this under linux
pari.fibo.restype = ctypes.POINTER(ctypes.c_long)
pari.GENtostr.restype = ctypes.POINTER(ctypes.c_char)    
pari.pari_init(4000000,500000)
x = pari.fibo(100)
y = pari.GENtostr(x)
ctypes.string_at(y)

结果如下:

代码语言:javascript
复制
'354224848179261915075'
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2527705

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档