0 / 0 / 0
Регистрация: 22.01.2011
Сообщений: 106
|
|
1 | |
Помогите разобраться со строками в WinAVR16.09.2012, 19:56. Показов 4724. Ответов 2
Метки нет (Все метки)
Помогите разобраться со строками ! Цель собрать строку из пришедших символов.
Например, приходят по USORT символы: 1,2,а нужно получить строку «12а». Объявляю переменные ! char stroka1[100]; char stroka2[100]; char stroka3[100]; Вариант-1 в теле программы хочу сделать так stroka1 = "a"; или так stroka1 = ‘a’; Выходит такая ошибка OS.c:415: error: insompatible types in assyknment В чем проблема почему нельзя записать символ в строку ? Вариант-2 strcpy(stroka1, "a"); //я так попытался записать значение «а» в строку «stroka1» strcpy(stroka2, "5"); if (stroka1 == "a") { PORTA = 1; _delay_ms(1000); } if (stroka2 == ‘5’) { PORTA = 2; _delay_ms(1000); } Ошибок никаких не выдаётся, но на порту-А, лампочки не зажигаются ! Но как ни странно если переменную полученную по USORT, сравнить с «а» или «5» то работать будет. USORT_RX = USORT_Receive(); //это процедура собирает по одному символу из буфера, пришедшего от обычного компа по COM-порту, на USORT. if (USORT_RX == a) { PORTA = 255; //включаем все сразу _delay_ms(250); } Последний вариант работает ! ! !, все 8 светодиодов включаются по приходу символа «а». _delay_ms(1000); - это задержка по времени. Чтобы успеть посмотреть что светиться. Подскажите как объявить и задать строку символов, чтобы с ней можно было работать ?
0
|
16.09.2012, 19:56 | |
Ответы с готовыми решениями:
2
Помогите разобраться со строками Помогите разобраться со строками. Ребяты помогите со строками чуток разобраться. Помогите обмануть оптимизатор WinAVR |
0 / 0 / 1
Регистрация: 27.01.2010
Сообщений: 3,435
|
|
16.09.2012, 20:59 | 2 |
Прежде всего - изучить в УЧЕБНИКЕ по стандартному Си - что такое строки и как с ними работать. И про указатели не забыть!
Это достаточно сложное понятие, особенно если переходить на Си с других языков, более высокого уровня. Вкратце: Строка - последовательность (Массив) символов, ограничивающийся нуль-символом. Объявление char stroka1[100] - делает вот что: 1. Выделяет память сплошным массивом в 100 элементов по char. 2. Адрес первого/нулевого элемента в этом массиве присваивается переменной с именем stroka1. На самом деле stroka1 - это на самом деле указатель на эту самую строку/массив, но НЕ сама строка. Строки - это НЕ настоящий тип данных в стандартном Си, это некая конструкция из типа char. Работать с ними как со строками нужно не обычными операторами сравнения или присваивания - а функциями работы со строками. Когда ты пишешь stroka1 = "a"; - это попытка присвоить значение. Но на самом деле (так как это понимает компилятор) - это попытка указателю stroka1 присвоить значение указателя на другую, константную строку "a" - а это уже несовпадение типов, ибо stroka1 на самом деле хоть и указатель, но он так объявлен, что ему уже нельзя присваивать другие значения. На самом деле нужно использовать функцию strcpy(stroka1,"a") stroka1 == "a" - это попытка сравнить строки. Но на самом деле программа будет сравнивать значение указателя (адреса) на строку stroka1 и на коснстантную строку "a" - и всегда будет НЕ РАВНО. Работать со сравнением строк нужно через функции strcmp, strstr и др. Например if ( !strcmp(stroka1,"a") ) { .... } Причем нужно иметь в виду - что стиндратная фунцкия сравнения строк strcmp возвращает НОЛЬ в случае совпадения, стало быть, операция "логического отрицания" (!) в условии - как раз оно. Хотя на первый "здравый взгляд" вроде неправильно. Записать символ в строку можно, например, так: "по-массивному": stroka1[0] = 1; stroka1[1] = 2; stroka1[3] = a; stroka1[4] = \0; Или, "по-указательному": *stroka1 = 1; *(stroka1+1) = 2; *(stroka1+2) = a; *(stroka1+3) =\0;
0
|
0 / 0 / 0
Регистрация: 22.01.2011
Сообщений: 106
|
|
16.09.2012, 23:09 | 3 |
Спасибо за подробный ответ. Я писал на Делфи, там намного проще было.
щас буду пробовать указанные функции.
0
|
16.09.2012, 23:09 | |
16.09.2012, 23:09 | |
Помогаю со студенческими работами здесь
3
WinAVR Помогите с прошивкой ультразвукового дальномера [Решено] Помогите победить варнинги: AvrStudio + WinAVR Не могу разобраться со строками Не могу разобраться со строками Не могу со строками разобраться Не могу разобраться с некоторыми строками кода Олимпиадная задачка(не могу разобраться со строками) Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |