другое в эбедете очень приятно юазть.
С++ как обычно с оговорками (все ради нас) мол записал одно поле вот его и юзай. записал другое юзай его
Но что если я в юнион сделал memcpy, какой элемент обьеденения сейчас активный? или это тоже UB?
да. UB
печель :(. а зачем так сделали? для удобства и защиты? ну а все же есть реальные кейзы?
Memcpy надо делать не в union, а из массива чаров/байтов в объект нужного типа, тогда все будет хорошо. Или наоборот, из объекта произвольного типа в массив байт.
Если ты в union из двух полей f1 и f2 записал через memcpy данные из объекта, который имеет тип f1, то это не UB, и активно поле f1. И наоборот. Хотя это не точно, надо бы справится в стандарте, но вроде идея такая была.
ну вот куда я должен делать копию когда идут данные с уарта, тем более по ДМА так сказать без человека? а поле или тип данных где то внутри. мне что потом копию данных делать в правильные типы? ну сказать что это удобно ну такое
Это точно неверно. ЕСЛИ бинарный буфер содержит реально данные одного из типов объединения, то тогда — да, можно. Собственно, любые данные на входе memcpy превращаются в такой буфер.
просто получается в том же модбасе прилетает запрос и если запрос записи IO то это байты и там тупо битики DI/DO а если регистры? то это уже uint16_t. мне что теперь эти uint16_t копировать в массив uint16_t?
В локальный объект. Скорее всего, компилятор поймёт, что ты хочешь просто переинтерпретировать данные и никакого дополнительного хранилища создавать не будет, то есть настоящей копии memcpy делать не должен.
Я имею в виду, без юниона вообще
С чего вдруго memcpy не будет делать копию ?
тут проще сослаться на Jason Turner: https://www.youtube.com/watch?v=L06nbZXD2D0
Обсуждают сегодня