chief_olimp 0 24 декабря, 2008 Опубликовано 24 декабря, 2008 · Жалоба Здраствуйте. Ткните где не так кто знает пожалуйста unsigned char blabla[] = "blablabla"; /// текст и все такое void find (unsigned char *findbuff) { unsigned int i; while (*findbuff != '\0') { USART0_OutBuf[i++] = *findbuff; findbuff++; } } int main (void) { find (blabla); } т.е. программа какие то данные из ОЗУ грузит в процедуру и что то так с ними делает Скажите пожалуйста как такое же провернуть со строкой типа unsigned char PROGMEM blabla[] = "blablabla"; Спасибо Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
rokhan 0 24 декабря, 2008 Опубликовано 24 декабря, 2008 · Жалоба И что ты хочешь найти? :) Если ты хочешь найти строку в "блабла" в буфере... - тогда тебе надо цикл опирать на буфер а не на строку. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
rezident 0 24 декабря, 2008 Опубликовано 24 декабря, 2008 · Жалоба Скажите пожалуйста как такое же провернуть со строкой типаunsigned char PROGMEM blabla[] = "blablabla"; Во-первых, строка должна заканчиваться завершающим нулем. unsigned char PROGMEM blabla[] = "blablabla\0"; А во-вторых, перед выводом нужно указателю присвоить значение ее адреса, явно сделав преобразование типа. findbuff=(unsigned char *)&blabla[0]; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Tiro 0 24 декабря, 2008 Опубликовано 24 декабря, 2008 · Жалоба Чип AVR с компилятором WinAVR? Тогда прочтите здесь: Data in Program Space Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
chief_olimp 0 24 декабря, 2008 Опубликовано 24 декабря, 2008 · Жалоба дело в том что я хочу каждый раз используя одну и ту же функцию искать разные строки подгружаемые из памяти программ. Функция ищет данные из FLASH в буфере UART. И если находит то сообщает об этом. Если считать данные одной функцией и потом сравнить два буффера то все получается. Проблема в том что я не знаю как объявить стоку из FLASH и затем данные из этой строки использовать в функции. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
defunct 0 24 декабря, 2008 Опубликовано 24 декабря, 2008 · Жалоба Проблема в том что я не знаю как объявить стоку из FLASH и затем данные из этой строки использовать в функции. Почитайте вот эту тему http://electronix.ru/forum/index.php?showtopic=56157&hl= может натолкнет на идеи. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
WHILE 0 24 декабря, 2008 Опубликовано 24 декабря, 2008 · Жалоба Я решал вашу задачу так: flash char *flash STRING_COMPARE[]={"BLA-BLA-BLA", "LY-LY-LY"}; char* COMPARE_STRING_RX(flash char *ptr_to_compare_rx) //не равны-возращается указательна NULL { char* ptr; return ptr=strstrf(str_rx,ptr_to_compare_rx); //str_rx-строка в ОЗУ,где лежат //принятые данные от модема } Где-то в коде: if(COMPARE_STRING_RX(ptr_to_compare_rx=STRING_COMPARE[3]))// что-то делаем если cтрока совпала else //делаем что-то другое-строка не совпала это для CVAVR. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
chief_olimp 0 24 декабря, 2008 Опубликовано 24 декабря, 2008 (изменено) · Жалоба в вашем случае насколько я понял сравниваются строки полностью. Я же во всем буффере ищу конкретное слово. На деле у меня это работает так. Копирую данные из флеш в буффер1 и ищу последовательность в буффере2. Но для этого приходится использовать две функции кстати я уже получил ответ на свой вопрос. может кому пригодится. Все оказалось как всегда просто const unsigned char PROGMEM blabla[] = "blablabla"; void find (const unsigned char *findbuff){ unsigned int i=0; unsigned char temp; while(1){ temp = pgm_read_byte(findbuff++); if(temp==0) break; USART0_OutBuf[i++] = temp; } } int main (void){ find (blabla); } Изменено 24 декабря, 2008 пользователем chief_olimp Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
demiurg_spb 0 24 декабря, 2008 Опубликовано 24 декабря, 2008 · Жалоба Во-первых, строка должна заканчиваться завершающим нулем. unsigned char PROGMEM blabla[] = "blablabla\0"; А во-вторых, перед выводом нужно указателю присвоить значение ее адреса, явно сделав преобразование типа. findbuff=(unsigned char *)&blabla[0]; Ни во-первых ни во-вторых делать не надо. Все СИ строки имеют завершающий ноль по определению. Имя одномерного масссива также является указателем на его первый элемент, так зачем же плодить промежуточные переменные. Приводить тип не надо, а надо использовать тип char для строк и char* для аргумента функции (ну или const char как в данном случае). На мой взгляд unsigned char следует использовать только как альтернативу uint8_t, а элементы строк, т.е. буквы-символы в подавляющем большинстве имеют тип char, на то он и нужен. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_Pasha 0 24 декабря, 2008 Опубликовано 24 декабря, 2008 · Жалоба #define Str const unsigned char PROGMEM Str blabla[] = "blablabla"; Str bububu[] = "bububu(b)"; Str *all_strings[3]={&blabla, &bububu,NULL}; unsigned char find (const unsigned char *findbuff){ unsigned int i=0; unsigned char temp; unsigned char *pos=&USART0_OutBuf[0]; while(i < sizeof(USART0_OutBuf)) { temp = pgm_read_byte(findbuff++); if(temp==0) return 1; // found the full string substitution if(*pos++ != temp) break; i++; } return(0);// not found } Так, что ли ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
rokhan 0 24 декабря, 2008 Опубликовано 24 декабря, 2008 (изменено) · Жалоба 2chief_olimp : простите. но то что вы написали - это не find ... это strcpy() причем в извращенной форме. при чем тут find? если он ничего не возвращет и не сообщает? 2pasha: а если строка не с начала? :) Изменено 24 декабря, 2008 пользователем rokhan Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
demiurg_spb 0 24 декабря, 2008 Опубликовано 24 декабря, 2008 · Жалоба #define Str const unsigned char PROGMEM Str blabla[] = "blablabla"; Str bububu[] = "bububu(b)"; Str *all_strings[3]={&blabla, &bububu,NULL}; unsigned char find (const unsigned char *findbuff){ unsigned int i=0; unsigned char temp; unsigned char *pos=&USART0_OutBuf[0]; while(i < sizeof(USART0_OutBuf)) { temp = pgm_read_byte(findbuff++); if(temp==0) return 1; // found the full string substitution if(*pos++ != temp) break; i++; } return(0);// not found } Так, что ли ? Похоже что не так. Str *all_strings[3]={blabla, bububu,NULL}; или Str *all_strings[3]={&blabla[0], &bububu[0],NULL}; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_Pasha 0 24 декабря, 2008 Опубликовано 24 декабря, 2008 · Жалоба Похоже что не так. Точно! (AVR-libc в помощь). спасибо. 2pasha: а если строка не с начала? :) тогда считать кол-во совпавших символов и принимать решение исходя из этого. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
rezident 0 24 декабря, 2008 Опубликовано 24 декабря, 2008 · Жалоба Ни во-первых ни во-вторых делать не надо. Все СИ строки имеют завершающий ноль по определению. Имя одномерного масссива также является указателем на его первый элемент, так зачем же плодить промежуточные переменные. Приводить тип не надо, а надо использовать тип char для строк и char* для аргумента функции (ну или const char как в данном случае). На мой взгляд unsigned char следует использовать только как альтернативу uint8_t, а элементы строк, т.е. буквы-символы в подавляющем большинстве имеют тип char, на то он и нужен. Теоретически вы правы. На практике могут проявиться нюансы. Как-то, приведение типа указателя без операции извлечения адреса не работает. А приведение типа в данном случае необходимо, т.к. указатель и массив имеют разный тип. IAR, например, сругался бы без приведения типа. Насчет char и unsigned char нужно опять же смотреть опции компилятора. Либо твердо помнить, что в строковых переменных используем только KOI-7 и/или только латиницу. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
WHILE 0 24 декабря, 2008 Опубликовано 24 декабря, 2008 · Жалоба в вашем случае насколько я понял сравниваются строки полностью. Я же во всем буффере ищу конкретное слово. ничего подобного-ищется конкретная лексема в строке.вы,имхо,делаете лишнюю работу,причем 2 раза. 1-зачем-то копируете лексему для поиска из флеш в озу.Нафига? 2-зачем вообще изобретать велосипед-все придумано до нас(с)-стандартная библиотека функций Си. Почитайте про функцию strstr из стандартной библиотеки,файл string.h.Единственно,вам нужен вам нужен вариант для нахождения в строке,лежащей в озу подстроки,находящейся во флеш.Покурите на эту тему хэлп вашего компилятора. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться