|
|
  |
процедура с указателем на строку в памяти программ, помогите разобраться |
|
|
|
Dec 24 2008, 14:39
|

Местный
  
Группа: Участник
Сообщений: 249
Регистрация: 31-10-05
Из: Украина Нетешин
Пользователь №: 10 344

|
Здраствуйте. Ткните где не так кто знает пожалуйста Код 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"; Спасибо
|
|
|
|
|
Dec 24 2008, 15:03
|
Участник

Группа: Участник
Сообщений: 25
Регистрация: 14-04-06
Пользователь №: 16 129

|
И что ты хочешь найти? Если ты хочешь найти строку в "блабла" в буфере... - тогда тебе надо цикл опирать на буфер а не на строку.
|
|
|
|
|
Dec 24 2008, 16:27
|
Гуру
     
Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882

|
Цитата(chief_olimp @ Dec 24 2008, 19:39)  Скажите пожалуйста как такое же провернуть со строкой типа Код unsigned char PROGMEM blabla[] = "blablabla"; Во-первых, строка должна заканчиваться завершающим нулем. Код unsigned char PROGMEM blabla[] = "blablabla\0"; А во-вторых, перед выводом нужно указателю присвоить значение ее адреса, явно сделав преобразование типа. Код findbuff=(unsigned char *)&blabla[0];
|
|
|
|
|
Dec 24 2008, 17:34
|

Знающий
   
Группа: Свой
Сообщений: 902
Регистрация: 2-01-06
Из: Краснодар
Пользователь №: 12 768

|
Я решал вашу задачу так: Код 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.
--------------------
"Hello, word!" - 17 errors 56 warnings
|
|
|
|
|
Dec 24 2008, 17:43
|

Местный
  
Группа: Участник
Сообщений: 249
Регистрация: 31-10-05
Из: Украина Нетешин
Пользователь №: 10 344

|
в вашем случае насколько я понял сравниваются строки полностью. Я же во всем буффере ищу конкретное слово. На деле у меня это работает так. Копирую данные из флеш в буффер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); }
Сообщение отредактировал chief_olimp - Dec 24 2008, 18:04
|
|
|
|
|
Dec 24 2008, 18:21
|

неотягощённый злом
     
Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643

|
Цитата(rezident @ Dec 24 2008, 19:27)  Во-первых, строка должна заканчиваться завершающим нулем. Код unsigned char PROGMEM blabla[] = "blablabla\0"; А во-вторых, перед выводом нужно указателю присвоить значение ее адреса, явно сделав преобразование типа. Код findbuff=(unsigned char *)&blabla[0]; Ни во-первых ни во-вторых делать не надо. Все СИ строки имеют завершающий ноль по определению. Имя одномерного масссива также является указателем на его первый элемент, так зачем же плодить промежуточные переменные. Приводить тип не надо, а надо использовать тип char для строк и char* для аргумента функции (ну или const char как в данном случае). На мой взгляд unsigned char следует использовать только как альтернативу uint8_t, а элементы строк, т.е. буквы-символы в подавляющем большинстве имеют тип char, на то он и нужен.
--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
|
|
|
|
|
Dec 24 2008, 18:28
|
Участник

Группа: Участник
Сообщений: 25
Регистрация: 14-04-06
Пользователь №: 16 129

|
2chief_olimp : простите. но то что вы написали - это не find ... это strcpy() причем в извращенной форме. при чем тут find? если он ничего не возвращет и не сообщает? 2pasha: а если строка не с начала?
Сообщение отредактировал rokhan - Dec 24 2008, 18:31
|
|
|
|
|
Dec 24 2008, 18:31
|

неотягощённый злом
     
Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643

|
Цитата(_Pasha @ Dec 24 2008, 21:24)  Код #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};
--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
|
|
|
|
|
Dec 24 2008, 19:49
|
Гуру
     
Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882

|
Цитата(demiurg_spb @ Dec 24 2008, 23:21)  Ни во-первых ни во-вторых делать не надо. Все СИ строки имеют завершающий ноль по определению. Имя одномерного масссива также является указателем на его первый элемент, так зачем же плодить промежуточные переменные. Приводить тип не надо, а надо использовать тип char для строк и char* для аргумента функции (ну или const char как в данном случае). На мой взгляд unsigned char следует использовать только как альтернативу uint8_t, а элементы строк, т.е. буквы-символы в подавляющем большинстве имеют тип char, на то он и нужен. Теоретически вы правы. На практике могут проявиться нюансы. Как-то, приведение типа указателя без операции извлечения адреса не работает. А приведение типа в данном случае необходимо, т.к. указатель и массив имеют разный тип. IAR, например, сругался бы без приведения типа. Насчет char и unsigned char нужно опять же смотреть опции компилятора. Либо твердо помнить, что в строковых переменных используем только KOI-7 и/или только латиницу.
|
|
|
|
|
Dec 24 2008, 20:03
|

Знающий
   
Группа: Свой
Сообщений: 902
Регистрация: 2-01-06
Из: Краснодар
Пользователь №: 12 768

|
Цитата(chief_olimp @ Dec 24 2008, 20:43)  в вашем случае насколько я понял сравниваются строки полностью. Я же во всем буффере ищу конкретное слово. ничего подобного-ищется конкретная лексема в строке.вы,имхо,делаете лишнюю работу,причем 2 раза. 1-зачем-то копируете лексему для поиска из флеш в озу.Нафига? 2-зачем вообще изобретать велосипед-все придумано до нас(с)-стандартная библиотека функций Си. Почитайте про функцию strstr из стандартной библиотеки,файл string.h.Единственно,вам нужен вам нужен вариант для нахождения в строке,лежащей в озу подстроки,находящейся во флеш.Покурите на эту тему хэлп вашего компилятора.
--------------------
"Hello, word!" - 17 errors 56 warnings
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|