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

 
 
4 страниц V   1 2 3 > »   
Reply to this topicStart new topic
> процедура с указателем на строку в памяти программ, помогите разобраться
chief_olimp
сообщение Dec 24 2008, 14:39
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 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";

Спасибо
Go to the top of the page
 
+Quote Post
rokhan
сообщение Dec 24 2008, 15:03
Сообщение #2


Участник
*

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



И что ты хочешь найти? smile.gif
Если ты хочешь найти строку в "блабла" в буфере... - тогда тебе надо цикл опирать на буфер а не на строку.
Go to the top of the page
 
+Quote Post
rezident
сообщение Dec 24 2008, 16:27
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 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];
Go to the top of the page
 
+Quote Post
Tiro
сообщение Dec 24 2008, 16:42
Сообщение #4


Знающий
****

Группа: Свой
Сообщений: 781
Регистрация: 3-10-04
Из: Санкт-Петербург
Пользователь №: 768



Чип AVR с компилятором WinAVR?
Тогда прочтите здесь: Data in Program Space
Go to the top of the page
 
+Quote Post
chief_olimp
сообщение Dec 24 2008, 16:49
Сообщение #5


Местный
***

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



дело в том что я хочу каждый раз используя одну и ту же функцию искать разные строки подгружаемые из памяти программ. Функция ищет данные из FLASH в буфере UART. И если находит то сообщает об этом. Если считать данные одной функцией и потом сравнить два буффера то все получается. Проблема в том что я не знаю как объявить стоку из FLASH и затем данные из этой строки использовать в функции.
Go to the top of the page
 
+Quote Post
defunct
сообщение Dec 24 2008, 17:02
Сообщение #6


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(chief_olimp @ Dec 24 2008, 18:49) *
Проблема в том что я не знаю как объявить стоку из FLASH и затем данные из этой строки использовать в функции.

Почитайте вот эту тему
http://electronix.ru/forum/index.php?showtopic=56157&hl=
может натолкнет на идеи.
Go to the top of the page
 
+Quote Post
WHALE
сообщение Dec 24 2008, 17:34
Сообщение #7


Знающий
****

Группа: Свой
Сообщений: 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
Go to the top of the page
 
+Quote Post
chief_olimp
сообщение Dec 24 2008, 17:43
Сообщение #8


Местный
***

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Dec 24 2008, 18:21
Сообщение #9


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

Группа: Свой
Сообщений: 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, на то он и нужен.


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Dec 24 2008, 18:24
Сообщение #10


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Код
#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
}

Так, что ли ?
Go to the top of the page
 
+Quote Post
rokhan
сообщение Dec 24 2008, 18:28
Сообщение #11


Участник
*

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



2chief_olimp : простите. но то что вы написали - это не find ... это strcpy() причем в извращенной форме.
при чем тут find? если он ничего не возвращет и не сообщает?

2pasha: а если строка не с начала? smile.gif

Сообщение отредактировал rokhan - Dec 24 2008, 18:31
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Dec 24 2008, 18:31
Сообщение #12


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

Группа: Свой
Сообщений: 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};


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Dec 24 2008, 18:49
Сообщение #13


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(demiurg_spb @ Dec 24 2008, 22:31) *
Похоже что не так.

Точно! (AVR-libc в помощь). спасибо.

Цитата(rokhan @ Dec 24 2008, 22:28) *
2pasha: а если строка не с начала? smile.gif

тогда считать кол-во совпавших символов и принимать решение исходя из этого.
Go to the top of the page
 
+Quote Post
rezident
сообщение Dec 24 2008, 19:49
Сообщение #14


Гуру
******

Группа: Свой
Сообщений: 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 и/или только латиницу.
Go to the top of the page
 
+Quote Post
WHALE
сообщение Dec 24 2008, 20:03
Сообщение #15


Знающий
****

Группа: Свой
Сообщений: 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
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 18th July 2025 - 14:11
Рейтинг@Mail.ru


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