values = ffi.new("int[]", 10)
pValue = ffi.addressof(pInt, 0)
Python CFFI, erzeugt der Code über einen Zeiger auf das erste Element als values
pValue
.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.
In C ist '* x' vollständig äquivalent zu' x [0] '. –
Ja. Ich habe einen Anwendungsfall hinzugefügt, bei dem eine direkte Dereferenzierung eines Zeigers auf ein CData sinnvoll wäre. – DRz
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]'. –