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.

Était-ce utile?

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.

Suivez les conseils :

  

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top