реклама на сайте
подробности

 
 
> Вопрос по указателям
eav1978
сообщение May 20 2008, 20:18
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 57
Регистрация: 13-01-07
Из: Санкт-Петербург
Пользователь №: 24 409



Есть массив unsigned char RegLcdData[16]. Необходимо в одно действие присвоить значение соседним элементам массива RegLcdData[0] и RegLcdData[1] (или RegLcdData[2] и RegLcdData[3]), (или RegLcdData[2] и RegLcdData[3]), и т.д.

Подозреваю, что вопрос задан коряво, так что не обессудьте.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
kurtis
сообщение May 23 2008, 13:54
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 466
Регистрация: 21-06-05
Пользователь №: 6 205



А как структуры выравнивать средствами языка Си???Или проще по возможности отказаться от использования переменных, разрядность которых меньше разрядности процессора???
Go to the top of the page
 
+Quote Post
rezident
сообщение May 23 2008, 14:50
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(kurtis @ May 23 2008, 19:54) *
А как структуры выравнивать средствами языка Си???
J,sxyj в препроцессоре есть соответствующая #pragma
Например
Код
#pragma pack(2)

Код
#pragma pack()

Цитата(kurtis @ May 23 2008, 19:54) *
Или проще по возможности отказаться от использования переменных, разрядность которых меньше разрядности процессора???
Нужно просто понимать как CPU работает с памятью и к чему может приводить обращение к невыровненным структурам.
Допустим у вас 16-и разрядный CPU. Имеется массие из 5-и байт 1, 2, 3, 4, 5
Код
unsigned char mass[5]={1, 2, 3, 4, 5};

который по случайному стечению обстоятельств, расположился в памяти с нечетного адреса (без явного указания компилятор сделал так, как ему удобнее), т.е. невыровненных на границу машинного слова.
0x4001 0x01
0x4002 0x02
0x4003 0x03
0x4004 0x04
0x4005 0x05
Вы пытаетесь считать в 16-ти разрядную переменную третий и четвертый элемент байтового массива, думая, что в результате получите 0x0403.
Код
unsigned int var=(unsigned int *)&mass[2];

Но поскольку обращение к памяти возможно только по четному адресу, то в результате вы получите значение var 0x0302, либо 0x0504.
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 26th July 2025 - 13:41
Рейтинг@Mail.ru


Страница сгенерированна за 0.01381 секунд с 7
ELECTRONIX ©2004-2016