ctypes python: initialiser (c_char_p)
-
18-09-2019 - |
Question
J'ai écrit un programme simple C ++ pour illustrer mon problème:
extern "C"{
int test(int, char*);
}
int test(int i, char* var){
if (i == 1){
strcpy(var,"hi");
}
return 1;
}
Je compile 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 cours, ma sortie est:
bye
hi
hi
hi
hi
Je pensais:
bye
hi
bye
bye
bye
Qu'est-ce que je suis absent?
Merci.
La solution
La chaîne que vous initialisés avec les caractères "bye"
, et dont l'adresse que vous continuez à prendre et l'affectation à charP
, ne soit pas re-initialisé après la première fois.
Vous devez être prudent, cependant, de ne pas les transmettre aux fonctions attente pointeurs vers la mémoire mutable. Si vous besoin des blocs de mémoire mutables, a ctypes une fonction qui create_string_buffer crée ces 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.
Autres conseils
Je suppose 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 juste demander un dépassement de mémoire tampon