Форум сайта python.su
я хочу передать из длл-лки структуру. как это сделать? рыл реф по ctypes, написано как определять типы. ну определил я структуру, ну и что дальше? :) об этом там что-то молчок.
Офлайн
Сейчас проверить не могу, но теоретически примерно так:
from ctypes import cdll, c_int, c_double, Structure, c_char
class MyStruct(Structure):
_pack_ = 1
_fields_ = [("data0", c_char * 10),
("data1", c_char * 7),
]
my_func = cdll.my_dll.my_func
my_func.argtypes = [c_int, c_double]
my_func.restype = MyStruct
Офлайн
ахахахаха работает! огромное спасибо!
а почему это «не очень правильно»?
теперь сижу думаю, что лучше сделать - вернуть из длл-ки указатель на весь массив структур (это 16 мегов), или же просто запрашивать поштучно. пока буду делать второй вариант (тем более что вот уже работает :)
Офлайн
dervish_candelaЧто-то сходу я не нашёл материалов по данной теме, но мне представляется так. Когда вызывается какая-то функция, то в стеке выделяется память для адреса возврата, аргументов (в том числе и для возвращаемого значения), локальных данных и т.п. И эта память будет выделена до конца работы функции.
а почему это «не очень правильно»?
Офлайн
ну это вроде не критично (все равно я бы использовал С++ там, где производительность критична)
угх @ стековые кадры. спасибо за попытку помочь, но это когда начинаются стеки, кончается мыслительный ресурс моего мозга.
(я с С++ то затем и сбежал, чтобы не пришлось лишний раз путаться во всяком бойлерплейте. смысла затевать это в питоне, где это выходит сложнее и неуклюжее, лично мне (к счастью) нет. если что, просто вернусь на С++, оставив в питоне только интерфейсную часть)
Офлайн
dervish_candelaТак я про C++ и рассказывал. Или даже про C без плюсов. Скорее всего dll-ка на них написана. На пересечениях языков надо учитывать их особенности. Если посмотреть стандартные функции C/C++, то среди них нет таких, которые возвращали бы сложные объекты. Везде используют для этого указатели или ссылки. Это неспроста :)
ну это вроде не критично (все равно я бы использовал С++ там, где производительность критична)
Офлайн
о, кстати, я ж теперь могу и DWORD и прочий unsigned получать по-человечески…
Офлайн