Jump to content

    
C2000

Кооперативная RTOS для STM32

Recommended Posts

6 hours ago, haker_fox said:

Теперь понятно. Это воплощает в жизнь известное высказывание: "если вы делаете преобразование типов, то ваша программа, скорее всего, написана неправльно".

 

Какая-та хрень... Есть движок Box2D, принимающий и возвращающий во float. В том числе и координаты, которые используются для вывода изображения на экран в целочисленном представлении:

 

float x,y;

Calculate_Physics(&x,&y);

Draw_Image((int)x, (int)y);

 

И что здесь неправильного?   Типкаст float в int  явно выделил - для педантичности ,  на самом деле можно опустить его, компилятор сам приведёт float в int.

 

Только не надо говорить что расчёт физики - не для МК и вообще не для embed. :biggrin:

Жизнь не спрашивает, что можно/нужно тащить в эмбид, а что нет.  Она требует.

Edited by __inline__

Share this post


Link to post
Share on other sites
16 минут назад, __inline__ сказал:

Есть движок Box2D, принимающий и возвращающий во float.

Вот мне только эта логика вообще не понятна, разработчики сего действа на что вообще рассчитывали, что есть экран с дробными пикселями??:biggrin: Не видал...

Share this post


Link to post
Share on other sites
18 minutes ago, __inline__ said:

И что здесь неправильного?

Вы почему меня спрашиваете? Я не автор этого высказывания. Я где-то его прочитал. По-моему у Страуструпа. И я полностью согласен, что при программировании без преобразования типов данных обойтись нельзя. Ну разве что в синтетическом примере в учебнике.

18 minutes ago, __inline__ said:

Только не надо говорить что расчёт физики - не для МК и вообще не для embed.

Ну я считаю (программирую) каждый день в МК физику, если измерения физических величин - это физика) Системы управления в своё время дела, тоже физика, ибо электропривода, траектория движения.

Share this post


Link to post
Share on other sites
1 минуту назад, haker_fox сказал:

И я полностью согласен, что при программировании без преобразования типов данных обойтись нельзя.

Так вы ж сами себе противоречите, пред. посту:biggrin:

Share this post


Link to post
Share on other sites
3 minutes ago, mantech said:

Вот мне только эта логика вообще не понятна, разработчики сего действа на что вообще рассчитывали, что есть экран с дробными пикселями??:biggrin: Не видал...

не хотели копить ошибки округления. И это лишь расчёт физики, его ведь не обязательно на экран выводить в "целых" пикселях в масштабе 1:1.

 

Share this post


Link to post
Share on other sites
16 minutes ago, mantech said:

Вот мне только эта логика вообще не понятна, разработчики сего действа на что вообще рассчитывали, что есть экран с дробными пикселями??:biggrin: Не видал..

 

Всё просто.  До какого-то момента я тоже думал, что разрабы Box2D дураки.  На самом деле,  дробный результат координат очень полезен , когда идёт приращение с  дробным инкрементом.

 

Допустим приращение 2,5 пиксела.   Вначале это +2,  затем уже +5,  затем +7, затем 10.   Приращение больше 2, но меньше 3.  

Можно конечно сделать целыми числами, но тогда надо будет умножать, затем делить, что не всегда удобно.

 

 

15 minutes ago, haker_fox said:

Вы почему меня спрашиваете? Я не автор этого высказывания. Я где-то его прочитал. По-моему у Страуструпа.

 

Моё бурное несогласие было направлено в адрес автора высказывания.  Не к вам.   Однако (мне показалось?) , что вы и DXP согласны с ним?

Edited by __inline__

Share this post


Link to post
Share on other sites
13 минут назад, haker_fox сказал:

Вы почему меня спрашиваете? Я не автор этого высказывания. Я где-то его прочитал. По-моему у Страуструпа. И я полностью согласен, что при программировании без преобразования типов данных обойтись нельзя. Ну разве что в синтетическом примере в учебнике.

Это примерно то же самое, как если в приличном обществе громко сказать ХУ*, а потом оправдываться, говоря: "Это не я так сказал, это на заборе было написано".  :biggrin:

Share this post


Link to post
Share on other sites
1 hour ago, mantech said:

Так вы ж сами себе противоречите, пред. посту:biggrin:

В чём противоречие? Вы вообще внимательно читаете то, что я пишу, и кому пишу? Или выдираете сказанное без контекста?

1 hour ago, __inline__ said:

Не к вам.

Ок, понял)

1 hour ago, __inline__ said:

Однако (мне показалось?) , что вы и DXP согласны с ним?

Скажу только за себя. Вам показалось) Я же пишу реальные программы для реального железа. И как же обойтись без кастования?

1 hour ago, jcxz said:

а потом оправдываться, говоря: "Это не я так сказал, это на заборе было написано".

Вы, по ходу, тоже не поняли, к чему относится моё высказывание, к которому вы так любезно "докопались") Прочитайте ещё раз всё внимательно с поста @dxp

1 hour ago, jcxz said:

а потом оправдываться,

Я, по вашему, в чём-то виноват, раз вы считаете, что я оправдываюсь?)))

Share this post


Link to post
Share on other sites
10 hours ago, dxp said:

Ну, и в С++ static_cast и reinterpret_cast - это разные уровни кастования - например, static_cast не позволит целое преобразовать к указателю, т.е. как бы разные уровни severity, а сишный вариант не различает их - объединяет оба.  

 

А вот это я уже называю "заботой об имбецилах"...  Дыру в человеческом мозгу никак не выправить ликвидациями кажущихся дыр в языке.   Считаю, что если программист допускает ошибочные или некорректные типкасты, то это его проблемы, а не языка.  И в этом плане Си - крут, так как полная свобода действий.  Иногда приходится делать сложные типкасты.  В этом случае хочется сделать свободный типкаст в стиле Си.  Без всяких этих static_cast'ов.

 

И пользоваться malloc/free (realloc), вместо new/delete.  Исключениями стоят выделения памяти под классы (тут только new/delete)

Edited by __inline__

Share this post


Link to post
Share on other sites
13 minutes ago, __inline__ said:

В этом случае хочется сделать свободный типкаст в стиле Си.  Без всяких этих static_cast'ов

Никто в Си++ не запрещает делать каст в Си-стиле. Но вы можете использовать reinterpret_cast из набора Си++ операторов. Он (если ян е ошибаюсь), эквивалентен "свободному" (безбашенному) Си-кастованию)

13 minutes ago, __inline__ said:

И в этом плане Си - крут, так как полная свобода действий.

А разве Си++ накладывает ограничения на свободу. Пишу на нём для МК достаточно давно. Чтобы было понятно, на каком уровне пишу, скажу так: драйвера, сбор данных, фильтрация, связь и т.п. Не заметил никаких ограничений. Если хочется быть совсем отмороженным))), то можете использовать инлайн-ассемблер, машинные коды или intrinsic-функции. Впрочем, всё это уже к Си++ мало относится, так как есть и в обычном Си. Но не нужно забывать, что Си++ предоставляет и массу полезных инструментов, позволяющих сократить количество строчек кода, и при этом не раздувать (как иногда ошибочно думают) машинный код.

13 minutes ago, __inline__ said:

И пользоваться malloc/free (realloc), вместо new/delete

Используйте их в Си++. Они работают. Только что такого в записи

type_t * ptr = malloc(sizeof(type_t) * TYPE_T_COUNT);

вместо

auto ptr = new type_t[TYPE_T_COUNT];

 

13 minutes ago, __inline__ said:

Исключениями стоят выделения памяти под классы (тут только new/delete)

Нет, не только. Вы можете объекты классов создавать статически. Без динамического выделения памяти.

З.Ы. Стал активно уходить от динамического распределения памяти. Давно не писал new/delete. Даже в справочник заглянул для того, чтобы в этом посте написать пример)))

Share this post


Link to post
Share on other sites
1 hour ago, haker_fox said:

А разве Си++ накладывает ограничения на свободу.

 

Накладывает:

 

1 hour ago, haker_fox said:

Используйте их в Си++. Они работают. Только что такого в записи


type_t * ptr = malloc(sizeof(type_t) * TYPE_T_COUNT);

 

Вот тут Вы и попались! :biggrin:

В С++ будет ошибка, в С пролезет.

Надо так:

 

type_t *ptr = (type_t*)malloc(sizeof(type_t)*TYPE_T_COUNT);

 

1 hour ago, haker_fox said:

Нет, не только. Вы можете объекты классов создавать статически. Без динамического выделения памяти.

 

Для классов с инитом конструкторов - тольлько  new/delete.  Без вариантов! :don-t_mention:

 

Quote

З.Ы. Стал активно уходить от динамического распределения памяти. Давно не писал new/delete. Даже в справочник заглянул для того, чтобы в этом посте написать пример)))

 

В играх без динамического перераспределения памяти никак нельзя. "Выделил-использовал-освободил"... так много раз.

 

 

P.S.  Еще что заметил:  в С++ тип bool "искаропки", а в обычном С - нет.

Edited by __inline__

Share this post


Link to post
Share on other sites
8 minutes ago, __inline__ said:

Вот тут Вы и попались! :biggrin:

Конечно попался: я new давно не писал, а malloc и того дольше) Да и идея была передать суть, а не 100%-компилируемый код)))

8 minutes ago, __inline__ said:

В С++ будет ошибка, в С пролезет.

Класс! Си++ вас же предупреждает о неаккуратности. Лишний раз задумаетесь) Я даже в IAR ключик добавляю, который все предупреждения превращает в ошибки.

8 minutes ago, __inline__ said:

Для классов с инитом конструкторов - тольлько  new/delete.  Без вариантов!

Не понял вас, приведите пример, пожалуйста. Я использую классы с конструкторами, но не использую выделение или удаление динамической памяти. В конструкторах происходит инициализация полей класса и конструктора базового класса.

8 minutes ago, __inline__ said:

В играх без динамического перераспределения памяти никак нельзя.

Да я не фанатик))) Прекрасно понимаю, что динамическая память это не зло, а необходимый инструмент. К месту.

Share this post


Link to post
Share on other sites
3 часа назад, __inline__ сказал:

Для классов с инитом конструкторов - тольлько  new/delete.  Без вариантов! :don-t_mention:

Есть вариант:

auto ptr = malloc(sizeof(T));
if(ptr == nullptr)
{
    return errorcode;
}

auto t_ptr = new(ptr) T(параметры конструктора);

......
  
t_ptr->~T();
free(ptr);

Подсказка: placemet new()

Share this post


Link to post
Share on other sites
8 минут назад, AHTOXA сказал:

Ну, то есть без new всё же не обошлось? :biggrin:

Этот new не выделяет память. Фактически это вызов конструктора.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.