Добавить указатели

itehno
Offline
Зарегистрирован: 18.04.2015

Добрый день. Требуется исполнитель для небольшой доработки:

В следующем сообщении код с комментариями.

itehno
Offline
Зарегистрирован: 18.04.2015
int16_t ledFP[] = {5, 6, 7};

void setup() {
for (int i = 0; i < 3; i++){
    pinMode(ledFP[i], OUTPUT);}
}

void loop() {
  action();
}

int hold(int16_t stoping) { // требуется добавить указатель на нужную функцию в качестве еще одного параметра
  int result;
  static uint32_t period = 0;
  static int16_t interspace = stoping;
  if ((millis() - period) > interspace) {
    f1();                   // тут необходима нужная функция (f1, f2, f3)
    period = millis();
    return result;
  }
}

void f1(){
  digitalWrite(ledFP[0],!digitalRead(ledFP[0]));
}

void f2(){
  digitalWrite(ledFP[1],!digitalRead(ledFP[1]));
}

void f3(){
  digitalWrite(ledFP[2],!digitalRead(ledFP[2]));
}

void action(){
  hold(500); // тут необходимо указывать в качестве второго параметра имя необходимой функции
}

Не смог разобраться с указателями

fridgetester
fridgetester аватар
Offline
Зарегистрирован: 09.02.2019

500000р., пишите в личку.

А если серьезно, то это вопрос по языку, а не по платформе ардуино. Вы легко можете получить безвозмездный ответ на любом форуме по C/C++ или даже в гугле.

itehno
Offline
Зарегистрирован: 18.04.2015

fridgetester пишет:

500000р., пишите в личку.

А если серьезно, то это вопрос по языку, а не по платформе ардуино. Вы легко можете получить безвозмездный ответ на любом форуме по C/C++ или даже в гугле.

Я не смог разобраться. Узнал много нового, но еще больше запутался. Читаю книгу - "Язык С Б.В. Керниган, Д.М. Ритчи", но там для чистого С. С программированием я столкнулся только начав плотно изучать Arduino.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Пджди до завтра, прикрутим тебе указателей жменю

negavoid
Offline
Зарегистрирован: 09.07.2016

Ога, две пачки.

void callee( int *data )
{
  int *i = data;
  Serial.println(*i);
}

void callee2( int *data )
{
  int *i = data;
  Serial.println(*i);
}

void caller( void ( *foo1 ) ( int* ), int *data )
{
  foo1(data);
}

void action()
{
  int hold = 10050;
  caller( callee, &hold );
  hold = 5010;
  caller( callee2, &hold );
}

 

Gas311
Gas311 аватар
Offline
Зарегистрирован: 06.12.2018

itehno пишет:

Добрый день. Требуется исполнитель для небольшой доработки:

В следующем сообщении код с комментариями.

Это похоже blink, только почему так запутано написан?

itehno
Offline
Зарегистрирован: 18.04.2015

Gas311 пишет:

itehno пишет:

Добрый день. Требуется исполнитель для небольшой доработки:

В следующем сообщении код с комментариями.

Это похоже blink, только почему так запутано написан?

Делаю "многозадачность". Задержка много где нужна.

itehno
Offline
Зарегистрирован: 18.04.2015

Еще раз доброго всем дня. Вот, что у меня получилось благодаря наводке negavoid

int16_t ledFP[] = {11, 8, 2};

void setup() {
  Serial.begin(9600);
for (int i = 0; i < 3; i++){
    pinMode(ledFP[i], OUTPUT);}
}

void loop() {
  action();
}

int hold(int *stoping, void(*foo1)()) {
  int result;
  static uint32_t period = 0;
  static int16_t interspace = stoping;
  if ((millis() - period) > interspace) {
    foo1();
    period = millis();
    return result;
  }
}

void f1(){
  Serial.println("1");
  digitalWrite(ledFP[0],!digitalRead(ledFP[0]));
}

void f2(){
  Serial.println("2");
  digitalWrite(ledFP[1],!digitalRead(ledFP[1]));
}

void f3(){
  Serial.println("3");
  digitalWrite(ledFP[2],!digitalRead(ledFP[2]));
}

void action(){
  hold(1000, f3);
}

Код работает, но меня смущает сообщение компилятора:

C:\Users\Администратор\Documents\Arduino\sketch_sep24a\sketch_sep24a.ino: In function 'int hold(int*, void (*)())':

C:\Users\Администратор\Documents\Arduino\sketch_sep24a\sketch_sep24a.ino:16:31: warning: invalid conversion from 'int*' to 'int16_t {aka int}' [-fpermissive]

C:\Users\Администратор\Documents\Arduino\sketch_sep24a\sketch_sep24a.ino: In function 'void action()':

C:\Users\Администратор\Documents\Arduino\sketch_sep24a\sketch_sep24a.ino:40:16: warning: invalid conversion from 'int' to 'int*' [-fpermissive]

C:\Users\Администратор\Documents\Arduino\sketch_sep24a\sketch_sep24a.ino:13:5: note:   initializing argument 1 of 'int hold(int*, void (*)())'

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

itehno пишет:
меня смущает сообщение компилятора:
И правильно делает, что смущает.

fridgetester
fridgetester аватар
Offline
Зарегистрирован: 09.02.2019

Меня тож кое-что смущает, а именно: ТС, ты случайно разделом не ошибся?

negavoid
Offline
Зарегистрирован: 09.07.2016

ЕвгенийП пишет:

itehno пишет:
меня смущает сообщение компилятора:

И правильно делает, что смущает.

О, оно ещё и скомпилировалось! Ну вообще :)))

Gas311
Gas311 аватар
Offline
Зарегистрирован: 06.12.2018

Это на юзера администратор ругается

C:\Users\Администратор\Documents\Arduino\sketch_sep24a\sketch_sep24a.ino:13:5: 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

fridgetester пишет:

ТС, ты случайно разделом не ошибся?

Да, он пытался в другом. Там ему DetSimen даже код готовый написал, но что-то не срослось. Наверное, подумал, что здесь лучше напишут.

itehno
Offline
Зарегистрирован: 18.04.2015

ЕвгенийП пишет:

fridgetester пишет:

ТС, ты случайно разделом не ошибся?

Да, он пытался в другом. Там ему DetSimen даже код готовый написал, но что-то не срослось. Наверное, подумал, что здесь лучше напишут.

Я надеюсь, что в будущем также поржу над данной версией своего кода. )))

itehno
Offline
Зарегистрирован: 18.04.2015

negavoid пишет:

ЕвгенийП пишет:

itehno пишет:
меня смущает сообщение компилятора:

И правильно делает, что смущает.

О, оно ещё и скомпилировалось! Ну вообще :)))

Сам в шоке ))) Но может почту Вашу отправите? Я же предлагал на платной основе. )))

negavoid
Offline
Зарегистрирован: 09.07.2016

Не, пожалуй, воздержусь ))), только не обижайтесь!!! На платной основе, я, гм, работаю с несколько более сложными проблемами, чем у вас, с большими братьями ардуины. А ардуино - моё хобби, я не исполнитель, здесь я помогаю бесплатно, по фану, по велению души, просто потому, что мне так интересно :)

itehno
Offline
Зарегистрирован: 18.04.2015

negavoid пишет:

Не, пожалуй, воздержусь ))), только не обижайтесь!!! На платной основе, я, гм, работаю с несколько более сложными проблемами, чем у вас, с большими братьями ардуины. А ардуино - моё хобби, я не исполнитель, здесь я помогаю бесплатно, по фану, по велению души, просто потому, что мне так интересно :)

Понятно, так я и не обижаюсь )))

Кстати, только две ошибки осталось и код, при этом, работает )))

Но, Русские не сдаются! )))

Открыт для предложений ) Хочу прокачать скилл. )

In function 'void hold(int, void (*)())':

20:12: warning: return-statement with a value, in function returning 'void' [-fpermissive]

 

sadman41
Offline
Зарегистрирован: 19.10.2016

void func() + return value = бессмыслица.

itehno
Offline
Зарегистрирован: 18.04.2015

Все. Вопрос решен:

Еще раз спасибо negavoid и DetSimen

int16_t ledFP[] = {11, 8, 2};

void setup() {
  Serial.begin(9600);
for (int i = 0; i < 3; i++){
    pinMode(ledFP[i], OUTPUT);}
}

void loop() {
  action();
}

void hold(int stoping, void(*foo1)()) {
  static uint32_t period = 0;
  static int16_t interspace = stoping;
  if ((millis() - period) > interspace) {
    foo1();
    period = millis();
  }
}

void f1(){
  Serial.println("1");
  digitalWrite(ledFP[0],!digitalRead(ledFP[0]));
}

void f2(){
  Serial.println("2");
  digitalWrite(ledFP[1],!digitalRead(ledFP[1]));
}

void f3(){
  Serial.println("3");
  digitalWrite(ledFP[2],!digitalRead(ledFP[2]));
}

void action(){
  hold(1000, f2);
}

 

itehno
Offline
Зарегистрирован: 18.04.2015

sadman41 пишет:

void func() + return value = бессмыслица.

Спасибо. Пока писал сообщение, то не увидел Ваше. Да, там и была собака зарыта. Спасибо и Вам.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

itehno пишет:

Делаю "многозадачность". Задержка много где нужна.

Не так ты её делаешь.  Лучше так делай

https://github.com/DetSimen/Arduino_TimerList

itehno
Offline
Зарегистрирован: 18.04.2015

DetSimen пишет:

itehno пишет:

Делаю "многозадачность". Задержка много где нужна.

Не так ты её делаешь.  Лучше так делай

https://github.com/DetSimen/Arduino_TimerList

Благодарю. Мне действительно интересно это направление. С удовольствием читаю ваш пост на github.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

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

sadman41
Offline
Зарегистрирован: 19.10.2016

С таким уровнем подготовки и многозадачность на восьмибитном МК... Ну, не знаю... Я вот, например, не берусь за такие странные дела.

b707
Offline
Зарегистрирован: 26.05.2017

sadman41 пишет:

С таким уровнем подготовки и многозадачность на восьмибитном МК... Ну, не знаю... Я вот, например, не берусь за такие странные дела.

И не удивительно, с твоим-то уровнем подготовки.  Подобной "многозадачностью" только новички и увлекаются, тебе она уже не нужна :)