使用cType(Python > C++)提交“int”和“string”数组

2024-10-01 15:40:53 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个简单的工作程序,它从一个Python函数向一个C++函数提交一个intnum_piezas)。在

食品.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); }
}

食品包装器.py

^{pr2}$

现在我想发送一个int数组和一个char数组以及这个数字。所以我试着:

食品.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); }
}

食品包装器.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

我做错什么了?我还需要做些什么来传递intstring数组作为参数吗? 提前谢谢。在


Tags: 函数pyselfnumbernewfoolibbar
2条回答

您需要使用CFUNCTYPE定义一个函数原型(阅读文档),然后使用新类型包装函数,之后您将获得类型化函数。每次要使用带参数的c-function或返回类型与int不同时,都必须这样做

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

你可以通过这种修改来逃脱惩罚:

from ctypes import c_int, c_char

...

# create a 3-int array
piezas = (c_int*3)()
piezas[0] = 1
piezas[1] = 2
piezas[2] = 3

# create a 3-(20-char array) array
prio = ((c_char*20)*3)()
prio[0].value = "normal"
prio[1].value = "baja"
prio[2].value = "primera pieza"

但由于您在C++侧部分处理char数组,所以建议您更改函数定义:^ {< CD1>}。它要长得多,但是如果要避免缓冲区溢出,就必须控制输入数组的长度。在

相关问题 更多 >

    热门问题