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

 
 
 
Reply to this topicStart new topic
> Заполнение массива на си
Lyt
сообщение Jan 15 2014, 06:45
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 38
Регистрация: 7-07-12
Пользователь №: 72 660



При инициализации массив можно заполнить следующим образом:
Код
unsigned char string_to_LCD[16]={0x20,0x48,0x45,0xA8,0x50,0x45,0x50,0xAE,0x42,0x20,0xA5,0xA4,0x4D,0xFE};

можно ли аналогично заполнить этот же массив другими символами?

использую такой массив для хранения кодов символов строки, выводимой на экран hd44780
Go to the top of the page
 
+Quote Post
andrewlekar
сообщение Jan 15 2014, 07:10
Сообщение #2


Знающий
****

Группа: Участник
Сообщений: 837
Регистрация: 8-02-07
Пользователь №: 25 163



Цитата
можно ли аналогично заполнить этот же массив другими символами?

Можно: unsigned char string_to_LCD[]={'h','t','c'};

Если хотите менять динамически, то можно так:
string_to_LCD[7] = 0x05;

Если хотите менять динамически и сразу куском, то так:
memcpy(string_to_LCD, new_data, 16);
Go to the top of the page
 
+Quote Post
megajohn
сообщение Jan 15 2014, 07:12
Сообщение #3


Профессионал
*****

Группа: Свой
Сообщений: 1 080
Регистрация: 16-11-04
Из: СПб
Пользователь №: 1 143



unsigned char string_to_LCD[]={ " HE\xA8" "PEP" "\xAE\x42" };

кстати, в вашем масиве два байта не проиннициализированно


--------------------
Марс - единственная планета, полностью населенная роботами (около 7 штук).
Go to the top of the page
 
+Quote Post
Lyt
сообщение Jan 15 2014, 07:43
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 38
Регистрация: 7-07-12
Пользователь №: 72 660



Можно поподробнее описать строку
Код
unsigned char string_to_LCD[]={ " HE\xA8" "PEP" "\xAE\x42" };
?
а можно стирать массив а потом заново его инициализировать с другими элементами?
или это нерационально?

Сообщение отредактировал Lyt - Jan 15 2014, 08:30
Go to the top of the page
 
+Quote Post
mempfis_
сообщение Jan 15 2014, 09:54
Сообщение #5


Профессионал
*****

Группа: Свой
Сообщений: 1 001
Регистрация: 27-06-06
Пользователь №: 18 409



Цитата(Lyt @ Jan 15 2014, 10:43) *
Можно поподробнее описать строку
Код
unsigned char string_to_LCD[]={ " HE\xA8" "PEP" "\xAE\x42" };
?
а можно стирать массив а потом заново его инициализировать с другими элементами?
или это нерационально?


Вы можете обозначить несколько константных массивов начальной инициализации и потом копировать их в массив в оперативной памяти.
Можно использовать strcopy или написать её аналог самостоятельно, ориентируясь на терминатор строки '\0' который будет автоматически добавлен в константную строку.
Код
const unsigned char init0[] = "init str 0";
const unsigned char init1[] = "SIZE:; NUM: ";
unsigned char string_to_lcd[33]; //+1 символ для терминатора строки
strcopy(char string_to_lcd, init0);
strcopy(char string_to_lcd, init1);


\ - позволяет подставить любое число или ascii-символ в данную позицию строки.
Запись типа \xA8 позволяет разместить на данной позиции число 0xa8. Можно записать \" - тогда на данной позиции будет размещён ascii-код символа '"'
Например unsigned char string_to_lcd[32] = "\"My LCD string\"";
Если напечатать эту строку на индикаторе то получите текст "My LCD string" заключённый в кавычки.

Чтобы быстро "стереть" строку запишите string_to_lcd[0] = '\0'; или эквивалентную запись string_to_lcd[0] = 0x0;

Кстати const unsigned char в зависимости от процессора будет располагаться в различных типах памяти.
Для AVR лучше использовать __flash unsigned char чтобы константные строки ложились во flash.
Если Вы оставите const unsigned char то строки будут располагаться в оперативке, что не есть рационально для этого процессора.
Для ARM const unsigned char будет расположено во flash.
Всё вышесказанное по поводу расположения строк относится к IAR.
Go to the top of the page
 
+Quote Post
andrewlekar
сообщение Jan 15 2014, 11:03
Сообщение #6


Знающий
****

Группа: Участник
Сообщений: 837
Регистрация: 8-02-07
Пользователь №: 25 163



Цитата
а можно стирать массив а потом заново его инициализировать с другими элементами?

К сожалению, нельзя.
Вы можете, и это довольно удобно, делать новый массив с новыми элементами на каждый чих.
Например:
Код
const char *A= {'a', 'b', 'c', 0};
printf("%s", A);
const char *B = {'d', 'e', 'f', 0};
printf("%s", B);


Если это ARM, то инициализаторы массивов будут лежать во флэше и вы почти не потеряете памяти на таком трюке и это будет удобно и красиво.
Если это AVR например, то лучше так не делать: будет съедаться стэк, если не ошибаюсь.

А если вы будете делать не const char *A, а char A[], то память будет съедать одинаково в обоих случаях (поправьте меня если я не прав).

Сообщение отредактировал andrewlekar - Jan 15 2014, 11:04
Go to the top of the page
 
+Quote Post
Lyt
сообщение Jan 15 2014, 11:15
Сообщение #7


Участник
*

Группа: Участник
Сообщений: 38
Регистрация: 7-07-12
Пользователь №: 72 660



пишу для stm8l
решил делать как раз
Цитата
делать новый массив с новыми элементами на каждый чих


Код
const char *A= {'a', 'b', 'c', 0};

а что делает эта строка? *А-указатель на массив ?

char string3_to_LCD[16]={0x20,0xA8,0x45,0x50,0xA5,...}
IAR пишет во флеш
Go to the top of the page
 
+Quote Post
andrewlekar
сообщение Jan 15 2014, 16:33
Сообщение #8


Знающий
****

Группа: Участник
Сообщений: 837
Регистрация: 8-02-07
Пользователь №: 25 163



Да, для STM8 должно ок получиться.

Цитата
а что делает эта строка? *А-указатель на массив ?

Да. В общем-то ничем не отличается от char[], но меньше места займёт. sm.gif
Go to the top of the page
 
+Quote Post
Lyt
сообщение Jan 15 2014, 18:04
Сообщение #9


Участник
*

Группа: Участник
Сообщений: 38
Регистрация: 7-07-12
Пользователь №: 72 660



спасибо!
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 10:33
Рейтинг@Mail.ru


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