Вызов процедуры по числу

ReD_LioN
Offline
Зарегистрирован: 04.01.2014

Здравствуйте, уважаемые.
Вопрос наверно глупый, но тем не менее
Возможно ли организовать вызов определённых процедур имея в наличии их имена?
Например у меня есть какой-то массив или строка в которой перечислены имена определённых процедур из программы. Можно ли имея это как-то вызвать эти процедуры в определённой последовательности?
Т е. грубо говоря автоматизировать их выбор чтобы он происходил в процессе работы программы?

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

Можно.

Если хотите продробности, сначала давайте их сами: функции все одинаковые (по типу возвращаемого значения и типам и количеству параметров), или разные?

ReD_LioN
Offline
Зарегистрирован: 04.01.2014

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

Этот набор понятное дело константа для каждого экрана.

Можно наверно через switch это реализовать или ещё как-то, но такой вариант в голову пришёл первым. Вроде как в теории выглядит красиво

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

ReD_LioN пишет:

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

Этот набор понятное дело константа для каждого экрана.

Можно наверно через switch это реализовать или ещё как-то, но такой вариант в голову пришёл первым. Вроде как в теории выглядит красиво

В теории красиво, но на практике люди  очень глупые устройства. И любую идею или не смогут организовать или сольют в г**о.

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

А что, на мой вопрос ответа не будет?

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

И, да, я вот что-то не пойму, госдума чтоли новый закон приняла - вызывать функции по именам? Годами такая тема не всплывала, а тут две одновременно - вот вторая http://arduino.ru/forum/programmirovanie/refleksiya-v-si-ili-vyzov-funktsii-po-imeni-v-peremennoi

ReD_LioN
Offline
Зарегистрирован: 04.01.2014

Одинаковые

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

Ну, тогда пихайте их (функции) в массив и вызывайте по индексу. В чём проблема то?

ReD_LioN
Offline
Зарегистрирован: 04.01.2014

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

И, да, я вот что-то не пойму, госдума чтоли новый закон приняла - вызывать функции по именам? Годами такая тема не всплывала, а тут две одновременно - вот вторая http://arduino.ru/forum/programmirovanie/refleksiya-v-si-ili-vyzov-funktsii-po-imeni-v-peremennoi

Говорят гениальные идеи сразу нескольким людям приходят:)

ReD_LioN
Offline
Зарегистрирован: 04.01.2014

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

Ну, тогда пихайте их (функции) в массив и вызывайте по индексу. В чём проблема то?

А можете подсказать как это сделать или где посмотреть?

Я так до этого с ними не обращался

ReD_LioN
Offline
Зарегистрирован: 04.01.2014

А можете подсказать где можно подсмотреть реализацию подобного иначе?

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

 

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

ReD_LioN пишет:
Видел несколько примеров реализации многоуровневого меню, но все они работали на текстовых экранах, да и интересного вроде там для себя не увидел. (может смотрел не там..)
Или не тем местом смотрели. "Объянение на пальцах" как это организовано  занимает еще больше места чем сам исходник раз в 10  специфического текста. А так ищите литературу по ООП и С++ .

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

ReD_LioN пишет:

А можете подсказать где можно подсмотреть реализацию подобного иначе?

Ну, если речь о вызове функций по индексу, то просто в лоб.

//
//	Имеем 100500 одинаковых по параметрам и 
//	возвращаемому значению функций
//
long _sum(const int a, const int b) { return a + b; }
long _diff(const int a, const int b) { return a - b; }
long _mul(const int a, const int b) { return a * b; }
long _div(const int a, const int b) { return a / b; }

//
//	Опимсываем тип данных: указатель на функцию 
//	с нужными параметрами и возвращаемым типом
//
typedef long (* TFunc)(const int, const int);

//
//	Пихаем все наши 100500 функций в массив
//
TFunc allFs[] = {_sum, _diff, _mul, _div };

void setup(void) {
	Serial.begin(57600);
	//
	//	Вызываем функции по индексу в массиве
	//
	Serial.println(allFs[0](9, 6));
	Serial.println(allFs[1](9, 6));
	Serial.println(allFs[2](9, 6));
	Serial.println(allFs[3](9, 6));
}

void loop(void) {}

ReD_LioN пишет:

А можете подсказать где можно подсмотреть реализацию подобного иначе?

Ну, делайте так, как Вам комфортнее. В согласии со своим уровнем подготовки и пониманием ситуации. Меню вообще-то делается через древовидную структуру объектов, но так делают профессионалы. Если Вы не профессиональный программист (и не хотите им становиться), то и не дёргайтесь

ReD_LioN
Offline
Зарегистрирован: 04.01.2014

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

ReD_LioN пишет:

А можете подсказать где можно подсмотреть реализацию подобного иначе?

Ну, если речь о вызове функций по индексу, то просто в лоб.

//
//	Имеем 100500 одинаковых по параметрам и 
//	возвращаемому значению функций
//
long _sum(const int a, const int b) { return a + b; }
long _diff(const int a, const int b) { return a - b; }
long _mul(const int a, const int b) { return a * b; }
long _div(const int a, const int b) { return a / b; }

//
//	Опимсываем тип данных: указатель на функцию 
//	с нужными параметрами и возвращаемым типом
//
typedef long (* TFunc)(const int, const int);

//
//	Пихаем все наши 100500 функций в массив
//
TFunc allFs[] = {_sum, _diff, _mul, _div };

void setup(void) {
	Serial.begin(57600);
	//
	//	Вызываем функции по индексу в массиве
	//
	Serial.println(allFs[0](9, 6));
	Serial.println(allFs[1](9, 6));
	Serial.println(allFs[2](9, 6));
	Serial.println(allFs[3](9, 6));
}

void loop(void) {}

ReD_LioN пишет:

А можете подсказать где можно подсмотреть реализацию подобного иначе?

Ну, делайте так, как Вам комфортнее. В согласии со своим уровнем подготовки и пониманием ситуации. Меню вообще-то делается через древовидную структуру объектов, но так делают профессионалы. Если Вы не профессиональный программист (и не хотите им становиться), то и не дёргайтесь

Спасибо, буду пробовать

Voodoo Doll
Voodoo Doll аватар
Offline
Зарегистрирован: 18.09.2016

ReD_LioN пишет:
А можете подсказать как это сделать или где посмотреть

https://www.arduino.cc/reference/en/language/structure/control-structure...