170 похожих чатов

В олд Си скажем так удобные unions положил одно читай

другое в эбедете очень приятно юазть.
С++ как обычно с оговорками (все ради нас) мол записал одно поле вот его и юзай. записал другое юзай его
Но что если я в юнион сделал memcpy, какой элемент обьеденения сейчас активный? или это тоже UB?

12 ответов

10 просмотров

да. UB

Stas-Koynov Автор вопроса
Ilya Zviagin
да. UB

печель :(. а зачем так сделали? для удобства и защиты? ну а все же есть реальные кейзы?

Memcpy надо делать не в union, а из массива чаров/байтов в объект нужного типа, тогда все будет хорошо. Или наоборот, из объекта произвольного типа в массив байт.

Если ты в union из двух полей f1 и f2 записал через memcpy данные из объекта, который имеет тип f1, то это не UB, и активно поле f1. И наоборот. Хотя это не точно, надо бы справится в стандарте, но вроде идея такая была.

Stas-Koynov Автор вопроса
Anton Semenov
Memcpy надо делать не в union, а из массива чаров/...

ну вот куда я должен делать копию когда идут данные с уарта, тем более по ДМА так сказать без человека? а поле или тип данных где то внутри. мне что потом копию данных делать в правильные типы? ну сказать что это удобно ну такое

Anton Semenov
Memcpy надо делать не в union, а из массива чаров/...

Это точно неверно. ЕСЛИ бинарный буфер содержит реально данные одного из типов объединения, то тогда — да, можно. Собственно, любые данные на входе memcpy превращаются в такой буфер.

Stas-Koynov Автор вопроса
Stas Koynov
ну вот куда я должен делать копию когда идут данны...

просто получается в том же модбасе прилетает запрос и если запрос записи IO то это байты и там тупо битики DI/DO а если регистры? то это уже uint16_t. мне что теперь эти uint16_t копировать в массив uint16_t?

Stas Koynov
ну вот куда я должен делать копию когда идут данны...

В локальный объект. Скорее всего, компилятор поймёт, что ты хочешь просто переинтерпретировать данные и никакого дополнительного хранилища создавать не будет, то есть настоящей копии memcpy делать не должен.

Anton Semenov
Я имею в виду, без юниона вообще

С чего вдруго memcpy не будет делать копию ?

Ilya Zviagin
С чего вдруго memcpy не будет делать копию ?

тут проще сослаться на Jason Turner: https://www.youtube.com/watch?v=L06nbZXD2D0

Похожие вопросы

Обсуждают сегодня

Anyone here suffers from unexplained aural migraines, who would be up for talking for a bit? Doesn't *have* to be aural, but I am not asking about headaches, I mean actual mi...
Martin Rys
55
Вопрос. Теоретический. Есть список команд. Команды отправляю в обработку некой функции, по очереди. Разные команды могут давать разные результаты после обработки. В зависимос...
Serjone
7
Привет, нужен совет старших товарищей. Есть глобальная переменная var DefaultDataFolder:string; инициализируем DefaultDataFolder:='a:\_OUT\'; есть примитивная процедур...
Max Otto
10
Всем вечера. Подскажите как лучше сделать. делаю на Д10 Например будет база данных на SQLite. в ней будет много таблиц. более 50шт Типа справочник. Содержать ID Name Id p...
Андрей Т 🐎
10
это группа токсиков или тех кто помогает?
Ибрагим
9
Я короче решил скомпилировать Nim в js, я думал он сработает как обычный транслятор. По итогу он мне создал файл с расширением js, и туда поместил кучу кода Вопрос, что это з...
𝕾𝖍𝖆𝖉𝖊 <suspense>
8
мы пытаемся подменить функцию, которая имеет меньше инструкций относительно функции, которой подменяем. https://www.reddit.com/r/jailbreakdevelopers/comments/w06ujy/mshookfun...
Óðinn
6
подскажите пожалуйста, как мне освободить результат записанный в переменную result? в чем проблема подскажите если МОЖЕТЕ?
Михаил Helper
28
Добрый день! Хочу спросить совета. Хочется в скрипт добавить некую конструкцию, что скрипт создал файл, который нужно потом скопировать в определенное место. Нашел такой сп...
Mikhail
4
я не магистр хаскеля, но разве не может лейзи тип конвертнуться в не-лейзи запросив вычисление содержимого прям при инициализации?
deadgnom32 λ madao
100
Карта сайта