реклама на сайте
подробности

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
> IAR AVR функция strstr, не могу разобраться
Xenia
сообщение Jul 23 2010, 20:14
Сообщение #16


Гуру
******

Группа: Модератор FTP
Сообщений: 4 479
Регистрация: 20-02-08
Из: Москва
Пользователь №: 35 237



_Bill, похоже на то, что ваш алгоритм даст неправильный ответ, если обе строки изначально тождественны. При этом, когда flash-строка дойдет до своего нуля, rеsult обнулится (сработает условие !*pp), отбросив этот вариант, как не являющийся совпадением - а это неправильно.
Go to the top of the page
 
+Quote Post
_Bill
сообщение Jul 24 2010, 05:04
Сообщение #17


Местный
***

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



Цитата(Xenia @ Jul 24 2010, 00:14) *
_Bill, похоже на то, что ваш алгоритм даст неправильный ответ, если обе строки изначально тождественны. При этом, когда flash-строка дойдет до своего нуля, rеsult обнулится (сработает условие !*pp), отбросив этот вариант, как не являющийся совпадением - а это неправильно.

Хм... За правильность алгоритма не ручаюсь. Я только формально скорректировал существующий - заменил индексы на указатели, тип и значения вспомогательной переменной. Не более того. Возможно единственно, что может повлиять на правильность работы, так это изменение порядка проверки условия совпадения символов в строках. Тогда я неправ.
PS: Да, тут я действительно неправ. Посчитал не существенным порядок проверки.

Сообщение отредактировал _Bill - Jul 24 2010, 05:08
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jul 24 2010, 06:16
Сообщение #18


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Классический, писанный на 'C', strstr()
CODE
/*                      - STRSTR.C -

   The ANSI "strstr" function.

   $Revision: 38615 $

   Copyright 1986 - 1999 IAR Systems. All rights reserved.
*/

#include "string.h"

char *strstr(const char *s1, const char *s2)
{
  int n;

  if (*s2)
  {
    while (*s1)
    {
      for (n=0; *(s1 + n) == *(s2 + n); n++)
      {
        if (!*(s2 + n + 1))
          return (char *)s1;
      }
      s1++;
    }
    return NULL;
  }
  else
    return (char *)s1;
}

от него и плясать.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
desh
сообщение Aug 3 2010, 12:48
Сообщение #19


Частый гость
**

Группа: Свой
Сообщений: 113
Регистрация: 25-10-07
Из: Краснодар
Пользователь №: 31 725



Я использую функцию которая работает одновременно со строками расположенными как в памяти программ так и в памяти данных. А для того что строки автоматически помещались во flash использую опцию компилятора --string_literals_in_flash. Из недостатков этого метода обнаружил что сама функция требует не мало памяти программ.

CODE

//******************************************************************************
// Функция сравнения строк
//******************************************************************************
char __generic* strstr_G(char __generic* buf, char __generic* sub)
{
if (*sub)
{
while (*buf)
{
char __generic* bp = buf;

do
{
if (!*sub) return buf;
}
while (*bp++ == *sub++);
sub -= (unsigned long) bp;
sub += (unsigned long) buf;
buf += 1;
}
return NULL;
}
return buf;
}
Go to the top of the page
 
+Quote Post

2 страниц V  < 1 2
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 20:56
Рейтинг@Mail.ru


Страница сгенерированна за 0.0141 секунд с 7
ELECTRONIX ©2004-2016