problem z prostą funkcją

To forum jest dla wszystkich pasjonatów mikrokontrolerów AVR Atmela. Wymiana doświadczeń i pomoc dla początkujących w pisaniu programów zarówno w C, Asemblerze jak i BASCOM. Zapraszam znawców tematu, aby pomogli wszystkim początkującym!
ODPOWIEDZ
nasiono
-
Posty: 46
Rejestracja: 29 lip 2005, 0:01

problem z prostą funkcją

Post autor: nasiono » 24 sie 2005, 18:33

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(;;);
}

Awatar użytkownika
Koppel
Użytkownik
Posty: 500
Rejestracja: 24 lip 2005, 18:05
Lokalizacja: Gliwice

Post autor: Koppel » 24 sie 2005, 19:06

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(;;
}

nasiono
-
Posty: 46
Rejestracja: 29 lip 2005, 0:01

Post autor: nasiono » 24 sie 2005, 19:35

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(;;);
}

Awatar użytkownika
Koppel
Użytkownik
Posty: 500
Rejestracja: 24 lip 2005, 18:05
Lokalizacja: Gliwice

Post autor: Koppel » 24 sie 2005, 20:13

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.

nasiono
-
Posty: 46
Rejestracja: 29 lip 2005, 0:01

Post autor: nasiono » 24 sie 2005, 21:07

Poraz kolejny dzięki za szybką odpowiedź
mógł byś mi jeszcze pomuc w tym :oops:
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(;;) ;
}

Awatar użytkownika
Koppel
Użytkownik
Posty: 500
Rejestracja: 24 lip 2005, 18:05
Lokalizacja: Gliwice

Post autor: Koppel » 24 sie 2005, 21:18

Nie rozumiem :P

nasiono
-
Posty: 46
Rejestracja: 29 lip 2005, 0:01

Post autor: nasiono » 24 sie 2005, 21:38

nie dziwie sie zagmatwałem troche :wink:
mianowicie chodzi mnie oto żeby nie było tak jak dotychczas:

fun(tab,i);

tylko:

fun(tab)

[ Dodano: 24-08-2005, 23:14 ]
Właściwie to chodzi mnie o to CZEGO tak sie nie da bo nie jest mnie to do szczęścia asz tak potrzebne ale ciekaw jestem co do tego.

Awatar użytkownika
Koppel
Użytkownik
Posty: 500
Rejestracja: 24 lip 2005, 18:05
Lokalizacja: Gliwice

Post autor: Koppel » 25 sie 2005, 8:43

Posługując się takim zapisem:
fun(tab)

Wysyłasz do funkcji wartość. Nie adres.
Należałoby posłużyć się takim przesłaniem:

fun(&tab)

A w zasadzie lepiej nawet:

fun(tab + i)

Tak czy inaczej w funkcji będzie już odpowiedni adres, trzeba tylko odczytać go za pomocą pgm_read_tonacomamochotę ;]

ODPOWIEDZ