2

よし、というわけで、数日前に PARI ライブラリのプリミティブ ラッパーを書いてみることにしました。それ以来、私はctypesdllをロードし、次のようなコードを使用して含まれている関数にアクセスする際にライブラリをいじっています:

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

したがって、関数はそこにあり、アクセスできる可能性がありますが、何をしようとしても常にアクセス違反が発生します。例えば:

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

argtypesポインタを受け取るため の設定を含む、そのバリエーション。

Pari .dll は C で記述されており、ライブラリ内のフィボナッチ関数の構文はGEN fibo(long x).

これらのエラーを引き起こしているのは戻り値の型でしょうか?それは標準ではなくint、PARI ライブラリに固有longの型なのでしょうか? GENどんな助けでも大歓迎です。誰かがライブラリを正常にロードし、Python 内から任意の関数を使用できる場合は、教えてください。私はこれで何時間も過ごしました。

編集:ライブラリを初期化するのを忘れていたようです。すぐpari.pari_init(4000000,500000)にエラーがなくなりました。今私の問題は、それが GEN オブジェクトを返すという事実にあります。これは問題ありませんが、それが指すアドレスを参照しようとすると、常に 33554435 であり、これはまだアドレスであると推測されます。さらにコマンドを試しています。何かの正しい値を取得できたら更新します。

4

1 に答える 1

3

ここには2つの問題があります。1つはfiboに正しいリターンタイプを与え、2つはGENリターンタイプを探している値に変換します。

ソースコードを少し見てみると、GENがlongへのポインタとして定義されていることがわかります。また、ライブラリがいくつかの変換/印刷GENを提供しているように見えます。GENtostrは、すべてのパリ機能にとっておそらく安全であるため、私はGENtostrに焦点を合わせました。

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)

結果:

'354224848179261915075'
于 2010-03-27T16:10:58.393 に答える