Goto page 1, 2 Next
Milosz Skowyra
Guest
Wed May 12, 2004 9:43 am
Ehlo.
Na wstepie... potrzebne do kombajnu marchewkowego ;-)
Mam strukture:
typedef struct
{
int adres[6];
unsigned char preheat[6];
unsigned char limit[6];
unsigned char character[6];
unsigned char nazwa[16] ;
}eeprom_set;
Struktura owa jest powiazana w pewien sposob z wielopoziomowym menu. W
pewnym miejscu programu tzn. tam gdzie nastepuje wyswietlenie konkretnej
wartosci ze struktury, nastepuje ustawienie wskaznika: int *edit_buffer
na dana za pomoca: edit_pointer=&ustawienia.adres[mep2-2]; W zupelnie
innej czesci programu musze miec mozliwosc edytowania wartosci na ktora
wskazuje edit_buffer. Dokonuje tego za pomoca np. (*edit_pointer)++;
Teraz problem: Jak widac struktura ma 2 typy danych inty i chary. Tak
byc musi, jak zmienie char-y na inty to w EEPROM-ie mi sie nie pomiesci,
adres musi byc intem. Procedura edycji danych musi byc jedna i edytowac
zmienne int i char. Jak to zrobic zeby wskaznik int *edit_buffer mogl
wsazywac obiekty char. Bo wskazywac to potrafi
edit_pointer=(int*)(&ustawienia.limit[mep2-2]); ale zapisuje dana jako
inta (zajmuje 2 bajty i slusznie).
Co powinienem sie dowiedziec ?? I czy w tym przypadku nie mam znow
problemu ze wskaznikami ?? Poczytalem K&R ale nie ma tam zasadniczo
informacji jak postapic w tym przypadku. Teoretycznie moglbym
wykorzystac wskaznik typu void i przepisywac go do wskaznika albo typu
char albo typu int. Ale moze da sie bardziej elegancko. Moglbym tez niby
przeciazyc funkcje, ale wolalbym miec dwa w jednym... da sie tak ??
--
Regards. Przy odpowiedzi usun "." przed "net" z adresu!!!
|-----------------------------------------------------|
| Milosz Skowyra GSM Mobile +48 600 95 35 72 |
| miloszek@fido.net.org.pl 2:484/2.47 on fidonet |
|-----------------------------------------------------|
Andy
Guest
Wed May 12, 2004 11:17 am
Użytkownik "Milosz Skowyra" <mewashek@wp.pl> napisał w wiadomości
news:40A1FFE1.ECFCA803@wp.pl...
Quote:
Ehlo.
Na wstepie... potrzebne do kombajnu marchewkowego ;-)
Mam strukture:
typedef struct
{
int adres[6];
unsigned char preheat[6];
unsigned char limit[6];
unsigned char character[6];
unsigned char nazwa[16] ;
}eeprom_set;
Struktura owa jest powiazana w pewien sposob z wielopoziomowym menu. W
pewnym miejscu programu tzn. tam gdzie nastepuje wyswietlenie konkretnej
wartosci ze struktury, nastepuje ustawienie wskaznika: int *edit_buffer
na dana za pomoca: edit_pointer=&ustawienia.adres[mep2-2]; W zupelnie
innej czesci programu musze miec mozliwosc edytowania wartosci na ktora
wskazuje edit_buffer. Dokonuje tego za pomoca np. (*edit_pointer)++;
Teraz problem: Jak widac struktura ma 2 typy danych inty i chary. Tak
byc musi, jak zmienie char-y na inty to w EEPROM-ie mi sie nie pomiesci,
adres musi byc intem. Procedura edycji danych musi byc jedna i edytowac
zmienne int i char. Jak to zrobic zeby wskaznik int *edit_buffer mogl
wsazywac obiekty char. Bo wskazywac to potrafi
edit_pointer=(int*)(&ustawienia.limit[mep2-2]); ale zapisuje dana jako
inta (zajmuje 2 bajty i slusznie).
a cast nie dziala ?
*(char*) edit_pointer = jakas_dana;
chyba zapisze char pod ten wskaznik
--
Andrzej
J.F.
Guest
Wed May 12, 2004 12:18 pm
On Wed, 12 May 2004 12:43:45 +0200, Milosz Skowyra wrote:
Quote:
typedef struct
{
int adres[6];
unsigned char preheat[6];
unsigned char limit[6];
unsigned char character[6];
unsigned char nazwa[16] ;
}eeprom_set;
W pewnym miejscu programu tzn. tam gdzie nastepuje wyswietlenie konkretnej
wartosci ze struktury, nastepuje ustawienie wskaznika: int *edit_buffer
na dana za pomoca: edit_pointer=&ustawienia.adres[mep2-2]; W zupelnie
innej czesci programu musze miec mozliwosc edytowania wartosci na ktora
wskazuje edit_buffer. Dokonuje tego za pomoca np. (*edit_pointer)++;
Teraz problem: Jak widac struktura ma 2 typy danych inty i chary. Tak
byc musi, jak zmienie char-y na inty to w EEPROM-ie mi sie nie pomiesci,
adres musi byc intem. Procedura edycji danych musi byc jedna i edytowac
zmienne int i char. Jak to zrobic zeby wskaznik int *edit_buffer mogl
wsazywac obiekty char. Bo wskazywac to potrafi
edit_pointer=(int*)(&ustawienia.limit[mep2-2]); ale zapisuje dana jako
inta (zajmuje 2 bajty i slusznie).
Ty cos Miloszu znowu przekombinowujesz. ja nie bardzo rozumiem co
chcesz osiagnac ...
Jesli jedna procedura ma poprawiac int i char ... to nie moze byc
"jedna" - bo jak ma sie zorientowac jaki typ ma poprawic ?
Poprawnie to bedzie cos takiego:
eeprom_set *edit_p;
edit_p=&ustawienia ; //lub =&ustawienia[0]; czy =ustawienia jesli
tablica
wyswietl(&(edit_p->adres[mep2-2]));
edytuj_inttab(edit_p->adres);
edytuj_chartab(edit_p->preheat);
mozesz oczywiscie zmiescic w jednej, na zasadzie
edytuj(void *p, char typ)
{
.....
if (typ==1) //char
*(char*)p=... ;
else
*(int*)p = ....;
}
Jesli ci sie nie podoba .. w zasadzie do tego sluza obiekty,
ale nie polecam :-)
Quote:
Teoretycznie moglbym
wykorzystac wskaznik typu void i przepisywac go do wskaznika albo typu
char albo typu int.
"zmienic typ" mozesz tak jak wyzej. void nie jest do tego potrzebny
- to tylko dla elegancji i podkreslenia ze ten typ dziwny jest.
Mogloby byc tak:
edytuj(int *p, char typ)
{
.....
if (typ==1) //char
*(char*)p=... ;
else
*p = ....;
}
Tylko wtedy kompilator bedzie cie ostrzegal przy wywolaniu
edytuj(edit_p->preheat+3, 1)
J.
Krzysztof Rudnik
Guest
Wed May 12, 2004 1:54 pm
Milosz Skowyra wrote:
Quote:
Ehlo.
Na wstepie... potrzebne do kombajnu marchewkowego ;-)
Mam strukture:
typedef struct
{
int adres[6];
unsigned char preheat[6];
unsigned char limit[6];
unsigned char character[6];
unsigned char nazwa[16] ;
}eeprom_set;
Struktura owa jest powiazana w pewien sposob z wielopoziomowym menu. W
pewnym miejscu programu tzn. tam gdzie nastepuje wyswietlenie konkretnej
wartosci ze struktury, nastepuje ustawienie wskaznika: int *edit_buffer
na dana za pomoca: edit_pointer=&ustawienia.adres[mep2-2]; W zupelnie
innej czesci programu musze miec mozliwosc edytowania wartosci na ktora
wskazuje edit_buffer. Dokonuje tego za pomoca np. (*edit_pointer)++;
Teraz problem: Jak widac struktura ma 2 typy danych inty i chary. Tak
byc musi, jak zmienie char-y na inty to w EEPROM-ie mi sie nie pomiesci,
adres musi byc intem. Procedura edycji danych musi byc jedna i edytowac
zmienne int i char. Jak to zrobic zeby wskaznik int *edit_buffer mogl
wsazywac obiekty char. Bo wskazywac to potrafi
edit_pointer=(int*)(&ustawienia.limit[mep2-2]); ale zapisuje dana jako
inta (zajmuje 2 bajty i slusznie).
Co powinienem sie dowiedziec ?? I czy w tym przypadku nie mam znow
problemu ze wskaznikami ?? Poczytalem K&R ale nie ma tam zasadniczo
informacji jak postapic w tym przypadku. Teoretycznie moglbym
wykorzystac wskaznik typu void i przepisywac go do wskaznika albo typu
char albo typu int. Ale moze da sie bardziej elegancko. Moglbym tez niby
przeciazyc funkcje, ale wolalbym miec dwa w jednym... da sie tak ??
Jakos prosto, automagicznie sie nie da.
Moze jakos tak (zeby nie kopiowac procedury edytujacej):
edit_int(int * xint)
{
(*xint)++;
}
edit_char(char * xchar)
{
int tmp = xchar[0];
edit_int(&tmp);
xchar[0] = tmp;
}
Komplikuje sie jesli chodzi Ci o cala tablice (wszedzie widze [6]),
trzeba by miec tymczasowa tablice.
Druga wada to ze traci sie sprawdzenie wartosci.
Krzysiek Rudnik
Milosz Skowyra
Guest
Wed May 12, 2004 5:18 pm
Andy wrote:
Quote:
a cast nie dziala ?
Proponujesz reinterpret_cast<char *>&edit_pointer ?? Cos nie chce... ;-(
Quote:
*(char*) edit_pointer = jakas_dana;
chyba zapisze char pod ten wskaznik
Nie sprawdzalem, ale to nie w ta strone ma dzialac... to znaczy troche.
Musialbym najpierw wiedziec ze wskaznik jest na char a nie na int.
--
Regards. Przy odpowiedzi usun "." przed "net" z adresu!!!
|-----------------------------------------------------|
| Milosz Skowyra GSM Mobile +48 600 95 35 72 |
| miloszek@fido.net.org.pl 2:484/2.47 on fidonet |
|-----------------------------------------------------|
Milosz Skowyra
Guest
Wed May 12, 2004 5:34 pm
"J.F." wrote:
[...]
Quote:
edit_pointer=(int*)(&ustawienia.limit[mep2-2]); ale zapisuje dana jako
inta (zajmuje 2 bajty i slusznie).
Ty cos Miloszu znowu przekombinowujesz. ja nie bardzo rozumiem co
chcesz osiagnac ...
Hint. Kiedys w asmie stworzylem sobie taki uklad menu, ktory dzialal
"sam z siebie" tzn. wystarczylo dopisac pozycje menu w definicji menu i
reakcje na enter. Teraz chce osiagnac cos podobnego. Ale juz widze ze
cos nie bardzo.
Quote:
Jesli jedna procedura ma poprawiac int i char ... to nie moze byc
"jedna" - bo jak ma sie zorientowac jaki typ ma poprawic ?
No wlasnie, myslalem ze za malo wiem na temat C i dlatego zapytalem.
[...]
Quote:
Jesli ci sie nie podoba .. w zasadzie do tego sluza obiekty,
ale nie polecam
Odpuszczam... kilkadziesiat bajtow to nie majatek. Za to przejrzystosc
spora.
Quote:
"zmienic typ" mozesz tak jak wyzej. void nie jest do tego potrzebny
- to tylko dla elegancji i podkreslenia ze ten typ dziwny jest.
Mogloby byc tak:
[...]
Tylko wtedy kompilator bedzie cie ostrzegal przy wywolaniu
edytuj(edit_p->preheat+3, 1)
Spoko, poradzilem sobie dwoma funkcjami, osobnymi dla typow. Jak mi
pamieci zacznie brakowac to moze wtedy zaczne kombinowac. A propo's
kompilatora i warninga... to mam jeszcze male 2 pytanka.
Dlaczego zapis:
eeprom_set temp;
memcpy(&temp,&ustawienia,sizeof(eeprom_set));
wywoluje warninga:
menu.c:189: warning: implicit declaration of function `memcpy'
ustawienia tez sa typu eeprom_set. Identyczna definicja kilkanascie
linijek nizej w innej funkcji nie wywoluje tego warninga. Nie rozumiem
dlaczego kompilator uwaza ze ta deklaracja jest "ukryta" czy
"bezgraniczna".
I kolejny problem warninga podczas zapisywania do eepromu.
eeprom_write_block(&ustawienia,&eeust[setting_number],sizeof(ustawienia));
menu.c:215: warning: passing arg 2 of `eeprom_write_block' discards
qualifiers from pointer target type
gdzie: eeprom_set ustawienia;
static const eeprom_set eeust[3] __attribute__((section(".eeprom"))) ={
{{1,2,3,4,5,6},{0,0,0,0,0,0},{255,255,255,255,255,255},{0,1,2,3,1,2},"1
zestaw nastaw "},
{{2,3,4,5,6,7},{0,0,0,0,0,0},{255,255,255,255,255,255},{0,0,0,0,0,0},"2
zestaw nastaw "},
{{3,4,5,6,7,8},{0,0,0,0,0,0},{255,255,255,255,255,255},{0,0,0,0,0,0},"3
zestaw nastaw "}};
Rozumiem ze nie podoba mu sie to ze adres dostarczam w malostrawnej dla
niego postaci. Czy tak ??
--
Regards. Przy odpowiedzi usun "." przed "net" z adresu!!!
|-----------------------------------------------------|
| Milosz Skowyra GSM Mobile +48 600 95 35 72 |
| miloszek@fido.net.org.pl 2:484/2.47 on fidonet |
|-----------------------------------------------------|
Milosz Skowyra
Guest
Wed May 12, 2004 5:35 pm
Krzysztof Rudnik wrote:
Quote:
Komplikuje sie jesli chodzi Ci o cala tablice (wszedzie widze [6]),
trzeba by miec tymczasowa tablice.
Druga wada to ze traci sie sprawdzenie wartosci.
Dzieki.
--
Regards. Przy odpowiedzi usun "." przed "net" z adresu!!!
|-----------------------------------------------------|
| Milosz Skowyra GSM Mobile +48 600 95 35 72 |
| miloszek@fido.net.org.pl 2:484/2.47 on fidonet |
|-----------------------------------------------------|
Piotr Wyderski
Guest
Wed May 12, 2004 6:40 pm
Milosz Skowyra wrote:
Quote:
Proponujesz reinterpret_cast<char *>&edit_pointer ?? Cos nie chce... ;-(
Bo:
a) to jest konstrukcja z C++, a nie z C, w ktorym, jak sie domyslam,
piszesz.
b) paramer podaje sie w nawiasach: reinterpret_cast<char *>(&edit_pointer).
W C piszesz zwyczajnie: (char*) &edit_pointer.
Pozdrawiam
Piotr Wyderski
Milosz Skowyra
Guest
Wed May 12, 2004 8:19 pm
Piotr Wyderski wrote:
Quote:
Proponujesz reinterpret_cast<char *>&edit_pointer ?? Cos nie chce... ;-(
Bo:
a) to jest konstrukcja z C++, a nie z C, w ktorym, jak sie domyslam,
piszesz.
b) paramer podaje sie w nawiasach: reinterpret_cast<char *>(&edit_pointer).
W C piszesz zwyczajnie: (char*) &edit_pointer.
Jasne. Jak rozumiem przez C generalnie rozumie sie ANSI C z pozniejszymi
zmianami typu C99 ??
A CPP to pochodna C, rozniaca sie... no wlasnie... czym ??
--
Regards. Przy odpowiedzi usun "." przed "net" z adresu!!!
|-----------------------------------------------------|
| Milosz Skowyra GSM Mobile +48 600 95 35 72 |
| miloszek@fido.net.org.pl 2:484/2.47 on fidonet |
|-----------------------------------------------------|
J.F.
Guest
Wed May 12, 2004 11:01 pm
On Wed, 12 May 2004 20:34:15 +0200, Milosz Skowyra wrote:
Quote:
Dlaczego zapis:
eeprom_set temp;
memcpy(&temp,&ustawienia,sizeof(eeprom_set));
wywoluje warninga:
menu.c:189: warning: implicit declaration of function `memcpy'
zapomniales string.h zaincludowac.
Kompilator sam sobie wtedy deklaruje funkcje memcpy - tzn
domysla sie parametrow.
Quote:
Identyczna definicja kilkanascie
linijek nizej w innej funkcji nie wywoluje tego warninga.
Bo teraz memcpy juz jest zdefiniowana :-)
Quote:
eeprom_write_block(&ustawienia,&eeust[setting_number],sizeof(ustawienia));
menu.c:215: warning: passing arg 2 of `eeprom_write_block' discards
qualifiers from pointer target type
gdzie: eeprom_set ustawienia;
static const eeprom_set eeust[3] __attribute__((section(".eeprom"))) ={
{{1,2,3,4,5,6},{0,0,0,0,0,0},{255,255,255,255,255,255},{0,1,2,3,1,2},"1
zestaw nastaw "},
Rozumiem ze nie podoba mu sie to ze adres dostarczam w malostrawnej dla
niego postaci. Czy tak ??
Nie, odrzuca jakis niuans w typie .. moze mu sie nie podoba ze adres
tablicy typu const przekazujesz w miejsce parametru ktory const nie ma
... czyli potencjalny problem uzmienniania stalej ?
J.
Milosz Skowyra
Guest
Thu May 13, 2004 8:57 am
"J.F." wrote:
Quote:
menu.c:189: warning: implicit declaration of function `memcpy'
zapomniales string.h zaincludowac.
Jasne... ;-( A propos gdzie mozna znalezc jakis opis gdzie siedzi jaka
funkcja ?? Pomijajac te dostepne w plikach *.h ktore ewentualnie mozna
znalezc recznie.
Quote:
Kompilator sam sobie wtedy deklaruje funkcje memcpy - tzn
domysla sie parametrow.
W sumie madre i glupie toto... wolalbym dostac error niz warninga ;-(
Quote:
menu.c:215: warning: passing arg 2 of `eeprom_write_block' discards
qualifiers from pointer target type
Nie, odrzuca jakis niuans w typie .. moze mu sie nie podoba ze adres
tablicy typu const przekazujesz w miejsce parametru ktory const nie ma
.. czyli potencjalny problem uzmienniania stalej ?
Jasne. Poszukam, popatrze... ;-)
--
Regards. Przy odpowiedzi usun "." przed "net" z adresu!!!
|-----------------------------------------------------|
| Milosz Skowyra GSM Mobile +48 600 95 35 72 |
| miloszek@fido.net.org.pl 2:484/2.47 on fidonet |
|-----------------------------------------------------|
J.F.
Guest
Thu May 13, 2004 10:15 am
On Thu, 13 May 2004 11:57:29 +0200, Milosz Skowyra wrote:
Quote:
"J.F." wrote:
zapomniales string.h zaincludowac.
Jasne... ;-( A propos gdzie mozna znalezc jakis opis gdzie siedzi jaka
funkcja ?? Pomijajac te dostepne w plikach *.h ktore ewentualnie mozna
znalezc recznie.
Siedziec to one siedza w bibliotece. Powinienes gdzies zrodla nawet
znalezc.
Quote:
Kompilator sam sobie wtedy deklaruje funkcje memcpy - tzn
domysla sie parametrow.
W sumie madre i glupie toto... wolalbym dostac error niz warninga ;-(
Zaszlosc historyczna - kiedys C tego w ogole nie sprawdzal, tylko
wywolywal jak kazales.
J.
Milosz Skowyra
Guest
Thu May 13, 2004 10:21 am
"J.F." wrote:
Quote:
Jasne... ;-( A propos gdzie mozna znalezc jakis opis gdzie siedzi jaka
funkcja ?? Pomijajac te dostepne w plikach *.h ktore ewentualnie mozna
znalezc recznie.
Siedziec to one siedza w bibliotece. Powinienes gdzies zrodla nawet
znalezc.
Jasne.
Quote:
Kompilator sam sobie wtedy deklaruje funkcje memcpy - tzn
domysla sie parametrow.
W sumie madre i glupie toto... wolalbym dostac error niz warninga ;-(
Zaszlosc historyczna - kiedys C tego w ogole nie sprawdzal, tylko
wywolywal jak kazales.
To moze niech juz ten warning zostanie

))
--
Regards. Przy odpowiedzi usun "." przed "net" z adresu!!!
|-----------------------------------------------------|
| Milosz Skowyra GSM Mobile +48 600 95 35 72 |
| miloszek@fido.net.org.pl 2:484/2.47 on fidonet |
|-----------------------------------------------------|
Jurek Szczesiul
Guest
Thu May 13, 2004 12:35 pm
Thu, 13 May 2004 13:21:46 +0200, na pl.misc.elektronika, Milosz Skowyra
napisał(a):
Quote:
Siedziec to one siedza w bibliotece. Powinienes gdzies zrodla nawet
znalezc.
Jasne.
Jest jeszcze narzedzie avr-ar, ktorym mozna obejrzec zawartosc
biblioteki*.a
Inna sprawa, ze w avr-libc nie ma wielkiego asortymentu - wiekszosc siedzi
w podstawowej libc.a, matematyka w libm.a - i jeszcze jest pare mniejszych
na rozne wersje vprintf.
Quote:
W sumie madre i glupie toto... wolalbym dostac error niz warninga ;-(
To moze niech juz ten warning zostanie

))
Jeszcze mozna sprobowac z opcja -Werror / powoduje potraktowanie warninga
jako error ( kompilacja zostaje zatrzymana, ale komunikat chyba niestety
sie nie zmienia ).
--
Pozdrowienia
Jurek Szczesiul
Krzysztof Rudnik
Guest
Thu May 13, 2004 1:46 pm
Milosz Skowyra wrote:
Quote:
"J.F." wrote:
menu.c:189: warning: implicit declaration of function `memcpy'
zapomniales string.h zaincludowac.
Jasne... ;-( A propos gdzie mozna znalezc jakis opis gdzie siedzi jaka
funkcja ?? Pomijajac te dostepne w plikach *.h ktore ewentualnie mozna
znalezc recznie.
Kompilator sam sobie wtedy deklaruje funkcje memcpy - tzn
domysla sie parametrow.
W sumie madre i glupie toto... wolalbym dostac error niz warninga ;-(
Zmienic rozszerzenie pliku na .cpp
Krzysiek Rudnik
Goto page 1, 2 Next