С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 02.04.2017
Сообщений: 7
1

Указатель на функцию с передачей параметров

09.06.2020, 21:51. Показов 999. Ответов 8
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Есть библиотека https://github.com/evert-arias/EasyBuzzer
в которой можно вызвать коллбэк как указатель на функцию, без параметров.
А мне нужно передать в нее локальные переменные в качестве параметра.
Пробовал воспользоваться лямбда выражением, но захват переменных не работает, как это можно обойти?
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
String step= "open";
 
EasyBuzzer.beep(
      frequency
     ,onDuration
     ,offDuration
     ,beeps
     ,pauseDuration 
     ,cycles 
     ,[&step]() { 
         Serial.print("ok");                       
 
          buzzer_done_callback(step);
                        
     }
);
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.06.2020, 21:51
Ответы с готовыми решениями:

Описать функцию типа void с передачей параметров по ссылке или указателю POWERA234(A,B,C,D), вычисляющую вторую, третью
Описать функцию типа void с передачей параметров по ссылке или указателю POWERA234(A,B,C,D),...

Создать функцию типа void с передачей параметров по ссылке или указателю, которая определяет площадь круга по его радиус
Создать функцию типа void с передачей параметров по ссылке или указателю, которая определяет...

Описать функцию типа void с передачей параметров по ссылке или указателю, заменяющую в тексте все малые буквы после точк
Описать функцию типа void с передачей параметров по ссылке или указателю, заменяющую в тексте все...

Как передать в функцию в качестве параметров указатель на файл
В общем есть функция (Copy_System_Files_To_New_System_Files), которая должна делать 4 раза одно и...

8
19409 / 10028 / 2443
Регистрация: 30.01.2014
Сообщений: 17,678
09.06.2020, 22:03 2
2048bit, форкнуть библиотеку, добавить те возможности, которых вам не хватает.

Автор библиотеки не оставил простора для маневра, поэтому только так.
0
4264 / 3323 / 925
Регистрация: 25.03.2012
Сообщений: 12,520
Записей в блоге: 1
09.06.2020, 22:18 3
DrOffset, Я не понимаю, а зачем такие громкие слова? Автору нужно просто забайндить какие-то переменные вместо параметров его функции, он даже сам написал один из вариантов.
Это замечательное решение, что не так-то?
автор хочет, чтобы в каждый вызов эжтой функции передовалось одно и то же слово step, так?
ну вот и замечательно.
0
19409 / 10028 / 2443
Регистрация: 30.01.2014
Сообщений: 17,678
09.06.2020, 22:22 4
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Это замечательное решение, что не так-то
Автор юзает чужую библиотеку, которая так делать, как он предложил, не позволяет.
0
6340 / 3511 / 1427
Регистрация: 07.02.2019
Сообщений: 8,977
09.06.2020, 22:58 5
Можно попробовать так нагвнокодить, только пока этот коллбэк зарегистрирован, не нужно менять функтор.
C++
1
2
3
4
5
6
7
8
9
10
11
static std::function<void()> fn1;
static void cb1()
{
    if (fn1) fn1();
}
 
//...
String step= "open";
fn1 = [&step] { /*...*/ };
// передаёшь cb1 как callback
//...
0
19409 / 10028 / 2443
Регистрация: 30.01.2014
Сообщений: 17,678
09.06.2020, 23:04 6
zayats80888, с глобальным состоянием каждый может. Только это не спортивно.
1
zayats80888
09.06.2020, 23:06
  #7

Не по теме:

Цитата Сообщение от DrOffset Посмотреть сообщение
Только это не спортивно.
А я ни с кем не соревнуюсь, не дорос ещё :)

0
19409 / 10028 / 2443
Регистрация: 30.01.2014
Сообщений: 17,678
09.06.2020, 23:42 8
Лучший ответ Сообщение было отмечено 2048bit как решение

Решение

Автор библиотеки "запилил" кривой интерфейс. Для минимальной поддержки обратного вызова должен быть void*-параметр userdata хотя бы. Это банально хороший тон. Такого параметра у автора нет.
Разумным будет либо просто форкнуть библиотеку к себе в проект, благо она совсем маленькая, и исправить там. Либо закинуть pull-реквест автору, чтобы расширить функциональность. Уже с void*-параметром можно извернуться и передать адаптер лямбды или чего-то еще, не говоря уж про более прямые решения.
2
6340 / 3511 / 1427
Регистрация: 07.02.2019
Сообщений: 8,977
09.06.2020, 23:54 9
Цитата Сообщение от DrOffset Посмотреть сообщение
Разумным будет либо просто форкнуть библиотеку к себе в проект, благо она совсем маленькая, и исправить там.
++
Я что-то даже не посмотрел, там один класс всего на 200 строчек кода. "Библиотека" - это громко сказано
0
09.06.2020, 23:54
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.06.2020, 23:54
Помогаю со студенческими работами здесь

В функцию передается несколько целых чисел. Создать из всех параметров динамический массив и вернуть указатель
В функцию передается несколько целых чисел. Создать из всех параметров динамический массив и...

Как сделать функцию, возвращающую указатель на функцию (которая в свою очередь возвращает указатель на массив)
Изучаю c++ по одной книжке.Она говорить не умеет.. Так вот понадобилось написать функцию,которая...

Ссылка с передачей параметров
Помогите пожалуйсто решить задачу: есть index1.html там при клике на &lt;a...

Проблема с передачей параметров
Вот опять... Есть класс, и форма, и мди контейнер формы... Вот код класса(точнее та часть которая...

Проблема с передачей параметров по GET
суть проблемы в следующем - есть форма и нужно передать данные из нее по методу GET - проблема...

Удаление файлов с передачей параметров
Передаю три аргумента, путь к папке, период по времени старше которого нужно удалять файлы и...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru