9
votes

Python CTYPES: Copie des contenus de la structure

Je veux imiter un morceau de code C en Python avec CTYPES, le code est quelque chose comme: xxx pré>

dans CTYPES Il n'est pas possible de faire ce qui suit: p>

import copy
p0 = Point()
p1 = copy.deepcopy(p0) #or just a shallow copy for this example


1 commentaires

Malheureusement DeepCopy échoue si la structure CTTYPES contient des pointeurs: ValueError: Les objets CTTYPES contenant des pointeurs ne peuvent pas être marinés .


5 Réponses :


0
votes

Je pense aussi à définir une méthode comme: xxx

mais il pourrait y avoir des options encore plus agréables ...


0 commentaires

0
votes

Opérations du pointeur Comme règle ne sont pas une mémoire très sûre. Je créerais des cours d'enveloppe pour chaque type de données Silt vous intéresse et laissez-les gérer les opérations de copie du pointeur. À peu près comme si tu fais ici. Il existe des fonctions de Lambda et de carte que vous pouvez utiliser récursivement comme sucre syntaxique.


1 commentaires

Prix ​​de la pensée à haute voix .. Il y a des métaclasses qui peuvent être utilisés un joli mécanisme de cartographie. code.Activité. com / recettes / 576666



6
votes

Vous pouvez utiliser une affectation de séquence pour copier les objets pointus (plutôt que d'affecter à P.Contents code>, qui modifie la valeur du pointeur):

>>> o1 = Point(1, 1)
>>> o2 = Point(2, 2)
>>> print (o1.x, o1.y, addressof(o1)), (o2.x, o2.y, addressof(o2))
(1, 1, 6474004) (2, 2, 6473524)
>>> copy(o2, o1)
>>> pprint (o1.x, o1.y, addressof(o1)), (o2.x, o2.y, addressof(o2))
(1, 1, 6474004) (1, 1, 6473524)

>>> o1 = Point(1, 1), o2 = Point(2, 2)
>>> print (o1.x, o1.y, addressof(o1)), (o2.x, o2.y, addressof(o2))
(1, 1, 6473844) (2, 2, 6473684)
>>> p1, p2 = pointer(o1), pointer(o2)
>>> addressof(p1.contents), addressof(p2.contents)
(6473844, 6473684)
>>> ptr_copy(p1, p2)
>>> print (o1.x, o1.y, addressof(o1)), (o2.x, o2.y, addressof(o2))
(2, 2, 6473844) (2, 2, 6473684)
>>> addressof(p1.contents), addressof(p2.contents)
(6473844, 6473684)


4 commentaires

Semblait prometteur, mais cela change simplement le pointee: -s l'adresse d'impression de (SRC) et l'adresse de (DST.Contents) après avoir affecté la vérification.


Ces fonctions ne sont pas censées être transmises à des pointeurs, elles sont censées être les objets de structure CTTYPES . Si vous souhaitez une fonction analogue à votre C copy_point , dactez dst [0] = src [0] .


Hmmmm ... Je ne peux pas voir pourquoi le comportement a changé de faire dST = pointeur (A); dst [0] = src; à pointeur (A) [0] = src : - |


Ça ne devrait pas; Il est assez facile de faire des erreurs ou d'utiliser accidentellement d'anciennes variables dans une session interactive.



6
votes

MemMove code> est la bonne opération ici. En définissant le argtypes code> de votre fonction COPPOpoint, vous pouvez facilement appliquer la sécurité type-sécurité.

<Point: x=1, y=2, addr=3085088024> <Point: x=-1, y=-1, addr=3085087952>
<Point: x=-1, y=-1, addr=3085088024> <Point: x=-1, y=-1, addr=3085087952>


0 commentaires

0
votes

dans Python 3X, votre code peut fonctionner correctement. indiqué ci-dessous:

>>> from ctypes import *
>>> class Point(Structure):
...   _fields_ = [("x", c_int),("y", c_int)]
>>> def copy_point(a, b):
...   a.contents = b.contents
>>> p0 = pointer(Point())
>>> p1 = pointer(Point(1,2))
>>> p0.contents.x
0
>>> copy_point(p0,p1)
>>> p0.contents.x
1


0 commentaires