Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: C++ Как встроить структуру __flash в класс
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > IAR
ASZ
Есть структура:

Код
typedef void (*IFunc)(char param);

typedef  struct
{      
  char   Txt1[12];   //Строки сообщений __flash
  char   Txt2[12];
  IFunc ItemFunc;    //Указатель на функцию обслуживания
}Item;

и класс
Код
class MyСlass
{
private:
  void ItemFunc1();
  void ItemFunc2();
...
  void ItemFuncN();
public:
  Myclass();
...
};

Нужно встроить в класс массив Item Items[N] в этот класс, затруднение вызывает инициализация значений, т.к. массив должен быть __flash.
Где и как это должно делаться?
Сергей Борщ
Цитата(ASZ @ Apr 2 2010, 12:15) *
Код
typedef void (*IFunc)(char param);
Не получится. Указатель на функцию отличается от указателя на функцию-член.
Цитата(ASZ @ Apr 2 2010, 12:15) *
Нужно встроить массив Item Items[N] в этот класс, затруднение вызывает инициализация значений, т.к. массив должен быть __flash.
Поскольку этот массив у вас будет один на все объекты этого класса - его надо делать статаческим. А статические члены прекрасно размещаются во флешь. Нестатические члены разместить во флешь нельзя (разве что указатели на них).
ASZ
Цитата
Не получится. Указатель на функцию отличается от указателя на функцию-член.

И как поступить? Удалить из структуры и вынести в отдельный массив?
Цитата
Поскольку этот массив у вас будет один на все объекты этого класса - его надо делать статаческим. А статические члены прекрасно размещаются во флешь. Нестатические члены разместить во флешь нельзя (разве что указатели на них).

Т.е. функции сделать также статическими?
Если не затруднит, то как бы Вы поступили? (Тупой намек на просьбу куска кода smile.gif )
Непомнящий Евгений
Цитата(ASZ @ Apr 2 2010, 14:03) *
И как поступить? Удалить из структуры и вынести в отдельный массив?


Вариант 1 -
Код
typedef void TMyClass::(*IFunc) (char);

Вариант 2 - функции - обработчики в классе делаете статическими.

Что использовать - зависит от вашей задачи...

Если вы поподробнее опишите, чего и зачем вам надо, можно что-нить предложить
ASZ
Цитата(Непомнящий Евгений @ Apr 2 2010, 14:57) *
Если вы поподробнее опишите, чего и зачем вам надо, можно что-нить предложить

Избитая тема меню.
В plain C проблем не было.
Сергей Борщ
Цитата(ASZ @ Apr 2 2010, 13:03) *
И как поступить? Удалить из структуры и вынести в отдельный массив?
Возможно я неясно выразился - для указателя на член семантика записи другая. Непомнящий Евгений показал правильную запись.
Цитата(ASZ @ Apr 2 2010, 13:03) *
Т.е. функции сделать также статическими?
Зачем? Функции могут быть и нестатическими. Мне не приходилось писать подобные вещи, указатели на функции-члены использовал только однажды.
ASZ
Цитата(Сергей Борщ @ Apr 2 2010, 16:12) *
Возможно я неясно выразился - для указателя на член семантика записи другая. Непомнящий Евгений показал правильную запись.
Зачем? Функции могут быть и нестатическими. Мне не приходилось писать подобные вещи, указатели на функции-члены использовал только однажды.

Спасибо, буду работать дальше.
Почему-то постоянно втыкаюсь именно в семантику... Возможно, из-за неверного (неполного) понимания.
ASZ
Спасибо ответившим - все получилось.
dxp
Цитата(ASZ @ Apr 2 2010, 21:21) *
Спасибо, буду работать дальше.
Почему-то постоянно втыкаюсь именно в семантику... Возможно, из-за неверного (неполного) понимания.

Еще иметь в виду, что указатель на член и по имплементации, обычно, отличается от обычного указателя и тащит за собой некоторый оверхед. В лучшем случае он по размеру равен обычному указателю (объекту для хранения адреса), но частенько он раза в три толще (зависит от реализации). Если вас не напрягает, то нормально. Я стараюсь в embedded избегать использования указателей на члены (по вышеуказанной причине).
ASZ
Цитата(dxp @ Apr 3 2010, 10:00) *
Еще иметь в виду, что указатель на член и по имплементации, обычно, отличается от обычного указателя и тащит за собой некоторый оверхед. В лучшем случае он по размеру равен обычному указателю (объекту для хранения адреса), но частенько он раза в три толще (зависит от реализации). Если вас не напрягает, то нормально. Я стараюсь в embedded избегать использования указателей на члены (по вышеуказанной причине).

Оп-па sad.gif
В таком случае лучше сделать глобальные функции и таблицу переходов тоже?
dxp
Цитата(ASZ @ Apr 3 2010, 19:41) *
Оп-па sad.gif

Посмотрите, какой у вашей платформы размер указателей. sizeof возьмите от обычного указателя и от указателя на член. На некоторых платформах они одинаковы могут быть.

Цитата(ASZ @ Apr 3 2010, 19:41) *
В таком случае лучше сделать глобальные функции и таблицу переходов тоже?

Если уж делать на ++, то, имхо, лучше тут в сторону виртуальных функций посмотреть. Те же таблицы указателей, только все безопасно с точки зрения инициализации и адресной арифметики с этим хозяйством.
ASZ
Цитата(dxp @ Apr 3 2010, 17:13) *
Посмотрите, какой у вашей платформы размер указателей. sizeof возьмите от обычного указателя и от указателя на член. На некоторых платформах они одинаковы могут быть.


Если уж делать на ++, то, имхо, лучше тут в сторону виртуальных функций посмотреть. Те же таблицы указателей, только все безопасно с точки зрения инициализации и адресной арифметики с этим хозяйством.

Спасибо. Буду пробовать.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.