![]() |
|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Заблокирован
Регистрация: 11.11.2016
Сообщений: 261
|
![]()
Мне нужно получить порцию данных из базы SQLite. Для этого я вызываю функцию:
Код:
И у меня есть недописанный класс, в котором предполагается хранить результаты запроса: Код:
Сейчас я думаю про классический сишный вариант - обернуть query_result в структуру и передать ее адрес. Пытался использовать shared_ptr, но он не кастуется в void *. Что делать? |
![]() |
![]() |
![]() |
#2 |
Форумчанин
Регистрация: 12.04.2017
Сообщений: 889
|
![]()
В аргумент data обычно предполагается передать указатель на какую-то вашу структуру, которую заполнит функция. Можно рассматривать саму ф. калбек, как статик мембер, которому дают указатель на объект (дата).
...сам эту фигню не люблю, в Lua есть подобное, я изменил дефайн калбека на std::function и перекомпилировал - теперь свободно передаются любые ф. и лямбды в луа у меня ![]() ...еще в эти сишные ф. можно передать мемберы класса, но с ограничением - прийдется делать через шаблоны и нумеровать их вручную уникально. Вот пример рабочий - лямбда идет в сишный калбек (каждая "новая" такая лямбда, т.е. вызов С ф./ lambdacb::to_callback , должна иметь уникальный ID для всего проекта): Код:
Код:
Последний раз редактировалось alexzk; 19.06.2017 в 13:06. |
![]() |
![]() |
![]() |
#3 |
Старожил
Регистрация: 13.07.2012
Сообщений: 6,331
|
![]()
В query_result добавить shared_ptr и передавать указатель на query_result, которая должна создаваться и удаляться автоматически, скрыто от пользователя.
|
![]() |
![]() |
![]() |
#4 | |
Форумчанин
Регистрация: 12.04.2017
Сообщений: 889
|
![]() Цитата:
![]() Т.е. передавать в ф. указатель просто так нельзя - сразу встает проблема времени жизни в полный рост и отслеживания, например, не удалил ли shared_ptr память, которая для калбека в другом потоке. Хотя, если вызов гарантировано блокирующий (т.е. нет параллельности), то можно и так: Код:
Последний раз редактировалось alexzk; 19.06.2017 в 13:28. |
|
![]() |
![]() |
![]() |
#5 |
Старожил
Регистрация: 13.07.2012
Сообщений: 6,331
|
![]() |
![]() |
![]() |
![]() |
#6 |
Заблокирован
Регистрация: 11.11.2016
Сообщений: 261
|
![]()
>А вот тут жутко черная магия
По-моему, это просто портянка копрокода. Из-за такого когда и говорят о том, что хаскель лучше крестов. А что насчет производительности такого кода по сравнению с аналогом на ФП-языках? |
![]() |
![]() |
![]() |
#7 | |
Форумчанин
Регистрация: 12.04.2017
Сообщений: 889
|
![]() Цитата:
Ладно, я че, я нече ![]() Последний раз редактировалось alexzk; 19.06.2017 в 16:58. |
|
![]() |
![]() |
![]() |
#8 |
Старожил
Регистрация: 13.07.2012
Сообщений: 6,331
|
![]() |
![]() |
![]() |
![]() |
#9 |
Форумчанин
Регистрация: 12.04.2017
Сообщений: 889
|
![]()
ну попробуйте
![]() Вобщем темплейт выше все это и делает. Последний раз редактировалось alexzk; 20.06.2017 в 05:07. |
![]() |
![]() |
![]() |
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Ошибка при выполнении запроса | dima_r | SQL, базы данных | 6 | 14.04.2011 17:47 |
Try и except при выполнении запроса с ошибкой | Droid | БД в Delphi | 4 | 17.04.2010 19:10 |
Ошибка при выполнении запроса | Шани | БД в Delphi | 4 | 27.07.2007 13:04 |
Ошибка при выполнении запроса | Elena | БД в Delphi | 3 | 14.06.2007 15:13 |
Ошибка при выполнении запроса | Elena | БД в Delphi | 2 | 25.05.2007 16:19 |