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

 
 
> процедура с указателем на строку в памяти программ, помогите разобраться
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
 
Start new topic
Ответов
rokhan
сообщение Dec 25 2008, 08:23
Сообщение #2


Участник
*

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



Я просто в шоке.

думаю мои и быстрее и веселее

Цитата
#define bool int //в зависимости от системы char|word|int|long|int64
/* если нет strlen и memcmp
inline int strlen(char* ins)
{
int i=0;
while(ins[i++]);
return i;
}

inline int memcmp(char* in1,char* in2,int cc)
{
int i=0;
while(cc--)
{
if(in1[cc]!=in2[cc])
return -1;
};

return 0;
}
*/

bool find(char* inb)
{
bool retval=-1;
char inc=*inb;
int i=0;
int slen=strlen(inb);
int pp=USART0_InBufSize-slen;

while(i<pp)
{
if(USART0_InBuf[i]==inc)
if(memcmp(&USART0_InBuf[i],inb,slen)==0)
{
retval=i;
break;
}
i++;
}
return retval;
}


в вашем случае - при использовании глобальных переменных - меняется

Цитата
void find(char* inb)
{
fndOK=-1;
char inc=*inb;
int i=0;
int slen=strlen(inb);
int pp=USART0_InBufSize-slen;

while(i<pp)
{
if(USART0_InBuf[i]==inc)
if(memcmp(&USART0_InBuf[i],inb,slen)==0)
{
fndOK=i;
break;
}
i++;
}
}



блин как тут пробелов наставить?

Сообщение отредактировал rokhan - Dec 25 2008, 08:26
Go to the top of the page
 
+Quote Post
chief_olimp
сообщение Dec 25 2008, 11:44
Сообщение #3


Местный
***

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



Код
void find(char* inb)
{
fndOK=-1;
char inc=*inb;
int i=0;
int slen=strlen(inb);
int pp=USART0_InBufSize-slen;

while(i<pp)
{
if(USART0_InBuf[i]==inc)
if(memcmp(&USART0_InBuf[i],inb,slen)==0)
{
fndOK=i;
break;
}
i++;
}
}


ну не работает у меня этот код с строкой в программе типа
Код
find (text_clcc);
где
Код
PROGMEM char text_clcc[] = "clcc";

И еще не смотря на компактность написания мой код на две строчки длинее всего.
Может автор сможет лучше с моим кодом сравнить по объему и быстродействию. Буду очень признателен. Сам я с асма только перелез и это моя первая программа на си. Поэтому и функциями библиотечными мало пользуюсть так как мало о них знаю.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Dec 25 2008, 12:05
Сообщение #4


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(chief_olimp @ Dec 25 2008, 13:44) *
Сам я с асма только перелез и это моя первая программа на си. Поэтому и функциями библиотечными мало пользуюсть так как мало о них знаю.
Ну так и надо начать программирование с изучения документации. С чтения WinAVR/doc/avr-libc/FAQ.htm и остальной документации в этой папке. Хотя бы тех разделов, в которых поиск находит слово PROGMEM.
Если вы писали на асме, то должны четко представлять, что для обращения к данным в озу используются команды LD, LDD, LDS, а для чтения из программной памяти - LPM. И должны понимать, что компилятор не может только по значению обычного указателя понимать, какую команду использовать. Иными словами, функции strlen(), memcmp() не могут работать и со строками в ОЗУ и со строками во флеше. Чтобы обойти эту нестыковку стандарта языка С и процессоров с несколькими адресными пространствами придуманы аналоги этих функций для работы с флеш. Еще в ответе №4 Tiro вам подсказал, где вы можете найти ответ. Вы не читаете ответов или не хотите следовать данным в них советам? Вы не хотите прочитать документацию? Тогда неудивительно, что код не работает и "так мало о них знаю".
Код
void find(prog_char const * inb)
{
    prog_char const * found = strstr_P(USART0_InBuf, inb);
    if (!found)
        fndOK=-1;
    else
        fndOK = found - USART0_InBuf;
}


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
alx2
сообщение Dec 26 2008, 10:36
Сообщение #5


Местный
***

Группа: Участник
Сообщений: 340
Регистрация: 25-10-05
Из: Пермь, Россия
Пользователь №: 10 091



Цитата(Сергей Борщ @ Dec 25 2008, 17:05) *
И должны понимать, что компилятор не может только по значению обычного указателя понимать, какую команду использовать. Иными словами, функции strlen(), memcmp() не могут работать и со строками в ОЗУ и со строками во флеше.
Во времена MCS-51, тоже имеющего много разных адресных пространств, компиляторы использовали "универсальные" трехбайтные указатели, в которых первый байт был селектором адресного пространства. Соответственно, и функции, принимавшие такие указатели, вполне успешно работали со строками хоть в памяти данных, хоть в памяти программ. И как раз для начинающих это понятно и удобно, ибо соответствует правилам языка. Продвинутые кодеры могли использовать нестандартные спецификаторы, если тредовалось уменьшить оверхед и/или размер указателей...


--------------------
Всего наилучшего,
Alex Mogilnikov
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- chief_olimp   процедура с указателем на строку в памяти программ   Dec 24 2008, 14:39
- - rokhan   И что ты хочешь найти? Если ты хочешь найти стро...   Dec 24 2008, 15:03
- - rezident   Цитата(chief_olimp @ Dec 24 2008, 19:39) ...   Dec 24 2008, 16:27
|- - demiurg_spb   Цитата(rezident @ Dec 24 2008, 19:27) Во-...   Dec 24 2008, 18:21
|- - rezident   Цитата(demiurg_spb @ Dec 24 2008, 23:21) ...   Dec 24 2008, 19:49
|- - demiurg_spb   Цитата(rezident @ Dec 24 2008, 22:49) Тео...   Dec 25 2008, 10:24
||- - HARMHARM   Цитата(demiurg_spb @ Dec 25 2008, 12:24) ...   Dec 25 2008, 11:14
|||- - zltigo   Цитата(HARMHARM @ Dec 25 2008, 14:14) Бол...   Dec 25 2008, 11:37
|||- - demiurg_spb   Цитата(HARMHARM @ Dec 25 2008, 14:14) Бол...   Dec 25 2008, 12:11
|||- - HARMHARM   Цитата(demiurg_spb @ Dec 25 2008, 14:11) ...   Dec 25 2008, 12:49
||- - rezident   Цитата(demiurg_spb @ Dec 25 2008, 15:24) ...   Dec 25 2008, 12:35
||- - demiurg_spb   Цитата(rezident @ Dec 25 2008, 15:35) Я с...   Dec 25 2008, 13:37
||- - zltigo   Цитата(demiurg_spb @ Dec 25 2008, 16:37) ...   Dec 25 2008, 14:31
|||- - demiurg_spb   Цитата(zltigo @ Dec 25 2008, 17:31) И за ...   Dec 25 2008, 16:50
||- - rezident   Цитата(demiurg_spb @ Dec 25 2008, 18:37) ...   Dec 25 2008, 15:00
||- - demiurg_spb   Цитата(rezident @ Dec 25 2008, 18:00) Буд...   Dec 25 2008, 16:38
||- - zltigo   Цитата(demiurg_spb @ Dec 25 2008, 19:38) ...   Dec 25 2008, 16:49
||- - zltigo   Цитата(demiurg_spb @ Dec 25 2008, 19:38) ...   Dec 25 2008, 16:54
||- - demiurg_spb   Цитата(zltigo @ Dec 25 2008, 19:54) Само ...   Dec 25 2008, 17:27
||- - zltigo   Цитата(demiurg_spb @ Dec 25 2008, 20:27) ...   Dec 25 2008, 17:34
||- - demiurg_spb   Цитата(zltigo @ Dec 25 2008, 20:34) Естес...   Dec 25 2008, 17:43
||- - zltigo   Цитата(demiurg_spb @ Dec 25 2008, 20:43) ...   Dec 26 2008, 13:54
||- - demiurg_spb   Цитата(zltigo @ Dec 26 2008, 16:54) Не по...   Dec 27 2008, 10:03
||- - Сергей Борщ   Цитата(demiurg_spb @ Dec 27 2008, 12:03) ...   Dec 27 2008, 11:15
|||- - demiurg_spb   Цитата(Сергей Борщ @ Dec 27 2008, 14:15) ...   Dec 28 2008, 22:04
||- - rezident   Цитата(demiurg_spb @ Dec 27 2008, 15:03) ...   Dec 27 2008, 22:00
|- - alx2   Цитата(rezident @ Dec 25 2008, 00:49) Тео...   Dec 25 2008, 11:15
- - Tiro   Чип AVR с компилятором WinAVR? Тогда прочтите здес...   Dec 24 2008, 16:42
- - chief_olimp   дело в том что я хочу каждый раз используя одну и ...   Dec 24 2008, 16:49
|- - defunct   Цитата(chief_olimp @ Dec 24 2008, 18:49) ...   Dec 24 2008, 17:02
- - WHALE   Я решал вашу задачу так: Кодflash char *flash STRI...   Dec 24 2008, 17:34
- - chief_olimp   в вашем случае насколько я понял сравниваются стро...   Dec 24 2008, 17:43
|- - WHALE   Цитата(chief_olimp @ Dec 24 2008, 20:43) ...   Dec 24 2008, 20:03
- - _Pasha   Код#define Str const unsigned char PROGMEM Str bla...   Dec 24 2008, 18:24
|- - demiurg_spb   Цитата(_Pasha @ Dec 24 2008, 21:24) Код#d...   Dec 24 2008, 18:31
- - rokhan   2chief_olimp : простите. но то что вы написали - э...   Dec 24 2008, 18:28
|- - chief_olimp   Цитата(rokhan @ Dec 24 2008, 22:28) 2chie...   Dec 24 2008, 20:15
- - _Pasha   Цитата(demiurg_spb @ Dec 24 2008, 22:31) ...   Dec 24 2008, 18:49
|- - zltigo   Цитата(rokhan @ Dec 25 2008, 11:23) думаю...   Dec 25 2008, 08:54
|- - chief_olimp   Документацию я как раз читаю. Только напоминаю я н...   Dec 25 2008, 12:18
||- - Сергей Борщ   Цитата(chief_olimp @ Dec 25 2008, 14:18) ...   Dec 25 2008, 13:44
||- - chief_olimp   Обращение есть. CODEvoid find (const void *findbuf...   Dec 25 2008, 14:22
|- - Сергей Борщ   Цитата(alx2 @ Dec 26 2008, 12:36) Во врем...   Dec 26 2008, 15:32
|- - Сергей Борщ   Цитата(Сергей Борщ @ Dec 26 2008, 17:32) ...   Dec 26 2008, 17:48
- - rokhan   Спасибо вы нашли опечатку. КодНа счет тегов могли ...   Dec 25 2008, 09:00
|- - zltigo   Цитата(rokhan @ Dec 25 2008, 12:00) У авт...   Dec 25 2008, 09:48
- - chief_olimp   т.е. каждый раз при очередном сравнивании данные с...   Dec 25 2008, 09:15


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

 


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


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