Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: C++ c шаблонами
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
esaulenka
Заткнулся на одной задачке. CortexM3, GCC.

Есть структура во флеше с настройками. Адрес структуры зафиксирован линкером.
Запись настроек производится однократно, в произвольном порядке.

Для облегчения записи сделал класс

Код
CFwSetting {
public:
static bool IsPresent () { ... }
static bool Write (const void * data) { ... }
static bool Compare (const void * data) { ... }
};


Теперь пытаюсь сделать его шаблонным, чтобы использовать для каждого поля:
Код
template <int Addr, int Len>
class CFwSetting_Base {
...
};

typedef CFwSetting_Base <(int)&Settings.SerialNumber, sizeof(Settings.SerialNumber)>        CFwSerial;


Проблем две:
1) оно в принципе не работает. Компилятор говорит "не знаю я адрес твоей структуры!". Если адрес вбить константой, работает. Но некрасиво...

2) некрасиво указывать название поля два раза - для адреса и для размера.
gosha-z
1. А причем тут вообще шаблоны?
2. А что такое Settings?
esaulenka
Мне показалось, что на шаблонах пяток таких микро-классов будет удобнее всего сделать. Другие варианты?

Settings - const struct, лежащая во флеше, в отдельной секции. Имеет несколько полей (от uint32_t до массива байтов; может быть ещё что-то будет). Поля записываются в произвольном порядке (как пользователь захочет), но только один раз.
SlavaV
зачем здесь класс и тем-более шаблоны, из приведённого кода это всё лишнее

В CFwSetting, если это структура (ключевое слово не видно) директива public: лишняя. У структур члены по умолчанию public

PS Если структура настроек расположена во флешке (ROM) как её писать планируется?
neiver
Параметры шаблона должны быть константами времени компиляции, иногда можно константы времени компановки(но не все компиляторы это едят, хотя ГЦЦ должен).
То есть Объект Settings должен быть размещен по известному в точке инстанцирования адресу, хотя-бы во время линковки.
AHTOXA
Цитата(esaulenka @ Jan 15 2016, 13:25) *
1) оно в принципе не работает. Компилятор говорит "не знаю я адрес твоей структуры!". Если адрес вбить константой, работает. Но некрасиво...


Если есть возможность получить константу адреса, то можно сделать так:
Код
typedef CFwSetting_Base<STRUCT_ADDRESS + offsetof(Settings, SerialNumber, sizeof(Settings.SerialNumber))> CFwSerial;
esaulenka
Потыкался, переделал на единый класс. При обращении к конкретному полю создаю экземпляр класса, в конструктор передаю адрес поля, с которым оно будет работать.


И новые грабли: http://cpp.sh/2w2n.
Для простоты понимания вырезал весь тот функционал, о котором я говорил выше, оставил только получение адреса-размера.
Если передавать в функцию ссылку на не-однобайтовую переменную в упакованной структуре, происходит странное.
ARM-GCC копирует её в стек, а только потом передаёт в функцию. Соответственно, адрес этой переменной ничего общего с реальным уже не имеет. Онлайновый GCC по ссылке так и вовсе ругается.

Очередной вопрос: как указать "функция принимает аргументы со смещённым адресом" ?
AHTOXA
С упакованными структурами, скорее всего, ничего не получится. Я не помню точно, как это формулируется, но суть такая: int (для примера) в упакованной структуре и просто int - это как бы разные типы. Они совместимы по присваиванию, но не идентичны. Поэтому так и получается.

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