|
21 / 19 / 6
Регистрация: 25.11.2017
Сообщений: 708
|
|
Что за тип данных uint32_t?30.07.2019, 22:34. Показов 40497. Ответов 171
Метки нет (Все метки)
0
|
|
| 30.07.2019, 22:34 | |
|
Ответы с готовыми решениями:
171
Как побитово скопировать uint32_t в float, минуя при этом выделения uint32_t в оперативную память
Скажите пожалуйста, что это за тип данных?! |
|
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
|
||||||
| 13.08.2019, 13:03 | ||||||
|
Если же юзерам длинные имена все же нужно, вероятно их нужно и разработчикам библиотеки. Просто они ретрограды и не хотят этого признавать. Это здесь таким боком, что язык это правила синтаксиса. Если правила синтаксиса asm() целиком выдуманы авторами C++ компилятора то да, asm() это подмножество C++. Причем, не C++ вообще, а того диалекта, который в вашем компиляторе. Ну и возвращаясь к Си. Если синтаксис Си чуть менее чем целиком входит в синтаксис плюсов, то для любых практических нужд Си это подмножество плюсов. И если там короткие имена, то объясняется это явно не тем что подмножество плюсов, лучше плюсов в целом. Что до контроллеров, вбил в Гугл "AVR C++". Сразу вылетел на статьи о том, как хреново C++ на AVR реализован. Так что да, на контроллерах на программистов давят. Что до uint, делаем его псевдонимом unsigned и будет он востребован не меньше чем unsigned. Но опять же, разработчикам uint как отдельная сущность не нужен. Только как часть uint32_t.
0
|
||||||
|
4150 / 2728 / 433
Регистрация: 09.09.2017
Сообщений: 12,099
|
||||||||||
| 13.08.2019, 14:07 | ||||||||||
|
Но это уж очень извращенное представление, поскольку обычно Си компилируется именно как Си, без привязки к другим языкам. Его просто незачем куда-то включать. А вовсе не особенность устройств с малым объемом памяти и скорости, где все эти динамические выделения, перебор наследования и т.п. просто невыгодны. Но, раз уж у нас сегодня еще один день откровений, я вас обрадую: при желании на С++ можно написать более читаемый и эффективный код, чем на Си. Вот только такой код не будет похож на код типичного плюсовика: придется отказаться от кучи привычных вещей и даже (о, ужас!) следить за памятью и прочими ресурсами самостоятельно. Увы, практика показывает, что лишь единицы способны таки побороть язык и написать на нем качественный код. У остальных же получается Ардуино...
0
|
||||||||||
|
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
|
|||||||
| 14.08.2019, 00:02 | |||||||
|
Что до включения Си в C++, надеюсь, не будет большим откровением что тот же плюсовый <cassert> это просто редирект на сишный <assert.h>. Си-код инклудится в плюсы на регулярной основе. Что тоже аргумент отнюдь не в пользу его независимости и качественного отличия от плюсов. Я уж не знаю заговор или еще что, но в хреново реализованном компиляторе виноват явно не C++. Добавлено через 38 минут
0
|
|||||||
|
4150 / 2728 / 433
Регистрация: 09.09.2017
Сообщений: 12,099
|
|||||||
| 14.08.2019, 11:44 | |||||||
|
Это предупреждение, что пихать в качестве формата не-константную строку - плохая идея. Мало ли какой формат туда засунут, сколько переменных захотят записать или прочитать. Потому что некоторые личности любят писать printf( str ); вместо printf( "%s", str ); или простого puts( str );Ну и, раз уж у нас продолжение "дня откровений", со scanf тоже надо быть осторожным и указывать максимально допустимое количество символов: не scanf("%s", str); а scanf("%10s", str);. Увы, указать длину из переменной нельзя. Кстати, это единственное известное мне место, где применение scanf_s было бы оправдано... не считая того, что логичнее было бы добавить флажок в сам scanf и не заниматься нецензурными извращениями с *_s функциями. Как бы то ни было, необходимость в подобном возникает крайне редко, да и fgets никто не отменял. Туда же использование snprintf вместо sprintf.Естественно, обсуждение функций форматного ввода-вывода не имеет отношения к теме и была приведена просто для общего развития. Например, далеко не каждому плюсовику очевидно, что в контроллерах не надо пользоваться new/delete (равно как и malloc/free) без крайней необходимости. Не очевидно, что использование наследования также нежелательно (а вот сами объекты вполне полезны). Не очевидно, что глобальный объект, который дергают все кому не лень, предпочтительнее постоянного создания локальных. Повторяю, это относится не к avr-g++, это сам подход С++.
0
|
|||||||
|
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
|
|||||
| 14.08.2019, 21:43 | |||||
|
Это предупреждение именно об опечатке. Что нельзя пихать в качестве формата неконстантную строку нельзя все и так знают. Но вот палец случайно стукнул по "s" не один раз, а два и одна функция превратилась в другую. И аргумент уехал куда-то не туда. А пилить предупреждения об опечатках имеет смысл только если кто-то эти опечатки регулярно делает. Подсчет факториала в Си и C++ идентичен до последней буковки. Но вы почему-то не считаете Си и C++ диалектами одного языка. В разных ассемблерах даже синтаксис команд одного и того же процессора не совпадает. Но это диалекты. Не находите, что в этой логике что-то не так?
0
|
|||||
|
4150 / 2728 / 433
Регистрация: 09.09.2017
Сообщений: 12,099
|
|||||||||
| 15.08.2019, 00:29 | |||||||||
|
Как бы то ни было, альтернативы стандартному выводу практически нет. Но какое отношение этот вопрос имеет к теме? Разные варианты *printf легко перепутать? Очевидно, нет. Использование похожих имен для похожих (но не одинаковых!) целей не имеет смысла? Тоже очевидно нет. Если уж С++ является наследником Си и поддерживает с ним такую совместимость, что почти любой Си-шный код может быть скомпилирован плюсами - это значит именно то, с чего началось: С++ - наследник Си, старающийся поддерживать совместимость. На каком основании вы называете Си придатком С++ никто не знает. Как и то, какое отношение все это имеет к исходной теме, но от вас я другого уже и не жду. Кстати, было бы интересно узнать ваше мнение о реализации следующих стандартных вещей в контроллерах. Пусть будут AVR, раз уж с них начали - просто для определенности. 1. Порты (три регистра DDRx, PORTx, PINx плюс номер ножки). Что порт не стоит хардкодить - очевидно, но какую абстракцию к нему применить? 1а. Стиль Ардуино: присвоить ножкам порядковые номера (числа), и запилить функции, принимающие эти номера и декодирующие их в те самые регистры. Для пользователя все красиво: порт задается единственным числом, передается в любые функции и т.п. 1б. ООП: объявить каждую ножку классом с полями и методами. 1в. Примитивные макросы: на каждую ножку задается 4 макроса, по одному на регистр. 1г. Продвинутые макросы: на каждую ножку задается один макрос с несколькими "полями", которые обрабатываются другими макросами. 1д. Шаблоны: вот тут подробностей дать не могу, поскольку только видел мельком такой вариант, но не разобрался в нем 1е. Ну и до кучи - свой вариант. Вдруг знаете более красивый способ, чем перечисленные . 2. Периферия. Например, в контроллере есть два SPI (у каждого свои выводы, скорость, полярность и т.п.) 2а. Стиль Ардуино: по объекту на каждый порт 2б. Макросы: порт кодируется только номером, который макроподстановкой добавляется к именам регистров. 2в. Свой вариант. . 3. Внешняя периферия. Например, на SPI1 висит дисплей 3а. Ардуино: Объявим объект дисплея, который будет хранить объект SPI-порта 3б. ООП: сам SPI кодируется как-то покороче, вроде адреса регистров SPI или вообще макросом. Но сам при этом завернут в объект. 3в. Процедурный подход: выделенного объекта нет, зато есть кучка функций, читающих номер порта из макроса или откуда-то еще. 3г. Ну как обычно.
0
|
|||||||||
|
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
|
|||||
| 15.08.2019, 06:53 | |||||
|
Что до возможности перепутать разные варианты printf, ну если программу робот набирает, то да, перепутать их сложно. Люди же никогда не делающие опечаток, существа по большей части мифологические. Возвращаясь к плюсам. Если горожанин (C++) понимает почти все фразы деревенского (C), а наоборот нет, мы несомненно можем утверждать что городской диалект развился от деревенского. Но это не повод утверждать что в деревне и городе говорят на разных языках. И уж тем более не повод объяснять заскоки деревенских жителей тем, что их язык лучше городского. Если русский и белорус (два ассемблера) друг друга вообще не понимают, но в "белорусский" есть "русский", это опять же не дает права говорить что русский и белорусский - диалекты одного языка. Ну а если горожанин ввертывает в свою речь фразы которые он считает французскими (асм-вставки), но французы его не понимают, он говорит на своим личном пиджине. По AVR - у нас оптимизатор кода работает или все как всегда? Если работает, то порты делаются глобальными объектами, наследующими абстрактный интерфейс Port. И port0.put(123) генерирует код идентичный PORTA|=123. Иначе пишем багреппорт "зачем компилятор делает виртуальный вызов, если тип объекта известен на стадии компиляции?". Примерно тоже с прочей периферией. Разумеется, если вы будете делать somePort.put(123), фокус не сработает. Но я не особо представляю как вы собираетесь уйти от полиморфизма, если функция должна писать в произвольный порт. Свитч по portID это те же яйца, профиль сбоку.
0
|
|||||
|
4150 / 2728 / 433
Регистрация: 09.09.2017
Сообщений: 12,099
|
||||||||||
| 15.08.2019, 09:49 | ||||||||||
|
Ну а С++ существенно отличается от Си, они развиваются каждый сам по себе, по своим принципам. Ну да, плюсовики старательно тащат совместимость с Си, это их дело. Забавно, что сами же при этом утверждают, что писать на С++ в стиле Си - плохая идея. Как бы то ни было, это не повод смешивать языки. Я не просто так говорил об отдельных выводах порта, потому что это типичная задача переносимости: куда повесить кнопку, светодиод, семисегментный индикатор, чтобы при переносе библиотеки, которая их использует, не пришлось бегать по всему проекту с автозаменой. Собственно, об этом я и говорю: разные подходы. Си-шник предпочтет макросы и будет точно знать во что код разворачивается. Плюсовик будет пихать все средства языка, которые знает. Да, он добьется большей гибкости... которая совершенно не нужна. А вот производительность пострадает.
0
|
||||||||||
|
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
|
|||||||||||||||
| 15.08.2019, 11:07 | |||||||||||||||
И вот не надо сказок про наличие контроля типов в Си.
По кнопкам и светодиодам - делайте ссылки и не морочьте голову. Port&button=port0;. Опять же, если оптимизатор кода не отвалился, ничего там с производительностью не сделается. По полиморфизму - делаем библиотечную функцию "отправь в порт строку". Нет, если у вас висящее на этом порту устройство принимает только однобайтовые команды, тогда конечно не стоит весь этот огород городить. Но так возможность лепить PORTA|=123 у вас никто и не отбирает.
0
|
|||||||||||||||
|
Вездепух
13239 / 6871 / 1827
Регистрация: 18.10.2014
Сообщений: 17,416
|
|||
| 15.08.2019, 21:09 | |||
void *) полностью идентична строгости контроля типов в С++.Приведенный вами код некорректен в С и требует диагностического сообщения. То есть он некомпилируем.
0
|
|||
|
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
|
||
| 15.08.2019, 21:34 | ||
|
0
|
||
|
Вездепух
13239 / 6871 / 1827
Регистрация: 18.10.2014
Сообщений: 17,416
|
||
| 15.08.2019, 22:04 | ||
|
Пробуем: http://coliru.stacked-crooked.... 77a1d1aa6d Получаем ворох требуемых стандартом языка диагностических сообщений. Код некомпилируем. Однако стоит указать "Show compiler warnings" в rextester и мы получим те же диагностические сообщения. Код некомпилируем.
1
|
||
|
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
|
|||
| 15.08.2019, 22:34 | |||
|
То есть, исполняемый файл успешно сгенерировался, запустился и грохнулся. Весьма странная "не компилируемость".
0
|
|||
|
Вездепух
13239 / 6871 / 1827
Регистрация: 18.10.2014
Сообщений: 17,416
|
||
| 15.08.2019, 23:53 | ||
|
Если же такие сообщения были выданы, то любой исполняемый файл, который при этом сгенерировался - это не более чем неубранный мусор, как значение неинициализированной переменной.
0
|
||
|
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
|
||
| 16.08.2019, 00:24 | ||
|
Делать варнинги мерилом компилируемости это весьма странная идея.
0
|
||
|
Вездепух
13239 / 6871 / 1827
Регистрация: 18.10.2014
Сообщений: 17,416
|
||
| 16.08.2019, 01:24 | ||
|
А те сообщения, которые не указывают на нарушения правил языка, т.е. сообщения, которые компилятор добавляет "от себя" (как в вашем примере), являются классическими "просто варнингами", которые к теме компилируемости не имеют никакого отношения. Для того, чтобы отличить стандартные диагностических сообщения от "просто варнингов" нужно либо иметь хорошее представление о спецификации языка (т.е. уметь отличать первые от вторых "невооруженным глазом"), либо прибегать к помощи компилятора, предоставляемой ключами вроде -pedantic-errors.
1
|
||
|
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
|
||
| 16.08.2019, 01:55 | ||
|
0
|
||
|
Вездепух
13239 / 6871 / 1827
Регистрация: 18.10.2014
Сообщений: 17,416
|
||||
| 16.08.2019, 02:10 | ||||
|
Но к языкам С или С++ это уже не будет иметь никакого отношения. Я же веду речь именно о корректности/компилируемости кода в рамках языков С или С++. В своем исходном сообщении о якобы отсутствующем контроле типов в языке С вы тоже вели речь о языке С.
0
|
||||
| 16.08.2019, 02:10 | |
|
std::vector<int> Что это за тип данных?
Восьмибитный тип переменной (что за тип, но не BYTE и не CHAR?
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Про "Windows must die!"
kumehtar 04.11.2026
Знаете, чет накатило. . . .
Когда-то это было почти боевым кличем: мол, нормальный человек сидит на DOS, OS/ 2 или Linux, а вот это вот - Must Die. А теперь человек произносит «мастдай» с усмешкой - и. . .
|
Красочные поля с номером страницы svg+background-image
russiannick 04.11.2026
Красочные поля с номером страницы не менее важны чем в эпоху бумажных книг.
Посему спешу представить почтеннейшей публике этот важный инструмент который эти поля и формирует.
В процессе разработки. . .
|
Вступаем в новую фазу генерации favicons, векторную.
russiannick 02.11.2026
Теперь нет нужды скрывать что используется простой svg. Исходный код изображения помещаем в поле и жмем кнопку. Исходник преобразуется в вид корректный для помещения в favicon или в url(). Нажатие. . .
|
Генератор паролей (вариант №4)
Maks 01.11.2026
После публикации 3-го варианта генератора паролей, разослал его своим коллегам (с целью оценки), в итоге были получены следующие рекомендации:
1. Вернуть возможность использования знаков | 1 l I;. . .
|
|
Генератор паролей (вариант №3)
Maks 30.10.2026
Финальная версия генератора паролей 1С.
Доработка решения в этот раз коснулась только визуальной части, а именно, добавлен реквизит ДопПараметры (тип Булево), который скрывает/ отображает реквизиты:. . .
|
Магическое мышление и магия, современная наука не отличима от магии (говорит ИИ Джемени)
zorxor 30.10.2026
Джемени, расскажи, пожалуйста, что такое магическое мышление, что такое магия, почему современная наука чем-то напоминает магию?
Фраза «Любая достаточно развитая технология неотличима от магии». . .
|
За какое время ИИ может подобрать пароль по хешу (рассказывает Джемени ИИ)
zorxor 30.10.2026
Расскажи, Джемени, если известен хэш МД5, например, за сколько ИИ сможет подобрать соответствующий пароль?
Искусственный интеллект (ИИ) может подобрать простой или средний по сложности пароль по. . .
|
Кто убил Suno? Почему наше солнышко погасло? (диалог с ИИ Джемени)
zorxor 30.10.2026
Как убивали Suno. Хронология.
«Убийство» музыкальной нейросети Suno — это затяжной процесс, в котором технологический хайп стартапа разбился о жесткую реальность судебных исков от гигантов. . .
|