реклама на сайте
подробности

 
 
> typeinfo + IAR v.5.11B, Как пользоваться?
alux
сообщение Jun 18 2008, 08:33
Сообщение #1


Знающий
****

Группа: Свой
Сообщений: 589
Регистрация: 24-04-05
Пользователь №: 4 447



Редактирование переменных типа 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 типа не предлагать.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
alux
сообщение Jun 18 2008, 13:48
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 589
Регистрация: 24-04-05
Пользователь №: 4 447



Получается, врут учебники:
Цитата
Для указателя на объект неопределённого типа не существует способа непосредственной перенастройки указателя на следующий объект с помощью операции инкрементации. В операторе, реализующем операции инкрементации и декрементации, только с помощью операций явного преобразования типа можно сообщить транслятору величину, на которую требуется изменить первоначальное значение указателя.

pUndefPointer++; // Это неверно, инкрементация не определена…
(int *)pUndefPointer++; // И так тоже ничего не получается…
((int *)pUndefPointer)++; // А так хорошо… Сколько скобок!
++(int *)pUndefPointer; // И вот так тоже хорошо…
Я же вначале так и делал...

PS. И еще. Применима ли операция sizeof() к указателю типа void*, проинициализированному адресом переменной?
Код
if(sizeof(pValue) == sizeof(double*)) {...}


PS2. 2 moderator. Эту тему можно перенести в раздел Помощь начинающему.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jun 18 2008, 14:19
Сообщение #3


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(alux @ Jun 18 2008, 16:48) *
Получается, врут учебники:
Получается, врут. Старые компиляторы пропускали, новые - уже нет. Касаемо именно указателя на void было отдельное ограничение в стандарте.
Цитата(alux @ Jun 18 2008, 16:48) *
PS. И еще. Применима ли операция sizeof() к указателю типа void*, проинициализированному адресом переменной?
Применима, но совершенно бессмысленна. Ибо указатель имеет одинаковый размер независимо от того, на что он указывает. Т.е. ваше сравнение будет давать истину для любого указателя, неважно на что он указывает.

В вашем случае просятся шаблоны.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
alux
сообщение Jun 18 2008, 14:44
Сообщение #4


Знающий
****

Группа: Свой
Сообщений: 589
Регистрация: 24-04-05
Пользователь №: 4 447



Цитата(Сергей Борщ @ Jun 18 2008, 17:19) *
Применима, но совершенно бессмысленна.
Я так и думал.
Цитата(Сергей Борщ @ Jun 18 2008, 17:19) *
В вашем случае просятся шаблоны.
Если бы реализация отличалась бы только типом данных... А то для переменных типа double используется функция ftoa, а для целочисленных itoa. Да и количество переменных может быть разным, что влечет за собой разную реализацию для переменных разных типов.
Получается, можно лишь передавать информацию о типе в качестве параметра... Или есть варианты?

PS. Я вижу выход только в использовании глобальной переменной bool real, с помощью которой передавать информацию о типе (double или unsigned char) и в реализации функции в зависимости от значения real выполнять нужные действия для конкретных типов..
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jun 18 2008, 21:21
Сообщение #5


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(alux @ Jun 18 2008, 17:44) *
Если бы реализация отличалась бы только типом данных... А то для переменных типа double используется функция ftoa, а для целочисленных itoa.
Можно написать две специализации шаблона для каждого из типов, можно ftoa и itoa "обернуть" в шаблон... Можно написать абстрактный базовый класс с виртуальной функцией ToString, и от него производные классы-шаблоны с параметрами double и char, а в вашей функции редактирования использовать эту виртуальную функцию.
Цитата(alux @ Jun 18 2008, 17:44) *
Да и количество переменных может быть разным, что влечет за собой разную реализацию для переменных разных типов.
Это недопонял.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- alux   typeinfo + IAR v.5.11B   Jun 18 2008, 08:33
- - KRS   typeid же только на классы с виртуальными функциям...   Jun 18 2008, 08:48
|- - alux   Цитата(KRS @ Jun 18 2008, 11:48) typeid ж...   Jun 18 2008, 09:00
- - KRS   ЦитатаСледует помнить, что RTTI в собственном смыс...   Jun 18 2008, 09:44
- - alux   Понятно. Значит typeid мне не подходит. Тогда все ...   Jun 18 2008, 12:39
- - KRS   операции с указателями void* запрещены, потому что...   Jun 18 2008, 12:58
|- - alux   Цитата(KRS @ Jun 18 2008, 15:58) можно на...   Jun 18 2008, 13:08
|- - KRS   Цитата(alux @ Jun 18 2008, 17:08) Та же о...   Jun 18 2008, 13:22
||- - alux   Цитата(Сергей Борщ @ Jun 19 2008, 00:21) ...   Jun 19 2008, 06:39
|- - IgorKossak   Цитата(alux @ Jun 18 2008, 17:44) ...Да и...   Jun 19 2008, 04:58
- - alux   Прошу помощь зала С редактированием и сохранение...   Jun 19 2008, 13:38
- - Сергей Борщ   Цитата(alux @ Jun 19 2008, 16:38) Как так...   Jun 20 2008, 13:16


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 20:59
Рейтинг@Mail.ru


Страница сгенерированна за 0.01427 секунд с 7
ELECTRONIX ©2004-2016