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

 
 
5 страниц V  « < 3 4 5  
Reply to this topicStart new topic
> Можно ли в typedef struct описать массив переменной длины, IAR, C, AVR
demiurg_spb
сообщение Feb 25 2009, 08:05
Сообщение #61


неотягощённый злом
******

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



Цитата(west329_ @ Feb 25 2009, 09:12) *
Аналогично функции strstr, ненашол.
Копилятор IAR AVR CLIB
Вы Молодец. Теперь делаем вывод, что без дополнительных усилий Вашу задачу не решить.
Но есть очень простой способ (с использованием временного буфера - будет отъедать ОЗУ).
Пишите свою функцию, которая ищет в строке s1 (из ОЗУ) подстроку s2 (из flash)
Код
char* strstr_P(const char* s1, flash char* s2)
{
    #define MAX_STR_LEN    50            // допустим 50
    char buf[MAX_STR_LEN];
    strncpy_P(buf, s2, MAX_STR_LEN);     // копируем flash в buf
    buf[MAX_STR_LEN-1] = '\0';           // null в любом случае должен быть
    return  strstr(s1, buf);             // вызываем библиотечную функцию.
}

Вариант 2: пишите полностью с нуля функцию char* strstr_P(const char* s1, flash char* s2) без буферизации.
Вариант 3: отказываетесь от использования flash.
Всё в Ваших руках...


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
west329_
сообщение Feb 25 2009, 10:20
Сообщение #62


Местный
***

Группа: Свой
Сообщений: 378
Регистрация: 10-09-07
Из: UKR/Voz
Пользователь №: 30 423



Всё работает как надо, благодарю за помощь. За ради интереса, собрал несколько аналогичных функций.
Код
char* strstr_P(const char* s1, flash char* s2)
{
    size_t len;
    len = strlen_P(s2);
    char *buf;  
    buf = malloc(len);
    strncpy_P(buf, s2, len);
    return  strstr(s1, buf);
}

самый прожорлевый вариант. прибавил сразу ~240kb
Код
char* strstr_P(const char* s1, flash char* s2)
{
    #define MAX_STR_LEN    30            // äîïóñòèì 30    
    char buf[MAX_STR_LEN];
    char len = strlen_P(s2);
    strncpy_P(buf, s2, len);     // êîïèðóåì flash â buf
    buf[len] = '\0';
   return  strstr(s1, buf)
}

немного меньше, но всёравно порядка 150кб
ваш код самый маленьки оказался, порядка 100кб
Go to the top of the page
 
+Quote Post
msalov
сообщение Feb 25 2009, 10:53
Сообщение #63


Знающий
****

Группа: Свой
Сообщений: 526
Регистрация: 24-08-07
Из: Беларусь, Минск
Пользователь №: 30 045



Цитата(west329_ @ Feb 25 2009, 12:20) *
Код
char* strstr_P(const char* s1, flash char* s2)
{
    #define MAX_STR_LEN    30
    char buf[MAX_STR_LEN];
    char len = strlen_P(s2);
    strncpy_P(buf, s2, len);
    buf[len] = '\0';
   return  strstr(s1, buf)
}

Советую не использовать этот вариант. Так как у вас тут потенциальное переполнение буфера. Безопасный вариант
Код
char* strstr_P(const char* s1, flash char* s2)
{
    #define MAX_STR_LEN    30
    char buf[MAX_STR_LEN];
    strncpy_P(buf, s2, MAX_STR_LEN);
    buf[MAX_STR_LEN - 1] = '\0';
   return  strstr(s1, buf);
}
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Feb 25 2009, 11:06
Сообщение #64


неотягощённый злом
******

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



Цитата(west329_ @ Feb 25 2009, 13:20) *
Всё работает как надо, благодарю за помощь. За ради интереса, собрал несколько аналогичных функций.
Эксперементировать надо с умом (простите, но гляда на то что Вы пишите у меня сердце кровью обливается).
Купите книжку по СИ и перечитайте её несколько раз - эти трудозатраты с лихвой окупятся.
Для общего развития:
1. На каждый malloc() должен быть свой free().
2. strncpy(s1,s2,n) копирует строку s2 в s1, но не более n символов, поэтому нас не интересует длина s2,
т.к. любая строка заканчивается '\0', а приёмный буфер (строка s1) имеет максимальную длину не меньше n.
И ещё, прикинте сколько машинных циклов добавят вызовы этих процедур: malloc() и free().
Да, можно еще немного оптимизировать:
Код
char* strstr_P(const char* s1, flash char* s2)
{
    #define MAX_STR_LEN    30
    char buf[MAX_STR_LEN];
    buf[MAX_STR_LEN - 1] = '\0';
    return  strstr(s1, strncpy_P(buf, s2, MAX_STR_LEN-1));
}


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
A. Fig Lee
сообщение Feb 26 2009, 02:10
Сообщение #65


Знающий
****

Группа: Участник
Сообщений: 974
Регистрация: 4-04-08
Из: далека
Пользователь №: 36 467



то, что возвращает malloc() правильные пацаны проверяют на NULL.


--------------------
Верить нельзя никому, даже себе. Мне - можно.
Go to the top of the page
 
+Quote Post

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

 


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


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