Правильный способ доступа к членам массива как другой тип?
У меня есть большой массив uint16_t
,
Большинство его членов uint16_t
, но некоторые int16_t
и немного uint8_t
,
Как бы вы справились с этим?
Кстати, я попробовал:
указатели:
Использовано 2 указателя, один
int16_t*
и другиеuint8_t*
оба инициализируются в начале массива для доступа к элементу массива, которыйint16_t
а такжеuint8_t
,(Сначала это работало, но я столкнулся с проблемами, когда позже в программе что-то еще изменило значение указателей, поэтому я не доверяю этому.)
Определение типа с объединением.
В файле.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};
(Это действительно бомбили.)
Кастинг.
(Я не очень далеко с этим.)
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
¿