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

 
 
 
Reply to this topicStart new topic
> C++ c шаблонами, нужен шаблонный маг!
esaulenka
сообщение Jan 15 2016, 08:25
Сообщение #1


Профессионал
*****

Группа: Свой
Сообщений: 1 032
Регистрация: 13-03-08
Из: Маськва
Пользователь №: 35 877



Заткнулся на одной задачке. 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) некрасиво указывать название поля два раза - для адреса и для размера.


--------------------
Тут обсуждается творческий порыв, а не соответствие каким-либо стандартам ©
Go to the top of the page
 
+Quote Post
gosha-z
сообщение Jan 15 2016, 08:27
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 327
Регистрация: 30-10-05
Пользователь №: 10 288



1. А причем тут вообще шаблоны?
2. А что такое Settings?
Go to the top of the page
 
+Quote Post
esaulenka
сообщение Jan 15 2016, 08:39
Сообщение #3


Профессионал
*****

Группа: Свой
Сообщений: 1 032
Регистрация: 13-03-08
Из: Маськва
Пользователь №: 35 877



Мне показалось, что на шаблонах пяток таких микро-классов будет удобнее всего сделать. Другие варианты?

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


--------------------
Тут обсуждается творческий порыв, а не соответствие каким-либо стандартам ©
Go to the top of the page
 
+Quote Post
SlavaV
сообщение Jan 15 2016, 09:10
Сообщение #4


Частый гость
**

Группа: Свой
Сообщений: 100
Регистрация: 13-06-06
Из: г.Улан-Удэ
Пользователь №: 18 024



зачем здесь класс и тем-более шаблоны, из приведённого кода это всё лишнее

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

PS Если структура настроек расположена во флешке (ROM) как её писать планируется?

Сообщение отредактировал SlavaV - Jan 15 2016, 09:28
Go to the top of the page
 
+Quote Post
neiver
сообщение Jan 15 2016, 10:08
Сообщение #5


Местный
***

Группа: Участник
Сообщений: 214
Регистрация: 22-03-10
Из: Саратов
Пользователь №: 56 123



Параметры шаблона должны быть константами времени компиляции, иногда можно константы времени компановки(но не все компиляторы это едят, хотя ГЦЦ должен).
То есть Объект Settings должен быть размещен по известному в точке инстанцирования адресу, хотя-бы во время линковки.
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Jan 15 2016, 15:09
Сообщение #6


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(esaulenka @ Jan 15 2016, 13:25) *
1) оно в принципе не работает. Компилятор говорит "не знаю я адрес твоей структуры!". Если адрес вбить константой, работает. Но некрасиво...


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


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
esaulenka
сообщение Jan 15 2016, 15:58
Сообщение #7


Профессионал
*****

Группа: Свой
Сообщений: 1 032
Регистрация: 13-03-08
Из: Маськва
Пользователь №: 35 877



Потыкался, переделал на единый класс. При обращении к конкретному полю создаю экземпляр класса, в конструктор передаю адрес поля, с которым оно будет работать.


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

Очередной вопрос: как указать "функция принимает аргументы со смещённым адресом" ?


--------------------
Тут обсуждается творческий порыв, а не соответствие каким-либо стандартам ©
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Jan 15 2016, 17:52
Сообщение #8


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



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

---
Вот тут почитайте на эту тему: тынц.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 29th June 2025 - 05:19
Рейтинг@Mail.ru


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