Найти - Пользователи
Полная версия: как в ctypes получить от функции что-то посложнее инта?
Начало » Python для новичков » как в ctypes получить от функции что-то посложнее инта?
1
dervish_candela
я хочу передать из длл-лки структуру. как это сделать? рыл реф по ctypes, написано как определять типы. ну определил я структуру, ну и что дальше? :) об этом там что-то молчок.
Kogrom
Сейчас проверить не могу, но теоретически примерно так:

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
Хотя, наверное, структуру возвращать не очень правильно. Лучше для неё определить указатель среди параметров функции.
dervish_candela
ахахахаха работает! огромное спасибо!
а почему это «не очень правильно»?

теперь сижу думаю, что лучше сделать - вернуть из длл-ки указатель на весь массив структур (это 16 мегов), или же просто запрашивать поштучно. пока буду делать второй вариант (тем более что вот уже работает :)
Kogrom
dervish_candela
а почему это «не очень правильно»?
Что-то сходу я не нашёл материалов по данной теме, но мне представляется так. Когда вызывается какая-то функция, то в стеке выделяется память для адреса возврата, аргументов (в том числе и для возвращаемого значения), локальных данных и т.п. И эта память будет выделена до конца работы функции.

Если учесть, что мы уже приготовили память для возвращаемого значения (для структуры), то получится избыточное использование памяти. Иногда это “спички”, но в случае со структурами это может быть не очень оптимально.

Возможно, лучше было бы, чтобы функция выделила память в куче и вернула указатель. Но тут будет возня с управлением памятью…

Как-то так. Но лучше бы найти информацию в более надёжном источнике. Возможно, мои представления устарели. Пока я нашёл только это:
http://ru.wikipedia.org/wiki/Стековый_кадр
dervish_candela
ну это вроде не критично (все равно я бы использовал С++ там, где производительность критична)

угх @ стековые кадры. спасибо за попытку помочь, но это когда начинаются стеки, кончается мыслительный ресурс моего мозга.
(я с С++ то затем и сбежал, чтобы не пришлось лишний раз путаться во всяком бойлерплейте. смысла затевать это в питоне, где это выходит сложнее и неуклюжее, лично мне (к счастью) нет. если что, просто вернусь на С++, оставив в питоне только интерфейсную часть)
Kogrom
dervish_candela
ну это вроде не критично (все равно я бы использовал С++ там, где производительность критична)
Так я про C++ и рассказывал. Или даже про C без плюсов. Скорее всего dll-ка на них написана. На пересечениях языков надо учитывать их особенности. Если посмотреть стандартные функции C/C++, то среди них нет таких, которые возвращали бы сложные объекты. Везде используют для этого указатели или ссылки. Это неспроста :)

Но вообще, это всё тонкости, конечно.
dervish_candela
о, кстати, я ж теперь могу и DWORD и прочий unsigned получать по-человечески…
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB