/ Изпращане на структура, съдържаща променлив низ в C от Python чрез ctypes - python, ctypes

Изпраща структурата, съдържаща подменструален низ на C от Python през ctypes - python, ctypes

Имам структура, която съдържа символен масив от страна C

stuct s
{
int x;
char buffer[100];
}

и на моята питон страна определям

class myS(ctypes.Structure):
_fields_ = [("x", c_int),
("buffer",type(create_string_buffer(100)))]

Сега, когато го правя

buf = create_string_buffer(64)
s1 = myS(10,buf)

Това ми дава грешка

TypeError: expected string or Unicode object, c_char_Array_100 found

Искам низ, който ще бъде променен от моята функция C. как да го направим?

Отговори:

1 за отговор № 1

Вие не трябва да създавате буфер. Буферът е в структурата, когато го инстанцирате.

Ето бърз DLL:

#include <string.h>

struct s
{
int x;
char buffer[100];
};

__declspec(dllexport) void func(struct s* a)
{
a->x = 5;
strcpy(a->buffer,"here is the contents of the string.");
}

И тук е кодът на Python да го извика:

import ctypes

class myS(ctypes.Structure):
_fields_ = [
("x", ctypes.c_int),
("buffer",ctypes.c_char * 100)]

s1 = myS()
dll = ctypes.CDLL("test")
dll.func(ctypes.byref(s1))
print s1.buffer
print s1.x

изход:

here is the contents of the string.
5

1 за отговор № 2

Можете да присвоите нормален Python низ на поле 100 * c_char:

class myS(ctypes.Structure):
_fields_ = [("x", c_int),
("buffer", 100*c_char)]

s1 = myS(10, "foo")
s1.buffer = "bar"

Ако обаче имате обект с буферен низ, можете да вземете неговата стойност:

buf = create_string_buffer(64)
s1 = myS(10,buf.value)

Имайте предвид и това

>>> type(create_string_buffer(100)) == 100*c_char
True