Правильный способ доступа к членам массива как другой тип?

У меня есть большой массив uint16_t,

Большинство его членов uint16_t, но некоторые int16_t и немного uint8_t,

Как бы вы справились с этим?


Кстати, я попробовал:

  1. указатели:

    Использовано 2 указателя, один int16_t* и другие uint8_t*оба инициализируются в начале массива для доступа к элементу массива, который int16_t а также uint8_t,

    (Сначала это работало, но я столкнулся с проблемами, когда позже в программе что-то еще изменило значение указателей, поэтому я не доверяю этому.)

  2. Определение типа с объединением.

    В файле.h:

    typedef union {
      uint16_t  u16[NO_OF_WORDS];     // As uint16_t
      int16_t   s16[NO_OF_WORDS];     // As int16_t
      uint8_t   u8[2 * NO_OF_WORDS];  // As uint8_t
    } ram_params_t;
    extern ram_params_t ram_params[];
    

    В файле.c:

    ram_params_t ram_params[] = {0};
    

    (Это действительно бомбили.)

  3. Кастинг.

    (Я не очень далеко с этим.)

2 ответа

Решение

Проблема с вашей попыткой №2 заключалась в том, что вы создали массив массивов.

Либо сделать это:

typedef union {
  uint16_t  u16;     // As uint16_t
  int16_t   s16;     // As int16_t
  uint8_t   u8[2];   // As uint8_t
} ram_params_t;
extern ram_params_t ram_params[NO_OF_WORDS];

ram_params_t ram_params[NO_OF_WORDS];

uval16  = ram_params[i].u16;
sval16  = ram_params[i].s16;
uval8_1 = ram_params[i].u8[0];
uval8_2 = ram_params[i].u8[1];

Или вы делаете это:

typedef union {
  uint16_t  u16[NO_OF_WORDS];     // As uint16_t
  int16_t   s16[NO_OF_WORDS];     // As int16_t
  uint8_t   u8[2 * NO_OF_WORDS];  // As uint8_t
} ram_params_t;
extern ram_params_t ram_params;

ram_params_t ram_params;

uval16  = ram_params.u16[i];
sval16  = ram_params.s16[i];
uval8_1 = ram_params.u8[2*i];
uval8_2 = ram_params.u8[2*i+1];

Я тоже не вижу ничего плохого в вашей попытке №1. Я думаю, что я, вероятно, сделал бы это, вместо того, чтобы использовать союз.

Элементы массива других типов должны быть того же размера, что и uint16_t так что просто брось их. В случае 8-битных данных существует вероятность того, что старшие 8 битов не определены, поэтому я их замаскировал.

#include <stdio.h>

#define uint16_t    unsigned short
#define int16_t     short
#define uint8_t     unsigned char

int main() {
    uint16_t n;

    // convert uint16_t to int16_t
    n = 0xFFFF;
    printf ("%d\n", (int16_t)n);

    // convert uint16_t to uint8_t
    n = 168;
    printf ("%c\n", (uint8_t)(n & 0xFF));

    return 0;
}

Выход программы

-1
¿
Другие вопросы по тегам