Je voulais faire quelque chose comme ça avec les ctypes de Python
typedef struct{
int x;
int y;
} point;
point p = {100, 200};
someFunc(&p.y); //Passer un pointeur sur y
Juste là où je l'ai écrit normalement
from ctypes import *
class Point(Structure):
_fields_ = [("x", c_int), ("y", c_int)]
p = Point(100, 200)
somedll.someFunc(byref(p.y))
TypeError: byref() argument must be a ctypes instance, not 'int'
Être en colère
La valeur obtenue avec p.y
n'est pas une instance de ctypes, mais juste un nombre entier (en Python), elle ne peut donc pas être référencée par byref.
fais ça
y_offset = Point.y.offset
y_addr = addressof(p) + y_offset
somedll.someFunc(y_addr)
J'ai le pointeur ou l'adresse elle-même, mais c'est probablement la même chose.
Merci
Objet de classe (d'une sous-classe de Structure) .nom du membre.offset
Semble pouvoir obtenir le décalage de ce membre depuis le début de la structure
Si vous obtenez l'adresse du début de la structure et ajoutez le décalage, vous pouvez obtenir l'adresse du membre par une journée ensoleillée.
Au fait
Classe objet.membre nom.size
Vous pouvez obtenir la taille de ce membre avec
Si vous l'utilisez beaucoup, il vaudrait mieux en faire une fonction comme suit.
def get_address_of_member(obj, member_name):
return addressof(obj) + obj.__class__.__dict__[member_name].offset
p = Point(100, 200)
somedll.someFunc(get_address_of_member(p, "y"))
Je ne pense pas que ce soit intelligent, mais ça va S'il y a un meilleur moyen, j'apprécierais que vous m'apprendriez.
Recommended Posts