RTV forum PL | NewsGroups PL

Jak poprawnie wykorzystać wskaźniki w funkcji do odczytu danych z EEPROM w C?

[avr-gcc] Wskaźniki, funkcja - nie dziala

NOWY TEMAT

elektroda NewsGroups Forum Index - Elektronika Polska - Jak poprawnie wykorzystać wskaźniki w funkcji do odczytu danych z EEPROM w C?

Saper/nolin11
Guest

Tue Jul 17, 2007 5:50 pm   



Witam,

Mam taki dylemat otóż jest sobie funkcja odczytująca z pamięci eeprom up
5bajtów i jeśli używam wskaźnika na tablicę do przenoszenia to qupa ,a jak
przenosze dane przez 5 wskaźników to jest ok..
Zeby było jaśniej co i jak kawałek kodu z funkcją wykożystującą wskaźniki:

void LoadDataProfile(uint8_t *_pwm[4], uint8_t *_outs, uint8_t prof_id) {
uint8_t tmp, tmp2;
prof_id = prof_id*5; // 5bajtów konfiguracyjnych (zakres konfiguracji:
0x05[05]-0x14[20])
for (tmp=0;tmp<4;tmp++) {
tmp2 = prof_id+tmp;
*(_pwm1+tmp) = eeprom_read_byte(tmp2);
}
tmp2 = prof_id+4;
*_outs = eeprom_read_byte(tmp2);
}

i wywołanie:
uint8_t _pwm[4], _outs;
[..]
LoadDataProfile(&_pwm,&_outs,2);

I w tablicy potem mam tylko wartość dla _pwm[0] i _pwm[3] ,a pozostałe [1]
i [2] ,mają = 0x00. Nie wiem czemu.

A ten kod działa (nawet za dobrze Smile) ):
void LoadDataProfile(uint8_t *_pwm1, uint8_t *_pwm2, uint8_t *_pwm3,
uint8_t *_pwm4, uint8_t *_outs, uint8_t prof_id) {
uint8_t tmp, tmp2;
prof_id = prof_id*5; // 5bajtów konfiguracyjnych (zakres konfiguracji:
0x05[05]-0x14[20])
tmp2 = prof_id+0;
*_pwm1 = eeprom_read_byte(tmp2);
tmp2 = prof_id+1;
*_pwm2 = eeprom_read_byte(tmp2);
tmp2 = prof_id+2;
*_pwm3 = eeprom_read_byte(tmp2);
tmp2 = prof_id+3;
*_pwm4 = eeprom_read_byte(tmp2);
tmp2 = prof_id+4;
*_outs = eeprom_read_byte(tmp2);
}

i wywołanie:
LoadDataProfile(&_pwm[0],&_pwm[1],&_pwm[2],&_pwm[3],&_outs,1);

Może mi wskazać ktoś gdzie robie błąd w tym pierwszym kodzie czy to jest
jak czarna dziura :/



Ps. Wskaźników staram się omijać jak ognia :/ - nie jestem z nimi za pan
brat ale praktyka czyni mistrza Smile)
--
Saper/nolin11
majl:nolin11_USUN_TO_@interia.pl
gg:4476700

Artur Lipowski
Guest

Tue Jul 17, 2007 7:53 pm   



Saper/nolin11 wrote:

.....
Quote:
void LoadDataProfile(uint8_t *_pwm[4], uint8_t *_outs, uint8_t prof_id) {

Według tej deklaracji/definicji _pwm jest tablicą wskaźników do uint8_t.
Czy aby na pewno Ci o to chodziło?

....
Quote:
*(_pwm1+tmp) = eeprom_read_byte(tmp2);
....

Tutaj się odwołujesz do kolejnego elementu _pwm czyli do kolejnego wskaźnika, a
nie do uint8_t. Wskaźnik zajmuje (zwykle) 16 bitów. Chyba reszta już jest jasna?

Trochę to chyba przekombinowałeś chyba chodziło Ci o:
void LoadDataProfile(uint8_t _pwm[], uint8_t *_outs, uint8_t prof_id)
a odwoływać do _tmp można się przez proste:
_pwm1[tmp] = .....
a wywołanie funkcji:
LoadDataProfile(_pwm,&_outs,2);

A tak wogóle to zainteresuj się funkcją eeprom_read_block.

BTW> Używane przedrostka w postaci podkreślenia jest wysoce "niestandardowe" ;-)


Pozdrawiam,
--
Artur Lipowski

Saper/nolin11
Guest

Tue Jul 17, 2007 10:58 pm   



Artur Lipowski wrote:
Quote:
Saper/nolin11 wrote:

....
void LoadDataProfile(uint8_t *_pwm[4], uint8_t *_outs, uint8_t prof_id)
{

Według tej deklaracji/definicji _pwm jest tablicą wskaźników do uint8_t.
Czy aby na pewno Ci o to chodziło?

To jest tak w funkcji głównej (z której jest wywołanie tej) jest
deklaracja:
uint8_t _pwm[4]; // tablica 4 elementowa

Quote:

...
*(_pwm1+tmp) = eeprom_read_byte(tmp2);
...
Tutaj się odwołujesz do kolejnego elementu _pwm czyli do kolejnego
wskaźnika, a nie do uint8_t. Wskaźnik zajmuje (zwykle) 16 bitów. Chyba
reszta już jest jasna?

Czyli wystaczyło by przekazać wskaźnik na pierwszy element i przesuwać go o
jeden na następny elelment, jeśli dobrze rozumiem.

Quote:

Trochę to chyba przekombinowałeś chyba chodziło Ci o:
void LoadDataProfile(uint8_t _pwm[], uint8_t *_outs, uint8_t prof_id)
a odwoływać do _tmp można się przez proste:
^^^ _pwm -= mniemam Smile
_pwm1[tmp] = .....
AAAAAA simple... Sad - I'm stupid....
a wywołanie funkcji:
LoadDataProfile(_pwm,&_outs,2);

A tak wogóle to zainteresuj się funkcją eeprom_read_block.

własnie se przypomniałem o niej Smile) ale miejsce mam więc moge sobie
pozwolić na lenistwo Smile i nie zmieniać tego "mojego odczytu"
Quote:

Używane przedrostka w postaci podkreślenia jest wysoce "niestandardowe"
Wink

Ja jestem osobą bardzo "niestandardową" :)

[dopisane]
Działa ze wskaźnikami jak chce Very Happy oto wynik:
void LoadDataProfile(uint8_t *_pwm, uint8_t *_outs, uint8_t prof_id) {
uint8_t tmp, tmp2;
prof_id = prof_id*5; // 5bajtów konfiguracyjnych (zakres konfiguracji:
0x05[05]-0x14[20])
for (tmp=0;tmp<4;tmp++) {
tmp2 = prof_id+tmp;
*(_pwm+tmp) = eeprom_read_byte(tmp2); // > *(_pwm+tmp) < <<--
przesunięcie wskaźnika po elementach tablicy
}
tmp2 = prof_id+4;
*_outs = eeprom_read_byte(tmp2);
}
i wywołanie:
LoadDataProfile(&_pwm[0],&_outs,1);

--
Saper/nolin11
majl:nolin11_USUN_TO_@interia.pl
gg:4476700

Saper/nolin11
Guest

Wed Jul 18, 2007 9:10 am   



Piotr Chmiel wrote:
Quote:
On Tue, 17 Jul 2007, Saper/nolin11 wrote:

Witam,

Mam taki dylemat otóż jest sobie funkcja odczytująca z pamięci eeprom up
5bajtów i jeśli używam wskaźnika na tablicę do przenoszenia to qupa ,a
jak przenosze dane przez 5 wskaźników to jest ok..
Zeby było jaśniej co i jak kawałek kodu z funkcją wykożystującą
wskaźniki:

void LoadDataProfile(uint8_t *_pwm[4], uint8_t *_outs, uint8_t prof_id)
{ uint8_t tmp, tmp2;
prof_id = prof_id*5; // 5bajtów konfiguracyjnych (zakres konfiguracji:
0x05[05]-0x14[20])
for (tmp=0;tmp<4;tmp++) {
tmp2 = prof_id+tmp;
*(_pwm1+tmp) = eeprom_read_byte(tmp2);
}
tmp2 = prof_id+4;
*_outs = eeprom_read_byte(tmp2);
}

i wywołanie:
uint8_t _pwm[4], _outs;
[..]
LoadDataProfile(&_pwm,&_outs,2);

I w tablicy potem mam tylko wartość dla _pwm[0] i _pwm[3] ,a pozostałe
[1] i [2] ,mają = 0x00. Nie wiem czemu.

A ten kod działa (nawet za dobrze Smile) ):
void LoadDataProfile(uint8_t *_pwm1, uint8_t *_pwm2, uint8_t *_pwm3,
uint8_t *_pwm4, uint8_t *_outs, uint8_t prof_id) {
uint8_t tmp, tmp2;
prof_id = prof_id*5; // 5bajtów konfiguracyjnych (zakres konfiguracji:
0x05[05]-0x14[20])
tmp2 = prof_id+0;
*_pwm1 = eeprom_read_byte(tmp2);
tmp2 = prof_id+1;
*_pwm2 = eeprom_read_byte(tmp2);
tmp2 = prof_id+2;
*_pwm3 = eeprom_read_byte(tmp2);
tmp2 = prof_id+3;
*_pwm4 = eeprom_read_byte(tmp2);
tmp2 = prof_id+4;
*_outs = eeprom_read_byte(tmp2);
}

i wywołanie:
LoadDataProfile(&_pwm[0],&_pwm[1],&_pwm[2],&_pwm[3],&_outs,1);

Może mi wskazać ktoś gdzie robie błąd w tym pierwszym kodzie czy to jest
jak czarna dziura :/

A od czego jest kompilator ?

Problem w tym że kompilator nie narzeka na na sposób przekazywania
zmiennych tylko troche na przypisanie z eeprom_read_byte ale to wiem i to
jednak działa. No nic Smile już sobie poradziłęm Smile) z pomocą pana Artura.


--
Saper/nolin11
majl:nolin11_USUN_TO_@interia.pl
gg:4476700

Paweł Więcek
Guest

Wed Jul 18, 2007 9:49 pm   



Thus wrote Saper/nolin11 <nolin11_USUNT_TO@interia.pl>:
Quote:
prof_id = prof_id*5; // 5bajtów konfiguracyjnych (zakres konfiguracji:

Zasadniczo istneije coś takiego jak *=...

Quote:
0x05[05]-0x14[20])
for (tmp=0;tmp<4;tmp++) {
tmp2 = prof_id+tmp;

Po co ta zmienna?

Quote:
*(_pwm+tmp) = eeprom_read_byte(tmp2); // > *(_pwm+tmp) < <<--

Z definicji *(x+y) jest równoważne x[y] (jak i y[x] oczywiście), więc po co
komplikować?

Quote:
LoadDataProfile(&_pwm[0],&_outs,1);

&_pwm[0]? _pwm jest jakby "trochę" prostsze.

Tak wiem, czepiam się.

Paweł

--
(___) | Pawel Wiecek ----------------- Coven / Svart --------------------- |
< o o > | http://www.coven.vmh.net/ <coven@vmh.net> GSM: +48603240006 |
\ ^ / | GPG/PGP info in message headers * [ Debian GNU/Linux developer ] |
(") | I don't want people to love me. It makes for obligations. -- JA |

Saper/nolin11
Guest

Thu Jul 19, 2007 8:13 pm   



Paweł Więcek wrote:
Quote:
Thus wrote Saper/nolin11 <nolin11_USUNT_TO@interia.pl>:
prof_id = prof_id*5; // 5bajtów konfiguracyjnych (zakres konfiguracji:

Zasadniczo istneije coś takiego jak *=...

hmmm, fakt Smile (ps. czepiasz sie Smile )

Quote:

0x05[05]-0x14[20])
for (tmp=0;tmp<4;tmp++) {
tmp2 = prof_id+tmp;

Po co ta zmienna?

Aby mi sie lepiej pisalo :)

Quote:

*(_pwm+tmp) = eeprom_read_byte(tmp2); // > *(_pwm+tmp) < <<--

Z definicji *(x+y) jest równoważne x[y] (jak i y[x] oczywiście), więc po
co komplikować?


A czy życie jest takie proste Smile - lubie tak mieszać Smile)

Quote:
LoadDataProfile(&_pwm[0],&_outs,1);

&_pwm[0]? _pwm jest jakby "trochę" prostsze.

Ja tam wole zozole Razz....
....wolę wiedzieć dokładniej co mu każe zrobić ,a zresztą "bo mi tak
wygodniej" Smile)

Quote:

Tak wiem, czepiam się.

Ja też wiem, troche.... Smile) ale projekt juz zamkniety Smile (napisane, działa
jak chce i nic więcej nie chce mi sie już dodawać i zmieniać Smile) ) tak wiec
dziękuje głównie za przypomnienie o tym operatorze.


[!close_thread!]
--
Saper/nolin11
majl:nolin11_USUN_TO_@interia.pl
gg:4476700

Artur M. Piwko
Guest

Fri Jul 20, 2007 11:41 am   



In the darkest hour on Thu, 19 Jul 2007 21:13:27 +0200,
Saper/nolin11 <nolin11_USUNT_TO@interia.pl> screamed:
Quote:

LoadDataProfile(&_pwm[0],&_outs,1);

&_pwm[0]? _pwm jest jakby "trochę" prostsze.

Ja tam wole zozole Razz....
...wolę wiedzieć dokładniej co mu każe zrobić ,a zresztą "bo mi tak
wygodniej" Smile)


To zamiast: int i = 0;
pisz: int i; memset( &i, 0, sizeof(i) );
będziesz wiedział dokładniej co mu każesz robić... ;)

--
[ Artur M. Piwko : Pipen : AMP29-RIPE : RLU:100918 : From == Trap! : SIG:232B ]
[ 12:24:20 user up 11408 days, 0:19, 1 user, load average: 0.50, 0.71, 0.02 ]

Compatible: Gracefully accepts erroneous data from any source.

Saper/nolin11
Guest

Fri Jul 20, 2007 9:06 pm   



Artur M. Piwko wrote:
Quote:
In the darkest hour on Thu, 19 Jul 2007 21:13:27 +0200,
Saper/nolin11 <nolin11_USUNT_TO@interia.pl> screamed:

LoadDataProfile(&_pwm[0],&_outs,1);

&_pwm[0]? _pwm jest jakby "trochę" prostsze.

Ja tam wole zozole Razz....
...wolę wiedzieć dokładniej co mu każe zrobić ,a zresztą "bo mi tak
wygodniej" Smile)


To zamiast: int i = 0;
pisz: int i; memset( &i, 0, sizeof(i) );
będziesz wiedział dokładniej co mu każesz robić... Wink

o_O
dobra, zamykać temat Smile)


--
Saper/nolin11
majl:nolin11_USUN_TO_@interia.pl
gg:4476700

elektroda NewsGroups Forum Index - Elektronika Polska - Jak poprawnie wykorzystać wskaźniki w funkcji do odczytu danych z EEPROM w C?

NOWY TEMAT

Regulamin - Zasady uzytkowania Polityka prywatnosci Kontakt RTV map News map