Czy mógł by któryś z szanownych forumowiczów przerobić tą funkcje tak zeby korzystała z stringów zapisanych w wew. fleszu ?
Byłbym wdzięczny.
#include <avr/io.h>
char tekst[]={"wajha"};
char tekst1[]={"baniak"};
char *tab[]={tekst,tekst1};
int i,txt0,txt1;
void fun(char *ta[],int a)
{
txt0=strlen(ta[a]);
txt1=strlen(ta[--a]);
}
int main(void)
{
fun(tab,i);
for(;;);
}
problem z prostą funkcją
Powinno działać, ale piszę z głowy - napisz jak będzie jakiś problem.
#include <avr/io.h>
#include <string.h>
#include <avr/pgmspace.h>
prog_char tekst[]="wajha"; // nawiasy nie są konieczne przy takiej inicjacji
prog_char tekst1[]="baniak";
prog_char *tab[]={tekst,tekst1};
int i,txt0,txt1;
void fun(char *ta[],int a)
{
txt0=strlen_P((prog_char*)pgm_read_word(ta[a]));
txt1=strlen_P((prog_char*)pgm_read_word(ta[--a]));
}
int main(void)
{
fun(tab,i);
for(;;
}
#include <avr/io.h>
#include <string.h>
#include <avr/pgmspace.h>
prog_char tekst[]="wajha"; // nawiasy nie są konieczne przy takiej inicjacji
prog_char tekst1[]="baniak";
prog_char *tab[]={tekst,tekst1};
int i,txt0,txt1;
void fun(char *ta[],int a)
{
txt0=strlen_P((prog_char*)pgm_read_word(ta[a]));
txt1=strlen_P((prog_char*)pgm_read_word(ta[--a]));
}
int main(void)
{
fun(tab,i);
for(;;
}
Jak zwykle dzięki za szybką odpowiedź.
Niestety nic z tego najpierw kompilator wysypał
WAJH.c:7: warning: initialization discards qualifiers from pointer target type
WAJH.c:7: warning: initialization discards qualifiers from pointer target type
dodałem prostą linijke co by efekt naocznie zaobserwować i pokazuje ze zamiast bitu 5 "zapala" sie 0
#include <avr/io.h>
#include <string.h>
#include <avr/pgmspace.h>
prog_char tekst[]="wajha"; // nawiasy nie są konieczne przy takiej inicjacji
prog_char tekst1[]="baniak";
prog_char *tab[]={tekst,tekst1};
int i,txt0,txt1;
void fun(char *ta[],int a)
{
txt0=strlen_P((prog_char*)pgm_read_word(ta[a]));
txt1=strlen_P((prog_char*)pgm_read_word(ta[--a]));
}
int main(void)
{
fun(tab,i);
PORTB=0;
DDRB=0;
PORTB=1<<txt0; //dodałem żeby sprawdzić w symulatorze efekt
for(;;);
}
Niestety nic z tego najpierw kompilator wysypał
WAJH.c:7: warning: initialization discards qualifiers from pointer target type
WAJH.c:7: warning: initialization discards qualifiers from pointer target type
dodałem prostą linijke co by efekt naocznie zaobserwować i pokazuje ze zamiast bitu 5 "zapala" sie 0
#include <avr/io.h>
#include <string.h>
#include <avr/pgmspace.h>
prog_char tekst[]="wajha"; // nawiasy nie są konieczne przy takiej inicjacji
prog_char tekst1[]="baniak";
prog_char *tab[]={tekst,tekst1};
int i,txt0,txt1;
void fun(char *ta[],int a)
{
txt0=strlen_P((prog_char*)pgm_read_word(ta[a]));
txt1=strlen_P((prog_char*)pgm_read_word(ta[--a]));
}
int main(void)
{
fun(tab,i);
PORTB=0;
DDRB=0;
PORTB=1<<txt0; //dodałem żeby sprawdzić w symulatorze efekt
for(;;);
}
No tak... zapomniałem:
(...)
txt0=strlen_P((prog_char*)pgm_read_word(&ta[a])); // &!!!
txt1=strlen_P((prog_char*)pgm_read_word(&ta[--a])); //&!!
Ponadto:
PGM_P tab[2] PROGMEM={tekst,tekst1};
Trochę to skomplikowane, ale GCC ma ogólnie problem z tablicami umieszczonymi w pamięci programu do tego wskazującymi na elementy z pamięci programu. Teraz powinno działać - inicjację tab wyciągnęłem z działającego programu.
(...)
txt0=strlen_P((prog_char*)pgm_read_word(&ta[a])); // &!!!
txt1=strlen_P((prog_char*)pgm_read_word(&ta[--a])); //&!!
Ponadto:
PGM_P tab[2] PROGMEM={tekst,tekst1};
Trochę to skomplikowane, ale GCC ma ogólnie problem z tablicami umieszczonymi w pamięci programu do tego wskazującymi na elementy z pamięci programu. Teraz powinno działać - inicjację tab wyciągnęłem z działającego programu.
Poraz kolejny dzięki za szybką odpowiedź
mógł byś mi jeszcze pomuc w tym
chciał bym żeby dało sie wywoływać w "funk" od razu wybrany elment tablicy
zaznaczyłem moment żebys wiedział o co mi chodzi bo wiem że cięszko sie połapać z mojch tłumaczeć
z góry CI dziękuje.
#include <avr/io.h>
#include <string.h>
#include <avr/pgmspace.h>
prog_char tekst[]="wajha"; // nawiasy nie są konieczne przy takiej inicjacji
prog_char tekst1[]="baniak";
PGM_P tab[] PROGMEM={tekst,tekst1};
int i=1,txt;
void fun(char *ta)
{
txt=strlen_P((prog_char*)pgm_read_word(&ta)); // &!!!
}
int main(void)
{
PORTB=0;
DDRB=0;
fun(tab[--i]); //TUTAJ!!!!!
PORTB=1<<txt;
fun(tab[++i]); //TUTAJ!!!!!
PORTB=1<<txt;
for(;;) ;
}
mógł byś mi jeszcze pomuc w tym
chciał bym żeby dało sie wywoływać w "funk" od razu wybrany elment tablicy
zaznaczyłem moment żebys wiedział o co mi chodzi bo wiem że cięszko sie połapać z mojch tłumaczeć
z góry CI dziękuje.
#include <avr/io.h>
#include <string.h>
#include <avr/pgmspace.h>
prog_char tekst[]="wajha"; // nawiasy nie są konieczne przy takiej inicjacji
prog_char tekst1[]="baniak";
PGM_P tab[] PROGMEM={tekst,tekst1};
int i=1,txt;
void fun(char *ta)
{
txt=strlen_P((prog_char*)pgm_read_word(&ta)); // &!!!
}
int main(void)
{
PORTB=0;
DDRB=0;
fun(tab[--i]); //TUTAJ!!!!!
PORTB=1<<txt;
fun(tab[++i]); //TUTAJ!!!!!
PORTB=1<<txt;
for(;;) ;
}