Перейти к содержанию
    

Заполнение массива на си

При инициализации массив можно заполнить следующим образом:

unsigned char string_to_LCD[16]={0x20,0x48,0x45,0xA8,0x50,0x45,0x50,0xAE,0x42,0x20,0xA5,0xA4,0x4D,0xFE};

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

 

Если хотите менять динамически, то можно так:

string_to_LCD[7] = 0x05;

 

Если хотите менять динамически и сразу куском, то так:

memcpy(string_to_LCD, new_data, 16);

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Можно поподробнее описать строку

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

?

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

или это нерационально?

Изменено пользователем Lyt

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Можно поподробнее описать строку
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.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

К сожалению, нельзя.

Вы можете, и это довольно удобно, делать новый массив с новыми элементами на каждый чих.

Например:

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

пишу для stm8l

решил делать как раз

делать новый массив с новыми элементами на каждый чих

 

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

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

 

char string3_to_LCD[16]={0x20,0xA8,0x45,0x50,0xA5,...}

IAR пишет во флеш

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

Да. В общем-то ничем не отличается от char[], но меньше места займёт. :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...