Код
volatile double* pValue; // Указатель на редактируемый параметр
volatile double __eeprom* pValueEE; // Указатель на редактируемый параметр в EEPROM
volatile double* param[] = {&area, &Kt, &Y0};
volatile double __eeprom* paramEE[] = {&ee_area, &ee_Kt, &ee_Y0};
..................
class TEditValue
{
public:
void Up() // k_right
{
if(pValue-- == *param) pValue = *(param+2);
if(pValueEE-- == *paramEE) pValueEE = *(paramEE+2);
......................................... // какие-то действия при нажатии кнопки UP
ftoa(*pValue, lcd_buf, 3, 0);
}
void Down() // k_left
{
.................
}
void Right() // k_enter
{
*pValue = round_to_pow(atof(lcd_buf), -3); // округлить до 3 знака после запятой
*pValueEE = *pValue; // сохранить отредактированную переменную в EEPROM
}
void Numeric() // 0...9
{
..............
}
};
// Функция, вызываемая при входе в пункт меню
void Level1Item1Sub1sub1_Func(void)
{
TCritSect cs;
pValue = *param; // &area;
pValueEE = *paramEE; // &ee_area;
.............
}
Это все работает. Но теперь возникла необходимость реализовать почти те же действия для переменных типа unsigned char. Первое, что пришло на ум, использовать указатель void* pValue. Когда необходимо редактировать переменную типа unsigned char (при входе в соответствующий пункт меню), то указатель приводится к типу (unsigned char*). volatile double __eeprom* pValueEE; // Указатель на редактируемый параметр в EEPROM
volatile double* param[] = {&area, &Kt, &Y0};
volatile double __eeprom* paramEE[] = {&ee_area, &ee_Kt, &ee_Y0};
..................
class TEditValue
{
public:
void Up() // k_right
{
if(pValue-- == *param) pValue = *(param+2);
if(pValueEE-- == *paramEE) pValueEE = *(paramEE+2);
......................................... // какие-то действия при нажатии кнопки UP
ftoa(*pValue, lcd_buf, 3, 0);
}
void Down() // k_left
{
.................
}
void Right() // k_enter
{
*pValue = round_to_pow(atof(lcd_buf), -3); // округлить до 3 знака после запятой
*pValueEE = *pValue; // сохранить отредактированную переменную в EEPROM
}
void Numeric() // 0...9
{
..............
}
};
// Функция, вызываемая при входе в пункт меню
void Level1Item1Sub1sub1_Func(void)
{
TCritSect cs;
pValue = *param; // &area;
pValueEE = *paramEE; // &ee_area;
.............
}
Но возникает вопрос, как привести к конкретному типу указатель pValue в реализации виртуальной функции? Т.е. определение типа происходит в runtime. В C++ есть механизм динамического определения типа во время выполнения программы при помощи операции typeid и класса type_info. В IAR v.5.11B есть даже соответствующий заголовочный файл <typeinfo>. Но при использовании ее компилятор выдает ошибки
Error[Pe878]: Embedded C++ does not support run-time type information C:\Program Files\IAR Systems\Embedded Workbench 5.0\avr\INC\DLIB\typeinfo 62
Error[Pe020]: identifier "typeid" is undefined D:\Sasha\MyWork\IAR projects\device\include\tasks.h 351
Для чего нужен этот файл, если нельзя им пользоваться? И как мне решить проблему с редактированием разных типов переменных посредством одного указателя?
PS. Создание второго класса для редактирования переменных unsigned char типа не предлагать.