Перейти к содержанию
    

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

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:

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

Изменено пользователем repstosw

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

16 минут назад, __inline__ сказал:

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

18 minutes ago, __inline__ said:

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

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

18 minutes ago, __inline__ said:

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 минуту назад, haker_fox сказал:

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

3 minutes ago, mantech said:

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

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

16 minutes ago, mantech said:

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

 

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

 

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

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

 

 

15 minutes ago, haker_fox said:

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

 

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

Изменено пользователем repstosw

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

13 минут назад, haker_fox сказал:

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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:

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

10 hours ago, dxp said:

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

 

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

 

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

Изменено пользователем repstosw

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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. Даже в справочник заглянул для того, чтобы в этом посте написать пример)))

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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 "искаропки", а в обычном С - нет.

Изменено пользователем repstosw

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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:

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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()

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

27 минут назад, Сергей Борщ сказал:

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

8 минут назад, AHTOXA сказал:

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...