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

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

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

12 ответов

38 просмотров

да. 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

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

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

Всем привет! Имеется функция: function IsValidChar(ch: UTF8Char): Boolean; var i: Integer; ValidChars: AnsiString; begin ValidChars := 'abcdefghijklmnopqrstuvwxyzABCDE...
Евгений
44
#include <stdio.h> #include <stdlib.h> #include <time.h> void mass_first_generate(int mass[5][7]) {     for (int N = 0; N < 5; N++) {         for (int A = 0; A < 7; A++) {   ...
Чувак
6
Всем привет! Решаю 99 OCaml Problems и столкнулся со следующей проблемой (прошу палками не забивать, я OCaml практически не трогал до этого момента): open OUnit2 let create_...
К|/|pи/\/\ 6е3yглbIи
2
https://www.linkedin.com/posts/ugama-benedicta-kelechi-codergirl-103041300_mobiledevelopment-fluttertraining-handsonlearning-activity-7263445699227254784-IdHB?utm_source=share...
CoderGirl
16
возможно ли как-то передать в электрон или таури медиа поток с рендера 2д движка? двиг запускается как dll, а дальше надо как-то отправлять рендер кодировать не подходит, зр...
Kyle Nekto
7
Ну вот просто даже давайте вот как. Какой нибудь конкретный кейс, можете в пример привести, где бч работает и приносит прикладную пользу, а не просто что бы было? Не крипту.
Alexander Andreev
22
Помогите пожалуйста. Делаю систему плагинов. Проблема сейчас в такая: плагины загружаются в основном потоке. FLibHandle := SafeLoadLibrary(FFileName) Но нужно еще выполнить фу...
Илья 🤣
10
Точно, оно. У тебя там имена потоков выставляются?
Александр (Rouse_) Багель
11
объясните пожалуйста, почему функция не работает должным образом? вроде должно брать активное окно сравнивать его размер с размером экрана, и если есть совпадение = true прове...
JF
12
лучше скажите, причём тут паскаль?
Alexey Kulakov
36
Карта сайта