|
IAR AVR функция strstr, не могу разобраться |
|
|
|
Jul 22 2010, 18:02
|
Местный
  
Группа: Участник
Сообщений: 326
Регистрация: 14-02-06
Пользователь №: 14 331

|
Код u8 str_buff[100]; c8 __flash *OKin = "OK";
if(strstr((const c8 *)str_buff,(const c8 *)OKin)return 0; strstr всегда выдаёт указатель на начало буфера, даже если ОК там нет. Т.е. в начале буфера могут быть любые символы, а потом ОК. Как я понимаю, не правильно преобразовываю. Но не могу понять, как правильно преобразовать типы. Сам массив в озу, а строки в нём ищутся из flash.
|
|
|
|
|
 |
Ответов
|
Jul 23 2010, 06:02
|
Местный
  
Группа: Участник
Сообщений: 326
Регистрация: 14-02-06
Пользователь №: 14 331

|
Строки пришлось определить так: Код const c8 OKin[] = "OK"; Строки находятся теперь и в flash и в озу, куда копируются при инициализации. Т.к. проц толстый и кол-во искомых строк немного, то не напрягает. Но вот если у проца озу маленькое, как тогда быть? К выбору другого проца пока не прибегаем
|
|
|
|
|
Jul 23 2010, 06:46
|

Профессионал
    
Группа: Свой
Сообщений: 1 001
Регистрация: 27-06-06
Пользователь №: 18 409

|
Цитата(zltigo @ Jul 23 2010, 09:18)  Писать свои функции. Можно по мотивам библиотечных. +1 Столкнулся с подобной проблемой когда из-за излишнего применения const было съедено много оперативки для константных строк. По аналогии с библиотечной strstr написал свою ф-ию для поиска подстроки в строке с различными комбинациями типов строк ((sram, sram), (sram, flash), (sram, eeprom)) - пользуюсь уже в 4м проекте. Код /***************************************************************************/ //поиск подстроки в строке с ограничением по длине поиска signed int my_strstr(unsigned char *pData, unsigned char __flash *pComp, unsigned int len) { signed int result=-1;
for( unsigned int i=0; i<len; i++) { result=1; for( unsigned int j=0; *(pComp+j); j++) { if( ( *(pData+i+j) != *(pComp+j)) || ( !*(pComp+j)) ) { result=-1; break; } }
if(result == 1) { return i; //возвращаем позицию начала подстроки в строке } }
return -1; } /******************************************************************/
|
|
|
|
|
Jul 23 2010, 16:28
|
Местный
  
Группа: Участник
Сообщений: 416
Регистрация: 18-04-06
Из: Челябинск
Пользователь №: 16 219

|
Цитата(mempfis_ @ Jul 23 2010, 10:46)  +1 Столкнулся с подобной проблемой когда из-за излишнего применения const было съедено много оперативки для константных строк. По аналогии с библиотечной strstr написал свою ф-ию для поиска подстроки в строке с различными комбинациями типов строк ((sram, sram), (sram, flash), (sram, eeprom)) - пользуюсь уже в 4м проекте. Код //поиск подстроки в строке с ограничением по длине поиска signed int my_strstr(unsigned char *pData, unsigned char __flash *pComp, unsigned int len) { signed int result=-1;
for( unsigned int i=0; i<len; i++) { result=1; for( unsigned int j=0; *(pComp+j); j++) { if( ( *(pData+i+j) != *(pComp+j)) || ( !*(pComp+j)) ) { result=-1; break; } }
if(result == 1) { return i; //возвращаем позицию начала подстроки в строке } }
return -1; } Я думаю, вашу функцию можно чуть-чуть эффективней сделать. Код signed int my_strstr(unsigned char *pData, unsigned char __flash *pComp, unsigned int len) { char result=0;
for( unsigned int i=0; i<len; i++) { result=1; for(char *tp = pData+i; *pComp; tp++, pComp++) { if(!*pComp || *tp != *pComp) { result=0; break; } }
if(result) { return i; //возвращаем позицию начала подстроки в строке } }
return -1; } Или нет?
|
|
|
|
Сообщений в этой теме
SZ0 IAR AVR функция strstr Jul 22 2010, 18:02 Xenia Цитата(SZ0 @ Jul 22 2010, 21:02) Как я по... Jul 22 2010, 18:36 zltigo QUOTE (Xenia @ Jul 22 2010, 21:36) Таковы... Jul 22 2010, 19:10  Xenia Цитата(zltigo @ Jul 22 2010, 22:10) ....в... Jul 22 2010, 20:52   _Bill Цитата(Xenia @ Jul 23 2010, 00:52) Ну вот... Jul 23 2010, 03:36   zltigo QUOTE (Xenia @ Jul 22 2010, 23:52) Ну вот... Jul 23 2010, 05:27 SZ0 Спасибо за разъяснение. Придётся искомые строки в ... Jul 23 2010, 02:32    _Bill Я думаю, вашу функцию можно чуть-чуть эффективней ... Jul 23 2010, 19:29  IgorKossak QUOTE (zltigo @ Jul 23 2010, 09:18) Писат... Jul 23 2010, 06:50 Xenia Цитата(SZ0 @ Jul 23 2010, 09:02) Строки п... Jul 23 2010, 11:10  mempfis_ КодЗнаю два варианта решения вашей проблемы:
... Jul 23 2010, 12:55 Xenia _Bill, похоже на то, что ваш алгоритм даст неправи... Jul 23 2010, 20:14 _Bill Цитата(Xenia @ Jul 24 2010, 00:14) _Bill,... Jul 24 2010, 05:04 zltigo Классический, писанный на 'C', strstr()
CO... Jul 24 2010, 06:16 desh Я использую функцию которая работает одновременно ... Aug 3 2010, 12:48
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|