Помогите с указателями на функцию
- Войдите на сайт для отправки комментариев
Есть функция чтения значения аналогового пина
int solid_read(int pin) { int val = analogRead(pin);// считываем значение val = map(val, 0 , 1023, 100, 0); return val; // выводим полученное значение }
Есть функция меню
void up_down_eeprom_var( int var ) { int x =0; lcd.clear(); //очищаем экран delay(del); while(1) { x++; if (x>interval){break;} lcd.print(" now="); lcd.print(var); }}
Как правильно передеть функции void up_down_eeprom_var(int var ) указатель на функцию int solid_read(int pin) (параметр int var)? чтобы внутри функции up_down.. читалось значение функции solid_read при каждой итерации цикла while?
Что делал:
создал указатель на функцию :
int (*pi)(int); void setup() { pi = &solid_read;
Далее вызываю функцию void up_down_eeprom_var(pi(0))
и в lcd.print(var); выводит статичное значение, которое не меняется... ) Если подставить вместо lcd.print(var); -> lcd.print(pi(0)); то всё ок,функция читается, но так мне не нужно т.к. есть много других функций которые мне надо туда передавать.... , ; второй вечер сижу голову ломаю...как полноценно читать функцию solid_read(int pin) внутри функции void up_down_eeprom_var( int var )? посредством указателей?=) надеюсь объяснил понятно =)
Как-то так
не работает...
Из текущего проекта
не могли бы вы пояснить что-куда-откуда, а то не понятно..
не могли бы вы пояснить что-куда-откуда, а то не понятно..
Так написано ж - ScanOneWire(TestOneWireDev)! Соответственно в ScanOneWire передаем указатель на TestOneWireDev и оно там его того.
Спрашуйте конкретней, что не понятно.
dachnik, тебе вроде нужно вместе с указателем на функцию еще и её параметр передать... сделай так:
может надо просто вызвать функцию где надо?
хотя с твоими кусками кода не понятно какого хрена ты вообще хочешь сделать
ни вызова функций нихрена нет, зачем тебе вообще указатели?
2 функции нельзя никуда передавать!!! функция это алгоритм действия над чемто (данными) как? да и зачем? их кудато передавать!
Задачу нормально сформулируй! и код нормальный дай!!
хотя готов догадаться что должно быть так
Всем спасибо за советы, но выручила книжка по плюсам
Единственное, пока научился передавать функцию, не имеющую параметров, а как скажем передать функцию, которая была описана в первом посте:
?
Сообщение #6
temp_in()
прямо внутри
? цель твоих действий?
Цель такова что эта функция up_down_eeprom_var служит для вызова разных настроек меню и является универсальной функцией для настройки энергонезависимой памяти контролера. Датчиков много функция одна. Экономия места и простота добавления новых устройств.
Сообщение #6
Еще один лишний параметр. Можно вместе с указателем передавать...главное правильно синтаксис написать. А с этим проблема компилятор ругается
типа примитивный вариант обработчика событий ))
только вот я не не пойму о каких аргументах ты толкуешь, откуда этой функции которая всё вызывает должна знать аргументы, даже чисто логически не может знать, она и должна аргументы раздавать или запрашивать их откудато
Сообщение #6
Еще один лишний параметр. Можно вместе с указателем передавать...главное правильно синтаксис написать. А с этим проблема компилятор ругается
И? Исходник и копия ошибки. Если нет, то разбирайся сам, не вопрос.
Единственное, пока научился передавать функцию, не имеющую параметров, а как скажем передать функцию, которая была описана в первом посте:
Чем не устроило сообщение номер 7? Чукча не читатель?
не компилится...
Вот спецом взял и скомпилировал:
Запустил, как ожидалось, в мониторе порта появилось:
Не компилируется, мдя... Конечно, если не думать и дописать в строчке
Что-то типа
То компилироваться перестанет - с чего бы это, Карл?
всё равно
всё равно
Блин. Это ж пример! Понимаете? ПРИ-МЕ-Р! Вы бездумно его вставили в свой код и хотите, чтобы заработало? Я не переписывал имена ваших функций, например. Ещё раз говорю: скетч компилируется. Что и куда вы вставили - вопрос: вы же не приводите ни строчки кода, который вы изменили!
Вижу лишь, что вы неправильно применяете пример, судя по
Если действительно хотите разобраться - либо давайте сюда кусок изменённого кода, который не компилируется, либо - читайте учебники по С++, в частности, про указатели, в частности - про указатели на функции.
Иначе всё это - разговор глухого с немым - понадёргают кусков кода, а потом - не компилируется. Вы хоть пробовали сделать так, как я писал: создать новый скетч, вставить туда мой код и убедиться в мониторе порта, что внутри eeprom_read_var вызывается функция, переданная по указателю на неё в eeprom_read_var? Проще уже некуда написать - посмотрите, что выводится в Serial.