|
процедура с указателем на строку в памяти программ, помогите разобраться |
|
|
|
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 25 2008, 13:44
|

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

|
Цитата(chief_olimp @ Dec 25 2008, 14:18)  Скажите у Вас у самого код что сверху работает со словами из FLASH? Конкретно этот не проверял, но если в pgmspace.h описан прототип extern char *strstr_P(const char *, PGM_P); то у меня нет основания сомневаться в том, что первый агрумент - указатель на строку в ОЗУ, а второй - на строку в flash. Описание стандартной функции strstr гласит: Цитата Returns a pointer to the first occurrence of str2 in str1, or a null pointer if str2 is not part of str1. А это именно то, что требуется, судя по вашему исходнику. Цитата(chief_olimp @ Dec 25 2008, 14:18)  Мой код у меня работает и меня лично вполне устаивает. Весьма сомнительно - в вашем коде нет обращения к flash. Цитата(chief_olimp @ Dec 25 2008, 14:18)  Код что выше у меня не работает, и выдает ошибку что не понимает аттрибута функции. Тренировки в телепатии, безусловно, полезны. Но пока мы не достигли совершенства в этой области неплохо было бы приводить конкретную строку, на которую выдается ошибка и конкретный текст ошибки. Мой код прекрасно компилируется: CODE main.cpp: #include <avr\pgmspace.h> char USART0_InBuf[10]; int fndOK; void find(prog_char const * inb) { prog_char const * found = strstr_P(USART0_InBuf, inb); if (!found) fndOK=-1; else fndOK = found - USART0_InBuf; }
main.lst: 531 .section .text._Z4findPKc,"ax",@progbits 532 .global _Z4findPKc 534 _Z4findPKc: 535 .LFB37: 536 .LSM79: 537 /* prologue: frame size=0 */ 538 /* prologue end (size=0) */ 539 .LVL13: 540 .LBB23: 541 .LSM80: 542 0000 BC01 movw r22,r24 ; inb, inb 543 0002 80E0 ldi r24,lo8(USART0_InBuf) ; , 544 0004 90E0 ldi r25,hi8(USART0_InBuf) ; , 545 .LVL14: 546 0006 00D0 rcall strstr_P ; 547 .LVL15: 548 .LSM81: 549 0008 0097 sbiw r24,0 ; found 550 .LVL16: 551 000a 01F4 brne .L64 ; , 552 .LSM82: 553 000c 8FEF ldi r24,lo8(-1) ; tmp45, 554 000e 9FEF ldi r25,hi8(-1) ; tmp45, 555 .LVL17: 556 0010 00C0 rjmp .L68 ; 557 .LVL18: 558 .L64: 559 .LSM83: 560 0012 8050 subi r24,lo8(USART0_InBuf) ; found, 561 0014 9040 sbci r25,hi8(USART0_InBuf) ; found, 562 .L68: 563 0016 9093 0000 sts (fndOK)+1,r25 ; fndOK, found 564 001a 8093 0000 sts fndOK,r24 ; fndOK, found 565 001e 0895 ret 566 .LBE23: 567 /* epilogue: frame size=0 */ 568 /* epilogue: noreturn */ 569 /* epilogue end (size=0) */ 570 /* function void find(const prog_char*) size 16 (16) */
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Dec 25 2008, 14:22
|

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

|
Обращение есть. CODE void find (const void *findbuff) { findOK = false; unsigned int i=0; unsigned char temp,j=0; pointer = 0; while(1) { temp = pgm_read_byte(findbuff++); if(temp==0) break; FIND[i++] = temp; } i=0; while (i != USART0_InBufSize) { if (USART0_InBuf[i] == FIND[j]) { i++;j++;findOK = true; if (FIND[j] == 0x00) { pointer = i; break; } } else { i++; if (findOK == true) { i = i-j; j=0; findOK = false; } } } } Но перед вами снимаю шляпу. Три страницы нужно было исписать что бы прийти к трем строчкам текста
|
|
|
|
Сообщений в этой теме
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   alx2 Цитата(Сергей Борщ @ Dec 25 2008, 17:05) ... Dec 26 2008, 10:36    Сергей Борщ Цитата(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
3 чел. читают эту тему (гостей: 3, скрытых пользователей: 0)
Пользователей: 0
|
|
|