2009-12-02 4 views
4

Je suis en train d'appeler une fonction C assis dans un objet partagé de python, et en utilisant ctypes semble être la meilleure façon d'y parvenir. Je passer les types dérivés de cette fonction, le prototype de la fonction suivante:Appel d'une fonction à l'aide ctypes avec des pointeurs vers structs

int MyFunc (Config *config, int *argc, char **argv) 

Le struct Config est défini comme

typedef struct{ char *some_filename ; 
       char **some_other_filenames ; 
       int some_value ; 
       Coord resolution; 
       } Config; 

Coord est défini comme

typdef struct { double x, y, area } Coord ; 

le python ctypes le code est alors juste une ré-écriture des types dérivés:

class COORD (ctypes.Structure): 
     _fields = [ ("lon",ctypes.c_double),\ 
     ("lat", ctypes.c_double),\ 
     ("area", ctypes.c_double)] 
coords = COORD() 
class CONFIG(ctypes.Structure): 
     _fields = [ ("some_filename", ctypes.c_char_p),\ 
     ("some_other_filenames", ctypes.c_char_p('\0' * 256)),\ 
     ("some_value", ctypes.c_int),\ 
     ("resolution", coords) ] 

je puis mis en place les arguments pour MyFunc:

MyFunc.argtypes = [ctypes.byref(CONFIG) , ctypes.POINTER(ctypes.c_int),\ 
     ctypes.POINTER (ctypes.c_char_p)] 
MyFunc.restype = ctypes.c_int 
myargv = ctypes.c_char_p * 2 
argv = myargv("One", "Two") 
argc = ctypes.c_int (2) 
retval = MyFunc ( ctypes.byref(config), ctypes.byref(argc), ctypes(argv)) 

Ceci, cependant, produit une erreur de segmentation. Quelqu'un a des idées sur ce qui se passe ici?

MISE À JOUR Il y avait une faute de frappe dans ma question, de couper et coller, problème est toujours là!

Répondre

1

Il ne ressemble pas à la structure de votre réécrite de configuration est le même que celui d'origine. Si vous le passez d'avant en arrière, l'alignement serait désactivé.

Editer: Je vois que vous avez fixé une partie de celui-ci. Mais je ne suis pas sûr que c_char_p soit le même que char **.

+0

Vous avez raison, le membre entier était manquant. Je l'ai édité maintenant, mais c'était juste moi qui ai du mal à couper et coller! Merci! – Jose

2

char ** correspond à POINTER (c_char_p), sans c_char_p.

Questions connexes