|
процедура с указателем на строку в памяти программ, помогите разобраться |
|
|
|
Dec 24 2008, 14:39
|

Местный
  
Группа: Участник
Сообщений: 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"; Спасибо
|
|
|
|
|
 |
Ответов
|
Dec 25 2008, 08:23
|
Участник

Группа: Участник
Сообщений: 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
|
|
|
|
|
Dec 25 2008, 11:44
|

Местный
  
Группа: Участник
Сообщений: 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"; И еще не смотря на компактность написания мой код на две строчки длинее всего. Может автор сможет лучше с моим кодом сравнить по объему и быстродействию. Буду очень признателен. Сам я с асма только перелез и это моя первая программа на си. Поэтому и функциями библиотечными мало пользуюсть так как мало о них знаю.
|
|
|
|
|
Dec 25 2008, 12:05
|

Гуру
     
Группа: Модераторы
Сообщений: 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)
|
|
|
|
|
Dec 26 2008, 10:36
|

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

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