Easyelectronics.ru

Электроника для всех
Текущее время: 27 сен 2020, 06:12

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



JLCPCB – Прототипы печатных плат за $2/5шт. два слоя. $5/5шт. четыре слоя
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

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

Зарегистрирован: 20 мар 2013, 11:27
Сообщения: 5358
std=c++1z Я это понял как с++11


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

Зарегистрирован: 10 июн 2011, 23:01
Сообщения: 3459
https://www.google.ru/search?q=c%2B%2B1z


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

Зарегистрирован: 20 мар 2013, 11:27
Сообщения: 5358
хм
не думал что атмел студио уже поддерживает С++17

а nullptr когда появился? его не понимает ни атмел по умолчанию ни IAR


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

Зарегистрирован: 23 янв 2016, 15:37
Сообщения: 1272
axill писал(а):
хм
не думал что атмел студио уже поддерживает С++17

а nullptr когда появился? его не понимает ни атмел по умолчанию ни IAR

Nullptr там должен быть, он еще в С++11 появился, а то, что компиляторы могут понимать ключи для С++17 еще не означает, что они его поддерживают полностью или хотя бы в значительном объеме.

Gcc 4.6.4 уже nullptr понимает.


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

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

как определить методы шаблона класса разные под разные значения параметров с чкстично специализацией?
вот здесь хочу сделать разные get() под конкретные T

Код:
      template <typename T, const T* data_ptr, uint16_t size_p>
      class Array {
      public:
         static const uint16_t size = size_p;
         static T get(uint16_t i);
      };

      template <typename T, const T* data_ptr, uint16_t size_p>
      T Array<T, data_ptr, size_p>::get(uint16_t i) {
         return    flash_getbyte(data_ptr[i]);
      }


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

Зарегистрирован: 23 янв 2016, 15:37
Сообщения: 1272
axill писал(а):
как определить методы шаблона класса разные под разные значения параметров с чкстично специализацией?
вот здесь хочу сделать разные get() под конкретные T

В преддверии появления constexpr if я бы наверняка cделал так:
Код:
#include <type_traits>

template <typename T, const T* data_ptr, uint16_t size_p>
class Array
{
public:
    static const uint16_t size = size_p;
    static T get(uint16_t i)
    {
        if /*constexpr*/(std::is_same<T, uint8_t>())
        {
            return flash_getbyte(data_ptr[i]);
        }
        else if /*constexpr*/(std::is_same<T, uint16_t>())
        {
            return flash_gethword(data_ptr[i]);
        }
        ...
    }
};


В релизной сборке все равно обычный тут if или constexpr, в дебаге скорее всего будет разница в объеме генерируемого кода.


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

Зарегистрирован: 20 мар 2013, 11:27
Сообщения: 5358
я сделал сейчас чуть проще
Код:
      template <typename T, const T* data_ptr, uint16_t size_p>
      T Array<T, data_ptr, size_p>::get(uint16_t i) {
         if( sizeof(T) == 1 ) return flash_getbyte(data_ptr[i]);
         if( sizeof(T) == 2 ) return flash_getwor(data_ptr[i]);
         return 0;
      }


но тем не менее мне нужно знать синтаксиси как можно описывать имплементацию методов с частичным раскрытием параметров, т.е. конкретные функции под частично определенные параметры


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

Зарегистрирован: 20 мар 2013, 11:27
Сообщения: 5358
is_same в IAR не заработал


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

Зарегистрирован: 20 мар 2013, 11:27
Сообщения: 5358
Reflector выручайте
вы давали пример описания методов с разным кодом для частных значений отдельных параметров
я обыскался по теме но не нахожу этот пример

не могли бы повторить?

например хочу сделать GPIO для пина с параметром типа enum и два значения - прямой и инверсный
в инверсном логика get/set/clr меняется на обратную
бывает полезно и для кнопок которые замыкают на GND и для реле которые включаются логическим нулем


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

Зарегистрирован: 10 июн 2011, 23:01
Сообщения: 3459
google-> template specialization


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

Зарегистрирован: 20 мар 2013, 11:27
Сообщения: 5358
в поиске уже был
полную специализацию разобрал
вопрос в синтаксисе при частичной специализации


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

Зарегистрирован: 20 мар 2013, 11:27
Сообщения: 5358
что здесь не так?

Код:
template <int A, int B>
class D {
   void test(void);
};

template <int A>
void D<A, 5>::test(void) {}


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

Зарегистрирован: 23 янв 2016, 15:37
Сообщения: 1272
axill писал(а):
is_same в IAR не заработал

В IAR проапдейтили компиляторы для популярных ARM, а для STM8 там мало что работает и я бы не сильно рассчитывал на то, что заработает в будущем.

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

Я точно давал такие примеры? Что-то не припомню, возможно именно поэтому ты их не можешь найти :)

Цитата:
что здесь не так?

А что это? Если пример частичной специализации, то тут не так все, начиная с того, что частичная специализация работает на уровне классов, а не отдельных методов. Но она тебе и не нужна вовсе, я уже раньше говорил, не нужно пытаться все сводить к шаблонам.
Типичный класс для работы с GPIO должен как минимум получать через шаблонный параметр порт и номер пина(или маску пинов), если есть, то еще можно передать AF, а в твоем случае параметр отвечающий за инверсию, хотя лично я считаю это плохой идеей. Поскольку это все константы, то в некоторых реализациях можно наблюдать switch для выбора режима пина растянувшийся на несколько экранов, а ты боишься один единственный if добавить, который оптимизатор потом выкинет...


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

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


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

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

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


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

Зарегистрирован: 20 мар 2013, 11:27
Сообщения: 5358
так работает
Show


получается что частично определить можно только класс целиком?
означает ли в данном случае что для всех значений T2 кроме 2 будет первый класс, а для 2 - второй?


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

Зарегистрирован: 23 янв 2016, 15:37
Сообщения: 1272
axill писал(а):
получается что частично определить можно только класс целиком?

Да, и получается придется переопределять все методы, даже если они от второго параметра никак не зависят.

Цитата:
означает ли в данном случае что для всех значений T2 кроме 2 будет первый класс, а для 2 - второй?

Я вообще думал, что так не должно работать, но похоже все именно так.


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

Зарегистрирован: 20 мар 2013, 11:27
Сообщения: 5358
Спасибо
Да, полностью класс переопределять может быть не очень удобно

Вот еще вопрос
Решил в настройку пина, те в параметры шаблона в том числе вынести настройки (вход/выход, пуллап/пушпул и тд)
Сейчас gpio это класс со статическими методами

Дальше два варианта:
1. Написать еще один статический метод init и вызывать его ручками в main()
2. Написать конструктор, определять экземпляр так чтобы инициализация вызывалась автоматически в конструкторе без необходимости что то вставлять руками в main()

Второе удобнее, меньше телодвижений
Но оверхед не понятен. Будет ли какой то рам отвелен под это при том, что полей данных нет


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

Зарегистрирован: 23 янв 2016, 15:37
Сообщения: 1272
axill писал(а):
Решил в настройку пина, те в параметры шаблона в том числе вынести настройки (вход/выход, пуллап/пушпул и тд)

Дальше два варианта:
1. Написать еще один статический метод init и вызывать его ручками в main()
2. Написать конструктор, определять экземпляр так чтобы инициализация вызывалась автоматически в конструкторе без необходимости что то вставлять руками в main()

Второе удобнее, меньше телодвижений
Но оверхед не понятен. Будет ли какой то рам отвелен под это при том, что полей данных нет

У меня так:
Код:
PinA<4> led;
led.init(PinMode::PushPullHighSpeed);

Или сразу так:
Код:
PinA<5> led(PinMode::PushPullHighSpeed);

Конструктор с параметрами вызывает init, с точки зрения производительности разницы никакой нет. Передавать режим как параметр шаблона смысла нет, итак можно все оформить одной строкой. Оверхед тут скрывается в самом подходе, естественно инитить отдельными пинами не так эффективно, как порты целиком, но можно написать, и я так делал, функции которые принимают несколько объектов класса Pin и инитят их за один раз если они все относятся к одному порту.


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

Зарегистрирован: 20 мар 2013, 11:27
Сообщения: 5358
инвертирование пина как параметр шаблона имеет смысл - там код разный

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

я пока ориентирован на то, что основные методы работы с пином статические


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

Зарегистрирован: 23 янв 2016, 15:37
Сообщения: 1272
axill писал(а):
инвертирование пина как параметр шаблона имеет смысл - там код разный

Наверно, но я бы это инвертирование пина просто убрал, не вижу никакой проблемы во включении реле нулем.

Цитата:
остальное конечно можно в init передавать
а вот дальше - какие затраты от создания экземпляра?
разве при обращении к нестатическому методу компилятор не будет автоматом вставлять ссылку на объект?
или современные компиляторы одинаково эффективно вызывают как статический метод класса так и не статический при отсутствии данных?

я пока ориентирован на то, что основные методы работы с пином статические

У меня все методы статические. На самом деле без разницы написано
Код:
PinA<5> led(PinMode::PushPullHighSpeed);
или
Код:
PinA<5>::(PinMode::PushPullHighSpeed);

Даже если бы методы были нестатическими, то вряд ли что-то бы поменялось. Зачем указатель на объект, если нет связанных с ним данных? Если передать указатель на нестатическую функцию и компилятор не сможет оптимизировать, тогда уже будет оверхед. Или если есть виртуальные функции и то не всегда.


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

Зарегистрирован: 20 мар 2013, 11:27
Сообщения: 5358
Reflector писал(а):
Код:
PinA<5> led(PinMode::PushPullHighSpeed);
или

здесь вызывается конструктор, так?
разве можно конструктор объявить статическим?


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

Зарегистрирован: 23 янв 2016, 15:37
Сообщения: 1272
axill писал(а):
здесь вызывается конструктор, так?
разве можно конструктор объявить статическим?

Нельзя, но в классе нет ни одного объекта к которому можно было бы обратиться через this, потому это не имеет значения. Конструктор кроме как вызвать статический init ничего больше сделать не может, а init неявно инлайнится...


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

Зарегистрирован: 20 мар 2013, 11:27
Сообщения: 5358
ну вот я собственно про это и спрашивал - компилятор все равно создаст указатель на экземпляр класса и потом его передаст при вызове конструктора
или же компимлятор настолько умный, что выховет конструк.тор без создания и передачи указателя?


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

Зарегистрирован: 23 янв 2016, 15:37
Сообщения: 1272
axill писал(а):
ну вот я собственно про это и спрашивал - компилятор все равно создаст указатель на экземпляр класса и потом его передаст при вызове конструктора
или же компимлятор настолько умный, что выховет конструк.тор без создания и передачи указателя?

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


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


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


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

Сейчас этот форум просматривают: нет зарегистрированных пользователей


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

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

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