4

関数から関数にint(num_piezas例では)を送信する単純な作業プログラムがあります。PythonC++

foo.cpp

#include <iostream>

class Foo{
    public:
        void bar(int number){
            printf("Number is: %d\n", number);
        }
};

extern "C" {
    Foo* Foo_new(){ return new Foo(); }
    void Foo_bar(Foo* foo, int number){ foo->bar(number); }
}

fooWrapper.py

from ctypes import cdll
lib = cdll.LoadLibrary('./libfoo.so')

class Foo(object):
    def __init__(self):
        self.obj = lib.Foo_new()

    def bar(self, num_piezas):
        lib.Foo_bar(self.obj, num_piezas)

num_piezas = 5    
f = Foo()
f.bar(num_piezas)

問題は、その番号とともにint配列と配列を送信したいということです。charだから私は試しました:

foo.cpp

#include <iostream>
#include <string.h>

class Foo{
    public:
        void bar(int number, int piezas[3], char prioridades[3][20]){
            printf("Number is: %d\n", number);
            for(int i=0;i<3;i++) {
                printf("%d", piezas[i]);
            }
            for(int q=0;q<3;q++) {
                printf("%s ", prioridades[q]);
            }
        }
};

extern "C" {
    Foo* Foo_new(){ return new Foo(); }
    void Foo_bar(Foo* foo, int number, int piezas[3], char prioridades[3][20]){ foo->bar(number, piezas, prioridades); }
}

fooWrapper.py

from ctypes import cdll
lib = cdll.LoadLibrary('./libfoo.so')

class Foo(object):
    def __init__(self):
        self.obj = lib.Foo_new()

    def bar(self, num_piezas, piezas, prioridades):
        lib.Foo_bar(self.obj, num_piezas, piezas, prioridades)

piezas = [1, 2, 3]
prioridades = ['normal', 'baja', 'primera pieza']
num_piezas = 5    
f = Foo()
f.bar(num_piezas, piezas, prioridades)

C++ファイルは正しくコンパイルされますが、Python 関数 ( ) を実行しようとすると、次のpython fooWrapper.pyエラー メッセージが表示されます。

Traceback (most recent call last):
  File "fooWrapper.py", line 15, in <module>
    f.bar(num_piezas, piezas, prioridades)
  File "fooWrapper.py", line 9, in bar
    lib.Foo_bar(self.obj, num_piezas, piezas, prioridades)
ctypes.ArgumentError: argument 3: <type 'exceptions.TypeError'>: Don't know how to convert parameter 3

私が間違っていることは何ですか?それと配列をパラメーターとして渡すために何か他のことをする必要がありintますか? string前もって感謝します。

4

2 に答える 2

1

CFUNCTYPE (ドキュメントを読む) を使用して関数プロトタイプを定義し、新しい型を使用して関数をラップする必要があります。その後、型付き関数を取得します。args または int とは異なる型を返す c-function を使用するたびに、これを行う必要があります。

http://docs.python.org/2/library/ctypes.html#function-prototypes

http://docs.python.org/2/library/ctypes.html#callback-functions

Python リストと C 配列は異なります。Pythonでc-arrayタイプを定義できます。ここを読んでください:

http://docs.python.org/2/library/ctypes.html#arrays

于 2013-08-07T11:16:01.900 に答える