Цитата(Ivan_Kov @ Feb 12 2007, 17:39)

А вот теперь возникла конкретная проблемка. Стал работать с регистрами микроконтроллера lpc2378, описав их через битовые поля. Возникла сложность. Если работаю с регистром как со структурой битовых полей непосредственно - нифига не работает. Если формирую значение регистра в переменной и затем присваиваю - работает.
Выбор из 2-х стилей: битовые поля или маски - дело вкуса.
Но - при текстах чуть более сложных студенческих работ (где очень рекомендуются бировые поля) - IMHO ! : битовые поля - это большая гадость.
Связано это с тем, что работая с битовыми полями, но не инициализируя всю структур в целом - вы рискуете иметь итоговый "мусор", даже при корректности вашего кода. Попробую показать на примере - прошу прощения, я спешил, и выхватил кусок кода из живого проекта, из-за этого куска мои коллеги имели "много времени неприятности"
Код
typedef uint16_t dt_t;
...
typedef union _sv_set {
dt_t state;
struct {
dt_t color :4;
dt_t regim :3;
};
} sv_set_t;
...
sv_set_t Lsvetofor::set_color( dt_t cmd ) {
sv_set_t st;
...
st.color = new_state;
return;
};
- как вы понимаете, в return - полный мусор, определяющийся историей отведения стека, там только 1-но корректное поле и есть: color

.
Если то же будет записоно как-то грубо так:
Код
sv_set_t Lsvetofor::set_color( dt_t cmd ) {
sv_set_t st;
...
st = SV_SET_COLOR_WHITE | SV_SET_COLOR_YELLOW | SV_SET_COLOR_ZAPRET;
};
- то мусорных неинициализированных полей возникнуть не может.
Это пример - примитивный, но если нечто подобное - в 1000 строк кода ... хорошее времяпрепровождение вам гарантировано

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