-
- В прошлом уже была тема, где осуждалось применение самодельных типов вроде i8, u8, i16, u16, i32 и т.д. При этом большинство участников выражали мнение, что так делать нельзя, а надо строго придерживаться определений из stdint.h, кончающихся Ксения(1698 знак., 04.05.2018 20:39)
- некий классик прок
линаллял всех и всякого кто использует словарнозависимые языки на основе одних и тех же азбук. - LordN(04.05.2018 21:43) - >с комплексными числами lloyd(824 знак., 04.05.2018 20:46)
- Хуже того, уже писал на эту тему. Код с самодельными типами невозможно запустить вне окружения, где его планировалось использовать (например взять одну функцию, класс). Код с самодельными типами сложно читать, потому, что не знаешь, например, что fk0(34 знак., 04.05.2018 21:25)
- "Код с самодельными типами сложно читать"- а replace в текстовом редакторе уже запретили? Хотелось бы посмотреть пример для PIC, когда есть разница в результате при использовании char и int8_t либо int и int16_t. - Экспериментатор(05.05.2018 19:48, )
- За u16 не должен скрываться тип uint32_t, т.к. мнемоника обязана соблюдаться (!), но могут скрываться типы: WORD, unsigned short, _unit16, __unit16, unit16_t и т.п. - Ксения(04.05.2018 21:33)
- Ну и смысл давать 100500 разных имён одной сущности unsigned short? Другое дело, что НУ НЕ МОЖЕТ, ИНСТРУКЦИЙ НУЖНЫХ НЕТ, эффективно работать CPU с таким типом. Что теперь, генерировать в полтора раз больше кода, где через строчку инструкция fk0(146 знак., 04.05.2018 22:46)
- Да потому что гладиолус. Я пишу так как удобно мне, кодом делится не собираюсь. Кто мой код возьмёт - меня не заботят его сложности, у меня же нет проблем переносимости. Разговор ни о чём, религиозные споры. - POV_(05.05.2018 10:44, )
- У тебя "Синдром Данинга-Крюгера" в чистом виде. Просто ты ни с чем кроме AVR и Delphi не сталкивался (да и тот же AVR выравнивает побайтово, а Delphi нормально, и положив в структуру int после char можно огрести). Да и код ты пишешь не в вакууме. fk0(60 знак., 05.05.2018 11:09)
- Что это за синдром даже гуглить не буду. За мои профессиональные качества голосуют рублем. Это нагляднее любых попыток сектантов указать на неправильность моих подходов. а - POV_(05.05.2018 17:10, )
- Про рубль, главное чтобы не били, по Салтыкову-Щедрину. - Движется к югу(06.05.2018 02:04, )
- Ты хороший продавец/бизнесмен. - fk0(05.05.2018 17:16)
- Дельфи выравнивает, как ему укажешь директивами компилятора. Просто при передаче структур между различными архитектурами нужно внимательно к этому отнестись, а не полагаться на умолчания. У меня одни и те же структуры в дельфях, VC и устройствах Гудвин(256 знак., 05.05.2018 11:59)
- И это не поможет... POV_(347 знак., 06.05.2018 00:14, )
- Что это за синдром даже гуглить не буду. За мои профессиональные качества голосуют рублем. Это нагляднее любых попыток сектантов указать на неправильность моих подходов. а - POV_(05.05.2018 17:10, )
- У тебя "Синдром Данинга-Крюгера" в чистом виде. Просто ты ни с чем кроме AVR и Delphi не сталкивался (да и тот же AVR выравнивает побайтово, а Delphi нормально, и положив в структуру int после char можно огрести). Да и код ты пишешь не в вакууме. fk0(60 знак., 05.05.2018 11:09)
- Да потому что гладиолус. Я пишу так как удобно мне, кодом делится не собираюсь. Кто мой код возьмёт - меня не заботят его сложности, у меня же нет проблем переносимости. Разговор ни о чём, религиозные споры. - POV_(05.05.2018 10:44, )
- Ну и смысл давать 100500 разных имён одной сущности unsigned short? Другое дело, что НУ НЕ МОЖЕТ, ИНСТРУКЦИЙ НУЖНЫХ НЕТ, эффективно работать CPU с таким типом. Что теперь, генерировать в полтора раз больше кода, где через строчку инструкция fk0(146 знак., 04.05.2018 22:46)
- Хуже того, уже писал на эту тему. Код с самодельными типами невозможно запустить вне окружения, где его планировалось использовать (например взять одну функцию, класс). Код с самодельными типами сложно читать, потому, что не знаешь, например, что fk0(34 знак., 04.05.2018 21:25)
- некий классик прок
- я вижу не первый раз. при чтении понятно, что имел в виду автор, ну и ладно. напомню, что в IAR для MSP430 нормальное использование stdint.h и math.h начинается с выбивания CLIB и вбивания DLIB - Vit(04.05.2018 11:24)
- А если ещё для управления девайсом пишется писишная софтина на делфи, то так оно точно будет совпадать. - POV_(04.05.2018 11:38, )
- или на M$VS6, например - Vit(04.05.2018 11:43)
- Делфи я упомянул к тому, что там нет stdint.h ))) - POV_(04.05.2018 11:49, )
- в windef.h как бы тоже - Vit(04.05.2018 12:00, ссылка)
- Делфи я упомянул к тому, что там нет stdint.h ))) - POV_(04.05.2018 11:49, )
- или на M$VS6, например - Vit(04.05.2018 11:43)
- А если ещё для управления девайсом пишется писишная софтина на делфи, то так оно точно будет совпадать. - POV_(04.05.2018 11:38, )
- У меня 15 лет один *.h везде тащится. В итоге код переносится быстро. - POV_(03.05.2018 21:03, )
- Переносить платформо-зависимые типы между платформами - это стрелять себе в ноги. lloyd(180 знак., 04.05.2018 13:04)
- <stdint.h> точно также к платформе прибивается гвоздями, только компиляторописателями, которые сюда скорее всего не ходят:) А кроме платформ есть ещё зоопарк сред разработки, которые имеют свои особенности. Никто не запрещает заальясить DWORD на Vit(214 знак., 04.05.2018 13:26)
- Вообще-то нормальные люди тип не фиксируют гвоздями на столько-то бит, потому, что тот же ARM, например, с 8-битными типами не работает нормально. Для этого и нужен, в том и суть обычного int, что он равен ширине регистра процессора и всегда fk0(58 знак., 04.05.2018 13:46)
- uint_fastX_t, uint_leastX_t. Хотя каюсь, у меня в одном проекте int16_t кастуется к float, из-за сказотнейшей архитектуры - lloyd(04.05.2018 13:55)
- :) а как же <stdint.h>? Vit(199 знак., 04.05.2018 13:52)
- stdint.h -- это не только фиксированные типы. Там есть int_fast8_t, который прекрасно получается 8-битным на PIC18, 16-битным на PIC24 и 32-битным на PIC32 (MIPS или ARM). Фиксированные типы нужны в основном, где нужно ограничить объём памяти. fk0(510 знак., 04.05.2018 13:59)
- А что там с uint_fast8_t в логических выражениях? Есть "обрезание" до 8 бит в логических выражениях? Слыхал, что вроде как есть, но ни разу не проверял (ни разу не было явной необходимости использовать). Если есть, то получается, компилятор должен Vit(52 знак., 04.05.2018 14:10)
- Ко всем вычислениям применяется правило integer promotion. Заключающееся в расширении до размера int всех типов меньших размеров перед началом вычисления. Поэтому что uint_fast8_t, что unsigned char, если размер uint_fast8_t меньше инта, оба fk0(1190 знак., 04.05.2018 14:24)
- Вроде бы для беззнаковых "a - b < c" будет вычисляться правильно, т.е. результат a-b будет знаковым, и сравнение будет знаковым. Разумеется при условии отсутствии переполнения при вычислениях и преобразованиях. - AlexBi(04.05.2018 16:27)
- Спасибо, можно было просто сказать, что слухам верить не нужно:) Но как доберусь до Кайла для 51-х, посмотрю. Слухи были, что там это маскирование встроено (настройкой) - Vit(04.05.2018 14:40)
- В ряде компиляторов "недо-C" для embedded включалось отключение integer promotion. Потому, что в целом это повышает эффективность кода. В SDCC точно, в Keil C51, в CCS для пиков. Проблема в том, что это капитально ломает совместимость с C и код fk0(254 знак., 04.05.2018 14:45)
- ага - Vit(04.05.2018 14:49)
- В ряде компиляторов "недо-C" для embedded включалось отключение integer promotion. Потому, что в целом это повышает эффективность кода. В SDCC точно, в Keil C51, в CCS для пиков. Проблема в том, что это капитально ломает совместимость с C и код fk0(254 знак., 04.05.2018 14:45)
- (u)int_(fast|least|)(8|16|32|64)_t - это просто синонимы типов для char/int/long/longlong, не больше и не меньше. - lloyd(04.05.2018 14:16)
- Зависит от компилятора и архитектуры. 32-битный int_fast8_t - крайне распространенная весчь, даже на x86 - LightElf(04.05.2018 15:56 - 16:50)
- Да, но не на MIPS, например, там он станет 32-битным. Ну нет у MIPS инструкций для эффективной работы с 8-битными величинами. - fk0(04.05.2018 16:25)
- Я говорю про то, что компилятору нет разницы _на_конкретной_платформе_ напишешь ли ты int32_t или int_fast8_t, если в stdint.h написано lloyd(57 знак., 04.05.2018 16:18)
- Наверно я чего-то не понял, но зачем тогда использовать типы из stdint.h? Собственно, конкретная реализация int_fast8_t может быть вообще экзотической и не совпадать ни с одним стандартным типом. - LightElf(04.05.2018 16:57)
- Эти типы _уже_ есть в языке. lloyd(247 знак., 04.05.2018 17:45)
- Можно полюбопытствовать, где явно написано, кроме префикса std в имени файла, что эти алиасы входят в состав языка, а не т.н. стандартной библиотеки? - Vit(04.05.2018 18:30)
- Можете у МЭКа купить бумажный/электронный текст стандарта языка, в свободном виде есть только будущий черновик lloyd(745 знак., 04.05.2018 18:59, ссылка)
- В этом документе на 10-м листе указано, что добавлены extended целые типы и библиотечные функции в <inttypes.h> и <stdint.h>. А в п. 6.2.5 явно перечислены стандартные целые типы. - Vit(04.05.2018 19:37)
- Стандартная библиотека входит в стандарт языка. Шах и мат! - SciFi(04.05.2018 19:40)
- Спасибо, Кэп. Сторонние (независимые) реализации не должны конфликтовать со стандартными библиотеками и хедерами. Особенно доставляет printf(), оформленный в виде макроса, а не библиотечной функции (которая как бы слабая), при этом перекрывает Vit(92 знак., 04.05.2018 20:16)
- Ежели вам попался говнокод, стандарт не виноват. Отрывайте руки и/или ноги собственно говнокодеру. - SciFi(04.05.2018 20:22)
- Тут, конечно, стандарт не виноват. Но имеем такое довольно часто - оно либо макрос(а так хотелось при тощем комплекте либ свой printf с плавучкой втиснуть), либо встроено так, что хрен его выгрызешь, но хоть можно подкрутить ретаргетинг... - Vit(04.05.2018 20:32)
- Если компилятор не заявляет поддержку С99 - то оно как бе уже ничего не сделаешь (хотя уже 7 лет как С11). lloyd(203 знак., 04.05.2018 20:37)
- Макросы как раз при ARM-GCC 4.8 и NanoLib:). Опции С99/GNU99 поддерживаются:) - Vit(04.05.2018 20:58)
- Уже GCC 7ой мажорной версии на дворе, вы где 4.8 нашли? - lloyd(04.05.2018 21:03)
- Вроде даже 5.4. А та либа зовется правильно NewLib Nano. Вопрос тут не в языке или компиляторе, а в тулчейне, и, в частности, в составе, опциях и оформлении предкомпилированных "стандартных" библиотек. Например, пока один раз пишем Hello World всё Vit(951 знак., 04.05.2018 22:08)
- Седьмой??? Да я только вчера восьмой уже ставил в дебиане. Потому как с седьмым уже не работает... (libasan4 и libc >= 2.27) О, я знаю места где 3.6 есть. А то и 3.3.3. - fk0(04.05.2018 21:29)
- Уже GCC 7ой мажорной версии на дворе, вы где 4.8 нашли? - lloyd(04.05.2018 21:03)
- Макросы как раз при ARM-GCC 4.8 и NanoLib:). Опции С99/GNU99 поддерживаются:) - Vit(04.05.2018 20:58)
- Если компилятор не заявляет поддержку С99 - то оно как бе уже ничего не сделаешь (хотя уже 7 лет как С11). lloyd(203 знак., 04.05.2018 20:37)
- Тут, конечно, стандарт не виноват. Но имеем такое довольно часто - оно либо макрос(а так хотелось при тощем комплекте либ свой printf с плавучкой втиснуть), либо встроено так, что хрен его выгрызешь, но хоть можно подкрутить ретаргетинг... - Vit(04.05.2018 20:32)
- Ежели вам попался говнокод, стандарт не виноват. Отрывайте руки и/или ноги собственно говнокодеру. - SciFi(04.05.2018 20:22)
- Спасибо, Кэп. Сторонние (независимые) реализации не должны конфликтовать со стандартными библиотеками и хедерами. Особенно доставляет printf(), оформленный в виде макроса, а не библиотечной функции (которая как бы слабая), при этом перекрывает Vit(92 знак., 04.05.2018 20:16)
- Стандартная библиотека входит в стандарт языка. Шах и мат! - SciFi(04.05.2018 19:40)
- В этом документе на 10-м листе указано, что добавлены extended целые типы и библиотечные функции в <inttypes.h> и <stdint.h>. А в п. 6.2.5 явно перечислены стандартные целые типы. - Vit(04.05.2018 19:37)
- Можете у МЭКа купить бумажный/электронный текст стандарта языка, в свободном виде есть только будущий черновик lloyd(745 знак., 04.05.2018 18:59, ссылка)
- Можно полюбопытствовать, где явно написано, кроме префикса std в имени файла, что эти алиасы входят в состав языка, а не т.н. стандартной библиотеки? - Vit(04.05.2018 18:30)
- Есть параноики, которым на 8-битном МК обязательно хочется счётчик цикла uint8_t. Теперь они могут написать там uint_fast8_t и гордо объявить это переносимым кодом. Хотя достижение сомнительное, конечно. Название типа "череззаборногузадерищенко" SciFi(4 знак., 04.05.2018 17:06)
- Эти типы _уже_ есть в языке. lloyd(247 знак., 04.05.2018 17:45)
- Наверно я чего-то не понял, но зачем тогда использовать типы из stdint.h? Собственно, конкретная реализация int_fast8_t может быть вообще экзотической и не совпадать ни с одним стандартным типом. - LightElf(04.05.2018 16:57)
- Зависит от компилятора и архитектуры. 32-битный int_fast8_t - крайне распространенная весчь, даже на x86 - LightElf(04.05.2018 15:56 - 16:50)
- Ко всем вычислениям применяется правило integer promotion. Заключающееся в расширении до размера int всех типов меньших размеров перед началом вычисления. Поэтому что uint_fast8_t, что unsigned char, если размер uint_fast8_t меньше инта, оба fk0(1190 знак., 04.05.2018 14:24)
- А что там с uint_fast8_t в логических выражениях? Есть "обрезание" до 8 бит в логических выражениях? Слыхал, что вроде как есть, но ни разу не проверял (ни разу не было явной необходимости использовать). Если есть, то получается, компилятор должен Vit(52 знак., 04.05.2018 14:10)
- stdint.h -- это не только фиксированные типы. Там есть int_fast8_t, который прекрасно получается 8-битным на PIC18, 16-битным на PIC24 и 32-битным на PIC32 (MIPS или ARM). Фиксированные типы нужны в основном, где нужно ограничить объём памяти. fk0(510 знак., 04.05.2018 13:59)
- Как-то ты внезапно перешёл к АРМ, хотя об нем речи не было. А как быть с твоим любимым профессиональным пиком? - POV_(04.05.2018 13:49, )
- В пике работа с 32-битными переменными чудовищно неэффективна. DWORD или uint32_t в ненужном месте сильно аукнется. - fk0(04.05.2018 13:50)
- Вы эта... Педали не путайте. В наше время
мы все грузиныи МИПС-Писк... ;О) - mse homjak(04.05.2018 13:53)
- Вы эта... Педали не путайте. В наше время
- В пике работа с 32-битными переменными чудовищно неэффективна. DWORD или uint32_t в ненужном месте сильно аукнется. - fk0(04.05.2018 13:50)
- Вообще-то нормальные люди тип не фиксируют гвоздями на столько-то бит, потому, что тот же ARM, например, с 8-битными типами не работает нормально. Для этого и нужен, в том и суть обычного int, что он равен ширине регистра процессора и всегда fk0(58 знак., 04.05.2018 13:46)
- Там... POV_(126 знак., 04.05.2018 13:13, )
- Деятельность что ли не очень профессиональная. Ещё скажи layout структур у тебя совпадает (а так же ендианность и формат float). А если не совпадает, то какой смысл в совпадении типов? Только не говори, что совпадает... fk0(118 знак., 04.05.2018 13:49)
- Есть же тысячи простых бинарных форматов представления данных. От монстроузного Protocol Buffers (в ипостаси nanopb), до компактного CBOR (реализация от RIOT). - lloyd(04.05.2018 16:22)
- Совпадения layout-а структур, КМК, часто интересуют тех, кто (по привычке, взращенной 8-битниками) пытается кастить типами структур линейные буферы протоколов, всяких FS и т.п. Тогда начинаются наглые вставки packed() и внезапно удивление, когда Vit(215 знак., 04.05.2018 14:02)
- Ну чтоб не было масса девяток на конце надо писать printf("%.6f", val), например. Вот и вся проблема. В конце концов "круглые" в десятичной системе числа в представлении с плавающей точкой в принципе изначально не круглые, и цепляться к младшим fk0(247 знак., 04.05.2018 16:32)
- Да потому что уж слишком привлекательной кажется возможность утоптать протокол в структуру против побайтного двухуровневого разбора. С другой стороны, мало кто использует красивые протоколы с разделителями полей, вот и провоцируется говнокод. - VLLV(04.05.2018 16:18)
- Деятельность что ли не очень профессиональная. Ещё скажи layout структур у тебя совпадает (а так же ендианность и формат float). А если не совпадает, то какой смысл в совпадении типов? Только не говори, что совпадает... fk0(118 знак., 04.05.2018 13:49)
- <stdint.h> точно также к платформе прибивается гвоздями, только компиляторописателями, которые сюда скорее всего не ходят:) А кроме платформ есть ещё зоопарк сред разработки, которые имеют свои особенности. Никто не запрещает заальясить DWORD на Vit(214 знак., 04.05.2018 13:26)
- Переносить платформо-зависимые типы между платформами - это стрелять себе в ноги. lloyd(180 знак., 04.05.2018 13:04)
- В прошлом уже была тема, где осуждалось применение самодельных типов вроде i8, u8, i16, u16, i32 и т.д. При этом большинство участников выражали мнение, что так делать нельзя, а надо строго придерживаться определений из stdint.h, кончающихся Ксения(1698 знак., 04.05.2018 20:39)