Уведомления

Группа в Telegram: @pythonsu

#1 Апрель 2, 2010 10:54:52

dervish_candela
От:
Зарегистрирован: 2010-04-02
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

как в ctypes получить от функции что-то посложнее инта?

я хочу передать из длл-лки структуру. как это сделать? рыл реф по ctypes, написано как определять типы. ну определил я структуру, ну и что дальше? :) об этом там что-то молчок.



Офлайн

#2 Апрель 2, 2010 13:18:21

Kogrom
От:
Зарегистрирован: 2009-12-03
Сообщения: 160
Репутация: +  0  -
Профиль   Отправить e-mail  

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



Офлайн

#3 Апрель 2, 2010 13:29:30

dervish_candela
От:
Зарегистрирован: 2010-04-02
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

как в ctypes получить от функции что-то посложнее инта?

ахахахаха работает! огромное спасибо!
а почему это «не очень правильно»?

теперь сижу думаю, что лучше сделать - вернуть из длл-ки указатель на весь массив структур (это 16 мегов), или же просто запрашивать поштучно. пока буду делать второй вариант (тем более что вот уже работает :)



Офлайн

#4 Апрель 2, 2010 14:11:33

Kogrom
От:
Зарегистрирован: 2009-12-03
Сообщения: 160
Репутация: +  0  -
Профиль   Отправить e-mail  

как в ctypes получить от функции что-то посложнее инта?

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

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

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

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



Офлайн

#5 Апрель 2, 2010 14:34:52

dervish_candela
От:
Зарегистрирован: 2010-04-02
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

как в ctypes получить от функции что-то посложнее инта?

ну это вроде не критично (все равно я бы использовал С++ там, где производительность критична)

угх @ стековые кадры. спасибо за попытку помочь, но это когда начинаются стеки, кончается мыслительный ресурс моего мозга.
(я с С++ то затем и сбежал, чтобы не пришлось лишний раз путаться во всяком бойлерплейте. смысла затевать это в питоне, где это выходит сложнее и неуклюжее, лично мне (к счастью) нет. если что, просто вернусь на С++, оставив в питоне только интерфейсную часть)



Офлайн

#6 Апрель 2, 2010 15:07:03

Kogrom
От:
Зарегистрирован: 2009-12-03
Сообщения: 160
Репутация: +  0  -
Профиль   Отправить e-mail  

как в ctypes получить от функции что-то посложнее инта?

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

Но вообще, это всё тонкости, конечно.



Офлайн

#7 Апрель 2, 2010 15:25:03

dervish_candela
От:
Зарегистрирован: 2010-04-02
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

как в ctypes получить от функции что-то посложнее инта?

о, кстати, я ж теперь могу и DWORD и прочий unsigned получать по-человечески…



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version