вызов процедуры по ее адресу

Vладимир
Offline
Зарегистрирован: 27.01.2015

всем привет. народ подскажите возможноли такое  как вызов процедуры по ее адресу 

допустим в секции setup в переменную записывается адрес некой функции,  а потом  осуществить переход на процедуру по зачению из переменной . если да то как это реализуется (можно пример , ссылку в инете , или просто ключевые слова для самостоятельного поиска)

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011
Vладимир
Offline
Зарегистрирован: 27.01.2015

не совсем то что хотелосьбы , сечас именно так и реализовано

Gippopotam
Gippopotam аватар
Offline
Зарегистрирован: 12.09.2014

Vладимир пишет:

всем привет. народ подскажите возможноли такое  как вызов процедуры по ее адресу 

допустим в секции setup в переменную записывается адрес некой функции,  а потом  осуществить переход на процедуру по зачению из переменной . если да то как это реализуется (можно пример , ссылку в инете , или просто ключевые слова для самостоятельного поиска)

Насколько мне известно в Ардуино не реализована технология callback-функций. И прямого доступа к памяти нет.

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Никаких проблем нет. Описать переменную как указатель на функцию, в setup проинициализировать и использовать. Первое что нашёл по строке "C++ указатель на функцию"http://www.amse.ru/courses/cpp2/2011_04_11.html

UPD: Вот тупой пример Blink, прямо щас моргает у меня на столе:

typedef void (* func)(unsigned long);

func func_ptr = NULL;

void setup() {
  func_ptr = &delay;
  
  pinMode(13, OUTPUT);
}

void loop() {
  digitalWrite(13,HIGH);
  func_ptr(1000);
  digitalWrite(13,LOW);
  func_ptr(1000);
}

 

Gippopotam
Gippopotam аватар
Offline
Зарегистрирован: 12.09.2014

kisoft пишет:

Никаких проблем нет.

Век живи - век учись.

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Использование указателей на функции есть, например, в одном из вариантов реализации конечных автоматов. Кому интересно, поищите, в гугле примеров немало.

В чистом С, например, таких приемом можно "реализовать" классы, например:

typedef int (*callback)(int param);

struct ClassStruct
{
  callback getValue;
  callback setValue;

  ClassStruct();
};

Тогда проинициализировав getValue & setValue (например в конструкторе или передав их как параметры в конструктор) можно использовать вызовы, типа:

ClassStruct myStruct;
int val;

val = myStruct.getValue(5);
val += 4;
myStruct.setValue(val);

Но у нас здесь не чистый С, а С++, потому нам такие извраты не интересны. Код я привел только для примера и он абстрактный.

Когда я использовал чистый С, видел подобные реализации в некоторых проектах.