Frage

Ich schrieb ein einfaches C ++ Programm, mein Problem zu veranschaulichen:

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

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

ich kompilieren diese in eine so. Von Python Ich nenne:

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

Als ich das laufen, meine Ausgabe lautet:

bye
hi
hi
hi
hi

ich erwartet hatte:

bye
hi
bye
bye
bye

Was bin ich fehlt?

Danke.

War es hilfreich?

Lösung

Die Zeichenfolge, die Sie mit dem Zeichen "bye" initialisiert und deren Adresse, die Sie immer wieder zu nehmen und charP zuweisen, nicht nach dem ersten Mal neu initialisiert erhalten.

Beachten Sie die Hinweise hier :

  

Sie sollten vorsichtig sein, jedoch nicht auf   geben sie nicht an Funktionen erwarten   Zeiger auf änderbare Speicher. Wenn du   müssen wandelbar Speicherblöcke, ctypes hat   eine Funktion, die create_string_buffer   schafft diese auf verschiedene Weise.

Ein „Zeiger auf änderbare Speicher“ ist genau das, was Ihre C-Funktion erwartet, und so sollten Sie die create_string_buffer Funktion verwenden, um diese Puffer zu schaffen, wie die Dokumentation erklären.

Andere Tipps

Ich vermute, Python ist die Wiederverwendung der gleichen Puffer für alle 5 Pässe. wenn Sie es auf „hallo“ gesetzt, können Sie es nie auf „bye“ zurückwerfen können Sie etwas tun:

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

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

aber vorsichtig sein, strcpy ist nur für einen Pufferüberlauf zu fragen

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top