2009-12-09 12 views
1

j'ai écrit un programme simple C++ pour illustrer mon problème:Python ctypes: initialisation c_char_p()

extern "C"{ 
    int test(int, char*); 
} 

int test(int i, char* var){ 
    if (i == 1){ 
     strcpy(var,"hi"); 
    } 
    return 1; 
} 

Je compilent cela en une sorte. De python j'appelle:

from ctypes import * 

libso = CDLL("Debug/libctypesTest.so") 
func = libso.test 
func.res_type = c_int 

for i in xrange(5): 
    charP = c_char_p('bye') 
    func(i,charP) 
    print charP.value 

Quand je lance, ma sortie est:

bye 
hi 
hi 
hi 
hi 

Je me attendais:

bye 
hi 
bye 
bye 
bye 

Qu'est-ce que je manque?

Merci.

Répondre

7

La chaîne que vous avez initialisé avec les caractères "bye" et dont vous continuez à prendre l'adresse et à l'affecter à charP, ne s'initialise pas après la première fois.

Suivez les conseils here: cependant,

Vous devez être prudent, de ne pas les transmettre aux fonctions pointeurs vers attente mémoire mutable. Si vous avez besoin de blocs de mémoire mutables, ctypes a une fonction create_string_buffer qui les crée de diverses manières.

Un « pointeur vers la mémoire mutable » est exactement ce que votre fonction C attend, et vous devez donc utiliser la fonction create_string_buffer pour créer cette mémoire tampon, comme les documents expliquent.

+0

Merci, en le remplaçant par charP = create_string_buffer ("bye"), corrige mon problème. J'aurais dû mieux examiner les docs. – Mark

2

Je suppose que python réutilise le même tampon pour les 5 passes. une fois que vous réglez sur « salut », vous ne réglez revenir à « revoir » Vous pouvez faire quelque chose comme ceci:

extern "C"{ 
    int test(int, char*); 
} 

int test(int i, char* var){ 
    if (i == 1){ 
     strcpy(var,"hi"); 
    } else { 
     strcpy(var, "bye"); 
    } 
    return 1; 
} 

mais attention, strcpy est tout simplement demander un dépassement de mémoire tampon

+0

Bon appel à propos de la strcpy et du débordement, la réponse d'Alex ci-dessous devrait également résoudre le problème, je ferai juste en sorte que mon tampon soit assez grand. – Mark

Questions connexes