esaulenka 7 15 января, 2016 Опубликовано 15 января, 2016 · Жалоба Заткнулся на одной задачке. 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 2 15 января, 2016 Опубликовано 15 января, 2016 · Жалоба 1. А причем тут вообще шаблоны? 2. А что такое Settings? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
esaulenka 7 15 января, 2016 Опубликовано 15 января, 2016 · Жалоба Мне показалось, что на шаблонах пяток таких микро-классов будет удобнее всего сделать. Другие варианты? Settings - const struct, лежащая во флеше, в отдельной секции. Имеет несколько полей (от uint32_t до массива байтов; может быть ещё что-то будет). Поля записываются в произвольном порядке (как пользователь захочет), но только один раз. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SlavaV 0 15 января, 2016 Опубликовано 15 января, 2016 (изменено) · Жалоба зачем здесь класс и тем-более шаблоны, из приведённого кода это всё лишнее В CFwSetting, если это структура (ключевое слово не видно) директива public: лишняя. У структур члены по умолчанию public PS Если структура настроек расположена во флешке (ROM) как её писать планируется? Изменено 15 января, 2016 пользователем SlavaV Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
neiver 0 15 января, 2016 Опубликовано 15 января, 2016 · Жалоба Параметры шаблона должны быть константами времени компиляции, иногда можно константы времени компановки(но не все компиляторы это едят, хотя ГЦЦ должен). То есть Объект Settings должен быть размещен по известному в точке инстанцирования адресу, хотя-бы во время линковки. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 18 15 января, 2016 Опубликовано 15 января, 2016 · Жалоба 1) оно в принципе не работает. Компилятор говорит "не знаю я адрес твоей структуры!". Если адрес вбить константой, работает. Но некрасиво... Если есть возможность получить константу адреса, то можно сделать так: typedef CFwSetting_Base<STRUCT_ADDRESS + offsetof(Settings, SerialNumber, sizeof(Settings.SerialNumber))> CFwSerial; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
esaulenka 7 15 января, 2016 Опубликовано 15 января, 2016 · Жалоба Потыкался, переделал на единый класс. При обращении к конкретному полю создаю экземпляр класса, в конструктор передаю адрес поля, с которым оно будет работать. И новые грабли: http://cpp.sh/2w2n. Для простоты понимания вырезал весь тот функционал, о котором я говорил выше, оставил только получение адреса-размера. Если передавать в функцию ссылку на не-однобайтовую переменную в упакованной структуре, происходит странное. ARM-GCC копирует её в стек, а только потом передаёт в функцию. Соответственно, адрес этой переменной ничего общего с реальным уже не имеет. Онлайновый GCC по ссылке так и вовсе ругается. Очередной вопрос: как указать "функция принимает аргументы со смещённым адресом" ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 18 15 января, 2016 Опубликовано 15 января, 2016 · Жалоба С упакованными структурами, скорее всего, ничего не получится. Я не помню точно, как это формулируется, но суть такая: int (для примера) в упакованной структуре и просто int - это как бы разные типы. Они совместимы по присваиванию, но не идентичны. Поэтому так и получается. --- Вот тут почитайте на эту тему: тынц. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться