4

私の問題を説明するために、簡単な C++ プログラムを作成しました。

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

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

私はこれをそうにコンパイルします。pythonから私は呼び出します:

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

これを実行すると、出力は次のようになります。

bye
hi
hi
hi
hi

私は期待しました:

bye
hi
bye
bye
bye

私は何が欠けていますか?

ありがとう。

4

2 に答える 2

8

文字で初期化した文字列と"bye"、そのアドレスを取得して割り当て続けている文字列charPは、初回以降は再初期化されません。

ここのアドバイスに従ってください:

ただし、変更可能なメモリへのポインターを期待する関数にそれらを渡さないように注意する必要があります。変更可能なメモリ ブロックが必要な場合、ctypes にはさまざまな方法でこれらを作成する create_string_buffer 関数があります。

「変更可能なメモリへのポインター」はまさにC関数が期待するものであるためcreate_string_buffer、ドキュメントで説明されているように、関数を使用してそのバッファーを作成する必要があります。

于 2009-12-09T03:25:22.430 に答える
2

私は、Pythonが5回のパスすべてで同じバッファを再利用していると推測しています。一度「こんにちは」に設定すると、「さようなら」に戻すことはできません。次のようなことができます。

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

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

ただし、注意strcpyしてください。バッファオーバーフローを要求しているだけです

于 2009-12-09T03:17:30.410 に答える