Целый день мучаюсь и не получается реализовать сишный список:
typedef struct List List;
typedef struct List
{
unsigned char message;
void* data;
List* next;
};
Как все это сделать на питоне через ctypes?
Вот как я пробовал:
# Объявляем нашу структуру таким образом, чтоб можно было ссылаться на саму себя
class MessageStruct(ctypes.Structure):
pass
MessageStruct._fields_ = [('message', ctypes.c_ubyte),
('data', ctypes.c_void_p),
('next', ctypes.POINTER(MessageStruct))]
struct = MessageStruct()
struct.message = ctypes.c_ubyte(0)
struct.data = ctypes.c_void_p(0)
struct.next = None
# Буду работать только с указателем на голову
struct_p = ctypes.pointer(struct)
Дальше я объявил 2 функции: добавления нового элемента и вывод списка:
def add_message(message_struct, message, data):
current_struct = message_struct
while current_struct.contents.next:
current_struct.contents = current_struct.contents.next
new_struct = MessageStruct()
new_struct.message = message
new_struct.data = data
new_struct.next = None
current_struct.contents.next = ctypes.pointer(new_struct)
def print_messages(message_struct):
current_struct = message_struct
while current_struct.contents:
print('message:', current_struct.contents.message,
'data:', current_struct.contents.data)
current_struct.contents = current_struct.contents.next
add_message(struct_p, 5, 0)
add_message(struct_p, 7, 0)
add_message(struct_p, 3, 0)
print_messages(struct_p)
message: 0 data: None
message: 0 data: None
message: 0 data: None
message: 0 data: None
message: 0 data: None
.....
Что я делаю не так?
Заранее спасибо!