Easyelectronics.ru

Электроника для всех
Текущее время: 21 сен 2017, 22:52

Часовой пояс: UTC + 5 часов



    • JLCPCB for PCB Prototyping: 10 шт. 2-слоя 100*100mm 2$(около 140rub), изготовление за 24 часа.
    • Создание принципиальных схем и проектирование печатных плат
    • Крупнейший китайский онлайн магазин радиодеталей. Скидка 50%
    • Просмотр GERBER файлов

Начать новую тему Ответить на тему  [ Сообщений: 291 ]  На страницу Пред.  1 ... 8, 9, 10, 11, 12
Автор Сообщение
 Заголовок сообщения: Re: Унифицированная кросс-платформенная библиотека Си
СообщениеДобавлено: 13 сен 2017, 16:26 
Старожил

Зарегистрирован: 23 янв 2016, 15:37
Сообщения: 314
axill писал(а):
cудя по отладчику он таки их вызывает

У меня не вызывает. Ты же отладчиком по релизной сборке ходишь?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Унифицированная кросс-платформенная библиотека Си
СообщениеДобавлено: 13 сен 2017, 16:49 
Старожил

Зарегистрирован: 20 мар 2013, 11:27
Сообщения: 4556
проверял на нерелизной, должно быть отличие?

к вопросу о списке параметров переменной длины
может быть рекурсию для этого использовать?
Код:
class dummy {};
template <int n, class A=dummy> class B {};

template <class B> class C {};

typedef C< B<0,  B<1,  B< 2, B<3> > > > > c_class;


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Унифицированная кросс-платформенная библиотека Си
СообщениеДобавлено: 13 сен 2017, 18:23 
Старожил

Зарегистрирован: 20 мар 2013, 11:27
Сообщения: 4556
и еще вопрос
почему static_cast здесь не работает?
Код:
uint8_t *ptr;
struct D { int i; };
D* d_ptr = static_cast<D*>(ptr);


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Унифицированная кросс-платформенная библиотека Си
СообщениеДобавлено: 14 сен 2017, 10:44 
Старожил

Зарегистрирован: 06 ноя 2013, 16:07
Сообщения: 420
Откуда: Германия
А это как раз и есть проверка компилятора - uint8_t и struct D не наследуют друг от друга, поэтому их нельзя кастить. Тут нужно обычное приведение (D*).


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Унифицированная кросс-платформенная библиотека Си
СообщениеДобавлено: 14 сен 2017, 13:11 
Старожил

Зарегистрирован: 23 янв 2016, 15:37
Сообщения: 314
dev писал(а):
А это как раз и есть проверка компилятора - uint8_t и struct D не наследуют друг от друга, поэтому их нельзя кастить. Тут нужно обычное приведение (D*).

Сам же говорил, что в С++ принято использовать static_cast, но в общем виде это означает, что не рекомендуется использовать старое сишное приведение, тогда вместо (D*) нужно воспользоваться reinterpret_cast, хотя лично я эти громоздкие касты в очевидных случаях не использую, например, при приведении перечисления к целому.

axill писал(а):
проверял на нерелизной, должно быть отличие?

Очень странный вопрос для разработчика унифицированной кросс-платформенной библиотеки :)

Цитата:
к вопросу о списке параметров переменной длины
может быть рекурсию для этого использовать?

Если нашел решение, то пробуй, сравнивай генерируемый код, тем более у тебя 3 разных компилятора...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Унифицированная кросс-платформенная библиотека Си
СообщениеДобавлено: 14 сен 2017, 14:00 
Старожил

Зарегистрирован: 20 мар 2013, 11:27
Сообщения: 4556
Reflector писал(а):
Очень странный вопрос для разработчика унифицированной кросс-платформенной библиотеки :)

попробовал Release, отлаживаемый новый проект сдулся с 2800 до 1100
но отладка не работает с ним - можно ходить только по машинным кодам, привязки к исходнику нет
так что фиг поймешь вызывает он пустые функции или соптимизировал

Reflector писал(а):
Если нашел решение, то пробуй, сравнивай генерируемый код, тем более у тебя 3 разных компилятора...

пробуй не пробуй, а альтернативы пока не видно

еще вопрос возник
вот скажем есть некоторая сущность которую обычно называют интерфейсом - набор методов с предопределенным входом и выходом
и есть реализация кода для них под разные задачи разные

без шаблонов в С++ для этого есть виртуальные абстрактные методы коотрые описываются в родительском классе с тем, чтобы их код был реализован в потомках
но виртуальные методы это моветон для МК - под них надо выделять место в RAM
к тому же они не возможны для static, что опять же минус для МК

есть ли какой то иной способ описать базовый интерфейс с тем, чтобы его в реализации не описывать заново, а только реализовывать код?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Унифицированная кросс-платформенная библиотека Си
СообщениеДобавлено: 14 сен 2017, 15:52 
Старожил

Зарегистрирован: 23 янв 2016, 15:37
Сообщения: 314
axill писал(а):
попробовал Release, отлаживаемый новый проект сдулся с 2800 до 1100
но отладка не работает с ним - можно ходить только по машинным кодам, привязки к исходнику нет
так что фиг поймешь вызывает он пустые функции или соптимизировал

Огради нужный участок кода, например, вставив в начале и конце NOP, можно еще добавить софтовый брейкпоинт, чтоб не пролетало дальше.

axill писал(а):
вот скажем есть некоторая сущность которую обычно называют интерфейсом - набор методов с предопределенным входом и выходом
и есть реализация кода для них под разные задачи разные

без шаблонов в С++ для этого есть виртуальные абстрактные методы коотрые описываются в родительском классе с тем, чтобы их код был реализован в потомках
но виртуальные методы это моветон для МК - под них надо выделять место в RAM
к тому же они не возможны для static, что опять же минус для МК

есть ли какой то иной способ описать базовый интерфейс с тем, чтобы его в реализации не описывать заново, а только реализовывать код?

Виртуальные методы не так и плохи, но нужно смотреть в реальном коде. Страуструп писал, что эффективнее сделать не получится, у Майерса в "Effective C++ in an Embedded Environment" написано, что but compared to C alternatives: faster and smaller than if/then/else or switch-based techniques... У меня виртуальные функции всего в паре мест и по одной, за скорость не скажу, но размер точно стал меньше.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Унифицированная кросс-платформенная библиотека Си
СообщениеДобавлено: 14 сен 2017, 16:19 
Старожил
Аватара пользователя

Зарегистрирован: 23 сен 2012, 20:35
Сообщения: 890
Reflector писал(а):
У меня виртуальные функции всего в паре мест и по одной, за скорость не скажу, но размер точно стал меньше.

По идее вызов виртуальной функции разворачивается в вызов по указателю из таблицы. Это, насколько я понимаю влияет на скорость выполнения только в одном месте - предвыборка инструкций (плюс выборка по индексу из VMT). Любой if или switch даст ровно такую же задержку, плюс время на вычисление условия. В целом должно быть так на так, как по мне. За счет более компактного кода можно получить и выиграш в скорости.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Унифицированная кросс-платформенная библиотека Си
СообщениеДобавлено: 14 сен 2017, 16:31 
Старожил

Зарегистрирован: 20 мар 2013, 11:27
Сообщения: 4556
evsi как бы да, но в одном случае все расположено во флэш, а во втором требуется дополнительный расход RAM
и вы говорите про задачу где в одной программе есть несколько экземпляров одного интерфейса с разной реализацией
только тогда в альтернативе сищным if/switch будет виртуальная таблица

я же спрашивал для ситуации когда скажем в шаблон1 передается другой шаблон с раскрытием шаблон2
внутри шаблон1 используетчя ряд методов от шаблона2
шаблон2 может иметь разные реализации - шаблон2_1, шаблон2_2 и тд
поэтому чтобы обеспечить преемственность между разными реализациями шаблон2 и шаблон1 хотелось бы иметь некий механизм когда интерфейс между ними описывался бы ОДИН раз
сейчас этот интерфейс я вынужден описывать столько раз сколько реализаций шаблон2 я имею
и более того - совместимость во время компиляции не проверяется если нет раскрытия одновременно шаблона 1 и шаблона2

в описанной проблеме виртуальный функции нв исполняемом коде не несут никаких плюсов, одни минусы
получается решение проблемы компиляции через runtime - совсем плохо


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Унифицированная кросс-платформенная библиотека Си
СообщениеДобавлено: 14 сен 2017, 22:42 
Только пришел

Зарегистрирован: 03 сен 2017, 22:47
Сообщения: 7
мне кажется вы накручиваете сами себя, или я не понял, что вы имеете в виду:
дело в том, что если вы передаёте "шаблон2" в качестве шаблонного параметра в "шаблон1" и используете из "шаблона1" методы "шаблона2", то вам так и так придётся реализовывать в "шаблон2" все необходимые методы для "шаблон1". Наличие необходимых методов в "шаблон2" и будет своеобразным интерфейсом (если не ошибаюсь это называется "стратегией" в шаблонном метапрограммировании, см. Александреску). Если чего-то не допишите, то либо компилятор выдаст ошибку, либо это ему не нужно.
Код:
//typedef TDevLCD_HD44780_1602 < TDrvLCD_HD44780_4bit > DevLCD;
typedef TDevLCD_HD44780_1602 < TDrvLCD_HD44780_8bit > DevLCD;

здесь как раз передаётся в шаблонный класс "драйвер" для работы с LCD-индикатором. Классы драйверов TDrvLCD_HD44780_4bit и TDrvLCD_HD44780_8bit имеют все необходимые методы для работы класса TDevLCD_HD44780_1602.
Если же драйвер "не подходит" к шаблонному классу, то на уровне компилятора будет ошибка, т.к. драйвер имеет строку (количество контроллеров HD44780 в индикаторе)
Код:
enum { HD44780 = 1 };
, а шаблонный класс статическую проверку
Код:
STATIC_ASSERT((Driver::HD44780 == 1), "Type of the driver not correct");

т.е. следующая строка выдаст ошибку компиляции, т.к. индикатор имеет 2 контроллера HD44780, а драйвер умеет работать только с одним контроллером HD44780
Код:
typedef TDevLCD_HD44780_4004 < TDrvLCD_HD44780_4bit > DevLCD;
правильно будет так
Код:
typedef TDevLCD_HD44780_4004 < TDrvLCD_HD44780x2_4bit > DevLCD;


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Унифицированная кросс-платформенная библиотека Си
СообщениеДобавлено: 14 сен 2017, 23:01 
Старожил

Зарегистрирован: 20 мар 2013, 11:27
Сообщения: 4556
technik-1017 Я не о таком простом спрашиваю

Что не устраивает:
- при определении кода методов вне класса хотелось бы не описывать прототипы методов в теле каждого шаблон2
- хотелось бы иметь заранее описанный "интерфейс" шаблон2 и чтобы соответствие ему проверялось при компиляции ДО раскрытия

И первое и второе упростило бы написание и отладку
Что то типа виртуальных методов не класса, а шаблона

Похоже нет такого


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Унифицированная кросс-платформенная библиотека Си
СообщениеДобавлено: 15 сен 2017, 07:57 
Только пришел

Зарегистрирован: 03 сен 2017, 22:47
Сообщения: 7
у меня описание методов находится в заголовочных файлах (*.h) из небольшого объёма кода (файл *.cpp отсутствует). Поэтому проблемы интерфейса у меня пока не существует.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Унифицированная кросс-платформенная библиотека Си
СообщениеДобавлено: 15 сен 2017, 10:44 
Старожил

Зарегистрирован: 20 мар 2013, 11:27
Сообщения: 4556
Рад за вас
Но распределение кода по файлам не влияет на ситуацию
Видимо не смог вам обьяснить суть


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Унифицированная кросс-платформенная библиотека Си
СообщениеДобавлено: 15 сен 2017, 14:39 
Старожил
Аватара пользователя

Зарегистрирован: 23 сен 2012, 20:35
Сообщения: 890
axill писал(а):
evsi как бы да, но в одном случае все расположено во флэш, а во втором требуется дополнительный расход RAM

VMT вполне может лежать во флеше, это константные данные, которые не меняются во всемя выполнения.

axill писал(а):
и вы говорите про задачу где в одной программе есть несколько экземпляров одного интерфейса с разной реализацией только тогда в альтернативе сищным if/switch будет виртуальная таблица

Естественно. Иначе нет смысла городить виртуальные методы вообще.

axill писал(а):
в описанной проблеме виртуальный функции нв исполняемом коде не несут никаких плюсов, одни минусы
получается решение проблемы компиляции через runtime - совсем плохо

Так тут и свичей/ифов тоже как бы нет.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Унифицированная кросс-платформенная библиотека Си
СообщениеДобавлено: 15 сен 2017, 21:26 
Старожил

Зарегистрирован: 20 мар 2013, 11:27
Сообщения: 4556
Понял я, что много хочу)
Чтож, буду дальше копипастить и проверять код при раскрытии


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Унифицированная кросс-платформенная библиотека Си
СообщениеДобавлено: 17 сен 2017, 01:23 
Старожил

Зарегистрирован: 20 мар 2013, 11:27
Сообщения: 4556
поясните по синтаксису
есть необходимость внутри класса дать набор статических данных
чтобы потом их не объявлять по одному полю. хочу объединить в структуру:
Код:
template <int a>
class A {
  struct D {
    int i;
    int j;
  } data;
};


далее почему то в IAR проходит так:
Код:
template <int a>
A<a>::D A<a>::data;


а gcc требует так:
Код:
template <int a>
typename A<a>::D A<a>::data;


что этого правильно?


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 291 ]  На страницу Пред.  1 ... 8, 9, 10, 11, 12

Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: Кот495


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB