2016-07-19 9 views
1
values = ffi.new("int[]", 10) 
pValue = ffi.addressof(pInt, 0) 

を間接参照、上記のコードはpValueとしてvaluesの最初の要素へのポインタを作成します。は、Python CFFI(C *の演算子は同等?)でffi.addressofで作成されたポインタのPython CFFIで

values[ 0 ]でコンテンツにアクセスすることはできますが、これは実際には透過的ではなく、どのような値であるのかを把握することは時々不便です。

pValueを参照して内容に直接アクセスするには、C *-operatorなどの機能がありますか?他の言語で

...:

// In C: 
// ===== 

int values[ 10 ] = {0}; 
int* pValue = &(values[ 0 ]); 

func_with_pointer_to_int_as_param(pValue); 

printf("%d\n", *pValue); 

------------------------------------------------------------- 

# In Python with CFFI: 
# ==================== 

values = ffi.new("int[]", 10) 
pValue = ffi.addressof(values, 0) 

lib.func_with_pointer_to_int_as_param(pValue) #lib is where the C functions are 

print values[ 0 ] #Something else than that? Sort of "ffi.contentof(pValue)"? 

編集:ここでは
は、それが有用であるユースケースである:

私がすることがより読み見つける:

pC_int = ffi.new("int[]", 2) 
pType = ffi.addressof(pC_int, 0) 
pValue = ffi.addressof(pC_int, 1) 
... 

# That you access with: 
print "Type: {0}, value: {1}".format(pC_int[ 0 ], pC_int[ 1 ]) 

むしろより:

pInt_type = ffi.new("int[]", 1) 
pType  = ffi.addressof(pInt_type, 0) 

pInt_value = ffi.new("int[]", 1) 
pValue  = ffi.addressof(pInt_value, 0) 

... 

# That you access with: 
print "Type: {0}, value: {1}".format(pInt_type[ 0 ], pInt_value[ 0 ]) 

そして、私は前者が速くなると思います。しかし、値にアクセスしたいときは、 "ok type is number 0"のように覚えておくのは不便です。

+1

Cでは、 '* x'は' x [0] 'と完全に等価です。 –

+0

はい。私はCDataのポインタの直接間接参照を有することが有用であろうユースケースを追加しました。 – DRz

+1

申し訳ありませんが、私はまだ理解していません。あなたは何をしたいですか?それは '* pType'、' * pValue'のようにCで書いていますか?そして、あなたはそれを書くことができます 'パラメータ・タイプ[0]'、 'p値[0]'。もちろん、独自の関数 'def contentof(p):return p [0]'を定義して使用することもできます。 –

答えて

1

Cでは、構文*pTypeは常にpType[0]に相当します。だから、あなたのような何かをしたいと言う:

print "Type: {0}, value: {1}".format(*pType, *pValue) 

もちろん、これは有効なPythonの構文ではありません。この問題を解決するには、次のように書き直すことができます。これは有効なPython構文になります:

print "Type: {0}, value: {1}".format(pType[0], pValue[0]) 
関連する問題