Problemas con el uso de código C en Python | conjunto 2

Requisito previo: problemas con el uso de código C en Python | Serie 1

La clase DoubleArrayType puede manejar la situación de Python que tiene diferentes formas como array, array numpy, lista, tupla. from_param()En esta clase, se define un único método . Este método toma un solo parámetro y lo reduce a un objeto ctypes compatible (un puntero a ctypes.c_double, en el ejemplo).

En el siguiente código, el nombre de tipo del parámetro se extrae y se usa para enviar a un método más especializado. Por ejemplo, si se pasa una lista, el nombre de tipo es lista y from_list()se invoca un método. Para listas y tuplas, el from_list()método realiza una conversión a un objeto de array ctypes.

Código #1:

nums = [1, 2, 3]
a = (ctypes.c_double * len(nums))(*nums)
print ("a : ", a)
  
print ("\na[0] : ", a[0])
  
print ("\na[1] : ", a[1])
  
print ("\na[2] : ", a[2])

Producción :

a : <__main__.c_double_Array_3 object at 0x10069cd40>

a[0] : 1.0

a[1] : 2.0

a[2] : 3.0

 
El método extrae el puntero de memoria subyacente y lo convierte en un objeto de puntero ctypes para objetos de array. from_array()

Código #2:

import array
arr = array.array('d', [1, 2, 3])
print ("arr : ", arr)
  
ptr_ = a.buffer_info()
print ("\nptr :", ptr)
  
print ("\n", ctypes.cast(ptr, ctypes.POINTER(ctypes.c_double)))

Producción :

arr : array('d', [1.0, 2.0, 3.0])

ptr : 4298687200

<__main__.LP_c_double object at 0x10069cd40> 

 
El from_ndarray()muestra un código de conversión comparable para arrays numpy. Al definir la clase DoubleArrayType y usarla en la firma de tipo de avg(), la función puede aceptar una variedad de diferentes entradas similares a arrays.

Código #3:

# libraries
import sample
import array
import numpy
  
print("Average of list : ", sample.avg([1, 2, 3]))
  
print("\nAverage of tuple : ", sample.avg((1, 2, 3)))
  
print(\nAverage of array : ", sample.avg(array.array('d', [1, 2, 3])))
  
print(\nAverage of numpy array : ", sample.avg(numpy.array([1.0, 2.0, 3.0])))

Producción :

Average of list : 2.0

Average of tuple : 2.0 

Average of array : 2.0

Average of numpy array : 2.0

 
Para trabajar con una estructura C simple, simplemente defina una clase que contenga los campos y tipos apropiados como se muestra en el código a continuación. Después de definir, se puede usar la clase en las firmas de tipos, así como en el código que necesita instanciar y trabajar con las estructuras.

Código #4:

class Point(ctypes.Structure):
    _fields_ = [('x', ctypes.c_double),
                ('y', ctypes.c_double)]
  
point1 = sample.Point(1, 2)
point2 = sample.Point(4, 5)
  
print ("pt1 x : ", point1.x)
  
print ("\npt1 y : ", point1.y)
  
print ("\nDistance between pt1 and pt2 : ",
           sample.distance(point1, point2))

Producción :

pt1 x : 1.0

pt1 y : 2.0

Distance between pt1 and pt2 : 4.242640687119285

Publicación traducida automáticamente

Artículo escrito por manikachandna97 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *