Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Вопрос по указателям
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему
eav1978
Есть массив unsigned char RegLcdData[16]. Необходимо в одно действие присвоить значение соседним элементам массива RegLcdData[0] и RegLcdData[1] (или RegLcdData[2] и RegLcdData[3]), (или RegLcdData[2] и RegLcdData[3]), и т.д.

Подозреваю, что вопрос задан коряво, так что не обессудьте.
DpInRock
В одно действие чего именно? (микропроцессора, языка С...)?
zltigo
Цитата(eav1978 @ May 20 2008, 22:18) *
Подозреваю...

Подозреваю, что лучше, чем писать в раздел "Операционные системы", просто прочитать соответствующий раздел в учебнике по "C". Тему перенес.
*(short *)&RegLcdData[0] = 0x1234;
eav1978
Большое спасибо!
Amper25
Цитата
*(short *)&RegLcdData[0] = 0x1234;


Это будет выглядеть как одно действие только со стороны текста программы. Проц то выполняет не Си-шную программу, а асм. И для него все равно что один short что два char это будет выполнятся за несколько действий.
Хотя, если проц 16 или 32битный ХЗ...
bav
когда пытаются пол программы разместить в одной строке, начинаю задумываться... может программист следует следующему правилу:

1. строка на С после компиляции будет выполняться за 1 такт

2. вместо табуляции будет вставлена команда nop

3. каждый символ в комментариях это тоже команда nop
rezident
Цитата(Amper25 @ May 21 2008, 03:09) *
Проц то выполняет не Си-шную программу, а асм. И для него все равно что один short что два char это будет выполнятся за несколько действий.
Хотя, если проц 16 или 32битный ХЗ...
Если MCU с разрядностью выше 8, то при работе с невыравненными структурами и/или при обращении к структуре без выравнивания на границу слова могут быть весьма забавные эффекты. Если не подозревать про них, то можно долго ломать голову над непонятными глюками "самопроизвольного" изменения данных в структуре.
kurtis
А как структуры выравнивать средствами языка Си???Или проще по возможности отказаться от использования переменных, разрядность которых меньше разрядности процессора???
zltigo
Цитата(bav @ May 23 2008, 14:09) *
..начинаю задумываться... может программист следует следующему правилу:

Подумали? smile.gif А вдруг нет?
rezident
Цитата(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.
arttab
Цитата
*(short *)&RegLcdData[0] = 0x1234;


это сработает когда нужно "одновременно" изменить четный и не четный элементы массива.
А если нужно не четный и четный элементы массива?
тут нужно думать что нужно сделать чтобы пока Вы меняете что то в массиве, не было считано не правильное значение другой частью программы. То есть сохранить целостность данных.
zltigo
Цитата(arttab @ May 26 2008, 02:11) *
это сработает..

Вопрос был про работу с указателями а не про обеспечение атомарности операции. Слово 'одновременно' вообще не поминалось Автором.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.