gpt4 book ai didi

python - 使用 ctypes (Python->C++) 提交 'int' 和 'string' 数组

转载 作者:太空狗 更新时间:2023-10-30 02:32:28 25 4
gpt4 key购买 nike

我有一个简单的工作程序,它从 Python 函数向 提交一个 int(示例中的 num_piezas) C++函数。

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

我做错了什么?我是否需要执行其他操作才能将 intstring 数组作为参数传递?提前致谢。

最佳答案

你可以逃避这个修改:

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 数组,我建议您更改函数定义:void Bar( int num, char* piezas, int len_piezas, char** prio , int len_prio_elem, int prio);.它要长得多,但如果要避免缓冲区溢出,则必须控制输入数组的长度。

关于python - 使用 ctypes (Python->C++) 提交 'int' 和 'string' 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18101215/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com