gpt4 book ai didi

Python 无法使用 Python 的 ctypes 读取包含 char 数组的结构

转载 作者:行者123 更新时间:2023-11-28 17:14:33 24 4
gpt4 key购买 nike

我用 C 写了一个小的 dll,这是我的 .c 文件。

struct my_struct
{
char arr[3];
};
__declspec(dllexport) struct my_struct func()
{
struct my_struct m;
m.arr[0] = 1;
m.arr[1] = 2;
m.arr[2] = 3;
return m;
};
//compiled to testdll.dll

我尝试使用 python 调用导出的 c 函数。这是我的 .py 文件。

from ctypes import *


class MyStruct(Structure):
_fields_ = [("arr", c_char * 3)]


f = cdll.testdll.func
f.restype = MyStruct

for i in f().arr:
print(i)

当我尝试读取返回的 c 结构中的数组时,我总是得到随机值。

但如果我在 .cpp 和 .py 文件中使用 int 数组而不是 char 数组,我可以按预期获得正确的值。为什么?

Error when using ctypes module to acess a DLL written in C相关问题在这里,我想我不应该在这里按值返回结构,因为如何返回结构是实现定义的。

最佳答案

我能够通过将返回类型声明为 POINTER(MyStruct) 来获得正确的值,因此 Python 似乎将返回结构视为返回指向该结构的指针。返回结构的一种更自然的方式是将其作为输出参数返回。我在下面给出了这两个示例。

正如您所说,使用 func.restype = MyStruct 可以将 c_int * 3 作为结构成员,但我只找到了 func.restype = POINTER当结构用作返回值时,(MyStruct) 适用于 c_char * 3c_int * 3 成员。

测试.c

struct my_struct
{
char arr[3];
};

__declspec(dllexport) struct my_struct func()
{
struct my_struct m = {1,2,3};
return m;
};

__declspec(dllexport) void func2(struct my_struct* m)
{
m->arr[0] = 4;
m->arr[1] = 5;
m->arr[2] = 6;
};

测试.py

from ctypes import *

class MyStruct(Structure):
_fields_ = ('arr',c_char * 3),

dll = CDLL('test')

func = dll.func
func.argtypes = None
func.restype = POINTER(MyStruct)

func2 = dll.func2
func2.argtypes = POINTER(MyStruct),
func2.restype = None

x = func()
print(x.contents.arr[0],x.contents.arr[1],x.contents.arr[2])

m = MyStruct()
func2(m)
print(m.arr[0],m.arr[1],m.arr[2])

输出

1 2 3
4 5 6

关于Python 无法使用 Python 的 ctypes 读取包含 char 数组的结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45135495/

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