Easyelectronics.ru

Электроника для всех
Текущее время: 10 авг 2020, 07:55

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



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

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

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


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

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

в Си я для этого использовал typedef enum
В С++11 как я понял для этого есть enum class

но вот в IAR enum class нет

нашел такой для себя вариант, прокомментируйте, может я что то не учел или есть вариант лучше
Код:
struct PinMode {
  enum type { a, b, c };
};

PinMode::type list = PinMode::a;


ну или так:
Код:
namespace PinMode {
  enum type { a, b, c };
};

PinMode::type list = PinMode::a;


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

Зарегистрирован: 06 ноя 2013, 16:07
Сообщения: 703
Откуда: Германия
Да, оба варианта верны. Ну или классика:

Код:
enum PinMode {
  PinMode_a;
  PinMode_b;
  PinMode_c;
};

PinMode list = PinMode_a;


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

Зарегистрирован: 29 янв 2010, 15:41
Сообщения: 1127
Откуда: Германия
dev писал(а):
Да, оба варианта верны. Ну или классика:

Код:
enum PinMode {
  PinMode_a;
  PinMode_b;
  PinMode_c;
};

PinMode list = PinMode_a;

error: expected '}' before ';' token


Код:
enum PinMode {
  PinMode_a,
  PinMode_b,
  PinMode_c
};

PinMode list = PinMode_a;

_________________
Мои поделки
http://www.fun-electronic.net/


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

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


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

Зарегистрирован: 23 сен 2012, 20:35
Сообщения: 2471
axill писал(а):
а вот допустим есть массив байт, который в зависимости от ситуации может быть интерпретирован как разные структуры данных
можно как то описать ссылку на этот массив не как uint8_t* а как ссылку на какой то базовый класс?

А чем это поможет? Все равно прийдется приводить указатель к конкретному классу.


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

Зарегистрирован: 10 июн 2011, 23:01
Сообщения: 3445
кто мешает руками приводить этот указатель к указателю на что угодно.
а вообще для этого вроде как существует union.


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

Зарегистрирован: 29 янв 2010, 15:41
Сообщения: 1127
Откуда: Германия
_pv писал(а):
а вообще для этого вроде как существует union.

У некоторых чудиков union заперщен к использованию.

_________________
Мои поделки
http://www.fun-electronic.net/


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

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

понятное дело, что приводить к конретному типу потребуется
но одно дело приводить к этому типу void* а другое нечто более конкретное

а если так?

Код:
class Data { };
class DataA : Data {};
class DataB : Data {};

void func(Data* data_ptr, int t) {
  if(t==0) {
      DataA *dataA_ptr = (DataA*)data_ptr;
  }
}

...
DataA data;
func(&data, 0);


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

Зарегистрирован: 06 ноя 2013, 16:07
Сообщения: 703
Откуда: Германия
Да, так. Только в C++ принято static_cast вместо () использовать - как-раз чтобы компилятор проверить мог.


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

Зарегистрирован: 20 мар 2013, 11:27
Сообщения: 5358
dev спасибо, учту


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

Зарегистрирован: 20 мар 2013, 11:27
Сообщения: 5358
возможно ли описать вектор прерывания так, чтобы он становился активным только если раскрыть шаблон?
пишу так:
Код:
void test();
template <int A>
class HandlerPortA  {
protected:
   #pragma vector = EXTI0_vector
   __interrupt static void VectorHandler(void) {
      test();
   }
};

typedef HandlerPortA<1> handler;

и линковщик не ругается на то, что нет test(), а значит и вектор не попадает в прошику
если же описание вектора вынести из шаблона то он наоборот будет попадать всегда
а хотелочь бы в одном файле описать несколько векторов, но так, чтобы в прошивку попадали только те чьи шаблоны использованы


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

Зарегистрирован: 03 сен 2017, 22:47
Сообщения: 27
необходимо добавить строку
Код:
template void HandlerPortA < 1 > ::VectorHandler();

работу с прерываниями (как я это вижу) уже демонстрировал здесь
viewtopic.php?f=16&t=32335


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

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


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

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

Зависит от задачи. Если класс небольшой, то можно обойтись и частичной специализацией, а отсутствующим параметрам присвоить void по умолчанию. Если передаваемые данные нужны только в данном методе, то можно использовать шаблонные методы внутри шаблонного класса.


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

Зарегистрирован: 20 мар 2013, 11:27
Сообщения: 5358
не совсем понял о чем речь
я спрашиваю про параметры шаблона, а не метода
не С++, но для пояснения вопроса ниже кусок кода
как описать шаблон так, чтобы A2::do() и A3::do() вызывались только если они заданы при специализации шаблона?
Код:
<template class A1, class A2=нечто, class A3=нечто>
....
A1::do();
if( A2 != нечто ) A2::do();
if( A3 != нечто ) A3::do();


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

Зарегистрирован: 23 янв 2016, 15:37
Сообщения: 1235
Цитата:
как описать шаблон так, чтобы A2::do() и A3::do() вызывались только если они заданы при специализации шаблона?

Код:
template<typename T1, typename T2>
class A
{
    void do() { T1::do(); T2::do(); }
};

template<typename T1>
class A<T1, void>
{
    void do() { T1::do(); }
};

template<typename T2>
class A<void, T2>
{
    void do() { T2::do(); }
};

A<int, int> a1;
A<int, void> a2;
A<void, int> a3;


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

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


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

Зарегистрирован: 06 ноя 2013, 16:07
Сообщения: 703
Откуда: Германия
axill писал(а):
не совсем понял о чем речь
я спрашиваю про параметры шаблона, а не метода
не С++, но для пояснения вопроса ниже кусок кода
как описать шаблон так, чтобы A2::do() и A3::do() вызывались только если они заданы при специализации шаблона?


Код:
struct Dummy {
  void do() {}
};

<template class A1, class A2=Dummy, class A3=Dummy>
....
A1::do();
A2::do();
A3::do();


(но я не пробовал компилировать)


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

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


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

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

В С++11 есть variadic templates, но это не для твоих STM8 :)


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

Зарегистрирован: 06 ноя 2013, 16:07
Сообщения: 703
Откуда: Германия
А это и есть оптимальный вариант, на мой взгляд: в исходники минимум визуального мусора, в бинарнике - ни одного лишнего байта.


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

Зарегистрирован: 20 мар 2013, 11:27
Сообщения: 5358
dev писал(а):
ни одного лишнего байта.

а как же вызовы пустых методов?


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

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

А зачем компилятору вызывать пустые методы?


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

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

cудя по отладчику он таки их вызывает
вот если вставить if с константным выражением то вызов из кода выбрасывается
но при отсутствии is_same это не возможно сделать, не возможно сравнивать типы


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


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


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

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


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

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

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