Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Заполнение массива на си
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
Lyt
При инициализации массив можно заполнить следующим образом:
Код
unsigned char string_to_LCD[16]={0x20,0x48,0x45,0xA8,0x50,0x45,0x50,0xAE,0x42,0x20,0xA5,0xA4,0x4D,0xFE};

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

использую такой массив для хранения кодов символов строки, выводимой на экран hd44780
andrewlekar
Цитата
можно ли аналогично заполнить этот же массив другими символами?

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

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

Если хотите менять динамически и сразу куском, то так:
memcpy(string_to_LCD, new_data, 16);
megajohn
unsigned char string_to_LCD[]={ " HE\xA8" "PEP" "\xAE\x42" };

кстати, в вашем масиве два байта не проиннициализированно
Lyt
Можно поподробнее описать строку
Код
unsigned char string_to_LCD[]={ " HE\xA8" "PEP" "\xAE\x42" };
?
а можно стирать массив а потом заново его инициализировать с другими элементами?
или это нерационально?
mempfis_
Цитата(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.
andrewlekar
Цитата
а можно стирать массив а потом заново его инициализировать с другими элементами?

К сожалению, нельзя.
Вы можете, и это довольно удобно, делать новый массив с новыми элементами на каждый чих.
Например:
Код
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[], то память будет съедать одинаково в обоих случаях (поправьте меня если я не прав).
Lyt
пишу для stm8l
решил делать как раз
Цитата
делать новый массив с новыми элементами на каждый чих


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

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

char string3_to_LCD[16]={0x20,0xA8,0x45,0x50,0xA5,...}
IAR пишет во флеш
andrewlekar
Да, для STM8 должно ок получиться.

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

Да. В общем-то ничем не отличается от char[], но меньше места займёт. sm.gif
Lyt
спасибо!
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.