2010-06-18 7 views
2

J'écris des fixations swig pour certaines fonctions c. Une de ces fonctions prend un flotteur **. J'utilise déjà cpointer.i pour les pointeurs normaux et regardé dans carrays.i, mais je n'ai pas trouvé un moyen de déclarer un flotteur **. Que recommandez-vous?Comment utiliser float ** en Python avec Swig?

fichier d'interface:

extern int read_data (const char * fichier, int * N_, int * m_, flotteur ** data_, int ** classes_);

+1

Je suppose que le read_data() La fonction prend ces pointeurs à des pointeurs afin que les valeurs peuvent être retournées par eux? Vous pourriez envisager de changer la fonction Python pour les retourner dans le cadre de la valeur de retour. – Petriborg

+1

@Petriborg, La chose est, je dois retourner 'classes', 'données', 'm' et 'n' et je ne suis pas censé utiliser une structure. – Framester

Répondre

1

Cette réponse est un repost de un à une question connexe Framester posté à propos de l'utilisation de ctypes au lieu de swig. Je l'ai inclus ici au cas où des recherches sur le Web afficheraient un lien vers sa question originale.

Je l'ai utilisé ctypes pour plusieurs projets maintenant et ont été très heureux avec les résultats . Je ne pense pas que j'ai personnellement en théorie, besoin d'un wrapper pointeur à pointeur encore mais, vous devriez être en mesure effectuer les opérations suivantes:

from ctypes import * 

your_dll = cdll.LoadLibrary("your_dll.dll") 

PFloat = POINTER(c_float) 
PInt = POINTER(c_int) 

p_data = PFloat() 
p_classes = PInt() 
buff  = create_string_buffer(1024) 
n1  = c_int(0) 
n2  = c_int(0) 

ret = your_dll.read_data(buff, byref(n1), byref(n2), byref(p_data), byref(p_classes)) 

print('Data: ', p_data.contents) 
print('Classes: ', p_classes.contents)