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

Python CFFI, erzeugt der Code über einen Zeiger auf das erste Element als valuespValue.Dereferenzieren einen Zeiger mit ffi.addressof in Python CFFI (C * -Operator Äquivalent?) Erstellt

Sie können dann auf den Inhalt mit values[ 0 ] zugreifen, aber das ist nicht wirklich transparent und es ist manchmal unbequem zu verfolgen, welcher Wert welcher Wert ist.

Gibt es irgendetwas wie das C *-operator, eine Funktion oder etwas anderes, um pValue zu dereferenzieren und auf seinen Inhalt direkt zuzugreifen?

In anderen Sprachen ...:

// 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)"? 

EDIT:
Hier ist ein Anwendungsfall, wo es sinnvoll ist:

Ich finde es besser lesbar zu machen:

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

Anstatt:

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

Und ich denke, das ehemalige ist schneller. Wenn Sie jedoch auf die Werte zugreifen möchten, ist es unpraktisch, sich daran zu erinnern, wie "OK-Typ ist Nummer 0" usw.

+1

In C ist '* x' vollständig äquivalent zu' x [0] '. –

+0

Ja. Ich habe einen Anwendungsfall hinzugefügt, bei dem eine direkte Dereferenzierung eines Zeigers auf ein CData sinnvoll wäre. – DRz

+1

Sorry, ich verstehe immer noch nicht. Was würdest du gern tun? Würde man das in C als '* pType',' * pValue' schreiben? Dann können Sie es 'pType [0]', 'pValue [0]' schreiben. Natürlich können Sie auch Ihre eigene Funktion 'def contentof (p) definieren und verwenden: return p [0]'. –

Antwort

1

In C entspricht die Syntax *pType immer pType[0]. Also sagen Sie, Sie möchten etwas tun wie:

aber natürlich ist dies nicht gültig Python-Syntax. Die Lösung ist, dass Sie es immer so schreiben können, das wird gültig Python-Syntax:

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