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

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 :)) ): 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 :))

Reply to
Saper/nolin11
Loading thread data ...

....

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

...

... 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,

Reply to
Artur Lipowski

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

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

^^^ _pwm -= mniemam :)

AAAAAA simple... :( - I'm stupid....

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

Ja jestem osobą bardzo "niestandardową" :)

[dopisane] Działa ze wskaźnikami jak chce :D 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);
Reply to
Saper/nolin11

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 :) już sobie poradziłęm :)) z pomocą pana Artura.

Reply to
Saper/nolin11

Thus wrote Saper/nolin11 <nolin11_USUNT snipped-for-privacy@interia.pl:

Zasadniczo istneije coś takiego jak *=...

Po co ta zmienna?

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

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

Tak wiem, czepiam się.

Paweł

Reply to
Paweł Więcek

hmmm, fakt :) (ps. czepiasz sie :) )

Aby mi sie lepiej pisalo :)

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

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

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

[!close_thread!]
Reply to
Saper/nolin11

In the darkest hour on Thu, 19 Jul 2007 21:13:27 +0200, Saper/nolin11 <nolin11_USUNT snipped-for-privacy@interia.pl screamed:

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

Reply to
Artur M. Piwko

o_O dobra, zamykać temat :))

Reply to
Saper/nolin11

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.