Господа, доброго времени суток!
Сломал себе уже весь мозг. Перечитал кучу статей, но, еще больше запутался.
Есть структура:
struct str_MenuItem { // Структура для хранения элемента меню и привязки его к переменным
byte Item_ID; // ID-команды
String Item_Name; // Наименование пункта меню
void* _value; //Указатель на переменную, хранящую текущее значение команды
};
Есть массив с набором пунктов меню. Массив нужен, т.к. одни и те же пункты (но, не все) могут быть в разных меню (дабы не дублировать):
str_MenuItem menuItems[] = { // Массив со структурами элементов меню
{ 1, "Команда #1", &str_val }, // Ссылка на переменную типа String
{ 2, "Команда №2", &float_val1 }, // Ссылка на переменную типа float
{ 3, "Команда №3", &float_val2 }, // Ссылка на переменную типа float
{ 4, "Команда №4", &unt8t_val1 }, // Ссылка на переменную типа uint8_t
{ 5, "Команда №5", &unt16t_val1 }, // Ссылка на переменную типа uint16_t
};
Далее, при переборе пунктов меню, я хочу получить возможность: 1) вывести текущее значение на экран; 2) изменять значение в выбранной переменной.
Максимум, что я смог осилить, это получить значение из какого-то конкретного типа (например, float):
float* t = static_cast<float*>(menuItems[MenuID]._value); // Получаю ссылку на переменную
CurrentValue = String(*t); // Для вывода на экран или других целей...
А как узнать какой тип в текущей ссылке “menuItems[MenuID]._value”? В принципе, если отказаться от переменной типа String в первом пункте меню (можно извернуться), то все переменные можно свести к типу float и работать с ним, но, может есть какой способ? Тем более, что после манипуляций со значением, его придется вернуть переменной, ссылка которой хранится в menuItems[MenuID]._value. И не факт, что float нормально в uint16_t вернется. Или может можно вообще обойтись без преобразований, а менять значение сразу в “указателе”?
*menuItems[MenuID]._value = 50;
В общем, прошу помощи у гуру.