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

 
 
> 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
 
Start new topic
Ответов
esaulenka
сообщение Jan 15 2016, 15:58
Сообщение #2


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

Группа: Свой
Сообщений: 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
Сообщение #3


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

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



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

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


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



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

 


RSS Текстовая версия Сейчас: 24th August 2025 - 11:24
Рейтинг@Mail.ru


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