p = reinterpret_cast<alt_u16*>(&bufRecive[1]);
*p = 0x7890;
данные попали в bufRecive[1] и bufRecive[2]
вся проблема в том что на этом этапе данные попали не в bufRecive[1] и bufRecive[2], а в bufRecive[0] и bufRecive[1]
Поэкспериментировал еще с прогой.... проблема не в касте, давайте без каста и без тайпдефов привиду пример
char array[10]; //в отладчике посмотрел адрес размещения массива, пусть будет 0x00801C4
short *p = (short *)array;//после этого р равен 0x00801C4
*p = 0x1234; //после этого по адресу 0x00801C4 размещается 0х34, по адресу 0x00801C5 0х12. Всё правильно
// т.е. array[0] = 0х34, array[1] = 0х12
//теперь сделаем указатель на нечетный адрес
p = 0x00801C5;//можно тем же reinterpretate_cast<short*>(&array[1]), у меня не было этой строчки,
//я сделал точку останова и руками выставил нужный адрес
*p = 0x5678;
после последней строчки я ожидаю изменение по адресам 0x00801C5 и 0x00801C6. Т.е. должно быть array[0] = 0х78, array[1] = 0х56. Но адрес 0x00801C6 (элемент array[2] ) остается без изменения а меняются 0x00801C4 и 0x00801C5, т.е. array[0] = 0х78, array[1] = 0х56. Вот в этом проблема.
Скорее всего процессор игнорирует младший бит для указателя на слово.
Ну вот это уже похоже на истину. Как бы это побороть?
ps
офтоп
Но зачем вообще понадобилось писать двухбайтовые значения с интервалом в байт?!
Такой протокол обмена, я его реализую. Пакет примерно такой: первый байт кадра - адрес, следующие два это длинна пакета, слудеющие два команда, следующий ....., следующие 4 байта параметр Х, следующие 4 байта - это температура в формате float, .... и т.д. Во многих протоколах подобное встречал. Раньше парсил подобными кодом
char array[100];
int count = f();
array[16] = count;
array[17] = count>>8;
array[18] = count>>16;
array[19] = count>>24;
но решил попробовать явным преобразованием типов (int*)(array+16) = count; , но не тут-то было.
А можете рассказать, какой сокральный смысл в использование reinterpretate_cast в данном случае? Чем он правильней statiс_cast'а и чем лучше олдскульного приведения?
Да сам толком не понимаю. НА си делал явные приведения, типа (int*)(bufRecive[1]). Но в с++ это типа плохой стиль. Есть касты. Сто раз перечитал про касты, запомнил тока одно - в с++ пользуй касты. А почему ... минут 10 помнил после прочтения учебников, потом просто лишняя инфа из головы пропадала. Осталось только "В с++ пользуй касты"
Почему не static_cast? А не работает статик каст с базовыми типами. Компилятор ругается на такой каст
char array[10];
int i;
i = *static_cast<int*>(array);
Ну есть ещё статьи что reinterpretate_cast нельзя вообще использовать, а лучше использовать двойной static_cast через указатель на void, как-то static_cast<int*>(statuc_cast<void*>(array)). Но есть также обоснованные мнения, что этот способ не менее опасен, чем reinterpretate_cast.