Я новичок ie C программист, работающий над поддержкой устаревшего встроенного C кода, который выглядит проблемным c. В следующих фрагментах я упростила:
UINT16 adcFunc(UINT8 adc, UINT8 channel)
{
ADC_t* adc_ptr = (ADC_t*)(adc << 4);
ADC_CH_t* adc_ch_ptr;
adc_ch_ptr = (ADC_CH_t*)((UINT8*)&(adc_ptr->CH0) + sizeof(ADC_CH_t) * channel);
...
}
Где определение структуры задано как:
typedef struct ADC_struct
{
...
register8_t reserved_0x1E;
register8_t reserved_0x1F;
ADC_CH_t CH0; /* ADC Channel 0 */
ADC_CH_t CH1; /* ADC Channel 1 */
ADC_CH_t CH2; /* ADC Channel 2 */
ADC_CH_t CH3; /* ADC Channel 3 */
} ADC_t;
С размером указателя 2 байта и UINT8
в виде typedef unsigned char
. При раскрашивании кода мой линтер сообщает предупреждение
, приведенное от UINT8 * к ADC_CH_t *, увеличивает необходимое выравнивание с 1 до 2 по строке
adc_ch_ptr = (ADC_CH_t*)((UINT8*)&(adc_ptr->CH0) + sizeof(ADC_CH_t) * channel);
Код пытается вычислить правильное смещение в структуре для указателя канала adc_ch_ptr
(где канал находится между 0 и 3). Для меня это выглядит как строгое нарушение псевдонимов, и я удалил приведение из (UINT8*)
Бессмысленно, и это разбило приложение.
Может кто-нибудь пролить свет на то, как правильно рассчитать указатель на правильный канал без проблем с наложением и дополнением / выравниванием?
Спасибо