Редактирование переменных типа
double реализовал при помощи виртуальных функций. Какую именно переменную редактировать указывается при помощи указателя
pValue, в которую передается адрес переменной :
Код
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*).
Но возникает вопрос, как привести к конкретному типу указатель
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 типа не предлагать.