AVR Раздел по микроконтроллерам компании Atmel - AVR / ATtiny / ATmega / ATMega128 / ATxmega, вопросы по программированию в AVR studio и все, относящееся к AVR... |
28.03.2014, 19:45
|
|
Частый гость
Регистрация: 30.08.2010
Сообщений: 46
Сказал спасибо: 0
Сказали Спасибо 4 раз(а) в 4 сообщении(ях)
|
Помогите разобраться с переполнением массива
Добрый день.
Есть 1 массив символов lcdbuffer1 для вывода ни дисплей
Если написать так:
unsigned char lcdbuffer1[16];
strcopy(lcdbuffer1,"__:__:_______.__",16,0); //функция см. ниже
lcd_gotoxy(0,0);
lcd_puts(lcdbuffer1);
то на дисплее появляется крокозябра во второй строке
Если же написать перемнной изначальной изначально задать значение, то все работает нормально:
unsigned char lcdbuffer1[16]={'_','_',':','_','_',':','_','_','_','_','_','_', '_','.','_','_'};
Вот сама функция для сложения строк:
void strcopy(char *str, char *str1, char l, char k)
{
char n;
for(n=0;n‹l;n++)str[n+k]=str1[n];
}
Функция вставляет "k" символов второй строки в первую, начиная с "l" символа первой строки.
Т.е. проблема где то в этой функцие(весь остальной код в проекте заремарен для проверки). Так же определил что если увеличить размер массива до 20, то тоже работает как надо.
Подскажите, что не так в этой функцие, почему она вызывает переполнение?
Последний раз редактировалось Sany81; 28.03.2014 в 20:36.
|
|
|
|
28.03.2014, 20:27
|
|
Почётный гражданин KAZUS.RU
Регистрация: 30.09.2006
Сообщений: 1,560
Сказал спасибо: 158
Сказали Спасибо 661 раз(а) в 431 сообщении(ях)
|
Re: Помогите разобраться с переполнением массива
При Вашем вызове функции параметр цикла n изменяется от 0 до 15. Какое значение будет, например, в str1[10] ?
|
|
|
|
28.03.2014, 20:35
|
|
Частый гость
Регистрация: 30.08.2010
Сообщений: 46
Сказал спасибо: 0
Сказали Спасибо 4 раз(а) в 4 сообщении(ях)
|
Re: Помогите разобраться с переполнением массива
Сообщение от Ara41
|
При Вашем вызове функции параметр цикла n изменяется от 0 до 15. Какое значение будет, например, в str1[10] ?
|
Прошу прощения, в первом сообщении пробелы исчезли, сейчас его подкорректирую.
|
|
|
|
28.03.2014, 21:04
|
|
Заблокирован
Регистрация: 21.01.2014
Сообщений: 589
Сказал спасибо: 7
Сказали Спасибо 267 раз(а) в 206 сообщении(ях)
|
Re: Помогите разобраться с переполнением массива
В конце строки должен стоять 0. Иначе как lcd_puts(buffer) узнает, сколько символов выводить? Вот она и шарашит кракозябры во второй строке после нормального текста, пока не встретит ноль ...
|
|
|
|
28.03.2014, 21:13
|
|
Частый гость
Регистрация: 30.08.2010
Сообщений: 46
Сказал спасибо: 0
Сказали Спасибо 4 раз(а) в 4 сообщении(ях)
|
Re: Помогите разобраться с переполнением массива
Я правильно понял что длинна массива должна быть 17 и 17й символ должен всегда быть 0??
|
|
|
|
28.03.2014, 21:17
|
|
Гуру портала
Регистрация: 06.05.2005
Адрес: Краснодар, возле укротворного моря.
Сообщений: 19,058
Сказал спасибо: 2,563
Сказали Спасибо 11,890 раз(а) в 5,964 сообщении(ях)
|
Re: Помогите разобраться с переполнением массива
Пустая строка содержит один байт - 0х00, это признак конца строки.
Длина строки в байтах - количество символов + 1.
__________________
Не бейте больно, ежели чо, ну не удержался... А вааще,
"Мы за все хорошее, против всей х..., По лугам некошеным чтобы шли ступни,
Чтобы миром правила правда, а не ложь, Мы за все хорошее, нас не на...!
..." (Ленинград)
Я не несу ответственности за свои действия в Вашей голове.
|
|
|
|
28.03.2014, 21:23
|
|
Заблокирован
Регистрация: 21.01.2014
Сообщений: 589
Сказал спасибо: 7
Сказали Спасибо 267 раз(а) в 206 сообщении(ях)
|
Re: Помогите разобраться с переполнением массива
Сообщение от Sany81
|
длинна массива должна быть 17
|
Да, должна быть на 1 больше чем максимальная длина строки.
И Ваша функция будет
Код:
|
void strcopy(char *str, char *str1, char l, char k)
{
char n;
for(n=0;n‹l;n++)str[n+k]=str1[n];
str[n+k]=0;
} |
автоматически вставлять 0 в конце новой строки
|
|
|
|
05.04.2014, 09:19
|
|
Частый гость
Регистрация: 30.08.2010
Сообщений: 46
Сказал спасибо: 0
Сказали Спасибо 4 раз(а) в 4 сообщении(ях)
|
Re: Помогите разобраться с переполнением массива
Всем спасибо.
Не было возможности поблагодарить.
В своей программе исправил 3 ошибки, первая была связана с длинной массива для вывода на дисплей, т.е. не хватало завершающего нулевого символа.
Остальные 2 связаны с корявыми функциями с указателями на массивы, переделал их без использования указателей и все ошибки прошли.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 19:49.
|
|