ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Вторник
25 марта
1503810 Топик полностью
Eddy_Em (06.03.2025 11:31, просмотров: 117) ответил Nikolay_Po на Эдуард, скажи, как ты решаешь такую задачу: нужно иметь возможность обращаться к набору данных как к отдельным, именованным параметрам, так и как к массиву байт. Например:
Чаще всего я просто делаю явное преобразование в (uint8_t) и работаю как с массивом данных. 

Я уж забыл, когда union последний раз использовал. Сейчас по всему дереву проектов на гитхабе запустил поиск, и там все употребление union - не мои, а из чужих инклюдов.

Предлагаю сделать так:

#include <stdint.h>
#include <stdio.h>

struct __attribute__((packed)) {
    uint8_t CmdAddr;
    uint8_t Version;
    uint16_t Status;
    uint32_t Errors;
    uint8_t DataSize;
    uint8_t Data[32];
} N = {0};

int main(){
    N.DataSize = 11;
    printf("DS=%u\n", N.DataSize);
    uint8_t *Nptr = (uint8_t*) &N;
    printf("Nptr[8]=%u\n", Nptr[8]);
    return 0;
}

Выхлоп:

gcc a.c && ./a.out
DS=11
Nptr[8]=11 


И никаких объединений не нужно!


// блин, таки в режиме "html" косяк на косяке и косяком погоняет!

eddy-em.livejournal.com github.com/eddyem